Прежде, чем начать, собственно, изложение технических деталей, мне хотелось бы немного рассказать о FIBPlus. Это библиотека "нативных" компонент для Borland Delphi, Borland C++ Builder и Borland Kylix, которая позволяет разработчику наиболее эффективно работать с базами данных InterBase и всех его клонов, используя Direct InterBase API. В общем-то, это означает, что при помощи FIBPlus разработчик может использовать все возможности InterBase: полное управление транзакциями, максимальную скорость, специализированные особенности InterBase (например, array-fields) и т.д. При всем этом, компоненты FIBPlus абсолютно совместимы со стандартными data-aware компонентами, что будет показано в процессе разработки демонстрационного приложения.

Использование связей master-detail является одной из самых распространенных задач для любого прикладного разработчика, который использует в своей работе реляционные базы данных. В общем-то, сам реляционный подход в оптимизации базы данных и означает создание все более глубоких связей master-detail. Таким образом, после оптимизации базы данных перед программистом встает необходимость максимально упростить себе жизнь при разработке пользовательского интерфейса, через который будет осуществляться потом работа со всеми master-detail связками в его базе данных.

Мы рассмотрим управление такой связкой на примере стандартной базы данных из поставки Interbase "EMPLOYEE.GDB" и двух таблиц: DEPARTMENT и EMPLOYEE. Ниже вы видите структуры обеих таблиц.

CREATE TABLE DEPARTMENT (
    DEPT_NO DEPTNO NOT NULL,
    DEPARTMENT VARCHAR (25) NOT NULL,
    HEAD_DEPT DEPTNO,
    MNGR_NO EMPNO,
    BUDGET BUDGET,
    LOCATION VARCHAR (15),
    PHONE_NO PHONENUMBER  DEFAULT '555-1234',
    DEPT_NO1 CUSTNO);


ALTER TABLE DEPARTMENT ADD PRIMARY KEY (DEPT_NO);


CREATE TABLE EMPLOYEE (
    EMP_NO EMPNO NOT NULL,
    FIRST_NAME FIRSTNAME NOT NULL,
    LAST_NAME LASTNAME NOT NULL,
    PHONE_EXT VARCHAR (4),
    HIRE_DATE DATE DEFAULT 'NOW' NOT NULL,
    DEPT_NO DEPTNO NOT NULL,
    JOB_CODE JOBCODE NOT NULL,
    JOB_GRADE JOBGRADE NOT NULL,
    JOB_COUNTRY COUNTRYNAME NOT NULL,
    SALARY SALARY NOT NULL,
    FULL_NAME COMPUTED BY (last_name || ', ' || first_name));


ALTER TABLE EMPLOYEE ADD PRIMARY KEY (EMP_NO);
ALTER TABLE EMPLOYEE ADD  FOREIGN KEY (DEPT_NO) REFERENCES DEPARTMENT (DEPT_NO);

Очевидно, что таблица DEPARTMENT является master-таблицей, а таблица EMPLOYEE - detail-таблицей. Связка master-detail осуществляется по полям:

DEPARTMENT.DEPT_NO <- EMPLOYEE.DEPT_NO

То есть, для каждого отдела мы можем сохранять информацию обо всех его сотрудниках. Для использования примеров, данных в данной статье, необходимо загрузить базу данных employee. Архив содержит резервную копию базы, которую надо будет восстановить той версией InterBase или Firebird, которую вы используете.

Шаг 1. Получение данных из таблицы и вывод данных в TDBGrid.

Рассмотрим с самого начала создание приложения, при помощи которого мы сможем редактировать данные об отделах и сотрудниках. Необходимо бросить на форму основной компонент, который позволяет подключаться к базе данных Interbase (TpFIBDatabase) и вызывать редактор этого компонента:

Рис. 1.

Рис. 2.

Для подключения к базе как минимум необходимо указать путь (в данном примере, это путь к локальному файлу), имя пользователя и пароль. Вы можете проверить правильность заданных параметров, нажав на кнопку Test. Мы также можем задать параметры подключения к базе в run-time:

Рис. 3.

procedure TForm1.Button1Click(Sender: TObject);
begin
  pFIBDatabase1.DBName := DBNameE.Text;
  pFIBDatabase1.ConnectParams.UserName := UserNameE.Text;
  pFIBDatabase1.ConnectParams.Password := PasswordE.Text;
  pFIBDatabase1.Open;
end;

Следующий этап - получение данных из базы данных. Для этого нам необходимо два компонента: TpFIBDataSet и TpFIBTransaction. TpFIBDataSet является потомком класса TDataSet и полностью совместим со всеми стандартными визуальными компонентами (DataSource1, в частности, связан с pFIBDataSet1 ). TpFIBTransaction предназначен для управления транзакцией.

Рис. 4.

Необходимо указать уровень изоляции транзакции при помощи свойства TPBMode, а также "подключить" pFIBTransaction1 к pFIBDatabase1:

Рис. 5.

Аналогично, необходимо указать свойства Database и Transaction для компонента pFIBDataSet1:

Рис. 6.

Рис. 7.

Теперь мы можем указать необходимые запросы к базе данных для получения и изменения данных в таблице. Нужно написать запрос для получения данных, используя свойство SelectSQL. В нашем случае это будет очень простой запрос:

SELECT * FROM DEPARTMENT

Теперь изменим немного код в процедуре:

procedure TForm1.Button1Click(Sender: TObject);
begin
pFIBDatabase1.DBName := DBNameE.Text;
pFIBDatabase1.ConnectParams.UserName := UserNameE.Text;
pFIBDatabase1.ConnectParams.Password := PasswordE.Text;
pFIBDatabase1.Open; pFIBDataSet1.Open; end;

Нам не нужно явным образом запускать транзакцию перед открытием запроса, поскольку по умолчанию свойство pFIBDataSet1.Options содержит ключ poStartTransaction и компонент сам запускает транзакцию. После запуска приложения, и открытия базы данных мы увидим следующий результат:

Рис. 8.

Загрузить полный рабочий код примера.

 




Описание для анонса: Первая часть статьи об особенностях работы с master-detail в FIBPlus. В этой части описаны самые первые шаги при работе с компонентами FIBPlus и использованием TpFIBDataSet совместно со стандартными визуальными компонентами.
Специальные цены для ex-USSR (кроме стран ЕС):

235 Euro
1500 руб. для физ. лиц
3600 руб. для юр. лиц

Скидки при покупке нескольких копий!

Навигация



На данный момент, лучшей из библиотек прямого доступа к IB/FB является FIBPlus, разрабатываемая выходцами из СССР и продаваемая нашим по более низкой цене (за что авторам thanks). Очень быстрая, очень компактная, очень удобная, очень функциональная. Например, позволяет управлять даже обрывом коннекта во время сеанса связи. Просто Best of All. >>

Дерягин А. SQL.RU
Раздел для покупателей
Получение полных версий и обновлений. Перейти в Личный кабинет
Сайт по Delphi: ежедневные ИТ-новости, статьи, документация, компоненты, конкурсы, юмор...