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

7.5. Фильтрация записей

7.5.1. Обзор методов

Помимо описываемых ниже методов, присущих только TTable, наборы данных имеют также общие свойства, методы и события для фильтрации записей - Filter, Filtered, OnFilterRecord, FindFirst, FindLast, FindNext, FindPrior. Они описаны в пре­дыдущей главе.

Для фильтрации записей ТБД собственно TTable имеет следующие методы:

SetRangeStart - устанавливает нижнюю границу фильтра;

EditRangeEnd - устанавливает верхнюю границу фильтра;

ApplyRange - осуществляет фильтрацию записей в TTable;

SetRange - имеет тот же эффект, что и последовательное выполнение методов SetRangeStart, SetRangeEnd и ApplyRange. В качестве параметра исполь­зуются массивы констант, каждый из которых содержит значения клю­чевых полей.

Заметим, что фильтрация методами ApplyRange/SetRange должна проводиться по ключевым полям. По умолчанию берется текущий индекс, определяемый свойством TTable.IndexName или TTable.IndexFieldNames. Если значения этих свойств не уста­новлены, по умолчанию используется главный индекс ТБД. Поэтому, если нужно использовать индекс, отличный от главного, необходимо явно переустановить значе­ние свойства TTable.IndexName (имя текущего индекса) или TTable.IndexFieldNames (список полей текущего индекса).

7.5.2. Использование SetRange

Метод

procedure SetRange(const StartValues, EndValues: array of const);

показывает в НД только те записи, индексные поля которых лежат в диапазоне [StartValues..EndValues].

Пример. Пусть в НД Table1 показываются все записи из ТБД tov.DB (Товары). Включим в структуру записи НД Table1 два поля: GrNum (Номер группы) и Tovar (Наименование товара). Пусть текущий индекс построен по полю GrNum.

Тогда для фильтрации записей таким образом, чтобы показывались записи только с определенным номером группы, располагаем в форме компоненты Edit1 (для ввода мера группы) и Checkbox1. Если CheckBox1 отмечен (Checkbox1.Checked = True), то производится фильтрация по номеру группы, введенному в Edit1, в противном случае называются все записи из ТБД (рис. 7.17).

Рис. 7.17. Неотфильтрованный набор данных.

Напишем такой обработчик события CheckBox1.OnClick:

procedure TForm1.CheckBox1Click(Sender: TObject) ;

var

GrNumTmp: Integer;

begin

if CheckBoxl.Checked then

begin

GrNumTmp := StrToInt(Edit1.Text) ;

{---------------фильтрация записей в НД---------------}

with Tablel do

begin

CancelRange;

SetRange([GrNumTmp],[GrNumTmp]) ;

end; {with}

end else

{---------------отмена фильтрации---------------}

Tablel.CancelRange;

end;

В отфильтрованном НД показываются только те записи, индексное поле текущего индекса у которых (в нашем случае поле GrNum) имеет значение, лежащее в заданном диапазоне. В данном случае диапазон определяется переменной GrNumTmp. Поэтому для GrNumTmp = 3 будут показаны записи, принадлежащие к одной группе 3 (рис. 7.18):

Рис. 7.18. Набор данных, отфильтрованный по группе 3.

Если бы мы захотели, чтобы в НД фильтровались записи из нескольких групп, то нам следовало бы добавить в форму второй компонент Edit2, в котором вводился бы номер конечной группы, в то время как в Edit1 вводился бы номер начальной группы:

procedure TForml.CheckBoxIClick(Sender: TObject);

var

GrNumTrnpl,GrNumTmp2: Integer;

begin

if CheckBoxl.Checked then

begin

GrNumTmp1 := StrToInt(Edit1.Text);

GrNumTmp2 := StrToInt(Edit2.Text) ;

{-----------фильтрация записей----------}

with Tablel do

begin

CancelRange;

SetRange ([GrNumTmp1], [GrNumTmp2]) ;

end; {with}

end else

{------------отмена фильтрации-----------}

Tablel.CancelRange;

end;

Р езультаты фильтрации записей с номерами группы от 2 до 4 показаны на рис. 7.19.

Рис. 7.19. Набор данных отфильтрован по группам в диапазоне 2...4.