Наиболее эффективным способом отбора записей в набор данных (особенно из больших таблиц) является создание и выполнение соответствующего запроса 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, заключается в том, что в этом методе-обработчике можно сравнивать поля и производить вычисления над их значениями.

Недостатком метода является недостаточная гибкость, хотя такой фильтр можно модифицировать путем присвоения методу процедурной переменной, содержащей ссылку на новый метод.