Насколько я понял, необходимо таблицу заполнить так:
-мастер-данные выводятся как есть
-детализирующие-данные разворачиваются в ту же строку справа.
Для этого на клиенте создаём 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));
Т.е. получаем строки:
Добавляем в текст запроса ещё одну "обязательную часть":
Код:
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.