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

Author Topic: Master-detail на ICallbackDatasource  (Read 3480 times)

drow

  • Newbie
  • *
  • Posts: 20
    • View Profile
Master-detail на ICallbackDatasource
« on: April 05, 2016, 10:13:06 am »
Сделал обертку вокруг ICallbackDatasource для работы с master-detail (см. приложения) чтобы было можно работать с ними в таком виде:
Code: [Select]
// Создаем отчет и датасорсы
LimeReport::ReportEngine report;

LRDataSource* dsUnits = new LRDataSource(report.dataManager()->createCallbackDatasouce("units"));
dsUnits->setObjectName("units"); // Это просто что-бы в дебаге понимать, от кого вывод
dsUnits->setFieldNames(QStringList()
   << "unitID"
   << "name");

LRDataSource* dsDates = new LRDataSource(report.dataManager()->createCallbackDatasouce("dates"));
dsDates->setFieldNames(QStringList()
   << "unitID"
   << "dt");
dsDates->setObjectName("dates"); // Это просто что-бы в дебаге понимать, от кого вывод
dsDates->setParentDataSource(dsUnits, "unitID", "unitID");

// Добавляем записи
dsUnits->addRow(QVariantList()
<< calculator->inParams.unit->id()
<< calculator->inParams.unit->name());
dsDates->addRow(QVariantList()
   << calculator->inParams.unit->id()
   << calculator->inParams.dtBeg.toString("dd.MM.yyyy"));
// И т.д.
Добавил бэнды на страницу, все настроил. Но работает как-то странно. После отладки (вывод в дебаг я оставил в прилагаемых исходниках) выяснилось, что кол-во записей в дочерних датасорсах запрашивается LimeReport-ом только при вызове setAllDatasourcesToFirst в самом начале построения отчета и больше никогда не запрашивается.
Если смотреть на пример, вставленный выше, то после перехода на 1-ю запись в units, определяется, что в dates есть 20 записей. Они выводятся в отчет, потом units смещается на 2-ю запись, dates при этом уже имеет, например, 30 записей, но так как кол-во записей запрашивалось только для первой записи units, то опять же, выводится 20 записей. Если в dates для текущей записи units меньше записей, чем 20, например, 15, то 15 нормальных строк и 5 пустых.

В общем, хотелось бы либо иметь механизм уведомления dataManager-а о том, что кол-во записей изменилось, или чтобы кол-во записей перезапрашивалось заново при построении дочернего бэнда.

[вложение удалено администратором]
« Last Edit: April 05, 2016, 10:15:19 am by drow »

drow

  • Newbie
  • *
  • Posts: 20
    • View Profile
Re: Master-detail на ICallbackDatasource
« Reply #1 on: April 05, 2016, 01:17:09 pm »
В общем, пока решил проблему переделкой исходников LimeReport. Закомментировал две строчки (см. ниже), чтобы кол-во строк всегда запрашивалось, когда перемещаешься на первую запись.
Code: [Select]
void CallbackDatasource::first(){
m_currentRow = 0;
m_eof=checkIfEmpty();
bool result=false;
//    if (m_rowCount == -1){
QVariant rowCount;
CallbackInfo info;
info.dataType = CallbackInfo::RowCount;
emit getCallbackData(info,rowCount);
if (rowCount.isValid()) m_rowCount = rowCount.toInt();
//    }
emit changePos(CallbackInfo::First,result);
if (m_rowCount>0) m_eof = false;
else m_eof = !result;
}

Если разработчики что-нибудь поменяют и все заработает с их исходниками, буду очень рад :)

Arin Alex

  • Developer
  • Administrator
  • Hero Member
  • *****
  • Posts: 1005
    • View Profile
Re: Master-detail на ICallbackDatasource
« Reply #2 on: April 05, 2016, 07:06:59 pm »
drow, Поправили :) Убрали проверку. Изначально планировалось, что в сложных случаях, будут реализованы два слота getCallbackData и changePos. getCallbackData может не возвращать количества строк и в этом случае перемещения по источнику данных реализуются в слоте changePos (пример можно посмотреть в demo_r1).