Извлечение нескольких вложенных наборов данных в 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: Если вам также нужен полный список основных записей без подробностей, вы можете загрузить их в отдельный набор данных клиента. Таким образом, вы можете отобразить на сетке все возможные основные записи, а когда пользователи выбирают просмотр подробностей, вы открываете второй клиентский набор, который загружает полную основную запись (и только эту запись) со всеми ее деталями.

Другие вопросы по тегам