Показать сообщение отдельно
  #6  
Старый 01.03.2019, 21:33
Аватар для Guaho
Guaho Guaho вне форума
Начинающий
 
Регистрация: 27.08.2017
Сообщения: 173
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Спасибо! Благодарю за столь подробное разъяснение!
Метод с виду подходящий, хотя и несколько сложноватый, как для меня, но тем не менее смысл понятен. Однако мне представляется более оптимальным другой путь, более простой, с использованием компонента TMemTableEh из библиотеки EhLib. Указанный компонент может работать как ни с чем не связанный набор данных. Этот внутренний датасет нужно сначала создать, определив его поля, причём определить их можно в Run Time, что мне и нужно. А далее с ним можно работать как душе угодно (мне будут нужны только функции сортировки и поиска). И вот в чём состоит тогда упрощённый метод:
1. Пробегаемся по всем записям мастер-датасета, из которых нужно составить сводную таблицу, и для каждой записи просматриваем список параметров, а из него формируем (занося в отдельную таблицу) все просмотренные параметры (если какой-то уже есть, его пропускаем). В итоге получаем датасет со списком имён всех параметров, которые должны быть показаны в сводной таблице.
2. Создаём внутренний датасет TMemTableEh, динамически создавая сначала поля мастер-таблицы, а затем поля имён параметров (из только что созданного датасета со списком имён всех параметров).
3. Заполняем датасет данными: перебираем все записи в мастере, формируя "мастерную" часть данных, а внутри этого цикла - перебираем детальные данные (т.е. параметры, привязанные к текущей мастер-записи), и из них формируем список значений для "детальной" части совмещённого датасета.
Время выполнения этой операции тут некритично, т.к. эта функция не будет основной, и, если надо, пользователь подождёт 1 - 2 секунды (хотя уверен, что всё выполнится намного быстрее, да и число записей не предполагается слишком большим).
Для визуализации надо будет динамически создавать столбцы в DBGridEh; если у меня это не получится, можно нагородить кучу полей с запасом.
Ответить с цитированием