Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.28;
Скачать: [xml.tar.bz2];




Вниз

Фильтрация НД 


Johnmen   (2002-01-31 12:24) [0]

Такой вот глюк при работе с IBDataSet : ставлю фильтр Filtered:=True; Filter:=<....>; и ничего не происходит ! Это я глючу или IBDataSet ? Кто сталкивался - отзовитесь !!!



Fareader   (2002-01-31 12:37) [1]

У них фильтры ставятся в событии OnFilterRecord таким макаром:

Accept := DataSet["апап"]=2;

т.те, ставиш фильтр Filtered:=True, а в Filter ничего не пишешь



Alexandr   (2002-01-31 12:44) [2]

свойство Filter это просто так, для совместимости (????), туда можно хоть чего писать (хоть Джефф Оверкэш дурак)



Johnmen   (2002-01-31 13:40) [3]

>Alexandr : я так и предполагал...спасибо
а кто это - Джефф Оверкэш ?
>Fareader : так тоже делал, но там свои проблемы...спасибо



Alexandr   (2002-01-31 13:51) [4]

так, как тебе Fareader и надо фильтрацию делать.
Если тебе конечно нужна фильтрация на клиенте, а не на сервере.
Это универсальный способ и он везде работает.

А Джефф Оверкэш это разработчик IBX - это как раз те компонеты, которыми ты пользуешься.

А вообще, мой тебе совет- используй лучше IBObjects или FIBPlus, чтобы потом не пожалеть



Johnmen   (2002-01-31 14:00) [5]

>Alexander : обязательно перейду (давно хочу) на FIBPlus,
просто сейчас совсем нет времени - добиваю проект, где используется IBX [Джефф Оверкэш >:((( ]...
еще раз попробую OnFilterRecord...еще раз спасибо.



Fareader   (2002-01-31 14:53) [6]

Можешь в этом событии сделать кучу возможных фильтров через кейс.
Я так сделал

case state_nak of
1:dataset.filtered:=false;
2:Accept := (DataSet["пап"]=-1) or (DataSet["ап"]=1);
3:Accept := DataSet["апа"]=2;
4:Accept := DataSet["апа"]=3;
5:Accept := DataSet["апа"]=4;
6:Accept := (DataSet["апа"]=4) or (DataSet["апа"]=5);
7:Accept := DataSet["апа"]=s_drv_query.fieldbyname("рр").asinteger;
8:Accept := DataSet["рр"]=strtoint(F_G_Form.edit1.text);
9:Accept := DataSet["апарп"]=strtoint(F_G_Form.edit2.text);
10:Accept := (DataSet["апрп"]=strtoint(F_G_Form.edit1.text)) and (DataSet["парп"]=strtoint(F_G_Form.edit2.text));
end;

сделал глобальную переменную state_nak и перед установкой фильтра ставлю ее в нужное значение
может некрасиво, но работает ;)



Johnmen   (2002-01-31 15:27) [7]

>Fareader © : спасибо, что не поленился столько нашлепать, но как пользоваться OnFilterRecord я знаю :)))))
просто надо иметь в виду, что внутренний механизм фильтрации НД в случае Filter:=<...> и OnFilterRecord несколько разный,
в связи с чем OnFilterRecord намного тормознутей Filter:=<...> ;o)
но раз в TIBDataSet облом с Filter:=<...>, то придется OnFilterRecord...



Fareader   (2002-01-31 16:45) [8]

