Хочу рассказать о нескольких полезных способах фильтрации данных, которые можно применить, чтобы достигнуть эффекта отсеивания данных, по мере ввода искомой строки. На пример в таблице есть столбец "Фамилия", пользователь вводит в поле поиска последовательно буковки и данные фильтруются(отсеиваются) - пользователь ввел первую буковку и выводятся все фамилии, начинающиеся с первой буквы, потом только те которые начинаются с первой и второй и т.д. пока не найдет , что то полезное или вообще ничего не найдет. Т.е. фильтрация происходит не по полному совпадению, а по части введенной пользователем строки. Так же будут приведены способы фильтрации по нескольким полям.
Немного теории.
Основное преимущество фильтров по сравнению с поиском состоит в том, что применять фильтр можно без всяких подготовительных действий над набором данных, так как фильтры не используют индексы. Один минус - фильтрация выполняется медленнее чем поиск основанный на индексах.
Есть два варианта с помощью которых можно задать условие на фильтрацию. Можно использовать их по отдельности или оба сразу. Первый - строковое значение в свойстве Filter. Второй - это условие описанное в обработчике события OnFilterRecord. Начинается фильтрация как только свойство Filtered, установлено в True.
Свойство Filter.
Сначала опишу возможности которые предоставляет свойство Filter, а во второй части главы будет рассказано как можно использовать событие OnFilterRecord. Именно свойство Filter нужно использовать в первую очередь, т.к. это дает значительный выигрыш в производительности при обработке больших по объему наборов данных (по сравнению с событием OnFilterRecord). Особенно это заметно при большом количестве записей в таблице (~свыше 100.000), ну и конечно многое зависит от мощности машины. При малом объеме обрабатываемых данных, разница в скорости не заметна.
Ну что ж приступим. Допустим, есть таблица с полями Фамилия, Имя, Отчество. Нужно фильтровать данные по одному из полей (на выбор), т.е. пользователь должен иметь возможность выбрать по какому из полей фильтровать данные. Для тех кто в танке термины "поле" и "столбец" - обозначают одно и тоже. Задача стоит такая отсеивать данные по мере ввода искомой строки в Edit.
Кидаем на форму компоненты Combobox и Edit. Combobox будет использоваться для выбора столбца, а в Edit будет вводится искомое слово. Заполняем свойство Items в Combobox именами столбцов. Ставим свойство Style у Combobox равным csDropDownList (чтоб что попало не вводили). Затем в обработчике события Edit1Change пишем следующее:
procedure TForm1.Edit1Change(Sender: TObject); begin if Length(Edit1.Text) > 0 then begin ADOTable1.Filtered:=false; ADOTable1.Filter:=Combobox1.Text + ' LIKE ' + #39 + Edit1.Text + '%' + #39; ADOTable1.Filtered:=true; end else ADOTable1.Filtered:=false; end;.