Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.05;
Скачать: CL | DM;

Вниз

Проблемы с фильтрацией в Dbgrid   Найти похожие ветки 

 
49 Cent   (2006-01-17 20:43) [0]

У меня есть аксесовский файл и в нем 12 таблиц по количеству месяцев. Там же есть Dbgrid, который связан с DataSource, а DataSource c Adotable.

На форме расположен tabset с закладками. Имя каждой закладки соответсвует именам таблиц. Идея в том, чтобы кликая на закладку загружать в Adotable определенную таблицу.

Делаю это так на событие TabSet1Change:
ADOTable1.Active:=false;
ADOTable1.TableName:=s;
ADOTable1.Active:=true;
, где s имя выделенной закладки в tabset.

Проблема в фильтрации. Сама фильтрация проводится таким кодом:
s:=dbgrid1.SelectedField.FieldName;
s1:=dbgrid1.SelectedField.AsString;

with ADOTable1 do begin
Filtered := False;
Filter := s+"=" + QuotedStr(s1);
Filtered := True;
end;

Идея такой фильтрации в том, чтобы после фильтрации оставлять только те записи, которые были выделены в ячейке dbgrid. Проблема в том, что после смены таблицы, фильтрация проводится криво. И криво потому что данные отображаются без одной строки.

К примеру, если в таблице 2 записи одного клиента, то после фильтрации отображается только 1 запись, хотя следующий код говорит, что в таблице осталось после фильтрации 2 записи:
statusbar1.Panels[1].Text:="Записей:"+inttostr(ADOTable1.RecordCount);

Если покрутить колесиком мышки вверх, а потом вниз, то только в этом случае неожидано появляется запись. Немного помог код: adotable1.Refresh; Однако, он не помогает если в таблице только 1 запись. Я думаю, что проблема в коде
ADOTable1.Active:=false;
ADOTable1.TableName:=s;
ADOTable1.Active:=true;

потому как, первоначально, когда я вручную загрузил таблицу через Object Inspector, фильтр работает как часы. Стоит только с помощью кода:
ADOTable1.Active:=false;
ADOTable1.TableName:=s;
ADOTable1.Active:=true;
загрузить новую таблицу, так сразу начинаются проблемы с фильтрацией. Как это исправить?


 
Johnmen ©   (2006-01-17 22:06) [1]

Сбрасывать фильтрацию после закрытия набора данных (ADOTable1.Active:=false;)


 
49 Cent   (2006-01-17 22:18) [2]

Я -начинающий, поэтому сильно извеняюсь за ламерский вопрос. А набор данных имеется ввиду компонент DataSource? Мне получается код (ADOTable1.Active:=false;) надо на событие AfterClose компонента DataSource добавить?


 
49 Cent   (2006-01-17 22:24) [3]

Маленькое уточнение. Т.е набор данных - это как я понял ADOTable1. Сбрасывать фильтрацию надо после закрытия данных. У ADOTable1 есть событие ADOTable1AfterClose. Таким образом, на событие ADOTable1AfterClose я добавил код adotable1.Filtered:=false; , но ничего не происходит. Также косячит.


 
49 Cent   (2006-01-18 00:36) [4]

Если не возражаете еще один вопрос! От чего зависит последовательно отображения данных в DBgrid? В аксесовской таблице, с которой я фактически работаю, установлена сортировка по полю ID и соответсвенно все данные отображаются ориентируясь на это поле. Т.е теперь в самом начале таблицы значения ID которых больше всего, а в самом низу самые малые значения. А как бы мне отсортировать Dbgrid также... потому как сейчас в нем все перемешено.


 
sniknik ©   (2006-01-18 00:49) [5]

ORDER BY поле
в запросе.

Sort:= "поле"
в датасете

IndexName:= "поле"
в ... ан нет, всеодно в датасете, таблицу выкини к чертовой бабушке и забудь о ее существовании (на время пользования ADO... вот вернешся на BDE...)


 
sniknik ©   (2006-01-18 00:52) [6]

да, обратная сортировка (от большего к меньшему) - DESC везде в конце добавить


 
49 Cent   (2006-01-18 03:07) [7]

2 sniknik
Спасибо. С сортировкой разобрался. Как бы еще и фильтр наладить?


 
sniknik ©   (2006-01-18 08:34) [8]

зачем сбрасывать фильтрацию в событии -> [3]? почему не в коде, ты же там явно закрываеш таблицу перед сменой имени, ну и выставляй Filtered := False;
Filter := ""; сразу после этого.

но почемуто кажется проблема не изза этого, чтото другое. "исчезает" первая запись? (та что должна быть первой) у меня был такой "косяк" при определенных настройках открытия рекордсета асинхронно (не используеш?)... "исчезал" первый пакет (CacheSize), по умолчани. 1-а запись. похоже. но к сожалению повторить не удается. (возможно и не удастся. апдейты системы с тех пор делал, а то был пожоже какойто глюк реализации определенного режема...)
в общем проверь (результат не гарантирую, ну а вдруг)
первое попробуй грубо RecNo:= 1; сразу после открытия
второе если в ExecuteOptions чтонибудь выбирал, убери.
и третье лучше вообше замени компонент "свежим" - TADODataSet, сними с палитры и не меняй никаких настроек по умолчанию... ну кроме CommandText, и Connection это обязательные, попробуй на нем.


 
evvcom ©   (2006-01-18 08:58) [9]


> файл и в нем 12 таблиц по количеству месяцев

Интересное решение, довольно древнее правда. А еще есть года. Или история совсем на фиг?


 
msguns ©   (2006-01-18 09:47) [10]

>evvcom ©   (18.01.06 08:58) [9]
>Интересное решение..
 
Угу.. Интересно чрезвычайно еще и тем, что надо бамбук курить при "листании" месяцев, ибо при активации каждой страницы идет переоткрытие таблицы.
Да и вообще решения типа "каждый месяц в отдельной таблице" просто смердят дремучим дилетантством.


 
49 Cent   (2006-01-19 01:10) [11]

2 sniknik
Большое спасибо за помощь! Проблема решена.



Страницы: 1 вся ветка

Текущий архив: 2006.02.05;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.027 c
3-1133777994
Daria
2005-12-05 13:19
2006.02.05
как загрузить из .txt с разделителями "^" в .db?


15-1137219018
begin...end
2006-01-14 09:10
2006.02.05
С Днём рождения! 14 января


1-1135935500
__oleg
2005-12-30 12:38
2006.02.05
Scrool в TStringGrid


4-1132574695
NiGGa
2005-11-21 15:04
2006.02.05
Информация о программе.


8-1124766998
palgen
2005-08-23 07:16
2006.02.05
Microsoft Video for Windows SDK