Прежде, чем начать, собственно, изложение технических деталей, мне хотелось бы немного рассказать о 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 руб. для юр. лиц

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

Навигация



Использую FIBPlus почти с момента их появления. С их помощью разрабатывал самые разные проекты, от промышленных задач, работающих в режиме 24х7, до обычных управленческих АРМов. Мои первые проекты на этом наборе компонент успешно работают больше 5 лет. Компоненты ориентированы на разработчика в самом прямом смысле этого слова. С их помощью реально и значительно упрощается разработка и, главное, сопровождение приложений. Удобные свойства, методы и события позволяют легко интегрировать компоненты в шаблоны и модели разработчика. Особенно это относится к репозиторию и автогенерации запросов - в исполняемых модулях может не быть ни одной строчки SQL кода.

Уверен, разработчики, сопровождающие долгоживущие проекты, оценят это, в комплексе с хорошей оптимизацией. Кеширование запросов и страничный режим здорово помогают на "слабых" клиентах. Радует также оперативная (даже упреждающая) реакция разработчика на выход новых версий базового ПО. Спасибо Сергею Бузаджи и коллективу Devrace за отличный продукт.

>>

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