Шаг 4. Связка master-detail. Использование специального префикса "MAS_" для наименования параметров.

Теперь мы можем перейти к созданию, собственно, связки master-detail. Для этого мы положим на форму компоненты:

DBGrid2: TDBGrid;
DataSource2: TDataSource;
pFIBDataSet2: TpFIBDataSet;
ReadTransaction2: TpFIBTransaction;
WriteTransaction2: TpFIBTransaction;

"Свяжем" их так же, как и предыдущую группу компонентов. Напишем SelectSQL для pFIBDataSet2:

SELECT * FROM EMPLOYEE
WHERE DEPT_NO = ?DEPT_NO

Очевидно, что мы хотим выбрать при помощи detail-запроса только тех сотрудников, которые работают в текущем отделе. Значение параметра ?DEPT_NO должно браться из поля DEPT_NO таблицы DEPARTMENT. Чтобы это происходило автоматически, необходимо задать свойство pFIBDataSet2.DataSource равным DataSource1. Теперь сгенерируем модифицирующие запросы для pFIBDataSet2 также, как мы делали это раньше для pFIBDataSet1.

После автоматической генерации мы должны внести некоторые изменения в полученные запросы. Рассмотрим, в частности, запрос для InsertSQL:

INSERT INTO EMPLOYEE(
    EMP_NO,  FIRST_NAME,  LAST_NAME,   PHONE_EXT,  HIRE_DATE,


    DEPT_NO,

    JOB_CODE,  JOB_GRADE, JOB_COUNTRY,  SALARY
)
VALUES(
    ?EMP_NO,  ?FIRST_NAME,  ?LAST_NAME, ?PHONE_EXT, ?HIRE_DATE,

   ?DEPT_NO,

    ?JOB_CODE,  ?JOB_GRADE, ?JOB_COUNTRY, ?SALARY
)

Очевидно, что при добавлении нового сотрудника, мы должны задать параметр ?DEPT_NO текущим значением поля DEPT_NO из таблицы DEPARTMENT. FIBPlus позволяет делать это автоматически при помощи префикса "MAS_":

INSERT INTO EMPLOYEE(
    EMP_NO,  FIRST_NAME,  LAST_NAME,   PHONE_EXT,  HIRE_DATE,


    DEPT_NO,

    JOB_CODE,  JOB_GRADE, JOB_COUNTRY,  SALARY
)
VALUES(
    ?EMP_NO,  ?FIRST_NAME,  ?LAST_NAME, ?PHONE_EXT, ?HIRE_DATE,

    ?MAS_DEPT_NO,

    ?JOB_CODE,  ?JOB_GRADE, ?JOB_COUNTRY, ?SALARY
)

Теперь мы указали явным образом, что значение для поля EMPLOYEE.DEPT_NO нужно брать из поля DEPT_NO таблицы DEPARMENT, которая является master-таблицей для таблицы EMPLOYEE. Тоже изменение необходимо внести в запрос UpdateSQL:

UPDATE EMPLOYEE SET 
    FIRST_NAME = ?FIRST_NAME,
    LAST_NAME = ?LAST_NAME,
    PHONE_EXT = ?PHONE_EXT,
    HIRE_DATE = ?HIRE_DATE,


    DEPT_NO = ?MAS_DEPT_NO,

    JOB_CODE = ?JOB_CODE,
    JOB_GRADE = ?JOB_GRADE,
    JOB_COUNTRY = ?JOB_COUNTRY,
    SALARY = ?SALARY
 WHERE     
            EMP_NO = ?OLD_EMP_NO

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

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

  pFIBDataSet1.Open;
  pFIBDataSet2.Open;
end;

Можно запустить приложение. Двигаясь вверх и вниз по DBGrid1 вы можете наблюдать как автоматически изменяется содержимое в DBGrid2. Связка master-detail уже работает.

Рис. 14.

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


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

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

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

Навигация



...сейчас пытаюсь понять как насчет устойчивости и предсказуемости работы - это гораздо важнее. пока претензий нет - даже подозрительно 8-)... >>

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