TcxFilterControl та TcxDBFilterControl
У роботі майже будь-якої бази даних настає момент, коли показувати всі дані немає сенсу, а іноді й можливості. І тут усі починають захоплено городити всілякі форми для початкового відбору даних, часто з передустановками, наприклад дані лише за сьогодні, тільки в «робочому» статусі і т.д. Якщо йдеться про відображення списку складних документів, наприклад, накладних з двома десятками полів, вікно завдання умов може мати кілька закладок і все одно не вирішувати всіх завдань. Але, як це часто буває, все викрадено придумано до нас ;)

Описану проблему дивно вирішують TcxFilterControl та TcxDBFilterControl від DevExpress. Ці два компоненти - візуальні будівельники умов з можливістю отримати відповідний SQL. Взагалі-то DevExpress має .Net лінійку продуктів, приблизно аналогічних тому, що вони роблять під Delphi, але користуватися не доводилося, тому далі тільки про VCL гілку ... Рис.2 TcxFilterControl/TcxDBFilterControl в дизайнері.
На відміну від самостійної реалізації «майстра пошуку» це рішення, як мінімум, спочатку буде більш масштабованим — при додаванні нових полів у запиті, який фільтруємо, форму треба доробляти, а FilterControl підхопить поля відразу. Додаткове налаштування знадобиться лише якщо FilterControl ми хочемо побачити списки підстановок. Основна різниця між цими контролами полягає в тому, що TcxDBFilterControl з'єднується з TDataSet, а TcxFilterControl з TcxGridDBTableView. Т.о. TcxDBFilterControl можна використовувати, навіть якщо у проекті немає cxGrid, що може бути корисним при модернізації старих проектів.
У TcxFilterControl і TcxDBFilterControlумови будуються у деревоподібному вигляді, тому досить легко зрозуміти, який текст генеруватиме компонент. Для додавання умови на поточному рівні вибираємо пункт «Додати умову». Рис.3 додавання умови до FilterControl
Для додавання рівня вибираємо «Додати групу».

Підкуповує те, що «з коробки» працюють підстановки імен полів, підстановки умов (рівно/не однаково, більше/менше, для дат взагалі величезний вибір передумов), підстановки значень значень зі списків, календарів, …


Рис.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 - аскетичний зовнішній вигляд і деякаскладність для непідготовлених користувачів. Плюси - масштабований і гнучкий засіб генерації умов за мінімальних витрат.
А у нас тут можна отримати грант на тестовий період Яндекс.Хмари. Варто лише у полі «секретний пароль» запровадити «Хабр»