Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 26.11.2016
Сообщений: 2

Загрузка нескольких вложенных DataSet-ов

26.11.2016, 08:21. Показов 1867. Ответов 5

Студворк — интернет-сервис помощи студентам
Приветствую всех!

Обращаюсь в надежде, что местные гуру подскажут решение. Сам я уже запарился его искать.
Речь идёт о DataSnap. Есть клиент-серверное приложение. На стороне клиента определена цепочка вложенных ClientDataSet'ов:
Delphi
1
2
3
4
5
6
7
8
9
TDM = class(TDataModule)
  cdsMaster: TClientDataSet;
  cdsMaster_cds1: TDataSetField;
  cds1: TClientDataSet;
  cds1_cds2: TDataSetField;
  cds2: TClientDataSet;
  cds2_cds3: TDataSetField;
  cds3: TClientDataSet;
end;
(т.е. вложенные зависимости 1:M - cdsMaster -> cds1 -> cds2 -> cds3).

На стороне сервера — соответствующий набор master-detail компонентов.
Delphi
1
2
3
4
5
6
7
TCoDataModule = class(TRemoteDataModule, ICoDataModule)
  prvMaster: TDataSetProvider;
  dsMaster: TIBDataSet;
  ds1: TIBTable;
  ds2: TIBTable;
  ds3: TIBTable;
end;
Задача состоит в том, чтобы сперва загрузить cdsMaster (без деталей), а потом по требованию получать ВСЕ вложенные детали для выбранной мастер-записи. То есть, чтобы всё содержимое cds1, cds2, cds3 шло одним пакетом.

У TDataSetProvider есть опция poFetchDetailsOnDemand. Только если её отключить, то сразу грузится вся база. А если включить, то клиент дёргает по одной записи, что приводит к жуткому оверхеду по трафику, снижая производительность в десятки раз.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.11.2016, 08:21
Ответы с готовыми решениями:

Изменение запроса в зависимости от выбранных строк в нескольких DbGrid (в SQL получить значения из нескольких DataSet)
Здравствуйте. Есть таблицы и компоненты: Tbl_authors – Таблица авторов. С ней связаны компоненты: - ADOTable_authors, -...

Загрузка в DataSet нескольких таблиц
Здравствуйте. У меня возникло несколько вопросов. Как известно DataSet может содержать несколько таблиц. Как загрузить эти таблицы в...

Как выходить из нескольких вложенных циклов?
Столкнулся с ситуацией что нужно выходить из нескольких циклов при определенных условиях. Тут только go to ?

5
5971 / 4547 / 1094
Регистрация: 29.08.2013
Сообщений: 28,168
Записей в блоге: 3
26.11.2016, 15:14
а вы прям по сети гоняете датасеты?
почему не Stream?

ЗЫ может вым убрать зависимости? передавать по одному, а уже на клиенте связать их?
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,669
Записей в блоге: 21
26.11.2016, 19:40
не, это нормально в датаснапе так все и предусмотрено
просто надо сделать отдельные датасеты
один - без join, а другой - с одной записью и Join'ами к ней

хотя лично я все гоняю в чистом json, не пользуюсь датасетами
ибо MVC
0
26.11.2016, 21:21

Не по теме:

S_talker, а большие таблички передаете? по локальной сети?

0
0 / 0 / 0
Регистрация: 26.11.2016
Сообщений: 2
27.11.2016, 04:59  [ТС]
qwertehok, если говорить о полезных данных, то мастер-таблица занимает где-то порядка 200-300 КБ. Суммарный размер деталей — в порядка 10-20 КБ на одну мастер-запись. Но если предположить, что для вытягивания всех деталей потребуется, например, 100 обращений к серверу, то получается бешенный оверхед. Метаданные, которые гоняются каждый раз от клиента к серверу и обратно, занимают около 20 КБ. Плюс всякие ключи да дельты — вот и набегает 5 МБ вместо 10 КБ. Плюс расходы на открытие сетевых соединений, курсоров и проч.

У клиента VPN, и довольно хиленький.

krapotkin, очень многое завязано на уже реализованной логике, поэтому Join'ы вряд ли подойдут (кстати, еще неясно сколько такая слепленная табличка будет весить). По этой же причине в проекте никогда не будет MVC
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,669
Записей в блоге: 21
27.11.2016, 12:46
под join я имел в виду ваши мастер детали
еще раз проговариваю идею
если вам надо одну так, другую по-другому, сделайте ДВЕ и переключайтесь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.11.2016, 12:46
Помогаю со студенческими работами здесь

Асинхронное загрузка таблиц в DataSet
Можно ли реализовать глобальную и асинхронную загрузку таблиц в DataSet ? Т.е Мы подключаемся к БД и сразу начинаем загружать все таблицы...

Загрузка 20K записей в DataSet
Здравствуйте! Есть такая необходимость использовать 20к (20 000) записей. Система поиска по базе данных и выводом в datagrid отпадает, по...

Загрузка данных из DataSet в Listview
Осваиваю Sql! Вот пытаюсь загрузить из БД данные в listView, загрузить получилось но загрузилась вся информация втолько в первый столбик а...

Объединение нескольких dataSet и отображение в dataGridView
Доброго времени суток всем! Пытаюсь объединить несколько dataSet'ов в один, результат отобразить в dataGridView таким способом: ...

Общий DataSet для нескольких форм
Привет всем! Помогите, пожалуйста, решить проблемку... Есть DataSet1, расположенный на форме Form1. В этот DataSet1 посредством...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru