Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Проектирование БД в Delphi ВТиП.doc
Скачиваний:
53
Добавлен:
17.03.2016
Размер:
3.62 Mб
Скачать
      1. Обращение к значению поля при помощи функции набора данных FieldByName

Если для НД не создан ни один объект-поле, получить доступ к значению поля этого НД можно с помощью его метода FieldByName, хотя этот метод можно применять и при наличии объектов-полей. Функция имеет вид:

function FieldByName(const FieldName: string): TField

В качестве парметра функция FieldByNameполучает имя поляНД. Тип возвращаемого значения может быть преобразован с помощью свойстваAsXXXX. Например

quBooks.FieldByName('Year').AsInteger := 2000;

    1. Программный доступ к данным запроса

Для просмотра, вставки, редактирования и удаления записей в Delphi обычно используются соответствующие визуальные компоненты (TDBGrid, TDBEdit, TDBNavigator и т.д.), которые автоматически вызывают нужные методы НД.

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

Программный доступ тесно связан с понятием курсора НД.Под курсором НД понимается указатель текущей записи в конкретномНД - таблице или запросе.

Текущая запись - это та запись, над которой в данный момент времени можно выполнять какие-либо операции, например, чтение значений, содержащихся в полях записи.

С помощью методов First,Last,Next,Prior,MoveBy,FindFirst,FindLast,FindNext,FindPriorможно изменять положение курсора и, следовательно, выбирать нужную запись в таблице или запросе.

      1. Общая схема программного доступа к данным запроса

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

Во многих случаях (см. примеры ниже) после этого нужно убедиться в том, что НД содержит записи. Для этого вызывается метод IsEmpty, который возвращает false, если в НД есть хотя бы одна запись, например

if not quBooks.IsEmpty then

Если НД не пустой, курсор НД устанавливается на 1-ой записи этого НД и она может быть обработана.

После обработки текущей записи переход к следующей записи реализуется методом FindNext или Next. В следующем разделе подробно рассматриваются другие средства навигации по НД.

По окончанию обработки НД должен быть закрыт.

      1. Последовательная навигация по записям

Для выполнения действий по последовательному перебору записей, начиная от стартовой записи и до конца НД, используют циклwhile...doилиrepeat...until.

Пусть НД представлен запросом quBooks (аналогично таблицей tbBooks). Для программного доступа ко всем записям этого НД может использоваться следующий вариант набора операторов:

quBooks.Open;

while not quBooks.EOF do begin

//Какие-либо действия над очередной записью, например

//заполняется компонент lbBooks типа TListBox

lbBooks.Items.Add(DM.quBooksbName.AsString); //объект-поле

//quBooksbName

quBooks.Next; // Переход к следующей записи

end;

quBooks.Close //закрытие таблицы

Другой вариант набора операторов программного доступа ко всем записям НД quBooks:

quBooks.Open; // открытие таблицы

if not quBooks.IsEmpty then // проверка набора на непустоту

repeat

//Какие-либо действия над очередной записью

until not quBooks.FindNext; // Переход к следующей записи

quBooks.Close;

Если же от момента открытия НДс ним уже проводились некоторыые действия и программист хочет задать начало очередной обработки с1-ой или последней записи, то это можно реализовать следующим образом.

Пусть стартовой будет 1-ая запись набора.

quBooks.First;

while not quBooks.EOF do begin

//Какие-либо действия над очередной записью

quBooks.Next;

end; {while}

или

if not quBooks.IsEmpty then // проверка набора на непустоту

begin

quBooks.First;

repeat

{Какие-либо действия над очередной записью}

until not quBooks.FindNext;

end; {with}

Точно так же можно перемещаться от конца НДк его началу. Пусть стартовой будет последняя запись набора.

quBooks.Last;

while not quBooks.BOF do begin

{Какие-либо действия над очередной записью}

quBooks.Prior;

end; {while}

или

if not quBooks.IsEmpty then // проверка набора на непустоту

begin

quBooks.Last;

repeat

{Какие-либо действия над очередной записью}

until not quBooks.FindPrior;

Если НД допускает вызов записи по ее номеру (его свойство IsSequenced в этом случае должно содержать значение True), можно использовать цикл for. Например, следующий обработчик события TForm.OnActivate поместит все значения строкового поля BName НД tbBooks в многострочное текстовое поле Memo1:

var

RecNo: integer;

begin

if quBooks.IsSequenced then

for RecNo := 1 to quBooks.RecordCount do begin

{Какие-либо действия над очередной записью)

end;

Свойство RecNo определяет порядковый номер обрабатываемой записи НД (нумерация начинается с 1), а его свойство RecordCount - количество записей.

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