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

5.4.3Обращение к значению поля при помощи функции набора данных FieldByName

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

function FieldByName(const FieldName: string): TField

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

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

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

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

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

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

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

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

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

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

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

if not quBooks.IsEmpty then

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

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

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

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

Для выполнения действий по последовательному перебору записей, начиная от стартовой записи и до конца НД, используют цикл 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 - количество записей.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]