
- •7.5. Фильтрация записей
- •7.5.1. Обзор методов
- •7.5.2. Использование SetRange
- •7.5.3. Методы SetRangeStart, SetRangeEnd, ApplyRange
- •7.5.4. Метод CancelRange
- •7.5.5. Методы EditRangeStart, EditRangeEnd
- •7.5.6. Свойство KeyExclusive
- •7.5.7. Фильтрация по составному индексу
- •7.5.8. Фильтрация по частичному соответствию
- •7.5.9. Фильтрация по части составного индекса
- •7.5.10. Ограничения возможностей фильтрации
- •7.6. Совмещение курсоров двух нд
7.5.8. Фильтрация по частичному соответствию
Для случаев сортировки по символьным полям полезно делать фильтрацию по частичному соответствию индексного поля (полей) условиям фильтрации.
Пример. Пусть рассматривавшаяся выше ТБД отсортирована по наименованию товара Tovar.
Обработчик отметки CheckBox1 («Фильтровать»):
procedure TForm1.CheckBox1Click(Sender: TObject) ;
begin
if CheckBoxl.Checked then
begin
with Table 1 do
begin
CancelRange;
SetRange([Edit1.Text],['яя']);
end; {with}
end else
Tablel.CancelRange ;
end;
В
этом случае в НД будут показаны все
записи с названием товара, равным или
большим указанного в Edit1
(рис. 7.27):
Рис. 7.27. После фильтрации показываются все товары с названием, равным ли большим «М».
Изменим вызов метода SetRange на следующий:
SetRange ([Editl.Text], [Editl.Text + ‘яя']);
Тогда в результате фильтрации в отфильтрованный НД попадут только записи, начинающиеся с введенного в Edit1 фрагмента названия товара, т.е. с буквы «М» (рис. 7.28).
Р
ис.
7.28. После фильтрации показываются все
товары с названием, начинающимся на
«М».
7.5.9. Фильтрация по части составного индекса
В качестве условий фильтрации могут быть заданы не все поля текущего индекса, а только ведущее поле или группа ведущих полей. В частности, для предыдущего примера можно указать в качестве текущего индекс Tovar+GrNum.
Тогда применение метода
SetRange([Editl.Text], [Editl.Text + 'яя']);
означает, что, поскольку в квадратных скобках в качестве начального и конечного условия фильтрации указаны не два значения поля, а одно, фильтрацию следует проводить на предмет соответствия ведущего поля индекса (в нашем случае Tovar) заданному поисковому значению (в нашем случае начальное значение – Edit1.Text, конечное значение – Edit1.Text + 'я я').
7.5.10. Ограничения возможностей фильтрации
Заметим, что рассмотренный механизм фильтрации позволяет отфильтровывать только те записи, у которых значения ключевых полей больше или равны нижней границе и меньше или равны верхней границе фильтрации. Иными словами, затруднительно задать сложное условие типа «все записи, у которых поле А < 100 или поле Z содержит вхождение строки поиск».
При возникновении подобных проблем вместо компонента ТТаble нужно использовать компонент TQuery.
7.6. Совмещение курсоров двух нд
Если в программе одновременно используются два и более компонента TTable, работающие с одной и той же физической таблицей БД, может возникнуть необходимость совмещения курсоров двух НД. Для этой цели применяется метод синхронизации GotoCurrent. Например:
Tablel.GotoCurrent(Table2) ;
что означает установку курсора в НД Table1 на ту же запись, на которой располагается в данный момент курсор НД Table2.
Однако на практике «размножение» идентичных TTable в двух или более формах встречается крйне редко и обычно свидетельствует о неправильном конструировании программы. Вместо того чтобы совмещать курсоры у двух TTable, нужно работать с одним компонентом, помещенным в общедоступный модуль – на главную форму программы или в специально для этих целей предназначенный модуль данных TDataModule. В этом случае в любой программной форме, в которой требуется работа с TTable, нужно лишь сослаться в предложении Uses на модуль данных. После этого форме станут доступны компонент TTable и связанный с ним компонент TDataSourse, который обычно также размещается в модуле данных.