LimeReport Forum
General Category | Основное => Discussion | Обсуждение => Topic started by: KorSA on April 05, 2024, 09:51:21 am
-
Добрый день.
Мне необходимо отобразить данные из двух таблиц, одна и которой является подчиненной.
Одна таблица содержит поле "id"(уникальный ключ) и какой набор данных, вторая таблица поле "id"(не уникальный ключ).
Пример:
tab1
id Fiel_1 Fiel_2
1 "поле1" "поле2"
2 "поле3" "поле4"
tab2
id Fiel_1
1 "значение1"
1 "значение2"
2 "значение3"
В результате должен получиться отчет
"поле1" "поле2"
"значение1"
"значение2"
"поле3" "поле4"
"значение3"
В дизайнере отчета поместил DataBand и к нему SubDetailBand. В DataBand поместил модель tab1, в SubDetailBand поместил tab2.
Добавление данных происходит через внешний источник данных.
------
std::unique_ptr<QSqlQuery> _query;
std::unique_ptr<QSqlQuery> _query_sub;
QSqlDatabase _db;
------
_query = std::make_unique<QSqlQuery>( _db );
_query->prepare( "select * from tab1");
_query->exec();
QSqlQueryModel* customersModel = new QSqlQueryModel();
customersModel->setQuery( *_query );
_reportEngine->dataManager()->addModel( "tab1", customersModel, true );
_query_sub = std::make_unique<QSqlQuery>(_db);
_query_sub->prepare( "select * from tab2 where tab2.id == "$D{tab1.id}");
_query_sub->exec();
QSqlQueryModel* customersModelSub = new QSqlQueryModel();
customersModelSub->setQuery(*_query_sub);
_reportEngine->dataManager()->addModel("tab2", customersModelSub, false);
В результате в готовом отчете
"поле1" "поле2"
"поле3" "поле4"
Как программно у модели tab2 сделать subdetail или есть другие варианты?
-
Хай!
Несколько неверно делаешь, смотри что происходит:
Ты сделал модели, отфильтровал (с помощью where id=..) твой customers и потом отдал модели в LR.
У тебя в отчете будут "замороженная" в моменте модель, с тем фильтром, который был применен на момент передачи ее (модели) в отчет.
Что нужно:
2 варианта:
1. использовать callBackDataSource - в docs/Руководство пользователя.pdf довольно подробно есть про это.
2. Твою customers модель полноценно создать в самом отчете LR, как subdetail. См. вкладку Datasources в дизайнере отчетов.
-
Я понимаю, что поставил условие "where id =", как раз один вопрос и состоит как модели связать программно(из кода), а не через дизайнер. Просто получается из дизайнера можно связать модели, а программно нет.
Если использовать 2 вариант, как тогда из кода передать настройки подключения к БД, к сожалению не нашел как перенастроить. Потому что отчеты строиться из разных баз, но с одинаковой структурой.
-
если задача именно из кода сделать, то это вариант 1, через callbackDataSource
-
Спасибо.