Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3 Практический раздел.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
5.18 Mб
Скачать

Навигация

Навигация по набору данных состоит в том, что выбирается указатель на ту или иную запись в таблице БД. Этот указатель так же называется курсором и определяет запись, с которой будут производиться операции в данный момент.

Мы уже рассматривали навигацию при помощи специального компонента - DBNavigator. Теперь рассмотрим, как можно осуществлять ее программным способом, обращаясь непосредственно к методам набора данных.

Для перемещения указателя текущей записи можно использовать следующие процедуры набора данных:

  • First - устанавливает указатель на первую запись;

  • Next - устанавливает указатель на запись, следующую за текущей;

  • Last - устанавливает указатель на последнюю запись;

  • Prior - устанавливает указатель на запись, предшествующую за текущей;

Для перемещения на несколько записей сразу используют функцию MoveBy - она принимает в качестве аргумента число, на которое должно произойти перемещение, а возвращает число записей, на которое реально переместился курсор (разница может быть вызвана, например тем, что конец набора данных был достигнут "досрочно"). Перемещение при помощи этой функции можно производить в обоих направлениях:

Table1.MoveBy(10); //перемещение указателя на 10 записей вперед

Table1.MoveBy(-3); //перемещение указателя на 3 записи назад

x:=Table1.MoveBy(y); //использование возвращаемого значения

if x<>y then

Caption:='Перемещено только на '+IntToStr(x)+' записей';

При перемещении указателя учитывается текущее состояние набора данных, т.е. порядок сортировки и ограничения, наложенные фильтрами.

ВНИМАНИЕ

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

Для примера возьмем все ту же таблицу счетов, задействовав компоненты Table, DataSource и DBGrid. Еще нам понадобятся 3 кнопки. Первая будет перемещать курсор на следующую запись, а вторая - на предыдущую. Соответственно, код для первой кнопки будет выглядеть так:

Table1.Next;

А у второй, соответственно:

Table1.Prior;

По сути, таким образом, мы просто сделали свой вариант навигации без использования готового компонента DBNavigator. Однако программное управление курсором позволяет производить гораздо более сложные манипуляции. Например, при помощи последовательного перебора записей можно вычислить их суммарное значение. Поэтому третья кнопка будет использоваться как раз для того, чтобы подсчитать итоговую сумму всех счетов.

Для реализации этого замысла нам потребуется организовать цикл для обхода всех записей, начиная с первой, каждый раз добавляя значение поля BILL_SUMM к переменной. В завершение останется вывести результат в заголовок окна. В итоге мы получим процедуру, приведенную в листинге 19.2.

Листинг 19.2. Последовательный обход всех записей в источнике данных

procedure TForm1.Button3Click(Sender: TObject);

var i: integer; x: currency;

begin

Table1.First; // начинаем с 1-й записи

x:=0;

for i:=0 to Table1.RecordCount-1 do

begin

x:=x+Table1.FieldByName('BILL_SUMM').AsCurrency;

Table1.Next; // не забываем перевести курсор на следующую запись

end;

Caption:=CurrToStr(x);

end;

Для того чтобы пройтись по всем записям, здесь мы воспользовались таким свойством набора данных, как RecordCount. Это вполне логичный вариант, однако, он не совсем идеален с той точки зрения, что нам требуется дополнительная переменная. В то же время, у набора данных имеется такое свойство, как Eof, при помощи которого можно узнать, достигнут или нет конец. Соответственно, чтобы избавиться от лишней переменной в своем коде, мы можем использовать цикл while:

while not Table1.Eof do

begin

x:=x+Table1.FieldByName('BILL_SUMM').AsCurrency;

Table1.Next;

end;

В любом случае, по завершении цикла мы получим нужный нам результат в переменной x. Исходный код приведен в примере в каталоге Demo/Part4/Navigate.

Помимо свойства Eof, существует и свойство Bof, проверяющее, находится ли указатель в начале набора данных. Он может потребоваться, например, в том случае, если необходимо произвести подсчет в обратном порядке:

Table1.Last;

while not Table1.Bof do

begin

x:=x+Table1.FieldByName('BILL_SUMM').AsCurrency;

Table1.Prior;

end;

Обратите внимание, что в данном случае курсор заблаговременно переводится на последнюю запись в наборе данных.