Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 7.doc
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
1 Мб
Скачать
☆

Var I: integer;

. . .

Tablel.First;

for i:=1 to Table1.RecordCount do begin

// Здесь можно расположить операторы, выполняющие

// обработку очередной записи

Table1.Next;

end;

Перебор всех записей набора данных осуществляется в цикле, для чего пере­менная i цикла последовательно принимает значения от 1 до RecordCount. Пе­ред началом цикла вызовом метода First выполняется переход к первой записи набора данных. В цикле для перехода к следующей записи вызывается метод Next.

Для локальных таблиц dBase или Paradox составляющие набор данных записи последовательно нумеруются, отсчет начинается с единицы. Номер записи в наборе данных определяет свойство RecNo типа Longint, которое доступно во время выполнения программы.

Номер текущей записи можно узнать, например, так:

Editl.Text:=IntToStr(Table1.RecNo) ;

Замечание

При изменении порядка сортировки или фильтрации нумерация записей также изменяется.

Для таблиц Paradox свойство RecNo можно использовать для перехода к требуе­мой записи, установив в качестве значения свойства номер записи. Так, в опе­рации

Table1.RecNo:=StrToInt(Edit1.Text) ;

выполняется переход к записи, номер которой содержится в поле редактирова­ния Editl. Указанная запись становится текущей.

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

  • навигационный;

  • реляционный.

Навигационный способ доступа заключается в обработке каждой отдельной записи набора данных. Этот способ обычно используется в локальных БД или в удаленных БД небольшого размера. При навигационном способе доступа каж­дый набор данных имеет невидимый указатель текущей записи. Указатель опре­деляет запись, с которой могут выполняться такие операции, как редактирова­ние или удаление. Поля текущей записи доступны для просмотра. Например, компоненты DBEdit и DBText отображают содержимое соответствующих полей именно текущей записи. Компонент DBGrid указывает текущую запись с по­мощью специального маркера.

В разрабатываемом приложении навигационный способ доступа к данным мож­но реализовать, используя любой из компонентов Table или Query.

Реляционный способ доступа основан на обработке группы записей. Если требу­ется обработать одну запись, все равно обрабатывается группа, состоящая из одной записи. При реляционном способе доступа используются SQL-запросы, поэтому его называют также SQL-ориентированным. Реляционный способ дос­тупа ориентирован на работу с удаленными БД и является для них предпочти­тельным. Однако его можно использовать и для локальных БД.

Реляционный способ доступа к данным в приложении можно реализовать с по­мощью компонента Query.

1.1. Состояния наборов данных

Наборы данных могут находиться в открытом или закрытом состояниях, на что указывает свойство Active типа Boolean. Если свойству Active установлено зна­чение True, то набор данных открыт. Открытый компонент Table содержит на­бор данных, соответствующий данным таблицы, связанной с ним через свойство TableName. Для открытого компонента Query набор данных соответствует резуль­татам выполнении SQL-запроса, содержащегося в свойстве sql этого компонен­та. Если свойство Active имеет значение False (по умолчанию), то набор дан­ных закрыт, и его связь с БД разорвана.

Набор данных может быть открыт на этапе разработки приложения. Если при этом к набору данных через источник данных DataSource подключены визуаль­ные компоненты, например, DBGrid или DBEdit, то они отображают соответст­вующие данные таблицы БД.

Замечание

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

Если по каким-либо причинам открытие набора данных невозможно, то при попытке установить свойству Active значение True выдается сообщение об ошибке, а свойство Active сохраняет значение False. Одной из причин невоз­можности открытия набора данных может являться неправильное значение свойства TableName или SQL.

Замечание

На этапе проектирования свойству Active наборов данных автоматически ус­танавливается значение False при изменении Значения СВОЙСТВ DataBaseName, TableName или SQL.

Приводимый пример демонстрирует управление состоянием набора данных с помощью свойства Active, которое используется для открытия и закрытия на­бора данных Query1:

procedure TForm1.ButtonlClick(Sender: TObject);

begin

Queryl.Active:=false;

Queryl.SQL.Clear;

Queryl.SQL.Add('select * from Examplel.db') ;

Queryl.Active:=true;

end;

Управлять состоянием набора данных можно также с помощью методов Open и Close.

Процедура Open открывает набор данных, ее вызов эквивалентен установке свойству Active значения True. При вызове метода Open генерируются события BeforeOpen и AfterOpen и соответственно вызываются процедуры-обработчики этих событий.

Процедура Close закрывает набор данных, ее вызов эквивалентен установке свойству Active значения False. При вызове метода Close генерируются собы­тия BeforeClose и AfterClose, а также вызываются процедуры-обработчики этих событий.

В примере показывается управление состоянием набора данных (открытие и закрытие) с помощью методов Open и Close:

procedure TForml.Button2Click(Sender: TObject);

begin

Queryl.Close;

Queryl.SQL.Clear;

Queryl.SQL.Add('select * from Example2.db');

Query1.Open;

end;

События BeforeOpen и AfterOpen имеют тип TDataSetNotifyEvent, который описывается следующим образом:

type TDataSetNotifyEvent = procedure(DataSet: TDataSet) of object;

В этом описании параметр DataSet определяет набор данных, для которого произошло событие.

Событие BeforeOpen возникает непосредственно перед открытием набора дан­ных. В обработчике этого события можно выполнить проверку определенных условий, и если они не соблюдаются, то открытие набора данных может быть запрещено.

Замечание

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

Рассмотрим в качестве примера следующую процедуру:

procedure TForml.TablelBeforeOpen(DataSet: TDataSet);

begin