Фильтрация данных. В нашем телефонном справочнике нет самого главного – возможности поиска

В нашем телефонном справочнике нет самого главного – возможности поиска. Представьте себе, что у вас в базе данных находятся телефоны ста человек. Как вы будете искать телефон определенного человека? Без возможности поиска тут очень тяжело.

Для организации поиска в компоненте TADOTable есть свойство Filter. В нем можно указывать условие, по которому будут выбираться данные для отображения. Но для того, чтобы фильтр заработал, надо еще установить свойство Filtered нашей таблицы в true. После этого можно изменять свойство Filter и все изменения сразу же будут вступать в силу.

Свойство Filter – это строка. В ней нужно писать текст условия в виде:

Поле [Оператор сравнения] ‘Значение’

Например, если вы хотите отобразить все записи, в которых поле Фамилия равно значению Сидоров, то нужно написать:

ADOTable1.Filter:= ‘Фамилия = ’’ Сидоров ’’ ’;

Обратите внимание, что значение нужно указывать в одинарных кавычках. А чтобы внутри строки поставить одинарную кавычку, ее нужно поставить дважды:

‘После этого текста будет одинарная кавычка ‘’ это продолжение текста’

Именно таким способом мы ставим перед значением одинарную кавычку. После значения нам нужно поставить одинарную кавычку и закрыть строку, поэтому мы ставим три одинарные кавычки (две для того, чтобы поставить кавычку для значения и одна для конца строки).

Это был пример условия на равенство, но можно использовать и операции больше или меньше. Можно даже создавать составные операторы сравнения, в которых сравниваются сразу два или более значений. Например:

ADOTable1.Filter:= ‘Фамилия = ’’Сидоров’’ or Телефон = ’’ 332652 ’’ ’;

В этом примере происходит поиск всех записей, в которых поле Фамилия равно значению Сидоров или поле Телефон имеет значение 332652. Для объединения двух условий можно использовать операторы логического типа or, and.

Внимание! Помните, что если имя поля состоит из двух слов, то его нужно заключать между квадратными скобками [ и ].

Теперь переходим к программированию. Будем добавлять к нашему проекту возможность поиска.

 
 

Для начала улучшим главную форму приложения. Для этого добавьте панель, на которой будет располагаться текст «Фамилия» и строка ввода Edit1.

Теперь создайте обработчик события OnChange для строки ввода Edit1. Когда пользователь изменил текст в строке ввода, мы должны изменить и фильтр. Напишем в этом обработчике следующий код:

procedure TForm1.Edit1Change(Sender: TObject);

Begin

if Length(Edit1.Text)>0 then

DataModule2.ADOTable1.Filtered:=true

Else

DataModule2.ADOTable1.Filtered:=False;

DataModule2.ADOTable1.Filter:= ' Фамилия >= ' ' ' + Edit1.text + ' ' ' ';

end;

Сначала мы проверяем строку. Если в строке поиска что-то есть, то включаем фильтр, иначе его можно отключить, чтобы показать всю таблицу. После этого создается условие фильтра: ' Фамилия >= ' ' ' + Edit1.text + ' ' ' '. Здесь используется знак >, чтобы отображать все записи, похожие на введенный текст.

Запустите проект. Попробуйте осуществить поиск человека по его фамилии. Вы наверняка заметили, что фильтр работает не всегда правильно. Для улучшения возможностей фильтрации выполните следующее:

· Перейдите в модуль данных (DataModule) и создайте для компонента ADOTable1 обработчик события OnFilterRecord. Он вызывается при включенной фильтрации каждый раз, когда программе надо выяснить, соответствует ли строка фильтру. Здесь мы можем самостоятельно управлять логикой фильтрации.

· Напишите в созданном обработчике следующий код:

procedure TDataModule2.ADOTable1FilterRecord(DataSet: TDataSet; var Accept: Boolean);

Begin

Accept:= false;

if copy(ADOTable1DSDesigner.AsString,1,Length(Form1.Edit1.Text))=Form1.Edit1.Text

then Accept:= True;

end;

В качестве второго параметра в обработчик передается булева переменная Accept. Если мы в нее занесем значение false, то текущая строка не соответствует фильтру. Если true, то строка соответствует и ее можно отображать.

В самом начале мы даем переменной Accept отрицательное значение. После этого происходит проверка соответствия текущей строки фильтру. Для этого нужно понять, что происходит во второй строке кода. Рассмотрим ее по частям:


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: