Создание псевдонима БД
Создадим псевдоним для нашей учебной БД. Псевдоним БД — это просто имя БД. Для файл-серверных БД псевдоним определяет путь доступа к файлам базы данных. В дальнейшем мы, возможно, захотим изменить его. В этом случае нам не придется исправлять этот путь в многочисленных компонентах доступа к данным — достаточно изменить его в псевдониме, и все ссылающиеся на псевдоним компоненты будут связаны с новым местом размещения данных. Роль псевдонимов особенно велика в клиент-серверных БД, в которых он содержит многочисленные дополнительные свойства, управляющие доступом к серверу.
С помощью команды Database ► Explorer из среды Delphi запустите утилиту SQL Explorer, на вкладке Databases открывшегося окна щелкните правой кнопкой мыши на узле Database и выберите команду New в контекстном меню. Утилита предложит выбрать тип вновь создаваемого псевдонима. Согласитесь с вариантом Standard, предлагаемым по умолчанию, — псевдонимы именно этого типа предназначены для обслуживания файл-серверных БД с таблицами Paradox (рис. 1.13).
Рис. 1.13. Определение псевдонима
Сразу после этого появится имя псевдонима STANDARD 1, предлагаемое по умолчанию, и на вкладке Definition будут перечислены его свойства. Воспользуемся тем, что выделено имя STANDARD 1, и сразу заменим его именем BIBLDATA. Теперь перейдите на вкладку Definition и в пустом поле справа от свойства PATH введите путь доступа к файлам БД: С: \BIBLDATA. Щелкните на вновь созданном псевдониме на вкладке Databases правой кнопкой мыши и выберите команду Apply в контекстном меню. В появившемся после этого диалоговом окне подтвердите необходимость запомнить вновь созданный псевдоним.
Если теперь на вкладке Databases щелкнуть на значке свернутого узла слева от имени псевдонима, а затем — на значке свернутого узла Tables, вы увидите все таблицы БД «Книголюб». Щелкнув на любой из них и открыв вкладку Data, вы сможете увидеть содержимое выбранной таблицы (рис. 1.14).
Рис. 1.14. Отображение содержимого таблицы в окне SQL Explorer
Модуль данных
В программе нам понадобятся 5 компонентов ТТаble и два компонента TDataSource. Разместим их в отдельном модуле данных, чтобы эти компоненты не загромождали основное окно.
Выберите команду File ► New ► Others, чтобы открыть окно хранилища объектов, и на вкладке New открывшегося окна дважды щелкните на значке Data Module. В свойство Name модуля данных поместите значение DM и сохраните модуль в файле dmNaklsU. Чтобы связать модуль с проектом, щелкните на копке панели инструментов и выберите только что созданный файл dmNakl sU.
Для связи таблиц с БД воспользуемся компонентом TDatabase на вкладке BDE палитры компонентов Delphi: щелкните на нем и затем — на имени модуля DM в окне дерева объектов. В окне инспектора объектов раскройте список свойства AliasName и выберите псевдоним BIBLDATA. В строке свойства DatabaseName напишите произвольное имя (например, AAA) так называемого локального псевдонима, который создает компонент TDatabase.
Локальный псевдоним доступен только в той программе, в которой используется компонент TDatabase. Этот компонент выполняет множество полезных функций, обеспечивающих связь программы с БД. Для файл-серверных систем только с его помощью можно реализовать транзакции — специальный механизм доступа к данным, повышающий их достоверность и непротиворечивость. В клиент-серверных системах он, кроме того, способен передать серверу БД имя пользователя, его пароль и ряд других параметров, оптимизирующих связь с сервером и избавляющих пользователя программы от обязательной регистрации на сервере.
После определения псевдонима БД и создания локального псевдонима исчезнет красный знак вопроса слева от компонента в окне дерева объектов, что свидетельствует о готовности компонента к работе. Поскольку в нашей простой программе мы не будем непосредственно обращаться к компоненту, можно оставить его имя Databasel, заданное по умолчанию, но я все-таки рекомендую изменить его на DB: в дальнейшем на примере этой программы я продемонстрирую работу механизма транзакций, и в программном коде нам придется обращаться к методам и свойствам этого компонента.
Теперь перенесите в окно дерева объектов компонент ТТаblе (вкладка BDE) и «положите» его на псевдоним AAA. В окне инспектора объектов в свойстве DatabaseName нового компонента автоматически появится имя локального псевдонима AAA, однако слева от компонента в окне дерева объектов будет красный знак вопроса, означающий, что компонент ТТаЫе еще не готов к работе.
Компонент ТТаble является набором данных (НД). Он преимущественно используется в файл-серверных системах для доступа к данным из какой-либо одной таблицы БД. Чтобы подготовить компонент к работе, необходимо определить имя этой таблицы: раскройте список его свойства TableName и выберите в нем таблицу NAKLS. В дальнейшем нам придется много раз обращаться к методам и свойствам этого компонента, поэтому измените его имя Table 1, заданное по умолчанию, на имя связанной с ним таблицы: в строке свойства Name введите Nakls.
Чтобы данные из НД Nakls смогла отобразить сетка DBGridl в главном окне программы, ее нужно связать с НД с помощью специального компонента TDataSource: выделите его на вкладке Data Access палитры компонентов и затем щелкните на компоненте Nakls в окне дерева объектов, чтобы связать его с НД.
Теперь подготовим вторую пару ТТаblе — TDataSource для отображения данных из таблицы MOVEBOOK во второй сетке главного окна: «положите» на псевдоним AAA набор данных ТТаЫе, а на него — источник данных TDataSource; свяжите НД с таблицей MOVEBOOK и дайте ему имя Move. Вид модуля данных к этому моменту показан на рис. 1.15.
Наборы данных Na kl s и Move связаны реляционным отношением один ко многим: единственной записи (накладной) в первом НД может соответствовать произвольное количество записей (книг) во втором. Чтобы НД «знали» об этом и согласованно отображали данные, их нужно предварительно подготовить. Перейдите на вкладку Diagram в окне кода модуля данных (предварительно нажмите клавишу F12 для визуализации окна кода) и с помощью мыши «перетащите» компоненты Nakls и Move из окна дерева объектов на вкладку Diagram. Перетаскивание реализуется классическим способом Drag&Drop: левая кнопка мыши нажимается на компоненте в окне дерева объектов и остается нажатой при перемещении указателя мыши на вкладку Diagram, после чего отпускается. Расположите таблицы Diagram одну под другой так, как это показано на рис. 1.16.
Рис. 1.15. Окно модуля данных с двумя наборами данных и окно дерева объектов
Рис. 1.16. Расположение таблиц в окне Data Diagram
Для установления связи между таблицами щелкните на кнопке [Щ: (кнопка Master Detail) панели инструментов, подведите указатель мыши в виде перечеркнутого круга к нижней кромке верхней таблицы (в этот момент указатель превратится в крестик), нажмите левую кнопку мыши и, удерживая ее нажатой, прочертите линию к верхней кромке нижней таблицы, после чего отпустите кнопку. На экране появится окно конструктора связей (рис. 1.17).
Чтобы установить связь, нужно указать связываемые поля в родительской и дочерней таблицах. По умолчанию для дочерней таблицы конструктор связей выбрал поле с первичным ключом Move ID. Чтобы сменить поле, нужно раскрыть список Available Indexes в верхней части окна и выбрать индекс MOVEBOOK_NAKL. После этого в поле Detail Fields появится имя поля MNakl — щелкните на нем и на имени поля NakllD в списке Master Fields, после чего щелкните на кнопке Add (эта кнопка станет доступной только после выделения полей связи и перестает быть доступной после щелчка на ней). Закройте окно конструктора связей щелчком на кнопке ОК.
Рис. 1.17. Окно конструктора связей
После выполнения этих действий между таблицами NAKLS и MOVEBOOK устанавливается связь один ко многим по полю NakllD, о чем свидетельствует вид окна Data Diagram на рис. 1.18.
Рис. 1.18. Окно Data Diagram после установления связи между таблицами
Щелкните на таблице Movebook. DB в окне дерева объектов и откройте набор данных Move: в окне инспектора объектов поместите в его свойство Active значение True. Точно так же откройте таблицу Nakls.
На этом начальный этап работы с окном модуля данных закончен, и нам нужно перейти к главному окну программы (щелкните на вкладке fmNaklsU в окне кода и нажмите клавишу F12). С помощью команды File ► Use Unit свяжите модуль главного окна с модулем данных. Для верхней сетки DBGridl раскройте список свойства DataSource и выберите в нем пункт DataSourcel — сетка туг же наполнится данными из НД Nakls. Точно так же свяжите нижнюю сетку с источником данных DataSource2. Свяжите навигатор баз данных DBNavigatorl в нижней части окна с источником DataSourcel.
Модули данных
Для упрощения разработки приложений баз данных наряду с формами в Delphi используются модули данных. Модуль данных (data module) – это централизованный контейнер для невизуальных компонентов доступа к базе данных. Он предназначен для отделения логики обработки данных и бизнес-правил от логики работы пользовательского интерфейса.