Извлечение нескольких вложенных наборов данных в Delphi DataSnap
У меня есть клиент-серверное приложение Delphi, которое использует DataSnap. На стороне клиента у меня есть цепочка вложенных наборов данных клиента (cdsMaster
-> cds1
-> cds2
-> cds3
).
TDM = class(TDataModule)
cdsMaster: TClientDataSet;
cdsMaster_cds1: TDataSetField;
cds1: TClientDataSet;
cds1_cds2: TDataSetField;
cds2: TClientDataSet;
cds2_cds3: TDataSetField;
cds3: TClientDataSet;
end;
На стороне сервера у меня есть аналогичный набор наборов данных с отношениями мастер-деталь.
TCoDataModule = class(TRemoteDataModule, ICoDataModule)
prvMaster: TDataSetProvider;
dsMaster: TIBDataSet;
ds1: TIBTable;
ds2: TIBTable;
ds3: TIBTable;
end;
Во-первых, мне нужно получить содержимое cdsMaster
один раз (без подробностей), а затем получить полную информацию по требованию в одном пакете (все вложенное содержимое cds1
, cds2
, cds3
для выбранной основной записи). Какой лучший способ реализовать это?
Если я отключу опцию poFetchDetailsOnDemand
за prvMaster
, он загружает всю базу данных при подключении. Если я включу его, он будет извлекать подробные записи один за другим, что приводит к огромным накладным расходам и снижению производительности.
1 ответ
Я бы лично добавил параметры, чтобы указать запись или диапазон записей для извлечения в главном Clientdataset, и отключил poFetchDetailsOnDemand, чтобы он возвращал полные данные для тех немногих выбранных записей в главной таблице.
Таким образом, вы не извлекаете детали по одной и не загружаете всю базу данных, вы загружаете только необходимые основные записи и все их детали.
Пример: измените ваш основной набор данных клиента sql с чего-то вроде SELECT * FROM COSTUMER на что-то вроде SELECT * FROM COSTUMER WHERE ID =: ID
PS: Если вам также нужен полный список основных записей без подробностей, вы можете загрузить их в отдельный набор данных клиента. Таким образом, вы можете отобразить на сетке все возможные основные записи, а когда пользователи выбирают просмотр подробностей, вы открываете второй клиентский набор, который загружает полную основную запись (и только эту запись) со всеми ее деталями.