
- •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.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. Фильтрация по первой группе. Название товара больше или равно «Макароны».