Фильтрация записей. Фильтрация по выражению
В процессе работы с данными часто возникает необходимость отбора записей, удовлетворяющих каким-либо критериям. Для этого к наборам данных применяют фильтры.
Фильтр — это набор ограничений для записей, которые будут выделены в наборе данных.
Процесс задания фильтра называется фильтрацией записей. Среда Delphi позволяет фильтровать записи либо по выражению, либо по диапазону.
По умолчанию отображаются все записи набора данных, то есть фильтр не используется.
Фильтрация по выражению ограничивает набор данных записями, которые удовлетворяют выражениям, записанным в фильтре. Этот вид фильтрации применим к любым полям, в том числе и неиндексированным.
ПРИМЕЧАНИЕ: Фильтрация по выражению эффективна в случае, когда набор данных содержит небольшое число записей, так как при фильтрации последовательно просматриваются все записи набора данных.
Для задания выражения фильтра используется свойство Filter типа Stream набора данных. В состав этого выражения могут входить:
- арифметические операции, такие как сложение, вычитание, умножение и деление, обозначаемые символами +, -, * и/;
- знаки логических операций: AND, OR, NOT и т. д.;
- имена полей таблиц. Если внутри имени поля содержатся пробелы, его заключают в квадратные скобки, например [Tel Number];
- круглые скобки для определения порядка выполнения арифметических и логических операций;
- литералы, то есть явно заданные значения, например строка, символ или число;
- операции сравнения, то есть обычные операции >,<,=>,<= и о.
Если при фильтрации невозможно сформировать сложные критерии фильтрации или отбора, то в дополнение к нему используется обработчик OnFilterRecord.
При работе с НБД при значении свойства Filtered=True НБД будет отфильтрован, т.е. фильтрация некоего НБД происходит при команде о необходимости фильтрации. Синтаксис фильтра схож с синтаксисом предложения WHERE SQL-запроса.WHERE <имя столбца табл.1> <оператор> <имя столбца табл.2>
Обработчик события OnFilterRecord имеет 2 параметра: имя фильтруемого НБД и переменную Accept. Если НБД будет отфильтрован, т.е. текущая запись будет удовлетворять критерию, значение параметра Accept=true.
Когда приложение обрабатывается событием OnFilterRecord НБД переводится из состояния просмотра в состояние фильтрации. Это предотвращает возможную модификацию НБД в момент фильтрации.
Для активации и деактивации используется свойство filter=true/false. По умолчанию false.
Свойство FilterOptions набора данных позволяет задавать параметры фильтрации. Значение комбинируется из двух параметров:
- foCaseInsensitive — при задании фильтра не учитывать регистр букв. То есть, например, для фильтра Name = 'Иван' будут выбраны записи «Иван», «ИВАН», «иван» и другие;
- foNoPartialCompare — проверять на полное соответствие значения поля фильтру. Применяется для строгого поиска. Если вы хотите осуществлять фильтрацию записей по частичному совпадению фильтра, отключите этот параметр. В таком случае можно заменить незначащие символы символом звездочки *. В результате при заданном фильтре Name = 'И*' будут выбраны все записи, имена людей в которых начинаются с буквы И.
По умолчанию оба параметра отключены.
Пример: при нажатии на кнопку Фильтровать фильтр активизируется при присваивании свойству Filtered=true. Редактор Edit1 будет использоваться для задания выражения фильтра и кнопка Все Записи будет использоваться для отключения фильтрации.
procedure TForm1.FormCreate(…);
begin
Zakazchik.FilterOption:=[foCaseInsensitive];
Zakazchik.Filtered:=false;
end;
procedure TForm1.Button1Click(…);
begin
Zakazchik.Filtered:=true;
Zakazchik.Filter:=Edit1.Text;
end;
procedure TForm1.Button2RecirdClick(…);
begin
Zakazchik.Filtered:=false;
end;
Если набор условий фильтрации ограничен и не изменяется, можно использовать компоненты для выбора условий CheckBox и RadioButton.
При работе с датами можно использовать установку дат с помощью компонента TDataTimePicker. Обработчик события OnFilterRecord вызывается для каждой записи, считываемой в НБД, поэтому его код должен быть коротким и оптимизированным для хорошей производительности фильтра.
Событие OnFilterRecord генерируется для каждой записи и при использовании методов поиска FindFirst, FindLast, FindNext.
В случае НБД Query для отбора записей можно использовать: SQL-запрос, обработчик события OnFilterRecord, выражение фильтрации.