Наиболее эффективным способом отбора записей в набор данных (особенно из больших таблиц) является создание и выполнение соответствующего запроса SQL. Но что делать, если набор данных функционирует на базе табличного компонента? В этом случае на помощь приходит встроенный в набор данных механизм фильтрации данных.
Применение фильтра основано всего на двух основных свойствах и одном вспомогательном. Текст фильтра должен содержаться в свойстве Filter, a свойство Filtered включает и выключает фильтр. Параметры фильтра определяются свойством FilterOptions.
Примечание
Компонент TQuery
также может использовать фильтры. Эта возможность подчас позволяет легко и изящно решать довольно сложные проблемы, которые иначе требуют изменения текста запроса или создания нового компонента запроса.
При использовании фильтра его текст транслируется в синтаксис SQL и передается для выполнения на сервер или через соответствующий драйвер в локальную СУБД.
Фильтры можно создавать двумя способами:
Фильтры можно разделить на статические и динамические.
Статические фильтры создаются во время разработки приложения и могут использовать как свойство Filter, так и метод OnFilterRecord.
Динамические фильтры можно создавать и редактировать во время выполнения приложения, для них используется только свойство Filter.
При создании текста фильтра для свойства Filter используются имена полей соответствующей таблицы БД, а для задания отношений применяются все операторы сравнения (>, >=, <, <=, =, <>) и логические операторы (AND, OR, NOT):
Fieldl>100 AND Field2=20
Сравнивать между собой два поля нельзя. Следующий фильтр вызовет ошибку при попытке использования:
ItemCount=Balance AND InputPrice>OutputPrice
При создании динамических фильтров можно изменять как выражение фильтра целиком, так и его части. Например, ограничивающее значение для поля можно задавать при помощи элементов управления формы, что позволяет пользователю приложения управлять фильтрацией набора данных:
procedure TForml.EditlChange(Sender: TObject);
begin
with Tablel do begin
Filtered := False;
Filter := 'Fieldl>=' + TEdit(Sender).Text; Filtered := True;
end;
end;
В фильтрах можно производить отбор по частям строк для строковых полей, для этого используется символ звездочка:
ItemName='A*'
Фильтр начинает работать только после того, как свойству Filtered присваивается истинное значение. Перед изменением текста динамического фильтра или для отключения фильтра свойству Filtered присваивается значение False.
Параметры фильтра определяются свойством FilterOptions:
property FiiterOptions: TFilterOptions;
TFilterOption = (foCaselnsensitive, foNoPartialCompare);
TFilterOptions = set of TFilterOption;
Параметр foCaselnsensitive, будучи включенным в свойстве, отключает сравнение строковых значений с учетом регистра символов.
Параметр foNoPartialCompare отключает отбор строковых значений по части строки.
Метод-обработчик onFilterRecord имеет следующее объявление:
type TFilterRecordEvent = procedure(DataSet: TDataSet; var Accept:
Boolean) of object;
property OnFiiterRecord: TFilterRecordEvent;
Если этот метод создан для набора данных, то он вызывается для каждой его записи. Программный код метода должен присваивать параметру Accept истинное или ложное значение. В результате запись передается в набор данных или отсекается:
procedure TForml.TablelFilterRecord(DataSet: TDataSet;
var Accept: Boolean);
begin
Accept := ArchOrdersArchDat.AsString >= DateEditl.Text;
end;
Важнейшее преимущество метода onFilterRecord, по сравнению со свойством Filter, заключается в том, что в этом методе-обработчике можно сравнивать поля и производить вычисления над их значениями.
Недостатком метода является недостаточная гибкость, хотя такой фильтр можно модифицировать путем присвоения методу процедурной переменной, содержащей ссылку на новый метод.