Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 3000555.doc
Скачиваний:
31
Добавлен:
30.04.2022
Размер:
19.12 Mб
Скачать

8.5.1. Фильтрация данных в базе

Для поиска в базе данных по технологии ADO у компонента TADOTаblе есть свойство Filter.

В нем можно указывать условие, по которому будут отображаться данные.

Например, Вы можете указать там отображение только записей, в которых поле Фамилия содержит значение Иванов.

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

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

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

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

ADOTablel.Filter:='Фамилия=''Иванов''';

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

' Идет текст далее стоит одинарная кавычка'' и после продолжение текста’

Именно так записывается значение с кавычкой внутри текста. И именно таким способом мы ставим перед значением одинарную кавычку.

Поэтому указанная ниже строка имеет такой вид

ADOTablel.Filter:='Фамилия=''Сидоров''';

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

Если вы не хотите мучиться с такими кавычками, то можете воспользоваться функцией QuotedStr. Ей нужно передать строку, а она вернет вам ее в кавычках.

Таким образом, ваш код может упроститься до следующего:

ADOTablel.Filter:='Фамилия='+ QuotedStr(Сидоров);

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

ADOTablel.Filter:='Фамилия=''Иванов'' or Телефон=''2462523' ";

В этом примере происходит поиск всех записей, в которых поле Фамилия равно значению Иванов и поле Телефон имеет значение 2462523.

Для объединения двух условий используется оператор or. Можно также использовать оператор логического типа — and.

Если имя поля состоит из двух слов, то его нужно заключать в квадратные скобки [ ]. Допустим, что у нас поле Город состоит из двух слов, например, :— Название города, в этом случае фильтр по этому полю будет выглядеть так:

ADOTablel.Filter:=' [Название города]=''Москва' " ;

Теперь можно перейти к доработке нашего приложения.

Для этого нужно открыть наше приложение и добавить к нему возможность поиска.

Для начала можно изменить Главную форму, а именно на форму установить компонент TLabel c текстом Найти и компонент и TEdit (строка ввода) с именем FindEdit. Теперь можно создать следующий обработчик события onChange для строки ввода.

Если пользователь изменил текст в строке ввода, то нужно изменить и фильтр.

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

Procedure TForml.FindEditChange(Sender: TObject);

begin

if Length-(FindEdit.Text)>0 then DataModulel.BookTable.Filtered:=true

else

DataModulel.BookTable.Filtered:=false;

DataModulel.BookTable.Filter:='Фамилия>'''+FindEdit.Text+'''';

End;

в этом обработчике сначала проверяется строка. Если в строке поиска что-то есть, то включаем фильтр, иначе его можно отключить, чтобы показать всю таблицу.

После этого создается условие фильтра: 'Фамилия>'''+FindEdit. Text+''''. Здесь используется знак больше, чтобы отображать все похожие записи на введенный текст.

Если установить знак равенства и пользователь введет букву "с", то в таблице ничего отображаться не будет, потому что нет такой фамилии. А при знаке "больше" будут отображаться все фамилии, начинающиеся на букву "с"

Знак "больше" в базах данных Access работает не очень хорошо. Компонент ADOTable хорошо и быстро работает только со знаком равенства (жесткий поиск). Там, где поиск должен быть не жестким, лучше использовать запросы SQL, использование которых рассмотрим ниже.

Как уже говорилось, фильтры в ADO работают плохо. Но Delphi представляет очень хорошую возможность расширить возможности фильтрации.

Перейдем в модуль данных (DataModuieUnit) и создадим для компонента SpisokTable обработчик события OnFiiterRecord.

Он вызывается при включенной фильтрации и каждый раз, когда программе надо выяснить, соответствует ли строка фильтру. Здесь можно самостоятельно управлять логикой фильтрации.

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

procedureTDataModulel.SpisokFilterRecord(DataSet:TDataSet;

var Accept: Boolean);

begin

Accept:=false;

if copy(SpisokTableDSDesigner.AsString,1,Length(Forml.FindEdit.Text))=

Forml.FindEdit.Text then

Accept:=true;

end;

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

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

Copy(SpisokTableDSDesigner.AsString,1,Length(Forml.FindEdit.Text))

:Здесь SpisokTableDSDesigner — имя поля Фамилия. Если дважды щелкнуть по компоненту SpisokTable и в появившемся редакторе полей посмотреть свойство Name поля Фамилия, то вы должны увидеть именно это имя.

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

Результат сравнивается с содержимым строки ввода для фильтра. Если фамилия в текущей строке базы данных начинается с текста, указанного в качестве фильтра, то эта строка будет отображаться.

Теперь наш фильтр стабилен и отлично работает. Если изначально ADO плохо работает с этим механизмом, то теперь проблем нет.

Таким образом, можно сделать фильтрацию любой сложности. Единственный недостаток — медленная скорость обработки фильтров.

Запросы SQL с большими данными работают быстрее.