Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ADO Delphi.doc
Скачиваний:
22
Добавлен:
11.08.2019
Размер:
800.26 Кб
Скачать

Создание базы данных

Перед тем как приступить к разработке, необходимо создать БД с помощью СУБД Microsoft Access 2003 (рис. 4). Для работы с БД создадим каталог D:\ Sale.

Рис. 4. Схема данных

МодулЬ данных

Модуль данных (Data Module) – специализированная форма, предназначенная для размещения используемых невизуальных компонентов доступа к данным.

Создадим новый проект командой File > New > VCL Forms Application – Delphi for Win 32. Сохраним модуль главной формы (которую мы пока не изменяли) под именем fmMainUnit, а весь проект – под именем Sale.

Добавим в проект модуль данных командой File > New > OtherВ окне Item Categories откроем Delphi Projects и Delphi Files. В открывшемся окне выберем Data Module. В свойство Name модуля данных поместим значение DM и сохраним модуль в файле dmSaleUnit. Свяжем модуль с проектом командой Project > Add to Project и выберем только что созданный файл dmSaleUnit.

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

Для связи таблиц с БД воспользуемся компонентом ADOConnection на вкладке dbGo палитры компонентов: щелкнем на нем и затем – на модуле DM. В модуле данных появляется компонент ADOConnection1.

Настраивается компонент ADOConnection следующим образом. Сначала надо сделать щелчок на кнопке с тремя точками, которая находится в строке свойства ConnectionString, затем в появившемся окне щелкнуть кнопку Build.

Откроется окно Свойства связи с данными, на вкладке По­ставщик данных которого нужно выбрать тип источника данных (для БД Microsoft AccessMicrosoft Jet 4.0 OLE DB Provider) и щелкнуть на кнопке Далее.

На вкладке Подключение надо выбрать БД – щелкнуть на кнопке просмотра (...) и в открывшемся окне выбрать файл БД. Если для доступа к БД необходим пароль и идентификатор пользователя, то их надо указать (по умолчанию к БД, созданной в Microsoft Access, доступ есть у пользователя Admin, но пароль не нужен).

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

  • LoginPrompt = False – окно Login (запрос имени и пароля пользователя) в момент подключения к БД не отображается;

  • Connected = Trueпризнак того, что соединение установлено.

В модуле данных разместим четыре компонента ADOTable (панель dbGo) и, обратившись к свойству Name, переименуем их в ADOZakazcik, ADOIzdelie, ADONaklad, ADOSnakl.

В модуле данных разместим четыре компонента DataSource (панель Data Access) и, обратившись к свойству Name, переименуем их в DataZakazcik, DataIzdelie, DataNaklad, DataSnakl.

У компонента ADOZakazcik необходимо изменить следующие свойства: Connection – на ADOConnection1; TableName – на Zakazcik; Active – на True.

У компонента DataZakazcik изменить следующие свойства (это будет ссылка на таблицу): DataSet – на ADOZakazcik.

У компонента ADOIzdelie необходимо изменить следующие свойства: Connection – на ADOConnection1; TableName – на Izdelie; Active – на True.

У компонента DataIzdelie изменить следующие свойства (это будет ссылка на таблицу): DataSet – на ADOIzdelie.

У компонента ADONaklad необходимо изменить следующие свойства: Connection – на ADOConnection1; TableName – на Naklad; Active – на True.

У компонента DataNaklad изменить следующие свойства (это будет ссылка на таблицу): DataSet – на ADONaklad.

У компонента ADOSnakl необходимо изменить следующие свойства: Connection – на ADOConnection1; TableName – на Snakl; Active – на True.

У компонента DataSnakl изменить следующие свойства (это будет ссылка на таблицу): DataSet – на ADOSnakl.

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

Рис. 5. Модуль данных

Связывание наборов данных. Наборы данных, размещенные в модуле данных, связаны реляционными отношениями один-ко-многим. Одной записи в наборе ADONaklad может соответствовать произвольное количество записей в наборе ADOSnakl. Чтобы НД знали об этом и согласованно отображали данные, их необходимо подготовить.

Два НД связываются друг с другом по ключевому полю с помощью свойств MasterSource / MasterFields. Зададим значение свойства MasterSource для НД ADOSnakl равным SourceNak (главная таблица). Вызовем редактор отношений, обратившись к свойству MasterFields. Свяжем поле SnNNom с полем NNom с помощью кнопки Add (Joined Fields: SnNNom –> NNom) (рис. 6).

Рис. 6. Связывание наборов данных

Создание объектов-полей. Двойным щелчком на компоненте ADOZakazcik откроем окно редактора полей, щелкнем в окне правой кнопкой мыши и в контекстном меню выберем команду Add all fields. Окно редактора заполнится списком всех полей таблицы Zakazcik. Если щелкнуть на любом поле в окне редактора полей, то в окне инспектора объектов станут доступными свойства и события объекта-поля.

Создание объектов полей для каждого набора данных считается признаком хорошего стиля программирования, так как они упрощают доступ к данным и дают программисту дополнительные возможности. Например, с помощью свойства DisplayLabel можно изменить заголовки соответствующих колонок в сетках отображения данных, с помощью обработчика события OnGetTextизменить формат отображения данных и т. п.