Видишь ли в чем дело, я сам порбовал перейти с BDE на IBX, но скорость работы, в том числе фильтра и локейт ну никак, поэтому пришлось переходиь на FIBPlus, там побыстрее, но все равно до скорости BDE не дотягивает :(



Johnmen   (2002-01-31 17:03) [9]

>Fareader © : не сравнивал, но знаю, что в BDE фильтрация - самая сильная сторона.
А если со скоростями, как ты говоришь, то это удручает 8o(



Fareader   (2002-01-31 18:43) [10]

Я имел ввиду скорость фильтра и локейта, а все остальное в FIBPlus на высоте. И я заметил такой глюк BDE - если обновлять большое (6000 и более записей), то где-то после 3000 записи начинают обновляться очень тупо, а если делать Commit - то вообще мрак...



Mikhail   (2002-01-31 19:47) [11]

А не можно ли по-подробнее про FIBPlus начинающему?
Где он есть? Премного влагодарен.



Alexandr   (2002-02-01 07:08) [12]

2Mikhail: fibplus.com.ua



Fareader   (2002-02-01 11:27) [13]

2 Alexandr
Туговато фильтры работают, не в пример BDE, есть идеи по повышению скорости их работы?



Alexandr   (2002-02-01 12:54) [14]

должно быть одинаково.

Для корректной проверки перед наложением фильтра сделай fetchAll.

А какая у тебя версия FIBPlus?



Fareader   (2002-02-01 13:27) [15]

VER 4.5
FetchAll - помог, но локейт даже после FetchAll - отрабатывает дольше фильтра, приходится накладывать фильтр, а потом снимать. Но даже так скорость локейт у BDE - выше. В общем терпимо, но юзера ропщут - дескать на старой версии проги - быстрее было :(



Johnmen   (2002-02-01 13:31) [16]

>Fareader © : м.б. изменить идеологию - напр. не работать с большими НД ?



Fareader   (2002-02-01 13:34) [17]

Я думаю, что НД в 100-200 записей - это не так уж много, к тому же вариантов нет - они нужны все.



Alexandr   (2002-02-01 13:39) [18]

200 записей и locate долго проходит после fetchall?
странно... У них что-за компьютеры?

А версия FIBPlus 4.4.12? Или более старая? Они там улучшали работу с памятью.

у меня вообще pos(substr,str) часто вместо locate применяется и то скорость нормальная.



Fareader   (2002-02-01 13:48) [19]

433 Celeron 32 RAM Win 98
у меня 800 Celeron 256 RAM Win 2000

в install.txt написано WELCOME TO DEVRACE FIBPLUS 4.5



}{unter   (2002-02-01 13:49) [20]

Не знаю по аналогии с BDE сначала назначается фильтр, а потом применяется т.е.
Filter :=".....";
Filtered := True
как может, что-то произойти если к моменту запуска фильтра он не задан ?
И ещё по аналогии с BDE средства хуже Filter просто не существует! Медленнее средства просто нет если только не самому пробегать в цикле по рекордам скидывая маркеры в какой нибудь стринг лист.
SetRange - хорошая альтернатива фильтру !



Alexandr   (2002-02-01 13:56) [21]

1) SetRange только для файловых баз данных.

2) А может фильтр проще на сервере делать в запросе в условии where

3) У меня примерно такие-же компы, и скорость нормальная

4) а detail у этого DataSet нету?



Johnmen   (2002-02-01 13:56) [22]

К слову :
Посмотрел старые проги (с использованием BDE) :
на 1000 записей НД поиск типа <найти вхождение>[pos(substr,str)]
работает прибл. 1 сек. на P-100 c 48MB !!!!!!



Alexandr   (2002-02-01 14:02) [23]

во-во.
Короче так.
2fareader: Пиши тестовый проект, где у тебя тормозит, что бы в нем все было, и было понятно!!! И зашли мне по мылу. База если большая, то шли не всю, а только то, что надо. Я там посмотрю чего ты понаписал... Delphi 5, база в GBK-в бакупе и сожми Zip.



Johnmen   (2002-02-01 14:05) [24]

>}{unter © : кто сказал, что не создан ?!
извини, но ты слегка не в тему...посмотри предыдущий диалог :)
А фильтры в BDE работают исключительно быстро

...И ещё по аналогии с BDE средства хуже Filter просто не существует!...

Не надо быть таким категоричным !!!!



Fareader   (2002-02-01 14:18) [25]

Ок. зашлю. Только базу надо порезать, а то бекап на 100 мб не пролезет



Alexandr   (2002-02-01 14:22) [26]

давай. В понедельник посмотрю.
Кстати проект делай под Delphi5.



Fareader   (2002-02-01 14:40) [27]

2Alexandr. Так и так с ним работаю. Только гнилыми помидорами и тухлыми яйцами не кидаться и больно не бить за качество кода. Там комментариев нету ;)



Mikhail   (2002-02-01 14:41) [28]

>>Alexandr Спасибо



}{unter   (2002-02-01 15:33) [29]

>>Johnmen
Почему именно так могу объяснить. При работе с Filter не используются индексы. Если файл большой в длинну работа с Filter разительно отличается от работы с SetRange.
Да я писал и знал, что не в тему просто обратил анимание на постановку вопроса особенно на алгоритм
Filtered := True;
Filter := "<>";
это меня и смутило. Я провёл анологию (если не понял) с таблицами Paradox по применению фильтра если он назначается позже, чем даётся указание на его применение.
И менно по аналогии я заподозрил, что у автора топика именно в этом проблема. Конечно же я не в курске приминима эта шняга к интербейсу или нет, я с ним не работал.



Johnmen   (2002-02-01 16:32) [30]

>}{unter © : я тебя понял, но пременительно к IB через BDE
1. последовательность Filtered Filter не важна
2. фильтрация НД работает исключитель быстро, независимо от индексов



}{unter   (2002-02-01 18:14) [31]

>>Johnmen
Сорри ! Я подозреваю, что могу чего-то и не знать !
Извини !




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.28;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.77 MB
Время: 0.021 c
3-90529           dimich                2002-02-05 18:32  2002.02.28  
Помогите с ADO


1-90560           Andreika              2002-02-11 21:55  2002.02.28  
Проблема с MDI-фрмой


1-90545           kserg@ukr.net         2002-02-11 11:45  2002.02.28  
Как в StatusBar вывести иконку?


1-90552           vopros                2002-02-11 14:42  2002.02.28  
Как емитировать нажатие клавиши?


3-90518           СергейМНК             2002-02-04 06:15  2002.02.28  
Как сделать чтобы выскакивал LoockUp список при начале набора текста в DBGrid в LoockUp поле