Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
фильтрация_дополнительно.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
149.5 Кб
Скачать

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, который обычно также размещается в модуле данных.