На этом шаге мы рассмотрим назначение компонента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;
На следующем шаге мы рассмотрим методы и события этого компонента.