При использовании фильтрации по выражению набор данных ограничивается записями, удовлетворяющими выражению фильтра, задающему условия отбора записей.
Достоинством фильтрации по выражению является то, что она применима к любым полям, в том числе к неиндексированным. В связи с тем, что в процессе отбора просматриваются все записи таблицы, фильтрация по выражению эффективна при небольшом количестве записей.
Для задания выражения фильтра используется свойство Filter типа string. Фильтр представляет собой конструкцию, в состав которой могут входить сле-дующие элементы:
1. имена полей таблиц;
2. литералы;
3. операции сравнения;
4. арифметические операции;
5. логические операции;
6. круглые и квадратные скобки.
Если имя поля содержит пробелы, то его заключают в квадратные скобки, в противном случае квадратные скобки необязательны.
Литерал представляет собой значение, заданное явно, например, число, строка |или символ. Отметим, что имена переменных в выражении фильтра использо-вать нельзя. Если в фильтр требуется включить значение переменной или свой-ства какого-либо компонента, то это значение должно быть преобразовано в строковый тип.
Операции сравнения представляют собой обычные для языка Pascal отношения >> => <=> >=и о.
Арифметическими являются операции +, -, * и / (сложения, вычитания, умно-жения и деления, соответственно).
В качестве логических операций можно использовать AND, OR и NOT (логическое умножение, сложение и отрицание, соответственно).
Круглые скобки применяются для изменения порядка выполнения арифметиче ских и логических операций. Если выражение фильтра не позволяет сформировать сложный критерий фильт-рации, то в дополнение к нему можно использовать обработчик события OnFilterRecord.
Для активизации и деактивизации фильтра применяется свойство Filter типа boolean. По умолчанию это свойство имеет значение False, и фильтрация выключена. При установке свойству Filtered значения True фильтрация включается, и в набор данных отбираются записи, которые удовлетворяют фильтру, записанному в свойстве Filter. Если выражение фильтра не задано (по умолчанию), то в набор данных попадают все записи.
Параметры фильтрации задаются с помощью свойства FilterOptions типа TFilterOptions. Это свойство принадлежит к множественному типу и может принимать комбинации двух значений:
1. focaseinsensitive — регистр букв не учитывается, т. е. при задании фильтра Post = 'Водитель' слова Водитель, ВОДИТЕЛЬ или водитель будут восприняты как одинаковые. Значение focaseinsensitive рекомендуется отключать, чтобы различать слова, написанные в различных регистрах.
2. foNoPartiaicompare — выполняется проверка на полное соответствие содержимого поля и значения, заданного для поиска. Обычно применяется для строк символов. Если известны только первые символы (или символ) строки, то нужно указать их в выражении фильтра, заменив остальные символы на звездочки * и выключив значение foNoPartiaicompare. Например, при выключенном значении foNoPartiaicompare для фильтра Post = ‘в*’ будут отобраны записи, у которых в поле Post содержатся значения водитель, вод., Вод-ль ИЛИ Врач.
По умолчанию все параметры фильтра выключены, и свойство FilterOptions имеет значение [ ].
Часто удобно предоставить пользователю список готовых выражений (шаблонов) для выбора. При этом пользователь получает также возможность редактировать выбранное выражение и корректировать весь список. Такой режим реализуется, например, с помощью компонентов comboBox и Memo.
Если набор условий фильтрации ограничен и не изменяется, то пользователь может управлять отбором записей с помощью таких компонентов, как независимые (checkBox) и зависимые (RadioButton) переключатели.
В обработчике события onFilterRecord можно определять дополнительные к выражению фильтра условия фильтрации. По своему действию основные и дополнительные условия как бы соединены логической операцией AND, т. е. для отбора записи в набор данных требуется соблюдение обоих условий. В отличие от выражения фильтра, в обработчике события OnFilterRecord можно кодировать любые сколь угодно сложные проверки с помощью средств языка Object Pascal. Таким образом, набор данных Table допускает два способа задания условий фильтрации: с помощью выражения фильтра Filter и в обработчике события OnFilterRecord.
В случае набора данных Query для отбора записей можно использовать:
1. SQL-запрос;
2. обработчик события OnFilterRecord;
3. выражение фильтра.
Напомним, что для связанных таблиц на отбор записей в набор данных также влияет ограничение, налагаемое отношением "главный-подчиненный" между таблицами БД.