Следует помнить, что, если для НД создан хотя бы один объект-поле, то НД будет содержать значения только тех полей, для которых созданы объекты. И если для НД не созданы объекты-поля, он содержит данные из всех полей таблицы.

Если мы собираемся расширить НД за счет добавления подстановочных полей из других таблиц, то без объектов-полей не обойтись.

НД ADONaklad содержит поле NZkod (код заказчика), но не содержит полей, отображающих наименование, адрес и телефон заказчика. Решить проблему можно с помощью подстановочных полей (Lookup fields), которые создаются в редакторе полей (Fields editor). Они имитируют реальные поля, выполняя подстановку значений полей из других таблиц, соответствующих имеющимся ключевым значениям.

ВНИМАНИЕ! Перед созданием новых полей в НД необходимо закрыть этот НД, выбрав для его свойства Active значение False.

Двойным щелчком на компоненте ADONaklad откроем окно редактора полей и щелчком правой кнопки мыши вызовем контекстное меню. Выберем команду New Field, чтобы открыть окно конструктора нового поля (рис. 7).

Рис. 7. Окно конструктора нового поля

С помощью конструктора можно создать в НД новые поля трех типов (тип определяется переключателями в группе Field type):

  • Data – поля содержат произвольные данные;

  • Calculated – поля содержат вычисляемые данные;

  • Lookup – поля содержат данные из таблицы подстановки.

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

В строке Name введем имя нового поля Naim, раскроем список Type и выберем тип String, размер Size установим равным 50. Установим переключатель Lookup, раскроем список полей Key Fields и выберем поле NZKod, в списке Dataset выберем ADOZakazcik, в списке Lookup Fields – ключевое поле ZKod и в списке Result Field – поле ZNaim. Закроем окно конструктора щелчком на кнопке ОК. Таким же образом создадим для НД ADONaklad подстановочные поля Adres и Telefon, указав в качестве результирующих полей ZAdres и ZTelef и задав размеры 50 и 10 символов.

Для НД ADOSnakl создадим подстановочные поля Name и Cena, связав их с помощью поля SnIKod с НД ADOIzdelie (поле IKod) и указав в качестве результирующих полей соответственно INaim (тип поля – String, размер – 50) и ICena (тип – Currency). Создадим вычисляемое поле Summa, для чего в строке Name введем имя Summa, в строке Type выберем Currency и установим переключатель Calculated.

Для НД ADOSnakl напишем обработчик события OnCalcFields (Events > Database> OnCalcFields):

procedure TDM.ADOSnaklCalcFields(DataSet: TDataSet);

begin

ADOSnaklSumma.Value:=

ADOSnaklCena.Value*ADOSnaklSnKol.Value;

end;

Создание объектов-столбцов. После того как мы создали подстановочные поля для НД ADONaklad и ADOSnakl, связанные с ними ключевые поля NZKod и SnIKod стали лишними – не имеет смысла рядом с названием заказчика или изделия показывать соответствующий код. Но удалить связанные с ними объекты-поля нельзя, т. к. НД лишится ключевого поля и подстановочная связь будет разрушена.

Можно для объектов-полей поместить значения False в их свойства Visible и не показывать их в компоненте отображения данных DBGrid. Однако спрятанные поля не будут видны не только в сетке, но и в других визуализирующих компонентах (компоненты вкладки Data Controls), что затруднит редактирование и ввод данных.

Выходом является создание для сетки объектов-столбцов – компонентов, облегчающих управление отображением данных. С их помощью можно изменять шрифт и цвет колонок, формировать заголовки и т. д. Как и для объектов-полей действует правило: если для сетки не создан ни один объект-столбец, в ней отображаются все объекты-поля. Если создан хотя бы один объект-столбец, сетка будет отображать данные только из объектов-столбцов.

ВНИМАНИЕ! Объекты-столбцы будут созданы на этапе проектирования рабочих форм приложения, работающего с БД.

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

Бизнес-правила разрабатываются на основе изучения предметной области. Для файл-серверных систем они обычно реализуются в комплексе обработчиков событий AfterXXXXBeforeXXXX компонентов ADOTable или ADOQuery.

В клиент-серверных системах эти действия, как правило, реализуются на сервере БД с помощью триггеров – процедур, которые автоматически запускаются при вставке, изменении или удалении записей.

Рассмотрим пример, реализующий часть бизнес-правил, связанных с удалением данных о накладной. Перед удалением накладной надо удалить список связанных с ней изделий, иначе в таблице Snakl появятся записи, которые ссылаются на несуществующую запись в таблице Naklad.

Реализовать бизнес-правила позволяет обработчик события BeforeDelete НД ADONaklad. Это событие автоматически генерируется перед удалением записи. Щелкнем на НД ADONaklad и дважды щелкнем в строке события BeforeDelete в окне инспектора объектов. Создадим такой обработчик:

procedure TDM. ADONakladBeforeDelete(DataSet: TDataSet);

begin

while not ADOSnakl.Eof do ADOSnakl.Delete;

end;

В обработчике учитывается то обстоятельство, что НД ADOSnakl связан с текущей записью НД ADONaklad отношением один-ко-многим и содержит данные только по тем изделиям, которые относятся к удаляемой накладной.

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