неділю, 13 грудня 2009 р.

TcxFilterControl и TcxDBFilterControl - продвинутые запросы в руках пользователя

В работе почти любой базы данных наступает момент, когда показывать все данные нет смысла, а иной раз и возможности. И тут все начинают увлеченно городить всякого рода формы для первоначального отбора данных, часто с предустановками, например - данные только за сегодня, только в "рабочем" статусе и т.д. Если речь идет про отображение списка сложных документов, например, накладных с 2-мя десятками полей, то окно задания условий может иметь несколько закладок и все равно не решать всех задач. Но, как это часто бывает, все украдено придумано до нас ;)
 
Рис.1 TcxFilterControl в работе



Описанную проблему чудно решают  TcxFilterControl и TcxDBFilterControl от DevExpress. Эти 2 компонента - визуальные построители условий с возможностью получить соответствующий SQL. Вообще-то у DevExpress есть .Net линейка продуктов, примерно аналогичных тому, что они делают под Delphi, но пользоваться не приходилось, поэтому дальше только про VCL ветку...



Рис.2 TcxFilterControl/TcxDBFilterControl в дизайнере.

В отличии от самостоятельной реализации "мастера поиска" это решение, как минимум, на первых порах будет более масштабируемым - при добавлении новых полей в запросе, который фильтруем, форму надо доделывать, а FilterControl подхватит поля сразу. Дополнительная настройка понадобится только если в FilterControl мы хотим увидеть списки подстановок. Основная разница между этими контролами в том, что TcxDBFilterControl соединяется с TDataSet, а TcxFilterControl c TcxGridDBTableView. Т.о. TcxDBFilterControl можно использовать, даже если в проекте отсутствует cxGrid, что может быть полезно при модернизации старых проектов. В 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)
что пригодно и для локального фильтра и для запроса к базе данных.

Итог - сделав то, в чем часто упрекают программистов, использующих мощные средства - поставив компонент на форму ;) мы дали пользователю в руки возможность очень гибко строить запросы. Минусов видится 2 - аскетичный внешний вид и некоторая сложность для неподготовленных пользователей. Плюсы - масштабируемое и гибкое средство генерации условий при минимальных затратах.

Немає коментарів:

Дописати коментар