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

7.5.5. Методы EditRangeStart, EditRangeEnd

Эти методы предназначены для смены условий фильтрации, установленных ранее с использованием соответственно методов SetRangeStart и SetRangeEnd. Напомним, что сама фильтрация в этом случае выполняется методом ApplyRange. Преимущества их использования ясны не всегда. Например, можно было бы предположить, что для рас­смотренной в п.7.5.4 ситуации эти методы способны заменить использование CancelRange:

procedure TForm1.ButtonlClick(Sender: TObject);

var

GrNumTmpl,GrNumTmp2: Integer;

­const

Num: Integer =0;

begin

inc(Num) ;

with Table 1 do

begin

if Num = 1 then

begin

SetRangeStart;

FieldByName('GrNum').AsInteger:= GrNumTmp1;

SetRangeEnd;

FieldByName('GrNum').AsInteger := GrNumTmp2;

Apply Range;

end else

begin

EditRangeStart ;

FieldByName('GrNum').AsInteger:= GrNumTmpI;

EditRangeEnd;

FieldByName('GrNum').AsInteger :.= GrNumTmp2;

ApplyRange;

end

end; {with}

end;

Однако результат будет таким же ошибочным. Указанный код будет правильно ра­ботать только в случае, когда индекс по GrNum является принятым по умолчанию и в процессе работы не изменяется (представим, что в показанном выше примере мы уда­лили переключатели RadioGroup1 для выбора текущего индекса). Однако в этом слу­чае правильно работает и такой код

procedure TForm1.ButtonlClick(Sender: TObject);

var

GrNumTmp1,GrNumTmp2: Integer;

­begin

with Table1 do

begin

SetRangeStart;

FieldByName('GrNum').AsInteger:= GrNumTmp1;

SetRangeEnd;

FieldByName('GrNum').AsInteger := GrNumTmp2;

ApplyRange;

end; {with}

end;

7.5.6. Свойство KeyExclusive

Свойство KeyExclusive применяется для фильтрации записей в TTable с использо­ванием методов SetRangeStart, SetRangeEnd и EditRangeStart, EditRangeEnd.

Свойство KeyExclusive влияет на включение в отфильтрованный НД записей, у кото­рых индексные поля содержат граничные значения диапазона фильтрации. KeyExclusive включается и отключается отдельно для начального и конечного условия фильтрации.

Если в свойство KeyExclusive для данной границы диапазона фильтрации (верхней или нижней) установлено значение False, записи, содержащие в индексном поле (полях) значение, указанное в качестве данной границы диапазона, включаются в от­фильтрованный НД, в противном случае не включаются. По умолчанию применяется значение False. Например:

with Table1 do

begin

CancelRange;

SetRangeStart;

KeyExclusive := True;

FieldByName('GrNum').AsInteger:= GrNumTmpl;

SetRangeEnd;

FieldByName('GrNum').As Integer := GrNumTmp2;

ApplyRange;

end; {with}

7.5.7. Фильтрация по составному индексу

Если индекс, по которому необходимо осуществить фильтрацию, состоит из более чем одного поля:

  • при использовании метода SetRange значения полей должны перечисляться че­рез запятую внутри квадратных скобок;

  • при использовании SetRangeStart, SetRangeEnd и т. д. значение каждого поля должно устанавливаться явно.

Пример. Пусть рассмотренный выше НД отсортирован по индексу, состоящему из полей GrNum и Tovar. Реализуем фильтрацию записей по заданному значению поля GrNum и любому значению поля Tovar. Для простоты проверку правильности ввода но­мера группы не производим. Обработчик выбора CheckBox1 «Фильтровать» выглядит так:

procedure TForm1.CheckBox1Click(Sender: TObject);

var

GrNumTmp: Integer;

TovarTmp: String;

begin

if CheckBoxl.Checked then

begin

GrNumTmp := StrToInt(Edit1.Text);

TovarTmp := Edit2.Text;

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

with Table1 do

begin

CancelRange;

SetRange([GrNumTmp,TovarTmp], [GrNumTmp,'яя']);

end; {with}

end else

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

Table1.CancelRange ;

end;

Реализацию выборки обеспечивает оператор

SetRange([GrNumTmp,TovarTmp],[GrNumTmp, ‘яя’]);

Отметим, что если требуется показывать в НД все записи группы, начинающиеся со значения в Edit2.Text, то в качестве значения товара в конечном условии фильтра­ции нужно объявить максимально возможное значение, которое только может встретиться в качестве названия товара. Поскольку строчные буквы имеют большие коды, чем заглавные, и название товара не может начинаться с 'яя', эти символы вполне могут использоваться как верхний ограничитель наименования товара.

П усть введена группа и не введено наименование товара. В этом случае в отфильт­рованный НД попадут все товары данной группы, т. е. записи, у которых определено наименование товара (рис. 7. 25).

Рис. 7.25. Фильтрация по первой группе. Название товара в условиях фильтрации не указано.

Пусть введен номер группы и наименование товара Макароны. В этом случае в отфильтрованный НД попадут товары данной группы, у которых наименование боль­ше или равно Макароны (рис. 7.26).

Рис. 7.26. Фильтрация по первой группе. Название товара больше или равно «Макароны».