Ревунков Г.И. - Методические указания к лабораторному практикуму по курсу «Базы данных» (1075664), страница 20
Текст из файла (страница 20)
Рис. 4.12. Список индексов таблицы Book.
При необходимости индекс можно изменить - кнопка Modify, или удалить - кнопка Erase.
4.1.3.Создание связи между таблицами базы данных
Пример 4.3.В условиях примера 4.1. помимо справочника-каталога книг заведем также справочник по издательствам и установим между этими справочниками связь.
В этом случае структура таблиц может иметь следующий вид:
Каталог домашней библиотеки (таблица Book):
Код книги Название книги Фиамилия, имя, отчество авторов Год издания Код издательства
Типы и размеры полей таблицы Book:
Имя Тип Обозначение Размер
ID Alpha A 9
Name Alpha A 80
Author Alpha A 80
Year Short S
ID_P Short S
Каталог издательств (таблица Publishers):
Код издательства Название издательства Справочный телефон
Типы и размеры полей таблицы Publishers:
Имя Тип Обозначение Размер
ID_P Short S
Name_P Alpha A 80
Telephone_P Alpha A 10
Между таблицами существует связь один-ко-многим . Одной строке в таблице издателей (родительская таблица) может соответствовать 0, 1 или несколько строк в таблице книг (дочерняя таблица). В качестве поля связи выступает поле ID_P. Оно должно имет один и тот же тип и размер в обеих таблицах ( в нашем пример это тип S, его размер фиксирован).Кроме того в обеих таблицах должен быть установлен один и тот же языковый драйвер.
Выполняя аналогичные действия, которые мы реализовали в предыдущих примерах, скорректируйте в соответствии с условиями примера 4.3. таблицу Book и создайте таблицу Publishers. Кроме того, поскольку задание связей представляет собой работу по созданию схемы базы данных (в нашем случае это структура таблиц и связей между ними), то таблицы должны быть без исходных данных. Поскольку в предыдущем примере Вы вводили исходные данных в таблицу Book, то сейчас удалите их. Связи, реализуемые механизмом ссылочной целостности, задаются на пустых таблицах.
Ссылочная целостность определяет как саму связь между таблицами, так и порядок каскадных изменений в связанных строках обеих таблиц.
Откройте дочернюю таблицу, выполнив опции File | Open | Table и в появившемся окне выбрав и открыв таблицу Book. Затем перейдите в режим изменения структуры таблицы, выполнив опции Table | Restructure. Далее выберите в выпадающем списке Table properties элемент Refrential Integrity и щелкните по кнопке Define.
В появившемся окне Refrential Integrity (рис. 4.13) в левом списке Fields приведены поля таблицы Book. Активизируйте поле связи ID_P и нажмите кнопку с изображением правой стрелки. Имя поля связи появится в поле Child fields.
В правом списке Table показаны таблицы нашей базы данных. Активизируйте в этом списке таблицу Publishers и щелкните кнопку с изображением стрелки влево. В поле Parent's key появится имя первичного ключа таблицы Publishers.
Рис. 4.13. Определение ссылочной целостности между таблицами
Далее необходимо выставить в этом окне переключатели Update rule. Эти переключателю следующим образом управляют порядком каскадных изменений в таблице:
• Cascade - ссылочное действие каскадного удаления. При установке этого переключателя в случае удаления родительской строки должны удаляться все зависящие от нее дочерние строки.
• Prohibit - при установке этого переключателя ограничиваются все операции с родительским ключем, от которого зависят дочерние строки (т.е. запрещены любые его изменения).
Установите желаемое состояние переключателей (если их не установить, то система не будет выполнять контроль ограничений ссылочной целостности), например оставьте рекомендуемое утилитой по умолчанию, и нажмите ОК.
На экране появится окно, в котором необходимо указать имя связи, поскольку в СУБД Paradox связи именуются. Присвойте связи, например, имя Publishers_Book и щелкните кнопку ОК. Сохраните изменеия в таблице Book щелкнув кнопку Save. Связь создана.
Можно посмотреть результат нашших действий. Снова войдите в режим реструктуризации: выполните опции Table | Restructure. Далее выберите в выпадающем списке Table properties элемент Secondary Indexes. В списке индексов появился индекс ID_P. Этот индекс и реализует связь между таблицами в СУБД Paradox и построен автоматически.
Теперь в нашей базе реализованы две таблицы со связью 1:М. Вначале необходимо ввести данные в родительскую таблицу. А затем можно вводить в дочернюю таблицу те строки, для которых уже имеется родительская строка. Проверьте.
4.1.4.Создание простой экранной формы
Вопрос создания экранных форм рассмотривался во второй части. Здесь речь пойдет о создании экранных форм, связанных с таблицами базы данных. В данном случае, в отличии от работы с утилитой Database Desktop, уже требуется знание некоторых методов и свойств компонента TDataSet и его производных.
Компоненты доступа к данным BDE находятся на палитре компонентов Component Palette на вкладке Data Acces.
Для отображения данных объекта TTable можно использовать компонент TDBGrid, который в палитре компонентов находится на вкладке Data Controls. Однако напрямую организовать отображение данных из объекта класса TTable в объект класса TDBGrid нельзя. Для этого в VCL имеется специальный компонет TDataSource, который и выступает в качестве канала связи между компонентами доступа к данным (например, TTable) и компонентами элементов управления данными (например, TDBGrid). С его помощью компоненты доступа подключаются к элементам управления.
Компонент TDataSource всякий раз реагирует на ввод или обновление записи в таблице генерацией события OnUpdateData. При желании, можно написать свой обработчик этого события.
Для реализации подключения необходимо выполнить определенную последовательность действий, которая будет рассмотрена в следующем примере.
Пример 4.4. Создать экранную форма для ввода, редактирования и просмотра данных в таблице Publishers.
Вызовите Delphi5. Для реализации примера необходимо выполнить определенную последовательность действий:
• По умолчанию IDE создает на экране пустую форму. Перенесите на эту форму из палитры компонентов компоненты TTable, TDataSource, TDBGrid (рис. 4.14).
• Активизируйте компонент TTable. Назначьте свойству DatabaseName псевдоним базы данных (в окне инспектора объектов) - в нашем случае это Catalogue_B. Его можно ввести вручную либо выбрать в выпадающем списке (т.к. мы его уже ранее зарегистрировали в Администраторе BDE). Свойству TableName назначьте значение Publishers (введите вручную либо выберите из выпадающего списка). Свойству Active назначьте значение True.
• Активизируйте компонент TDataSource. Назначьте свойству DataSet (в окне инспектора объектов) значение Table1 (введите вручную либо выберите из выпадающего списка). Такое значение IDE присвоил по умолчанию компоненту TTable в нашей программе. Компонент TDataSource по умолчанию получил в нашей программе имя TDataSource1. Проверьте в окне инспектора объектов. Свойству AutoEdit назначьте значение True, иначе не будет возможности изменять ранее введенные значения.
• Активизируйте компонент TDBGrid. Назначьте свойству DataSource (в окне инспектора объектов) значение TDataSource1 (введите вручную либо выберите из выпадающего списка).
Рис. 4.14. Форма на этапе разработки.
Все. Теперь данные компонента TTable находятся в компоненте TDBGrid. Можно проверить синтаксические ошибки в проекте, откомпилировать его, сохранить и запустить на выполнение (см. выше - ч. 1, 2) - рис. 4.15. Для удобства проект лучше сохранять в отделном каталоге (папке).
Рис. 4.15. Внешний вид приложения.
Ниже приведен исходный текст созданного Вами простейшего приложения:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, DBGrids, StdCtrls, Mask, DBCtrls, Db, DBTables;
type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
Table1: TTable;
DataSource1: TDataSource;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
end.
При работающей программе для добавления новой записи в конец таблицы следует, находясь на последней записи, нажать клавишу со стрелкой вниз (клавишу управления курсором). Либо если необходимо вставить пустую запись перед текущей - нажать клавишу Insert. Для ввода или редактирования данных в каком то поле сделайте на нем двойной щелчок мыши. Для удаления текущей записи следует нажать клавиши [Ctrl][Del].
4.1.5.Создание экранной формы с главной и подчиненной таблицами
Пример 4.5. Создать экранную форма для ввода, редактирования и просмотра данных в связанных таблицах Book и Publishers таким образом, чтобы в подчиненной таблице показывались только те строки, которые относятся к текущей строке в главной таблице..
По аналогии с примерами, рассмотренными выше, выполните проектирование в соответствии с рис.4.16. При этом вначале с помощью утилиты Database Desktop измените структуру таблиц, уменьшив размеры полей названий книги, издательства и фамилии авторов с 80 символов до 40. Затем с помощью IDE создайте макет экранной формы. Вверху расположите таблицу1 - Book (у нас это подчиненная таблица), внизу расположите таблицу2 - Publishers (в нашем примере - главная таблица). С помощью компонента Label с панели Standard введите названия таблиц и экранной формы.
Рис. 4.16. Форма с главной и подчиненной таблицей на этапе разработки
В созданной экранной форме таблицы пока что независимы друг от друга. Для того чтобы организовать связь между главной и подчиненной таблицами необходимо выполнить следующие действия:
• Активизируйте подчиненную таблицу (в нашем случае это Table1).
• Раскройте в окне инспектора список выбора значений у свойства MasterSource. Выберите значение DataSource2. Затем раскройте в окне инспектора список выбора значений у свойства MasterFields. Щелкните по кнопке с тремя точками.
• В появившемся окне редактора связей Field Link Designer раскройте список выбора Available Indexes и выберите для организации связи индекс ID_P (мы его создали в примере 4.3), который ранее был создан по одноименному полю связи. После выбора индекса поле связи ID_P одновременно появится в окне Detail Fields.
• Перейдите в окно Master Fields и выберите это же поле (рис. 4.17).
• Щелкните кнопку ADD. Связь установлена (рис. 4.18). Щелкните кнопку ОК.
Рис. 4.17. Окно редактора связей.
При создании связи должны выполняться следующие ограничения. Поля связи в обеих таблицах должны иметь один и тот же тип. А также, свойство IndexName подчиненной таблицы не должно ссылаться на индекс, в котором поле связи не является основным.
Рис.4.18. Окно редактора связей после установки связи
Откомпилируйте и сохраните проект. Закройте IDE и запустите приложение - рис. 4.19.
Рис. 4.19. Пример экранной формы с главной и подчиненной таблицами
Можно производить ввод и редактирование данных.Перемещение указателя в главной таблице приводит к отображению только связанных строк в подчиненной таблицы. В подчиненной таблице поле связи изменить нельзя. Оно формируется автоматически.
4.1.6. Настройка полей данных и задание компонентов для работы с полями
Пример 4.6. В созданном приложении в таблице Publishers названия столбцов таблиц сделать русскими.
Задачу можно решить созданием объектов-полей (объектов класса TField) и их настройкой. О порядке работы с полями набора данных см. раздел 3.2.
Откройте проект созданной формы и вызовите редактор полей Fields Editor. Для этого дважды щелкните по компоненту Table2 (для таблицы Publishers). Далее необходимо выполнить следующие действия:
Щелкните правой кнопкой мыши по окну редактора полей Fields Editor.
В появившемся меню выберите опцию Add Fields.
В появившемся одноименном с опцией окне Вы найдете список всех полей таблицы Publishers. Выделите все поля (рис. 4.20) и нажмите кнопку ОК. Теперь в окне редактора полей будет заполненный список полей табличного набора.
Рис. 4.20. Добавление полей-объектов.
Если поле не включить в список полей, то оно становится невидимым для программы. Для каждого включенного в список поля Delphi создаст объект класса TField (его потомок). Каждому объекту будет назначено уникальное имя, которое является сцеплением имени набора и имени поля. Например, Table2ID_P. Имена автоматически созданных объектов-полей можно теперь посмотреть в окне кода программы - Unit1.pas. Проверьте.
Теперь каждому созданному объекту-полю можно назначить новое название колонки. Для этого требуется выполнить следующие действия:
• Активизировать имя поля в окне редактора полей.
• В окне инспектора объектов свойству DisplayLabel в качестве значения присвоить (ввести) новое русское название колонки.
Измените названия у всех столбцов таблицы Publishers и запустите программу на выполнение.
Задачу можно решить, внеся необходимые изменения с помощью компонента DBGrid. Рассмотрим этот вариант.
Пример 4.7. Используя компонент DBGrid1 в созданном приложении в таблице Book названия столбцов таблиц сделать русскими.