Подключение к генератору InterBase при использовании TiBQuery

При создании новых записей в редактируемых наборах данных компонентов запросов возникает проблема присвоения значений полям первичных индексов. Очевидно, что при сохранении новой записи в базе данных поле первичного индекса будет инкрементировано средствами сервера InterBase (соответствующими генератором и триггером). Однако получить это значение в приложении можно только сохранив изменения и обновив набор данных, что зачастую требует больших затрат ресурсов.

Для решения этой проблемы в компоненте TiBQuery используется свойство

property GeneratorField: TIBGeneratorField;

Редактор свойства (рис. 6) позволяет связать генератор с инкрементируемым полем.

 

Рисунок 6 Редактор свойства GeneratorField компонента TiBQuery

 

Список Generator позволяет выбрать один из доступных генераторов базы данных. Список Field задает инкрементируемое поле набора данных. В строке Increment By определяется шаг прибавляемого значения поля.

 

Группа радиокнопок Apply Event определяет событие, при котором срабатывает генератор:

- On New Record — при создании новой записи;

- On Post — при сохранении новой записи;

- On Server — генератор управляется сервером.

 

Редактор свойства GeneratorField попросту присваивает значения полям экземпляра класса TIBGeneratorField.

Компонент TUpdateSQL

TUpdateSQL предназначен для модификации данных на сервере с помощью заранее подготовленных SQL-предложений. Это особенно важно для наборов данных, открываемых TIBQuery с запросом SELECT, поскольку SELECT создает таблицу только для чтения. Компонент TUpdateSQL позволяет определить различные операторы SQL для удаления, вставки и модификации записи, в том числе отличные от простых операторов DELETE, INSERT, APPEND. Эти операторы SQL содержатся в свойствах DeleteSQL, InsertSQL, ModifySQL соответственно.

Имя компонента TUpdateSQL может быть значением свойства UpdateObject какого-либо компонента TDataSet (например, TTable или TQuery). Если в этом случае используется кэширование данных, то в процессе выполнения транзакции, инициированной применением метода ApplyUpdates компонента TDataSet при попытке вставки, удаления или изменения записи генерируется SQL-запрос, содержащийся в свойстве InsertSQL, DeleteSQL или ModifySQL соответственно. Эти свойства можно редактировать, выбрав пункт UpdateSQL editor из контекстного меню компонента TUpdateSQL. Если же кэширование не используется, соответствующие SQL-запросы генерируются при выполнении метода Post компонента TDataSet.

Отметим, что эти три свойства поддерживают специальное расширение SQL, обеспечивающее возможность использования в запросах значений полей, существовавших до начала выполнения транзакции, переносящей на сервер данные из кэша (обычно это требуется при создании предложения WHERE в SQL-запросах). Такие значения полей обозначаются следующим образом: префикс "OLD_" + <имя поля>.

На этапе выполнения в процессе сохранения какой-либо записи на сервере компонент TUpdateSQL выбирает один из трех описанных в его свойствах запросов в соответствии со значением свойства UpdateKind компонента TDataSet, пересылает параметры запроса на сервер и выполняет запрос с целью фиксации на сервере данного обновления.

Для управления каждым отдельным обновлением внутри транзакции, переносящей данные из кэша на сервер, можно использовать событие OnApplyUpdate соответствующего компонента TDataSet, а также параметры UpdateKind (тип обновления) и UpdateAction, которому должно быть присвоено значение uaApplied, если обновление было успешным. Если установить значение этого параметра равным uaSkip, данная запись в кэше будет проигнорирована и не перенесена на сервер.

Cтандартные SQL-запросы для добавления, удаления и изменения записи наиболее удобно создавать с помощью специального редактора UpdateSQL editor, который вызывается двойным щелчком на TUpdateSQL или при выделенном TUpdateSQL вызывается из всплывающего меню. (рис. 7)

Рисунок 7 Редактор UpdateSQL

Необходимо выделить поля, входящие в первичный ключ (Key Fields) и поля предназначенные для редактирования (Update Fields). После этого необходимо нажать на кнопку Generate SQL тем самым задав свойства DeleteSQL, InsertSQL, ModifySQL. Просмотреть и при необходимости изменить тексты запросов можно на вкладке SQL диалогового окна.

Отметим, что свойства DeleteSQL, InsertSQL, ModifySQL компонента TUpdateSQL могут содержать более сложные запросы, нежели сгенерированные автоматически в его редакторе свойств, в соответствии с логикой содержащего его приложения.

Компонента TDataSource

Компонент TDataSource является связующим звеном между наборами данных, представленных компонентами TTable, TQuery и TStoredProc, и визуальными компонентами отображения и управления данными, он обеспечивает взаимодействие набора данных с компонентами отображения данных. Чаще всего одному набору данных соответствует один компонент TDataSource, хотя их может быть несколько.

Для настройки свойств компонента необходимо прежде всего связать набор данных и компонент TDataSource. Для этого используется свойство DataSet компонента TDataSource, доступное через Инспектор объектов. Это указатель на экземпляр компонента доступа к данным. В списке этого свойства в Инспекторе объектов перечислены все доступные компоненты наборов данных.

 

Примечание

 

Компонент TDataSource можно подключить не только к набору данных из той же формы, но и любой другой, модуль которой указан в секции uses.

Компонент TDataSource имеет ряд полезных свойств и методов. Итак, связывание с компонентом набора данных выполняет свойство

property DataSet: TDataSet;

а определить текущее состояние набора данных можно, использовав свойство

property State: TDataSetState;

(Тип TDataSetState определяет различные варианты состояния набора данных.

type TDataSetState = (dslnactive, dsBrowse, dsEdit, dslnsert, dsSetKey, dsCalcFields, dsFilter, dsNewValue, dsOldValue, dsCurValue, dsBlockRead, dsInternalCalc);

Для нас важны четыре первых значения

- Dslnactive – набор не активен,

- DsBrowse – набор в режиме просмотра,

- dsEdit - набор в режиме редактирования записи,

- dslnsert- набор в режиме вставки записи)

 

При помощи свойства

property Enabled: Boolean;

можно включить или отключить все связанные визуальные компоненты. При значении False ни один связанный компонент отображения данных не будет работать.

 

Свойство

property AutoEdit: Boolean;

при значении True всегда будет переводить набор данных в режим редактирования при получении фокуса одним из связанных визуальных компонентов.

Аналогично, метод

procedure Edit;

переводит связанный набор данных в режим редактирования.

Метод-обработчик

type TDataChangeEvent = procedure(Sender: TObject; Field: TField)

of object;

property OnDataChange: TDataChangeEvent;

вызывается при редактировании данных в одном из связанных визуальных компонентов.

Метод-обработчик

type TDataChangeEvent = procedure(Sender: TObject; Field: TField) of object;

property OnDataChange: TDataChangeEvent;

вызывается при редактировании данных в одном из связанных визуальных компонентов.

Метод-обработчик

property OnUpdateData: TNotifyEvent;

вызывается перед сохранением изменений в базе данных.

Метод-обработчик

property OnStateChange: TNotifyEvent;

вызывается при изменении состояния связанного набора данных



php"; ?>