Подключение к генератору 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;
вызывается при изменении состояния связанного набора данных