|
Вложенные наборы данных
В гл. 14 рассматривался вопрос организации
между таблицами отношения "один-ко-многим",
когда через одинаковое значение поля внешнего ключа
одна запись главной таблицы связывается с несколькими
записями подчиненной таблицы. Этот широко распространенный
в практике программирования приложений БД механизм реализован
и в компоненте TClientDataSet.
Для этого используется класс поля TDataSetField.
На стороне клиента для создания отношения
"один-ко-многим" необходимо использовать как
минимум два компонента TClientDataSet,
главный из которых инкапсулирует основной набор данных,
а подчиненный — вложенный набор данных.
Итак, на стороне сервера есть два табличных
компонента, связанных отношением "один-ко-многим"
при помощи свойств MasterSource
и MasterFields (см. гл. 14).
Также это могут быть и два компонента запросов SQL,
связанные параметрами подчиненного запроса с одноименными
полями главного запроса и свойством DataSource.
Теперь на стороне клиента необходимо
при помощи компонента-провайдера связать компонент
TClientDataSet с главным серверным компонентом
отношения "один-ко-многим" и создать для него
статические объекты для всех полей. Для этого достаточно
дважды щелкнуть на компоненте и в окне Редактора полей
(см. рис. 22.3) из всплывающего меню выбрать пункт Add
Field. В результате в окне Редактора полей появятся
имена объектов для
всех полей серверного набора данных,
а также еще одно дополнительное поле объектного типа
TDataSetFieid. Его имя совпадает
с именем подчиненного серверного компонента отношения
"один-ко-многим".
Это поле связано с подчиненным компонентом
на сервере. Чтобы убедиться в этом, достаточно просмотреть
значение его свойства только для чтения
property NestedDataSet:
TDataSet;
Индексированный список всех полей,
передаваемых из серверного подчиненного компонента,
содержится в свойстве только для чтения
property Fields:
TFields;
В дальнейшем связь между компонентами
на клиенте настраивается именно через это поле. В подчиненном
компоненте TClientDataSet в Инспекторе
объектов необходимо выбрать свойство
property DataSetField:
TDataSetFieid;
В списке этого свойства вы увидите
имя только что созданного поля объектного типа TDataSetField.
Выберите его и отношение "один-ко-многим"
для клиентских наборов данных готово. При этом в компоненте
вложенного набора данных автоматически очищаются свойства
RemoteServer и FroviderName,
т. к. их значения утрачивают значение и компонент оказывается
связан только с главным компонентом отношения "один-ко-многим".
Теперь при навигации по записям основного
набора данных во вложенном наборе данных автоматически
будут появляться связанные записи. Также вы можете использовать
все возможности, предоставляемые компонентом TClientDataSet
как для основного, так и для вложенного набора данных.
|