Если вы попробуете исправить какие-то значения в DBGrid1, то увидите, что в текущем состоянии мы имеем read-only запрос. Для того, чтобы наш запрос стал редактируемым, или "живым", нам надо написать несколько дополнительных запросов, которые будут автоматически выполнятся компонентом pFIBDataSet1 при редактировании данных в DBGrid1. Необходимо заполнить свойства:

Рис. 9.

FIBPlus включает специальный design-time редактор для редактирования и генерации модифицирующих запросов. Вы можете вызвать Generator SQLs из контекстного меню, если нажмете правой кнопкой мыши на компоненте pFIBDataSet1.

Рис. 10.

Для генерации модифицирующих запросов необходимо сначала указать основную таблицу в списке. Если в запросе участвует только одна таблица, то она будет выбрана в списке автоматически. После этого необходимо нажать кнопку Get Table Fields для заполнения списков "Key Fields" и "Update Fields". В первом списке нужно выделить те поля, которые будут вставлены в условие WHERE во всех модифицирующих запросах. В списке "Update Fields" необходимо выделить те поля, которые мы хотим редактировать. По умолчанию выделены все поля таблицы DEPARTMENT. Теперь достаточно нажать кнопку "Generate SQLs" и получить автоматически все модифицирующие запросы, которые вы можете увидеть на закладке SQLs. Например, мы получим следующий запрос для свойства InsertSQL:

INSERT INTO DEPARTMENT(
    DEPT_NO,  DEPARTMENT,  HEAD_DEPT,  MNGR_NO,  BUDGET,  LOCATION,
    PHONE_NO
)
VALUES(
    ?DEPT_NO, ?DEPARTMENT,  ?HEAD_DEPT, ?MNGR_NO, ?BUDGET, ?LOCATION,
    ?PHONE_NO
)

Обратите внимание также на запрос для свойства RefreshSQL. Это такой же выбирающий запрос, но возвращать он должен только одну запись - текущую! Теперь, после создания всех запросов, когда пользователь вставит новую запись в DBGrid1, то pFIBDataSet1 автоматически заполнит значения параметров ?DEPT_NO, ?DEPARTMENT и т.д. теми значениями полей, которые наберет пользователь. Обратите внимание на поле DEPT_NO. Это целочисленное поле, которое является primary key для таблицы и оно должно содержать уникальные значения. Interbase предлагает специальную возможность для получения таких номеров, гарантируя уникальность в масштабе базы данных - это генераторы. Особенность использования генераторов состоит в том, что мы должны получать новое значение генератора в приложении до того, как выполним запрос на вставку записи. Зачем это нужно? Дело в том, что после выполнения любого модифицирующего запроса (кроме удаления), pFIBDataSet1 автоматически выполняет запрос из RefreshSQL, подставляя в качестве условия текущие значения параметров. В нашем случае для подстановки надо использовать значение первичного ключа. Если мы не получим его заранее, а будем генерировать его, используя триггер, то мы не сможем подставить значение DEPT_NO в запрос RefreshSQL, а значит не сможем перечитать измененную запись. Таким образом, если какие-то поля записи менялись внутри триггеров базы данных, то мы не увидим эти изменения, пока не переоткроем весь запрос целиком. Если же мы сначала получим новое значение генератора, потом вставим это значение наравне с остальными параметрами, то потом сможем использовать это же значение для refresh'а текущей записи и будем "в курсе" актуальных значений полей без излишних переоткрываний!

TpFIBDataSet позволяет автоматически получать и вставлять значения первичного ключа, используя генератор. Для этого нам необходимо заполнить свойство AutoUpdateOptions:

Рис. 11.

Прежде всего, нужно указать название таблицы DEPARTMENT, название ключевого поля DEPT_NO и название генератора DEPT_NO_GEN. Свойство WhenGetGenID может принимать три возможных значения:

  • wgOnNewRecord - получать значение генератора сразу после подготовки буфера для новой записи;
  • wgBeforePost - получать значение генератора непосредственно перед отправкой новой записи на сервер;
  • wgNever - не использовать механизм генерации ключевых значений.

В нашем примере мы укажем значение wgOnNewRecord, чтобы сразу видеть в DBGrid1 те значения поля DEPT_NO, которые будут получены с сервера. Теперь мы можем запустить наше приложение и отредактировать какие-либо существующие записи и даже вставить новые записи:

Рис. 12.

Из рисунка видно, что было автоматически получено значение для поля DEPT_NO равное 22. Обратите также внимание на тот факт, что также автоматически были получены значения по умолчанию для полей BUDGET и PHONE_NO.

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


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

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

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

Навигация



Меня поражает как в них [FIBPlus] все хорошо продумано. И приятно, что это сделали русские программисты. >>

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