Использование SetRange
Метод procedure SetRange(const StartValues, EndValues: array ofconst); показывает в НД только те записи, индексные поля которых лежат в диапазоне [StartValues.. EndValues].
Пример.
Пусть В НД Tablel показываются все записи из ТБД "TOV.DB" (Товары). Включим в структуру записи НД Tablel 2 поля : GrNum (Номер группы, Smallint) и Tovar (Наименование товара, String).Пусть текущий индекс построен по полю 'GrNum'.
Тогда, для фильтрации записей в НД таким образом, чтобы показывались записи только с определенным номером группы, располагаем в форме компоненты Edit1 (для ввода номера группы) и CheckBox1. Если CheckBox1 отмечен (CheckBoxl.Checked = True), то производится фильтрация по номеру группы, введенному в Edit1; если CheckBoxl не отмечен или с него снята отметка (CheckBox1 -Checked = False), в НД показываются все записи из ТБД "TOV.DB" (рис.8.21).
Напишем обработчик события CheckBox1.OnClick, возникающего при отметке CheckBoxl. Заметим, что для простоты правильность ввода в Editi не проверяется.
procedure TForm1.CheckBoxIClick(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 {then}
ELSE
{—————отмена фильтрации ——————}
Tablel.CancelRange;
end;
Неотфильтрованный НД показан на рис.8.21.
В отфильтрованном НД показываются только те записи, индексное поле текущего индекса у которых (т.е. в нашем случае поле GrNum) имеет значение, лежащее в заданном диапазоне. В данном случае диапазон определяется переменной GrNumTmp. Поэтому для GrNumTmp =3 будут показаны записи, принадлежащие к одной группе 3 (рис.8.22).
Если бы мы хотели, чтобы в НД фильтровались записи из нескольких групп, то нам следовало бы добавить в форму второй компонент Edit2, в котором вводился бы номер конечной группы, в то время как в Edit1 вводился бы номер начальной группы. Далее необходимо модифицировать обработчик события CheckBoxl.OnClick, изменив SetRange на SetRange([GrNumTmpl],[GrNumTmp2]);
procedure TForm1.CheckBoxIClick(Sender: T0b;ect) ;
var GrNumTrnpl,GrNumTmp2 : Integer;
begin
IF CheckBoxl.Checked THEN
begin
GrNumTmp1 := StrToInt(Edit1.Text);
GrNumTmp2 := StrToInt(Edit2.Text) ;
{————фильтрация записей в НД-———}
WITH Table1 do begin
CancelRange;
SetRange([GrNumTrnpl],[GrNumTmp2]) ;
END; {with}
end {then}
ELSE
{
———отмена фильтрации ——————}Table1.CancelRange;
end;
Результаты фильтрации записей с номерами группы от 2 до 4 показаны на рис.8.23.