Delphi 3 и создание приложений баз данных


7.7.2. Использование методов FindFirst, FindLast, FindNext, FindPrior


Известно, что набор данных может быть отфильтрован с использованием свойства Filtered Условие фильтрации задается свойством Filter или описывается в обработчике события OnFliter Re cord Свойство Filtered указывает, выполнять ли фильтрацию (значение True) или нет (значение False) В этом случае в НД показываются все записи, а не только удовлетворяющие условию фильтрации

Для НД, в котором определены условия фильтрации, но сама фильтрация в текущий момент не включена, Delphi предоставляет интересную возможность Она заключается в том, что в неотфильтрованном в данный момент НД можно обеспечить навигацию только между теми записями, которые удовлетворяют условию фильтрации (оно в текущий момент, когда свойство Filtered = False, не действует)

Для этой цели используются методы FindFirst, FindLast. FindNext, FindPrior

Условие фильтрации можно сделать совпадающим с условием поиска, указанным в параметре./^ Values метода Locate При этом поиск с помощью указанных методов имеет довольно большое преимущество перед поиском с помощью Locate если в Locate можно указывать только значения, то в условии фильтрации можно указывать логические условия, например

Accept := (DataSet['Doljnosf] = 'доцент') AND (DataSet['TabNum'] > 150000);

т е. включать в НД только записи о сотрудниках-доцентах, и притом не всех, а только тех из них, у которых табельный номер больше 150000

В случае, если искомая запись найдена, данные методы возвращают True, в противном случае - False. Аналогичный результат возвращает свойство Found

function FindFirst: Boolean; -

переходит на первую запись, удовлетворяющую фильтру;

function FindLast: Boolean; -

переходит на последнюю запись, удовлетворяющую фильтру;

function FindNext: Boolean; -

переходит на следующую запись, удовлетворяющую фильтру;

function FindPrior: Boolean; -

переходит на предыдущую запись, удовлетворяющую фильтру;

property Found: Boolean; -

возвращает True, если последнее обращение к одному из методов FindFirst, FindLast, FindNext, FindPrior привело к нахождению нужной записи.

Пример.

Предоставить пользователю возможность перемещаться на первую, последнюю, следующую, предыдущую запись, удовлетворяющую условию "Содержимое Edit1 входит как часть ФИО сотрудника". Заметим, что свойство Table1.Filtered = False, т.е. хотя в обработчике события Table1.OnFilterRecord и указано условие фильтрации, в НД показываются все записи, и он остается в неотфильтрованном состоянии (см. рис. 7.27 и 7.28)

условие

фильтрации

procedure TFormX.TablelFilterRecord(DataSet: TDataSet;

var Accept: Boolean);

begin

Accept := POS(Editl.Text,DataSet['FIO']) > 0;

end;

// нажата кнопка "Первая"

procedure TFormX.FindFirstButtonClick(Sender: T0b;ect) ;

begin

Labell .Caption := ";

IF not Tablel.FindFirst THEN

Labell.Caption := 'Нет такой записи';

end;

// нажата кнопка "Последняя"

procedure TFormX . FmdLastButtonClick (Sender : TObject) ;

begin

Labell.Caption := ";

IF not Tablel.FindLast THEN

Labell.Caption := 'Нет такой записи';

end;

// нажата кнопка "Следующая"

procedure TFormX.FindNextButtonClick(Sender: TObject);

begin

Labell.Caption := ";

IF not Tablel.FindNext THEN

Labell.Caption := 'Нет такой записи';

end;

// нажата кнопка "Предыдущая"

procedure TFormX.FindPriorButtonClick(Sender: TOb^ect) ;

begin

Labell.Caption := ";

IF not Tabiel.FindPrior THEN

Labell.Caption := 'Нет такой записи';

end;

Заметим, что поскольку фильтрация записей с использованием события OnFilter Record или (и) свойства Filter может применяться только на небольших объемах записей (из-за того, что при этом используется последовательный метод доступа к записям в ТБД), аналогичные ограничения накладываются и на поиск записей с использованием методов FindFirst, FindLast, FindNext, FindPrior.




Начало  Назад  Вперед



Книжный магазин