Фильтрация по составному индексу
Если индекс, по которому необходимо осуществить фильтрацию, состоит более чем одного поля:
• при использовании метода Set Range значения полей должны перечисляться через запятую внутри квадратных скобок;
• при использовании SetRangeStart, SetRangeEnd и т.д. значение каждого поля должно устанавливаться явно.
Пример.
Пусть рассмотренный выше НД отсортирован по индексу, состоящему из полей 'GrNum;Tovar'. Реализуем фильтрацию записей по заданному значению поля GrNum и любому значению поля Tovar (рис.8.29).Для простоты проверку правильности ввода номера группы не производим. Обработчик выбора CheckBoxl ("Фильтровать") выглядит так:
procedure TFormI.CheckBoxIClick(Sender: TObject);
var GrNumTmp : Integer;
TovarTmp : String;
begin
IF CheckBoxl.Checked THEN
begin
GrNumTmp := StrToInt(Editi.Text);
TovarTmp := Edit2.Text;
{
——————фильтрация записей в НД————}WITH Tablel do begin
CancelRange;
SetRange([GrNumTmp,TovarTmp],[GrNumTmp,'яя']) ;
END; {with}
end {then}
ELSE
{
————————отмена фильтрации ———}Tablel.CancelRange;
end;
Реализацию выборки обеспечивает метод
SetRange([GrNumTmp,TovarTmp],[GrNumTmp,'яя']);
Интересно, что если требуется показывать в НД все записи группы, начинающиеся со значения в Edit2.Text, то в качестве значения товара в конечном условии фильтрации нужно объявить максимально возможное значение, которое может встретиться в качестве названия товара. Поскольку строчные буквы имеют бoльшие коды, чем заглавные, и название товара не может начинаться с 'яя', эти символы вполне могут использоваться как верхний ограничитель наименования товара.
Пусть введена группа и не введено наименование товара. В этом случае в отфильтрованный НД попадут все товары данной группы, т.е. записи , у которых определено наименование товара (рис.8.30):
Пусть введен номер группы и наименовании товара - 'Макароны'. В этом случае в отфильтрованный НД попадут товары данной группы, у которых наименование больше или равно "Макароны" (рис.8.31):