На этом шаге мы рассмотрим назначение компонентаTIBClientDataSet и его свойства.
Компонент TIBClientDataSet создает клиентский НД. Его назначение - кэшировать получаемые от сервера данные и поддерживать двунаправленный курсор. Фактически он сочетает в себе свойства других компонентов-наборов: в свойство CommandText можно поместить SQL-запрос и выполнить его методом Execute - в этом случае он подобен компоненту TIBQuery; с другой стороны, он имеет целый набор свойств и методов, позволяющих использовать его как компонент TIBTable. Свойства компонента TIBClientDataSet перечислены в таблице 1.
Свойство | Описание |
---|---|
property Active: Boolean; | Открывает/закрывает набор данных |
property ActiveAggs [Index: Integer]: TList; | Указывает, каким образом осуществляется агрегирование значений: по всем данным (индекс 0), по первому групповому уровню (индекс 1) и т. д. Элементами ActiveAggs являются списки возможных значений свойства Aggregates. Если какой-либо элемент содержит NIL, агрегирование на данном уровне отсутствует |
property Aggregates: TAggregates; | Содержит наборы объектов класса TAggregate, каждый из которых определяет формулу, по которой осуществляется вычисление агрегатного значения |
property AggregatesActive: Boolean; | Разрешает/запрещает агрегирование данных |
property CanModifу: Boolean; | Содержит True, если данные можно изменять |
propertyChangeCount: Integer; | Содержит количество изменений, сделанных в текущем НД |
propertyCloneSource: TCustomClientDataSet; | Определяет НД, с которым компонент разделяет данные |
property CommandText: String; | Содержит текст SQL-запроса. Для TIBClientDataSet это текст свойства SQL внешнего компонента TIBDataSet |
property DBConnection: TIBDatabase; | Содержит ссылку на связной компонент |
property DBTransaction: TIBTransaction; | Содержит ссылку на транзакционный компонент |
property Data: OleVariant; | Содержит данные, полученные от провайдера |
property DataSetField: TDataSetField; | Открывает доступ к вложенным таблицам Oracle |
property DataSize: Integer; | Определяет текущую длину данных в байтах |
property DataSource: TDataSource; | В дочерней таблице указывает имя главного НД (вариант только для чтения свойства MasterSource) | property DBConnection: TDatabase; | Содержит ссылку на связный компонент (на TIBDatabase) |
property Delta: OleVariant; | Содержит обновляемые записи |
property DisableStringTrim: Boolean; | Если содержит True, завершающие пробелы в текстовых столбцах будут отсекаться при подтверждении изменений |
property FetchOnDemand: Boolean; | Если содержит True, данные из ВLOВ-столбцов не включаются в пакет данных |
property FileName: String; | Содержит имя файла для хранения данных при отложенной обработке (см. ниже) |
property Filter: String; | Аналог свойства TDataSet.Filter |
property Filtered: Boolean; | Аналог свойства TDataSet.Filtered |
property FilterOptions: TFilterOptions; | Аналог свойства TDataSet.FilterOptions |
property Found: Boolean; | Если содержит True, для НД могут использоваться методы FindFirst, FindLast, FindNext, FindPrior |
property GroupingLevel: Integer; | Указывает количество уровней, на которых агрегируются данные |
property IndexDefs: TIndexDefs; | Содержит информацию об индексах таблиц БД |
propertyIndexFieldCount: Integer; | Содержит количество столбцов в индексе |
property IndexFieldNames: String; | Содержит имена индексных столбцов, разделенных символами точки с запятой |
property IndexFields [Index: Integer]: TField; | Открывает доступ к индексным столбцам |
property IndexName: String; | Содержит имя текущего индекса |
property KeyExclusive: Boolean; | Аналог свойства TTable.KeyExclusive | propertyKeyFieldCount: Integer; | Содержит количество используемых для поиска индексных столбцов в сложном индексе |
property KeySize: Word; | Содержит длину в байтах текущего ключа |
property LogChanges: Boolean; | Содержит True, если ведется протокол изменений в локальном наборе данных. Если содержит False, компонент не поддерживает кэширование изменений |
property MasterFields: String; | Аналог одноименного свойства ТТаblе |
property MasterSource: TDataSource; | Аналог одноименного свойства ТТаblе |
property Modified: Boolean; | Содержит True, если текущая запись была изменена | property Options: TProviderOptions; | Указывает способ заполнения данных и их использование (см. ниже) |
property PacketRecords: Integer; | Содержит максимальное количество записей в одном пакете данных |
property Params: TParams; | Аналог одноименного свойства TQuery |
property ReadOnly: Boolean; | Содержит True, если данные нельзя изменять |
property RecNo: Integer; | Аналог одноименного свойства ТТаblе |
property RecordCount: Integer; | Содержит количество записей в локальном НД | property SavePoint: Integer; | Указывает позицию изменения в протоколе изменений (см. ниже) |
type TUpdateStatus = (usUnmodified, usModif ied, uslnserted, usDeleted) ; TUpdateStatusSet = set of TUpdateStatus; property StatusFilter: TUpdateStatusSet; |
Определяет записи, которые будут участвовать в процедуре обновления:
|
property XMLData: OleVariant; | Аналог свойства Data, но представляет данные в формате языка XML |
Свойство FileName позволяет реализовать так называемую отложенную обработку данных. Если это свойство содержит имя файла, при закрытии компонента данные из кэша автоматически записываются в файл, а при открытии - считываются из него. Таким образом, компонент получает возможность работать с собственными данными и до поры не подтверждать их изменение в таблицах БД.
Определение типа TProviderOption для свойства Options выглядит следующим образом:
type TProviderOption = ( poFetchBlobsOnDemand, poFetchDetailsOnDemand, poIncFieldProps, poCascadeDeletes, poCascadeUpdates, poReadOnly, poAllowMultiRecordUpdates, poDisableInserts, poDisableEdits, poDisableDeletes, poNoReset, poAutoRefresh, poPropogateChanges, poAllowCommandText, poRetainServerOrder); TProviderOptions = set of TProviderOption;
Здесь элементы перечисления означают следующее:
С помощью свойства SavePoint можно восстановить НД после ошибочных изменений. Для этого нужно перед изменениями запомнить текущее значение свойства, а для отмены изменений - поместить в него сохраненное значение. Например, пусть значение в столбце Age (возраст) НД не должно быть меньше 0 и больше 100. Тогда можно использовать такой фрагмент программы:
var BeforeEditPos: Integer; procedure TForm1.IBClientDataSet1BeforeEdit(DataSet: TDataSet); begin // Перед началом изменений запоминаем позицию изменений // в глобальной переменной BeforeEditPos: BeforeEditPos := IBClientDataSetl.SavePoint; end; procedure TForm1.IBClientDataSet1AfterEdit(DataSet: TDataSet); var Age: Real; begin Age := DataSet['Age']. AsFloat; if (Age<0) or (Age>100) then begin ShowMessage('Указан неверный возраст'); IBClientDataSet1.SavePoint := BeforeEditPos; еnd; end;
На следующем шаге мы рассмотрим методы и события этого компонента.