Показать сообщение отдельно
  #5  
Старый 25.02.2019, 22:01
DenSarych DenSarych вне форума
Прохожий
 
Регистрация: 02.08.2018
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Насколько я понял, необходимо таблицу заполнить так:
-мастер-данные выводятся как есть
-детализирующие-данные разворачиваются в ту же строку справа.

Для этого на клиенте создаём sql-запрос вручную.
Нам потребуется два TQuery. Первый, назовём его QueryParams, который покажет нам сколько дополнительных столбцов нам потребуется. А во втором, назовём его QueryRes, мы построим sql-запрос, выполним его и отобразим полученные данные в DbGrid.

Допустим у нас есть три таблицы c колонками: TbMaster (TbMaster_id, Name); TbDetail (TbDetail_id, Name); TbMstDetail (TbMstDetail_id, TbMaster_id, TbDetail_id, Value). И нам требуется вывести в строку значения параметров Value. Другими словами, две таблицы связаны с помощью третьей связью многие ко многим, в которой и содержатся значения параметра.

Текст первого запроса QueryParams очищаем. QueryParams.SQL.Clear
Вводим в него sql-запрос наподобии следующего:
Код:
  
  select distinct md.TbDetail_id
    from TbMaster m
    left join TbMstDetail md on m.TbMaster_id = md.TbMaster_id
Выполним его. QueryParams.Open
Мы получим перечень наших дополнительных столбцов, которые используются в нашей выборке по таблице TbMaster. Количество столбцов возьмём из QueryParams.RecordCount. Кроме того, получим id наших параметров.

Теперь сформируем наш второй запрос QueryRes.
В нём нам нужно получить sql-запрос наподобии следующего (например, для трёх параметров c id: 10, 11, 12):
Код:
  select m.num, m.name, m.description
    ,md1.Value prm1 
    ,md2.Value prm2 
    ,md3.Value prm3 
  from TbMaster m
  left join TbMstDetail md1 on m.TbMaster_id = md1.TbMaster_id and md1.TbDetail_id = 10
  left join TbMstDetail md2 on m.TbMaster_id = md2.TbMaster_id and md2.TbDetail_id = 11
  left join TbMstDetail md3 on m.TbMaster_id = md3.TbMaster_id and md3.TbDetail_id = 12
  order by m.Name  
Текст второго запроса QueryRes очищаем.
Добавляем в него "обязательную часть", т.е. то что было первоначально на картинке "мастер" в первом посте:
Код:
  QueryRes.Sql.Add('select m.num, m.name, m.description');
Дальше в цикле for i:= 1 to QueryParams.RecordCount добавляем колонки, в которых будут отображаться значения параметров:
Код:
  QueryRes.Sql.Add('  , md'+IntToStr(i) +'.Value prm'+IntToStr(i));
Т.е. получаем строки:
Код:
  '  ,md1.Value prm1'
Добавляем в текст запроса ещё одну "обязательную часть":
Код:
  QueryRes.Sql.Add('  from TbMaster m');
A дальше в цикле for i:= 1 to QueryParams.RecordCount добавляем связи:
Код:
  QueryRes.Sql.Add('  left join TbMstDetail md'+IntToStr(i)
    +' on m.TbMaster_id = md'+IntToStr(i)+'.TbMaster_id and  md'+IntToStr(i)+'.TbDetail_id = '+IntToStr(n1));
Т.е. получаем строки:
Код:
    '  left join TbMstDetail md1 on m.TbMaster_id = md1.TbMaster_id and md1.TbDetail_id = 10'
Завершаем текст sql сортировкой, а при необходимости и условием отбора where:
Код:
  QueryRes.Sql.Add('  order by m.Name');
Наш запрос готов, запускаем его. QueryRes.Open
Переименовываем (или добавляем) столбцы в DbGrid.
Ответить с цитированием