powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDac и возврат значений из динамически созданной таблицы
5 сообщений из 5, страница 1 из 1
FireDac и возврат значений из динамически созданной таблицы
    #39501578
Alexander2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делается динамический pivot для классической ситуации создания кросс-таблицы для товаров (по строкам) и свойств или показателей (по колонкам) пример взят отсюда
Для MySQL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
SET @sql = '';
SELECT
    @sql := CONCAT(@sql,if(@sql='','',', '),temp.output)
FROM
(
    SELECT
      DISTINCT
        CONCAT(
         'MAX(IF(pa.fieldname = ''',
          fieldname,
          ''', pa.fieldvalue, NULL)) AS ',
          fieldname
        ) as output
    FROM
        product_additional
) as temp;

SET @sql = CONCAT('SELECT p.id
                    , p.name
                    , p.description, ', @sql, ' 
                   FROM product p
                   LEFT JOIN product_additional AS pa 
                    ON p.id = pa.id
                   GROUP BY p.id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Таблица product

 id | name     | description   | stock  |

  1 | product1 | first product |    5   | 
  2 | product2 | sec   product |    5   | 

Таблица product_additional

| id | fieldname  | fieldvalue |

  1 | size    | S    |
  1 | height  | 103  |
  2 | size    | L    |
  2 | height  | 13   |
  2 | color   | black|


Отлаживаю в MySQL WorkBench, все работает, вначале показывает секунду одномерные строки, потом промигивает и показывает кросс-таблицу. Это работает только в MySQL Workbench.
На клиенте взял FireDacQuery и в нем прописал этот скрипт и вызываю этот датасет на грид - чтоб получить созданную скриптом кросс-таблицу. Вместо таблицы получаю промежуточный результат все еще одномерный.
Как и что надо исправить в механизме вызова или обращения, чтобы она возвращала финальный датасет: по строкам продукты, по колонкам имена параметров, в ячейках значения?
...
Рейтинг: 0 / 0
FireDac и возврат значений из динамически созданной таблицы
    #39501901
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что мешает написать такой запрос?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT
  p.id,
  p.name,
  p.description,
  (SELECT MAX(pa.fieldvalue) FROM product_additional WHERE pa.fieldname = pa2.fieldname)
FROM
  product p
  LEFT JOIN product_additional AS pa2 ON (p.id = pa2.id)
GROUP BY
  p.id
...
Рейтинг: 0 / 0
FireDac и возврат значений из динамически созданной таблицы
    #39502069
Alexander2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

что-то не получается каменный цветок из такого скрипта, ты уверен, что это должно работать (думаю, на ты можно, давно тут обитаем)
вот картинка
...
Рейтинг: 0 / 0
FireDac и возврат значений из динамически созданной таблицы
    #39502141
AX-Class
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander2,

Может, через FireDacQuery.NextRecordSet
...
Рейтинг: 0 / 0
FireDac и возврат значений из динамически созданной таблицы
    #39502170
Alexander2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AX-Class,

Спасибо, вот пытаюсь понять как работать с этим NextRecordSet, на эмбаровике нашел такой пример:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
var
  i: Integer;
begin
  FDConnection1.ResourceOptions.ServerOutput := True;
  FDQuery1.FetchOptions.AutoClose := False;
  FDQuery1.Open('select * from Region; print ''Hello''');
  FDMemTable1.Data := FDQuery1.Data;
  Memo1.Lines.Add(Format('%d rows processed', [FDMemTable1.RecordCount]));
  FDQuery1.NextRecordSet;
  if FDConnection1.Messages <> nil then
    for i := 0 to FDConnection1.Messages.ErrorCount - 1 do
      Memo1.Lines.Add(FDConnection1.Messages[i].Message);
end;


сделал так:
на датамодуль бросил FDQuery - fdNext, в нем прописал тот вышеупомянутый скрипт динамического формирования кросс-таблицы
положил еще FDMemTable1,
на форме грид, датасурс нацелил на FDMemTable1
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TfReport.btn1Click(Sender: TObject);
begin
     dmReport.fdNext.Active:=False;
     dmReport.fdNext.Active:=True;
     dmReport.FDMemTable1.Data := dmReport.fdNext.Data;
     dmReport.fdNext.NextRecordSet;
     labNstrok.Caption:=IntToStr(dmReport.FDMemTable1.RecordCount);
end;


в итоге получаю такое - картинка:
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDac и возврат значений из динамически созданной таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]