На этом шаге мы рассмотрим методы и события компонента TIBClientDataSet.
Методы компонента TIBClientDataSet перечислены в таблице 1.
| Метод | Описание |
|---|---|
| procedure AddIndex (const Name, Fields: String; Options: TIndexOptions; const DescFields: String= ' '; const CaselnsFields: String = ' '; const GroupingLevel: Integer = 0); | Создает новый индекс (см. ниже) |
| procedure AppendData (const Data: OleVariant; HitEOF;Boolean); | Добавляет данные Data к существующему локальному НД. Вместо этого метода обычно используется GetNextPacket |
| procedure AppendRecord (const Values: array of const); | Добавляет новую запись к НД, заполняет ее значениями Values, отсылает на сервер (или помещает в кэш) и делает ее текущей |
| procedure ApplyRange; | Включает механизм фильтрации записей по ключевым столбцам |
| function ApplyUpdates (MaxErrors: Integer): Integer; | Обновляет записи в БД: MaxErrors - максимально допустимое количество ошибок. Возвращает истинное количество ошибок |
| function BookmarkValid (Bookmark: TBookraark): Boolean; | Возвращает True, если закладка Bookmark содержит правильную ссылку |
| procedure Cancel; override; | Откатывает все неподтвержденные изменения текущей записи |
| procedure CancelRange; | Отменяет режим фильтрации по ключевым столбцам |
| procedure CancelUpdates; | Отменяет все неподтвержденные изменения из пакета Delta |
| function CompareBookmarks (Bookmarkl, Bookmark2: TBookmark): Integer; | Сравнивает две закладки и возвращает -1, 0 или +1, если первая закладка соответственно меньше, равна или больше второй |
| function ConstraintsDisabled: Boolean; | Разрешает или запрещает компоненту учитывать ограничения на значения столбцов |
| function CreateBlobStream (Field: TField; Mode: TBlobStreamMode): TStream;override; | Создает поток данных для BLOB-столбца:
|
| procedure CreateDataSet; | Создает пустой набор данных с параметрами по умолчанию |
| procedure DeleteIndex (const Name: String); | Удаляет индекс с именем Name |
| procedure DisableConstraints; | Временно прекращает действие ограничений, наложенных на значения столбцов |
| procedure EditKey; | Переводит НД в режим dsEditKey и сохраняет поисковый буфер. Этот метод полезно вызывать для комплексного индекса, когда между двумя поисками меняются лишь некоторые столбцы (см. примечание ниже) |
| procedure EditRangeEnd; | Переводит НД в режим редактирования нижней границы диапазона фильтрации |
| procedureEditRangeStart; | Переводит НД в режим редактирования верхней границы диапазона фильтрации |
| procedure EmptyDataSet; | Очищает буфер от всех записей |
| procedure EnableConstraints; | Отменяет режим, установленный методом DisableConstraints |
| procedure Execute; virtual; | Выполняет запрос из свойства CommandText |
| procedure FetchBlobs; | Получает от сервера приложений текущий BLOB-столбец |
| procedure FetchDetails; | Получает от сервера приложений детальную таблицу |
| function FetchParams; | Получает от сервера приложений текущие параметры компонентов TQuery или TStoredProc |
| function FindKey (const KeyValues: array of const): Boolean; | Аналог одноименного метода ТТаblе (см. примечание ниже) |
| procedure FindNearest (const KeyValues: array of const); | Аналог одноименного метода ТТаblе (см. примечание ниже) |
| function GetCurrentRecord (Buffer: PChar): Boolean; override; | Копирует текущую запись в буфер Buffer |
| function GetFieldData (Field: TField; Buffer: Pointer): Boolean; override; | Копирует столбец Field текущей записи в буфер Buffer |
| type TGroupPosInd = (gbFirst, gbMiddle, gbLast); TGroupPosInds = set of TGroupPosInd; function GetGroupState(Level: Integer): TGroupPosInds; |
Возвращает положение текущей записи в группе агрегирования Level:
|
procedure GetIndexInfo (IndexName: String); | Возвращает информацию об индексе с именем IndexName |
| functionGetNextPacket: Integer; | Требует от сервера приложений передать следующий пакет записей. Длина пакета определяется свойством PacketRecords. Функция возвращает количество записей, добавленных в свойство Data | function GetOptionalParam (const ParamName:String): OleVariant; | Возвращает из пакета данных пользовательскую информацию с именем ParamName, которая помещена туда методом SetOptionalParam |
| procedure GotoCurrent (DataSet: TClientDataset); | Синхронизирует курсор текущего набора с курсором набора DataSet | function GotoKey: Boolean; | Ищет запись, определенную предварительным вызовом SetKey или EditKey с последующим вызовом FieldByName, и возвращает True, если запись найдена (см. примечание ниже) |
| procedure GotoNearest; | Ищет запись, либо точно соответствующую поисковому значению, либо следующую за ней в порядке индекса. Поисковое значение задается методом SetKey или EditKey с последующим вызовом FieldByName (см. примечание ниже) | procedure LoadFromFile (const FileName: String = ' ') ; | Загружает набор данных из файла FileName. Совместно с SaveToFile дает возможность отложенного обновления данных |
| procedure LoadFromStream (Stream: TStream); | Загружает набор данных из потока Stream | type TLocateOption =(loCaselnsensitive, loPartialKey); TLocateOptions = set of TLocateOption; function Locate (const KeyFields: String; const KeyValues: Variant; Options: TLocateOptions): Boolean; override; |
Ищет запись по значениям KeyValues столбцов KeyFields и возвращает True в случае успеха.
Параметр Option уточняет условия поиска:
|
| function Lookup (const KeyFields: String; const KeyValues: Variant; const ResultFields: String): Variant; override; | Ищет запись по значениям KeyValues столбцов KeyFields и возвращает значения столбцов ResultFields найденной записи в случае успеха | procedure MergeChangeLog; | Объединяет данные из протокола изменений с реальными данными с помощью вызова ApplayUpdates |
| procedure Post; override; | Подтверждает изменения в текущей записи | function Reconcile (const Results : OleVariant): Boolean; | Вызывается методом ApplayUpdates провайдера в случае возникновения ошибки: Results - пакет ошибочных записей. Метод возбуждает событие OnReconcileError для каждой записи пакета Results (см. ниже) |
| procedure RefreshRecord; | Обновляет текущую запись, считывая ее у провайдера. Протокол изменений записи не меняется | procedure RevertRecord; | Восстанавливает текущую запись по протоколу ее изменений |
| procedure SaveToFile (const FileName: String = ' ') ; | Сохраняет НД в файле FileName | procedure SaveToStream (Stream: TStream; Format: TDataPacketFormat = dfBinary); | Сохраняет НД в потоке |
| procedure SetAltRecBuffers (Old, New, Cur: PChar) ; | Устанавливает новые значения в столбцы OldValue, HewValue и CurValue текущей записи |
| procedure SetKey; | Переводит НД в режим dsSetKey для установки нового поискового значения, которое задается следующим вызовом FieldByName (см. примечание ниже) |
| procedure SetOptionalParam (const ParamName: String; const Value: OleVariant; IncludeInDelta: Boolean = False); | Помещает в пакет данных пользовательскую информацию:
|
| procedure SetRange (const StartValues, EndValues: array of const); | Устанавливает диапазон поиска по ключам (см. примечание ниже) |
| procedure SetRangeEnd; | Устанавливает нижнюю границу диапазона поиска (см. примечание ниже) |
| procedure SetRangeStart; | Устанавливает верхнюю границу диапазона поиска (см. примечание ниже) |
| function UndoLastChange (FollowChange: Boolean): Boolean; | Отменяет последнюю операцию изменения, удаления или вставки записи. Если FollowChange=True, после отмены текущей становится восстановленная запись |
| function UpdateStatus: TUpdateStatus; override; | Возвращает статус обновления текущей записи |
Параметры метода AddIndex перечислены ниже:
Метод Reconcile для каждой ошибочной записи генерирует связанное с компонентом специфическое событие:
type TReconcileAction = (raSkip, raAbort, raMerge, raCorrect, raCancel, raRefresh); TReconcileErrorEvent = procedure (DataSet: TClientDataSet; E: EReconcileError; UpdateKind: TUpdateKind; var Action: TReconcileAction) of object; property OnReconcileError: TReconcileErrorEvent;
Здесь:
Обработчик может использовать значения OldValue, NewValue и CurValue для каждого столбца записи, но он не должен изменять текущее положение курсора НД.
События компонента TlBClientDataSet перечислены в таблице 2.
| Событие | Описание |
|---|---|
| type TRemoteEvent = procedure (Sender: TObject; var OwnerData: OleVariant) of object; property AfterApplyUpdates: TRemoteEvent; |
Возникает после подтверждения изменений, но перед событием OnReconcileError |
| property AfterExecute: TRemoteEvent; | Возникает после получения НД в результате выполнения метода Execute |
| property AfterGetParams: TRemoteEvent; | Возникает после получения от провайдера значений параметров в результате выполнения метода FetchParams |
| property AfterGetRecords: TRemoteEvent; | Возникает после получения от провайдера пакета данных |
| property AfterRowRequest: TRemoteEvent; | Возникает после получения компонентом детальной информации о текущей записи |
| type TUpdateKind = (ukModify, uklnsert, ukDelete); type TAfterUpdateRecordEvent = procedure (Sender: TObject; SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind) of object; property AfterUpdateRecord: TAfterUpdateRecordEvent; |
Возникает после успешного подтверждения каждой записи. Параметр UpdateKind указывает тип подтвержденных изменений:
|
| property BeforeApplyUpdates: TRemoteEvent; | Возникает перед подтверждением изменений |
| property BeforeExecute: TRemoteEvent; | Возникает перед выполнением метода Execute |
| property BeforeGetParams: TRemoteEvent; | Возникает перед выполнением метода FetchParams |
| property BeforeGetRecords: TRemoteEvent; | Возникает перед получением пакета данных от провайдера |
| property BeforeRowRequest: TRemoteEvent; | Возникает перед получением компонентом детальной информации о текущей записи |
| type TBeforeUpdateRecordEvent = procedure (Sender: TObject; SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean) of object; property BeforeUpdateRecord: TBeforeUpdateRecordEvent; |
Возникает перед подтверждением изменений каждой записи. Параметр Applied отменяет (True) или разрешает (False) подтверждение |
| type TGetTableNameEvent = procedure (Sender: TObject; DataSet: TDataSet; var TableName: String) of object; property OnGetTableName: TGetTableNameEvent; |
Возникает, когда провайдер не может определить имя таблицы, в которой должны подтверждаться изменения. Если НД составлен объединением нескольких таблиц или является результатом обращения к хранимой процедуре, обработчик этого события - единственное средство определения имени таблиц |
| type TReconcileAction = (raSkip, raAbort, raMerge, raCorrect, raCancel, raRefresh); type TReconcileErrorEvent = procedure (DataSet: TCustomClientDataSet; E: EReconcileError; UpdateKind: TUpdateKind; var Action: TReconcileAction) of object; property OnReconcileError: TReconcileErrorEvent; |
Это событие генерируется методом Reconcile для каждой ошибочной записи (см. выше описание метода Reconcile) |
| type TProviderDataEvent = procedure (Sender: TObject; DataSet: TCustomClientDataSet) of object;
property OnUpdateData: TProviderDataEvent; |
Возникает непосредственно перед подтверждением изменений, но после события BeforeApplyUpdates |
| type TResolverResponse = (rrSkip, rrAbort, rrMerge, rrApply, rrlgnore); type TResolverErrorEvent = procedure (Sender: TObject; DataSet: TCustomClientDataSet; E: EUpdateError; UpdateKind: TUpdateKind; var Response: TResolverResponse) of object; property OnUpdateError: TResolverErrorEvent; |
Возникает, если провайдер не может подтвердить изменения очередной записи из-за ошибки в данных. Обработчик может скорректировать запись и сообщить провайдеру свое решение по поводу ошибочных данных в параметре Response (см. ниже) |
Допустимые значения параметра Response типа TResolverResponse:
Со следующего шага мы начнем рассматривать пример использования некоторых из перечисленных компонентов.