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

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


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

    В отличии от самостоятельной реализации «мастера поиска» это решение, как минимум, на первых порах будет более масштабируемым — при добавлении новых полей в запросе, который фильтруем, форму надо доделывать, а FilterControl подхватит поля сразу. Дополнительная настройка понадобится только если в FilterControl мы хотим увидеть списки подстановок. Основная разница между этими контролами в том, что TcxDBFilterControl соединяется с TDataSet, а TcxFilterControl c TcxGridDBTableView. Т.о. TcxDBFilterControl можно использовать, даже если в проекте отсутствует cxGrid, что может быть полезно при модернизации старых проектов.

    В TcxFilterControl и TcxDBFilterControl условия строятся в древовидном виде, поэтому довольно легко понять, какой текст будет генерировать компонент. Для добавления условия на текущем уровне выбираем пункт «Добавить условие».
    image
    Рис.3 добавление условия в FilterControl

    Для добавления подуровня выбираем «Добавить группу».
    image
    Рис.4 добавление группы в FilterControl

    Подкупает то, что «из коробки» работают подстановки имен полей, подстановки условий (равно/не равно, больше/меньше, для дат вообще огромный выбор предусловий), подстановки искомых значений из списков, календарей,…
    image
    Рис.5 выпадающий список полей

    image
    Рис.6 выпадающий список условий на поле типа Date

    image
    Рис.7 выпадающий список имен сотрудников из таблицы-справочника

    Также можно задавать различные булевские операции для значений внутри группы и между группами условий.
    image
    Рис.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 — аскетичный внешний вид и некоторая сложность для неподготовленных пользователей. Плюсы — масштабируемое и гибкое средство генерации условий при минимальных затратах.
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 4

      0
      Раз уж использовать DevExpress, то лучше и использовать тогда их гриды, где уже все эти фильтры есть.
        0
        да! гриды у них шикарные!!!
        простые в использовании но при этом мощные!!!

        не только гриды, конечно. у них много полезных контролов и для винформ, и для веба.
          0
          вы не вчитались в статью ;) я упомянул, что эти фильтры МОЖНО использовать использовать без cxGrid. а фильтры, которые есть в гридах:
          во-первых — работаю локально (а не всегда нужно/можно вытянуть все записи)
          во-вторых используют те же механизмы (если TcxFilterControl цепляем к гриду) что и сам грид, т.е. его можно использовать для визуализации заданных на самом гриде условий и им же их задавать…
          форма рабочего проекта, с которой делались скрины к статье справа содержит таки cxGrid :), фильтры которого продолжают работать для локального поиска, а TcxFilterControl, который на картинке, используется для отбора из базы, т.е. всему свое место — и гридам и фильтрам :)
            0
            Да нет, вчитался и согласен, но не целиком. Фильтры cxGrid можно сделать и не локальными (у полей грида вроде как есть методы для получения его возможных значений), а давать пользователю такие фильтры для изначального отбора данных — пользователю вряд ли такое понравится, только если продвинутому в каких-нибудь служебных местах или себе, любимому, для поддержки :)

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое