Відповідь на питання № 31176

Фільтрація даних |

Виникла проблема з використанням фільтрації в DBGridEh. З таким запитанням я знайшов з пошуку, але відповіді на нього не знайшов. Тому публікую своє питання.
Працюю на D7 з FireBird 1.5 через IBX. У хелпе на EhLib дані роз'яснення щодо використання STFilter. Зробив все як там і писалося, а саме: встановив все пов'язані з фільтрацією властивості так, як показано в прикладі, додав EhLibIBX в uses, але фільтр не працює. Пробував використовувати локальну і серверну фільтрацію з відповідними змінами в SQL (where / * Filter * / 1 = 1), пробував встановлювати IBQuery.Filtered: = True при локальної фільтрації. Результат один - нічого не працює. Причому навіть не меняеться ні IBQuery.SQL.Text ні IBQuery.Filter. На сам EhLib нарікань немає, тому що demo працює справно.
У зв'язку з цим питання: що я роблю не так або може хтось поділитися чіткою послідовністю дій: що де потрібно прописати і будь-що встановити якісь поля?
І додаткове запитання: чи можливо обробляти фільтр не по Enter, а зі зміни рядка фільтра?

Відстежувати відповіді на це питання по RSS

Для фільтрації не по Enter'у а за вибором рядка в STFilter, прописуємо 1 раз наступний рядок

Насправді в DBGridEh фільтрація для СУБД Interbase працює. Ви все зробили правильно: включили в модулі посилання на EhLibIBX, виставили властивість STFilter.Visible в True. Але, ймовірно, не дуже уважно читали довідку (як власне і я). Я вважаю, що фільтрація у вас не запрацювала тому, що і у мене. У довідці написано:
«Коли grid налаштований для фільтрації на сервері, спеціальний об'єкт будує вираз для пропозиції 'WHERE' SQL-рядки DataSet'а. Він намагається знайти рядок, що починається з ключового висловлювання '/ * Filter * /' (Ви можете змінювати це ключове вираження використовуючи глобальну змінну SQLFilterMarker) в SQL-вираженні і додає вираз для фільтрації після ключа в тому ж рядку. Так що, SQL-запит повинен містити рядок, що починається з '/ * Filter * /'. наприклад:
'Select *
from table1
where
/ * Filter * / 1 = 1 ' »
Тобто це треба розуміти буквально. Для того, щоб спеціальний об'єкт знайшов рядок, що починається з ключового висловлювання '/ * Filter * /', цей рядок повинна починатися тільки з / * Filter * / 1 = 1 'і отже в ній не повинно бути ніяких початкових пробілів. Я ж написав так:
......
where
/ * Filter * / 1 = 1.
І природно рядок розпізнано була. Що можна побачити поставивши Breakpoint в процедурі ApplyFilterSQLBasedDataSet (модуль DBUtilsEh) на момент фільтрації. На роботі мені сказали, що не зручно постійно стежити за відсутністю прогалин в запитах і попросили виправити цей недолік. Я злегка переписав EhLib-івську процедуру ApplyFilterSQLBasedDataSet і тепер рядок, яка вказує на необхідність фільтрації може починатися з будь-якого числа Прохворівши :-)))). Наведу приклад коду.
Мій варіант процедури:

фільтрацію доведеться самому писати, в EhLibIBX немає ніяких натяків, що при його підключенні фільтрація відразу стане працювати :)

У пакеті EhLib є папка DataService
пропиши модуль EhLibIBX в модулі де знаходиться EhGrid, сортування за кількома стовпцями з'явитися якщо вкл DBGridEh.SortLocal: = True, а ось з фільтром доведеться повозиться напевно, для початку треба буде встановити DBGridEh.STFilter.Visible: = True;
DBGridEh.STFilter.Local: = True;
після цього трохи підправити модуль EhLibIBX, щоб фільтрація працювала так як тобі потрібно,
можливо доведеться також підправити DBUtilsEh.
ЗИ:
я на прикладі модуля EhLibCDS правил EhLibFIB, і ніби як все работет

Сторінка обраних питань Круглого столу.

Схожі статті