Связанные курсоры позволяют определить отношение один ко многим (one-to-many relationship). Например, иногда полезно связать таблицы, например CUSTOMER и ORDERS так, чтобы каждый раз, когда пользователь выбирает имя заказчика, то он видит список заказов связанных с этим заказчиком. Иначе говоря, когда пользователь выбирает запись о заказчике, то он может просматривать только заказы, сделанные этим заказчиком.
Рассмотрим пример программы, которая использует связанные курсоры. Дизайн программы сводится к установке в форму двух экземпляров объектов TTable, двух экземпляров TDataSource и двух экземпляров элементов управления TDBGrid. Далее необходимо присоединить первый набор к таблице CUSTOMER, а второй к таблице ORDERS. Программа в этой стадии имеет вид, приведенный на рис 8.
Дизайн программы
Рис.8
После выполнения дизайна следует связать таблицу ORDERS с таблицей CUSTOMER так, чтобы были видимы только те заказы, которые связанные с текущей записью в таблице заказчиков. В первой таблице заказчик однозначно идентифицируется своим номером – поле CustNo. Во второй таблице принадлежность заказа определяется также номером заказчика в поле CustNo. Следовательно, таблицы нужно связывать по полю CustNo.Следует заметить, что в обеих таблицах поля могут иметь различное название, но должны быть совместимы по типу. Для этого, чтобы установить связь необходимо выполнить три действия.
· Установить свойство Table2.MasterSource = DataSource1.
· Установить свойство Table2.MasterField = CustNo.
· Установить свойство Table2.IndexName = CustNo.
Второе действие выполняется посредством редактора связей (рис. 9).
Общий вид редактора связей
Рис.9
В период дизайна и после запуска приложения видно, что обе таблицы связаны вместе, и всякий раз, когда пользователь выполнит перемещение на новую запись в таблице CUSTOMER, в таблице ORDERS будут отображаться только те записи, которые принадлежат соответствующему заказчику.
Связанные курсоры позволяют также определить отношение многие ко многим (mamy-to-many relationship). Для реализации такого отношения связанные таблицы должны содержать комплексные индексы, состоящие из нескольких полей. Причем, поле входящее в состав комплексного индекса может иметь и собственный индекс.
Пример конструирования базы данных
Сформулируем основную концепцию разработки базы данных:
· Справочник должен представлять локальную базу данных, в которой каждая таблица должна соответствовать тематическому разделу справочника.
· Каждая таблица должна иметь одинаковую структуру.
· Таблица должна содержать поисковое и описательное поле.
· Приложение управления базой данных должно обеспечивать просмотр и запись данных.
· В процессе создания базы данных приложение должно обеспечить возможность загрузки ранее подготовленных файлов примеров.
· В процессе работы со справочником должна быть обеспечена защита от случайного повреждения данных.
· С целью обеспечения возможности перемещения на другие компьютеры таблицы базы данных должны размещаться в папке приложения, т.е. без изменения конфигурации ядра базы данных.
На основании сформулированной концепции можно приступить к созданию базы данных и разработке приложения управления базой данных. Работу предлагается выполнять в следующем порядке:
1. Используя утилиту DataBaseDesctop, создайте в формате Paradox таблицы Funct1, Funct2, … Funct(n) соответственно количеству разделов. Структура всех таблиц должна быть одинаковой. Каждая таблица должна иметь содержать поля, приведенные в таблице 1.
Таблица 1
Field Name
Type
Size
Key
FunctName
A
*
Description
F
2. Создайте новую папку будущего проекта и сохраните в ней созданные таблицы. Используя команду Alias Manager меню Tools утилиты DataBaseDesctop, создайте временный псевдоним будущей базы данных, например DelphiFunction.
3. В среде Delphi создайте новый проект и сохраните его с уникальным именем в папку, содержащую таблицы базы данных.
4. Выполните дизайн приложения управления базой данных согласно рисунку 10 и таблице 2.
Расположение компонентов в форме
Рис.10
Таблица 2
№ п/п
Компонент
Имя
Расположение
TEdit
SearchEdit
Panel1
TComboBox
DbBox
Panel1
TSpeedButton
EditButton
Panel2, Panel1
TDBGrid
DBGrid
Panel3
TDBNavigator
DBNavigator
Panel4, Panel3
TDBRichEdit
DBRich
Panel5
TSpeedButton
OpenButton
Panel6, Panel5
TSpeedButton
SaveButton
Panel6, Panel5
TSpeedButton
CutButton
Panel6, Panel5
TSpeedButton
CopyButton
Panel6, Panel5
TSpeedButton
PasteButton
Panel6, Panel5
TSpeedButton
DelButton
Panel6, Panel5
TSpeedButton
FontButton
Panel6, Panel5
TTable
FTable
TDataSource
DataSource
TOpenDialog
OpenDialog
TsaveDialog
SaveDialog
TFontDialog
FontDialog
5. Присвойте имена элементам управления соответственно именам, приведенным в таблице 2.
6. Выберете в списке свойств объекта FTable свойство DataBaseName и присвойте ему псевдоним Вашей базы данных. Также из списка свойства TableName выберете нужную таблицу, например Funct1.
7. Свяжите объект DataSource с объектом FTable посредством свойства DataSet.
8. Используя свойство DataSourceэлементов управления DBGrid, DBNavigator, DBRich установите связь с объектом DataSource. Также используя свойство DataField компонента DBRichустановите его связь с полем Description таблицы базы данных.
9. Посредством свойства VisibleButtons установите видемыми соответствуюние кнопки навигатора (рис. 16.10).
10. Откройте выбранную таблицу базы данных установив свойство Active объекта FTableв состояние True и настройте компонент DBGrid в соответствии рисунку 16.10. посредством редактора свойства Columns.
11. Закройте выбранную таблицу базы данных путем установки свойства Active в состояние False.
12. Занесите названия всех разделов справочника в поле списка DbBox.
Прежде чем приступить к разработке программы сформулируем задачи управления. Итак, приложение должно обеспечить два режима функционирования, а именно режим создания базы данных и режим просмотра и поиска записей. В режиме создания и редактирования базы данных, приложение должно обеспечить возможность загрузки информации (описания функций и примеров их применения) из ранее подготовленных файлов, а также возможность их последующего редактирования. В режиме просмотра и поиска записей, база данных должна быть защищена от возможной модификации в результате действий пользователя. Поиск записей по ключевому полю (FunctName) должен производится без учета регистра клавиатуры. Доступ к конкретной таблице базы данных должен выполнятся посредством выбора раздела поиска.
Итак, переключение режима функционирования приложения свяжем с кнопкой EditButton. Для этого настроим кнопку в режим “залипания”, установив ее свойство AllowAllUp в true, и присвоив свойству GroupIndex значение равное единице. Переключение режимов будет состоять в изменении видимых кнопок навигатора, видимости панели инструментов текстового редактора, а также доступа к поисковому полю. Перед написанием процедуры следует установить свойство Visible Panel6 в состояние false и свойство ReadOnly DBRich в true. Команда переключения режимов будет выглядеть как: