Welcome, Guest. Please login or register.
Did you miss your activation email?

Author Topic: Вопрос по работе с SubDetailBand  (Read 64 times)

KorSA

  • Newbie
  • *
  • Posts: 10
    • View Profile
Вопрос по работе с SubDetailBand
« 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.
Добавление данных происходит через внешний источник данных.

Quote
------
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 или есть другие варианты? 

Subst

  • Sr. Member
  • ****
  • Posts: 444
    • View Profile
Re: Вопрос по работе с SubDetailBand
« Reply #1 on: April 05, 2024, 10:40:12 AM »
Хай!
Несколько неверно делаешь, смотри что происходит:
Ты сделал модели, отфильтровал (с помощью where id=..) твой customers и потом отдал модели в LR.
У тебя в отчете будут "замороженная" в моменте модель, с тем фильтром, который был применен на момент передачи ее (модели) в отчет.

Что нужно:
2 варианта:

1. использовать callBackDataSource - в docs/Руководство пользователя.pdf довольно подробно есть про это.
2. Твою customers модель полноценно создать в самом отчете LR, как subdetail. См. вкладку Datasources в дизайнере отчетов.

KorSA

  • Newbie
  • *
  • Posts: 10
    • View Profile
Re: Вопрос по работе с SubDetailBand
« Reply #2 on: April 05, 2024, 11:19:30 AM »
Я понимаю, что поставил условие "where id =", как раз один вопрос и состоит как модели связать программно(из кода), а не через дизайнер. Просто получается из дизайнера можно связать модели, а программно нет. 
Если использовать 2 вариант, как тогда из кода передать настройки подключения к БД, к сожалению не нашел как перенастроить. Потому что отчеты строиться из разных баз, но с одинаковой структурой. 

Subst

  • Sr. Member
  • ****
  • Posts: 444
    • View Profile
Re: Вопрос по работе с SubDetailBand
« Reply #3 on: April 05, 2024, 11:23:34 AM »
если задача именно из кода сделать, то это вариант 1, через callbackDataSource

KorSA

  • Newbie
  • *
  • Posts: 10
    • View Profile
Re: Вопрос по работе с SubDetailBand
« Reply #4 on: April 05, 2024, 11:24:54 AM »
Спасибо.