property Fields: TFields;
В дальнейшем связь между компонентами на клиенте настраивается именно через это поле. В подчиненном компоненте TCiientDataSet в Инспекторе объектов необходимо выбрать свойство
property DataSetField: TDataSetFieid;
В списке этого свойства вы увидите имя только что созданного поля объектного типа TDataSetFieid. Выберите его и отношение "один-ко-многим" для клиентских наборов данных готово. При этом в компоненте вложенного набора данных автоматически очищаются свойства RemoteServer и ProviderName, т. к. их значения утрачивают значение и компонент оказывается связан только с главным компонентом отношения "один-ко-многим".
Теперь при навигации по записям основного набора данных во вложенном наборе данных автоматически будут появляться связанные записи. Также вы можете использовать все возможности, предоставляемые компонентом TCiientDataSet как для основного, так и для вложенного набора данных.
Дополнительные свойства полей клиентского набора данных
Как известно, все классы полей имеют одного общего предка - класс TFieid. Подробно эти классы рассматриваются в гл. 13. Здесь же остановимся лишь на нескольких дополнительных свойствах полей, которые работают только в режиме кэширования в обычных компонентах, инкапсулирующих набор данных, и в компоненте TCiientDataSet. Причем в компоненте TCiientDataSet реализация этих свойств обеспечена локальным кэшем.
Итак, для разработчика могут быть полезны свойства объектов полей, содержащие не только текущее, но и предыдущее значение поля.
Свойство
property CurValue: Variant; возвращает текущее значение поля.
Свойство
property OldValue: Variant;
содержит значение поле, которое было до начала редактирования. Свойство
property NewValue: Variant ;
содержит новое значение, которое может быть присвоено при обработке ошибки сервера методом-обработчиком OnReconcileError (см. ниже).
Обработка ошибок
Особенности использования компонента TCiientDataSet распространяются также и на обработку ошибок. Ведь клиентский набор данных должен реагировать не только на ошибки, возникшие локально, но и на ошибки сохранения изменений на сервере.
В первом случае разработчик может применить стандартные способы. Это использование блоков try. .except или методов обработчиков, унаследованных от класса TDataSet:
О property OnDeleteError: TDataSetErrorEvent;
- вызывается при ошибках удаления записей;
□
property OnEditError: TDataSetErrorEvent;
- вызывается при ошибках редактирования записей;
О property OnPostError: TDataSetErrorEvent; - вызывается при ошибках локального сохранения записей.
Все они используют процедурный тип
type
TDataSetErrorEvent = procedure,(DataSet: TDataSet;
E: EDatabaseError;
var Action: TDataAction) of object;
Здесь, помимо параметров DataSet и E, определяющих соответственно набор данных и тип ошибки, параметром Action можно задать вариант реакции на ошибку:
type TDataAction = (daFail, daAbort, daRetry); daFail - прервать операцию и показать сообщение об ошибке; daAbort - прервать операцию без сообщения об ошибке; daRetry - повторить операцию.