Наиболее эффективным способом отбора записей в набор данных (особенно из больших таблиц) является создание и выполнение соответствующего запроса SQL. Но что делать, если набор данных функционирует на базе табличного компонента? В этом случае на помощь приходит встроенный в набор данных механизм фильтрации данных.
Применение фильтра основано всего на двух основных свойствах и одном вспомогательном. Текст фильтра должен содержаться в свойствеFilter, a свойство Filtered включает и выключает фильтр. Параметры фильтра определяются свойством FilterOptions.
Примечание
Компонент TQuery также может использовать фильтры. Эта возможность подчас позволяет легко и изящно решать довольно сложные проблемы, которые иначе требуют изменения текста запроса или создания нового компонента запроса.
При использовании фильтра его текст транслируется в синтаксис SQL и передается для выполнения на сервер или через соответствующий драйвер в локальную СУБД.
Фильтры можно создавать двумя способами:
- при помощи свойства Filter создаются довольно простые фильтры, для которых достаточно предоставляемого механизмом фильтрации синтаксиса;
- для создания более сложных фильтров с применением всех возможных средств языка программирования применяется метод-обработчик набора данных OnFilterRecord.
Фильтры можно разделить на статические и динамические.
Статические фильтры создаются во время разработки приложения и могут использовать как свойство 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, заключается в том, что в этом методе-обработчике можно сравнивать поля и производить вычисления над их значениями.
Недостатком метода является недостаточная гибкость, хотя такой фильтр можно модифицировать путем присвоения методу процедурной переменной, содержащей ссылку на новый метод.