- •Раздел 1. Проектирование баз данных. 2
- •Раздел 2. Разработка приложений для работы с Базами Данных в среде Delphi. 25
- •Раздел 1. Проектирование баз данных.
- •1.1. Основы построения баз данных. Модели данных.
- •1.1.1. Реляционная модель данных.
- •1.1.2. Нормализация базы данных.
- •1.2. Проектирование базы данных методом “сущность-связь”.
- •Раздел 2. Разработка приложений для работы с Базами Данных в среде Delphi.
- •2.1. Технология создания информационной системы.
- •2.1.1.Создание таблиц базы данных в Database Desktop.
- •2.1.2. Целостность базы данных.
- •Программа bde Administrator и модули данных.
- •Компоненты доступа и работы с данными. Тема: Наборы данных. Состояние и режимы наборов данных.
- •Тема: Объекты поля. Операции с полями.
- •Тема. Отображение и выбор значения поля.
- •Тема. Визуальные компоненты отображения записей из набора данных.
- •Закладки.
- •Тема. Ограничения на вводимые значения.
- •Тема. Сортировка набора данных.
- •Тема. Операции с таблицей базы данных.
- •Тема. Фильтрация записей.
- •Тема. Поиск записей.
- •Тема. Модификация набора данных.
- •Тема. Работа с отчетами
- •Отчет для связанных наборов данных
- •Составной отчет
- •Модули данных
- •Конструктор отчетов Rave Report
- •Реляционный способ доступа к данным.
- •Основные сведения о языке sql.
- •Оператор выбора Select.
- •Агрегирование и группирование записей.
- •Объединение таблиц.
- •Вложенные запросы.
- •Модификация записей.
- •Примеры баз данных
Компоненты доступа и работы с данными. Тема: Наборы данных. Состояние и режимы наборов данных.
БД – это совокупность таблиц – физических объектов, находящихся на диске. В приложениях Delphi для работы с таблицами создаются наборы данных. Набор данных – это логическая таблица, с которой можно работать при выполнении приложения. Записи в набор данных отбираются по определенным правилам из одной или нескольких таблиц БД.
Для работы с наборами данных служат компоненты Table, Query, UpdateSQL, DecisionQuery, StoredProc.
При организации операций с наборами данных используются навигационный и реляционный способы доступа к данным.
Для локальных БД используется навигационный способ доступа к данным, при котором обрабатывается каждая отдельная запись. Каждый набор данных имеет невидимый указатель текущей записи, для которой выполняется редактирование или удаление. Например, компонент DBGrid указывает текущую запись с помощью специального маркера.
Класс TTable используется для доступа к БД через BDE и позволяет работать с таблицами Paradox, dBase, Access, FoxPro. Компоненты класса поддерживают следующие операции над наборами данных:
Навигация по записям
Модификация, добавление и удаление записей
Установка и использование фильтра
Использование индексов
Отображение упорядоченных данных.
Свойства.
DatabaseName, TableName, Active – рассмотрены в предыдущей теме.
RecordCount:Longint (только для чтения) – количество записей, составляющих набор данных. Управление числом записей выполняется косвенно. Для таблиц dBase и Paradox записи нумеруются с 1.
RecNo:Longint – номер текущей записи в наборе данных, свойство доступно во время выполнения приложения. Например,
// переход к нужной записи
Table1.RecNo:=StrToInt(Edit1.Text);
// вывод номера текущей записи
Label1.Caption:=IntToStr(Table1.RecNo);
ReadOnly:Boolean – позволяет установить режим доступа только для чтения;
CanModify:Boolean (только для чтения) – определяет, может ли приложение выполнять вставку, редактирование и удаление записей в таблице. На значение свойства влияет свойство ReadOnly.
Методы
процедура First – установка на первую запись;
процедура Next – установка на следующую запись; для последней записи указатель не перемещается;
процедура Last – установка на последнюю запись;
процедура Prior – установка на предыдущую запись; для первой записи указатель не перемещается;
функция MoveBy (Distance: Integer): Integer; – перемещение на количество записей, указанное параметром функции. Например,
procedure TForm1.Button1Click(Sender: TObject);
begin
DataModule2.Table1.MoveBy(2);
Label1.Caption:=IntToStr(DataModule2.Table1.RecNo);
end;
Пример.
// перебор всех записей набора данных
var i: integer;
…
Table1.First;
For i:=1 to Table1.RecordCount do begin
// обработка i-ой записи
…
Table1.Next;
End;
Набор данных может находиться в открытом (Table1.Active:= True) или закрытом (Table1.Active:= False) состояниях.
процедура Open – открывает набор данных, например,
Table1.Open;
процедура Close – закрывает набор данных, например,
Table1.Close;
или Table1.Active:=False;
процедура EmptyTable – удаляет из таблицы все записи;
процедура Post; override – записывает измененную запись в базу данных;
Наборы данных могут находиться в различных режимах. Текущий режим определяется свойством State:TDataSetState, которое доступно для чтения во время выполнения приложения. Для изменения режима используются специальные методы (прямые или косвенные).
Режимы набора данных
dsInactive – неактивность, набор данных закрыт и доступ к данным не возможен. Набор данных переходит в этот режим, если Active:=False;
dsBrowse – осуществляется навигация по записям набора данных и просмотр. Переходит:
из режима dsInactive – если Active:=true;
из режима dsEdit – при вызове метода Post или Cancel;
из режима dsInsert - при вызове метода Post или Cancel;
dsEdit – редактирование текущей записи. Переходит из режима dsBrowse при вызове метода Edit.
dsInsert – вставка новой записи. Переходит из режима dsBrowse при вызове методов Insert, InsertRecord, Append или AppendRecord.
dsSetKey – поиск записи, удовлетворяющей заданному критерию. Переходит из dsBrowse при вызове методов SetKey, SetRangeXXX, FindKey, GotoKey, FindNearest, GotoNearest.
dsCalcFields - расчет вычисляемых полей. Используется обработчик события OnCalcFields.
dsFilter - фильтрация записей. Автоматически переходит из режима dsBrowse при выполнении обработчика события OnFilterRecord.
При выполнении программы режим набора данных можно определить с помощью свойства State:TDataSetState компонента DataSourse.
Например,
procedure TDataModule2.DataSource1StateChange(Sender: TObject);
begin
case DataSource1.State of
dsInactive: Form1.Label1.Caption:=’НД закрыт';
dsBrowse: Form1.Label1.Caption:='Просмотр НД';
dsEdit: Form1.Label1.Caption:='Редактирование';
dsInsert: Form1.Label1.Caption:='Вставка';
else Form1.Label1.Caption:=Режим не определен!'
end;
end;
События
BeforeOpen – возникает непосредственно перед открытием набора данных. В его обработчике можно выполнить проверку каких-либо условий, и если они не соблюдены, то открытие набора данных можно запретить, например, с помощью процедуры Abort.
AfterOpen – возникает сразу после открытия набора данных.
BeforeClose и AfterClose – возникают при закрытии набора данных.
Закрытие набора данных автоматически не сохраняет текущую запись, то есть произведенные изменения при редактировании или вставки для текущей записи будут потеряны. Поэтому перед закрытием набора данных нужно вызвать метод Post.
Например,
procedure TDataModule2.Table1BeforeClose(DataSet: TDataSet);
begin
if (Table1.State=dsEdit) or (Table1.State=dsInsert)
then Table1.Post;
end;