Рис.1 TcxFilterControl в работе
Описанную проблему чудно решают TcxFilterControl и TcxDBFilterControl от DevExpress. Эти 2 компонента - визуальные построители условий с возможностью получить соответствующий SQL. Вообще-то у DevExpress есть .Net линейка продуктов, примерно аналогичных тому, что они делают под Delphi, но пользоваться не приходилось, поэтому дальше только про VCL ветку...
Рис.2 TcxFilterControl/TcxDBFilterControl в дизайнере.
Рис.3 добавление условия в FilterControl
Рис.4 добавление группы в FilterControl
Подкупает то, что "из коробки" работают подстановки имен полей, подстановки условий (равно/не равно, больше/меньше, для дат вообще огромный выбор предусловий), подстановки искомых значений из списков, календарей, ...
Рис.5 выпадающий список полей
Рис.6 выпадающий список условий на поле типа Date
Рис.7 выпадающий список имен сотрудников из таблицы-справочника
Также можно задавать различные булевские операции для значений внутри группы и между группами условий.
Рис.8 булевские операции для значений внутри группы
Результатом работы TcxFilterControl/TcxDBFilterControl является то, что генерируется строка, подходящая для использования в свойстве Filter любых источников данных (DataSet's) - так мы получаем локальный фильтр. С некоторыми оговорками (уникальность имени поля в пределах текущего запроса) это условие можно добавлять в WHERE часть запроса. Например, для Рис.1
наш FilterControl класса TcxFilterControl при обращении к FilterControl.FilterText возращает
( (ORDER_STATE = 1) OR (ORDER_STATE = 2) OR (ORDER_STATE = 3))
AND (EMP = 2304)
AND (EMP = 2304)
что пригодно и для локального фильтра и для запроса к базе данных.
Итог - сделав то, в чем часто упрекают программистов, использующих мощные средства - поставив компонент на форму ;) мы дали пользователю в руки возможность очень гибко строить запросы. Минусов видится 2 - аскетичный внешний вид и некоторая сложность для неподготовленных пользователей. Плюсы - масштабируемое и гибкое средство генерации условий при минимальных затратах.
Немає коментарів:
Дописати коментар