:: Visual Foxpro, Foxpro for DOS
Последовательное заполнение фильтра в grid
MERFLOW
Автор

Сообщений: 2
Дата регистрации: 20.11.2018
Здравствуйте.
Задача: таблица, подгружаемая в грид, состоит из 18 столбцов, нужно сделать 4 фильтра по 4 стоблцам типа (от, до), сами границы прописываются в эдитбоксах, после нажатия на кнопку, должна происходить фильтрация. Она может быть из абсолютно любых комбинаций .

Вопрос: я сделал проверку эдитбоксов на empty в отдельных конструкциях, дабы можно было знать какая из границ есть, либо есть обе. после каждой проверки условия у меня идет set filter to , но каждая новая конструкция фильтра обнуляет фильтр предыдущей. Можно ли как-нибудь сделать что-то наподобие накопительного фильтра с границами?

конструкции:

IF EMPTY(thisform.edit3.Value)
IF EMPTY(thisform.edit4.Value)
ELSE
SET FILTER TO table.a1<=VAL(ALLTRIM(thisform.edit4.Value))
GO TOP
ENDIF
ELSE
IF EMPTY(thisform.edit4.Value)
SET FILTER TO table.a1=>VAL(ALLTRIM(thisform.edit3.Value))
GO TOP
ELSE
SET FILTER TO table.a1=>VAL(ALLTRIM(thisform.edit3.Value)) AND table.a1<=VAL(ALLTRIM(thisform.edit4.Value))
GO TOP
endif
ENDIF

IF EMPTY(thisform.edit7.Value)
IF EMPTY(thisform.edit8.Value)
ELSE
SET FILTER TO table.a2<=VAL(ALLTRIM(thisform.edit8.Value))
GO TOP
ENDIF
ELSE
IF EMPTY(thisform.edit8.Value)
SET FILTER TO table.a2=>VAL(ALLTRIM(thisform.edit7.Value))
GO TOP
ELSE
SET FILTER TO table.a2=>VAL(ALLTRIM(thisform.edit7.Value)) AND table.a2<=VAL(ALLTRIM(thisform.edit8.Value))
GO TOP
endif
ENDIF


Можно сделать, конечно сложную конструкцию, но это бред. Может есть какой-то вариант, буду очень благодарен за помощь.



Исправлено 1 раз(а). Последнее : MERFLOW, 20.11.18 02:39
Ratings: 0 negative/0 positive
Re: Последовательное заполнение фильтра в grid
1793

Сообщений: 290
Откуда: Озерск
Дата регистрации: 17.10.2001
это ?
lcFiltr=""
If Empty(Thisform.edit3.Value)=.f.
lcFiltr=lcFiltr+Iif(Empty(lcFiltr),""," and ")+"Table.a1<=Val(Alltrim(Thisform.edit3.Value))"
Endif
If Empty(Thisform.edit4.Value)=.f.
lcFiltr=lcFiltr+Iif(Empty(lcFiltr),""," and ")+"Table.a1<=Val(Alltrim(Thisform.edit4.Value))"
Endif
If Empty(Thisform.edit7.Value)=.f.
lcFiltr=lcFiltr+Iif(Empty(lcFiltr),""," and ")+"Table.a1<=Val(Alltrim(Thisform.edit7.Value))"
Endif
If Empty(Thisform.edit8.Value)=.f.
lcFiltr=lcFiltr+Iif(Empty(lcFiltr),""," and ")+"Table.a1<=Val(Alltrim(Thisform.edit8.Value))"
Endif
Set Filter To &lcFiltr.
Go Top



Исправлено 1 раз(а). Последнее : 1793, 20.11.18 06:04
Ratings: 0 negative/1 positive
Re: Последовательное заполнение фильтра в grid
MERFLOW
Автор

Сообщений: 2
Дата регистрации: 20.11.2018
да, именно это, спасибо большое)
Ratings: 0 negative/0 positive
Re: Последовательное заполнение фильтра в grid
XAndy

Сообщений: 3803
Откуда: Киев
Дата регистрации: 05.02.2004
Только thisform в выражение фильтра не засовывайте
lcFiltr = ""
If !Empty(thisform.edit3.Value)
lcFiltr = lcFiltr+" and Table.a1<="+alltrim(thisform.edit3.Value)
Endif
If !Empty(thisform.edit4.Value)
lcFiltr = lcFiltr+" and Table.a1<="+alltrim(thisform.edit4.Value)
Endif
* .......
lcFiltr = ltrim(lcFiltr," and ")
Set Filter To &lcFiltr
Go Top
Ratings: 0 negative/0 positive
Re: Последовательное заполнение фильтра в grid
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
А ещё лучше вообще не использовать SET FILTER, а сгенерировать и исполнить SELECT-SQL команду с полным набором такого рода "условий".


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Последовательное заполнение фильтра в grid
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
Ну почему так категорично, в определенных рамках SET FILTER простое и быстро работающее решение ... ну ежели конечно не охулиард записей тянем и затем фильтруем
Ratings: 0 negative/0 positive
Re: Последовательное заполнение фильтра в grid
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Потому что через ж*пу работает этот самый фильтр Как только заходит речь о "листании" а не об однократном прогоне. Зачем делать 100 раз поиск одной и той же "подходящей" записи, если можно за 1 раз её найти, положить в курсор и далее не иметь никаких проблем с её показом.
Впрочем, т.к. зачастую "фильтруют" так что под условие попадает 100500 записей, и потом весело листают это дело в гриде, то разницы практически нет - и так и так г*но получается


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Последовательное заполнение фильтра в grid
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
Ну про 100500 понятно - тут нет возражений, но например на справочнике даже порядка 10 тыс записей тормозов нет, зато скорость - "не успел дописать" ))) - а ежели выбирать из этих же 10 с сервака - то уже задержка ... если логика не предполагает слишком частого использования - то и фиг с ней с задержкой, а ежели в режиме "постоянно" - то как раз простой как топор фильтр самое то. Ну особенности его работы при "листании" - да, есть такое, тут по задаче смотреть нуна, на практике у меня обычно под фильтром оказывалось 5-10 записей - как раз то что нужно )))



Исправлено 1 раз(а). Последнее : AndyNigmatec, 22.11.18 07:16
Ratings: 0 negative/0 positive
Re: Последовательное заполнение фильтра в grid
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Если под фильтром оказывается 5-10 записей, то по скорости отбора нет решительно никакой разницы между SET FILTER и SELECT - НО SET FILTER будет снова и снова делать этот отбор - при перерисовках грида, скроллинге (даже бессмысленном - просто подёргать скролбар) и т.п.
Единственный плюс SET FILTER в том, что он "останавливается" при заполнении видимой части грида - т.е. как раз для ситуаций когда под условие попадает 100500 записей, SELECT будет добросовестно их все в курсор гнать (ну если там какой TOP не дописать), а SET FILTER вынимет первые 20-30 записей и остановится до того как грид начнут "крутить".


------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 23 (Гостей: 23)

© 2000-2024 Fox Club 
Яндекс.Метрика