LimeReport Forum
General Category | Основное => Discussion | Обсуждение => Topic started by: drow on April 05, 2016, 10:13:06 am
-
Сделал обертку вокруг ICallbackDatasource для работы с master-detail (см. приложения) чтобы было можно работать с ними в таком виде:
// Создаем отчет и датасорсы
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-а о том, что кол-во записей изменилось, или чтобы кол-во записей перезапрашивалось заново при построении дочернего бэнда.
[вложение удалено администратором]
-
В общем, пока решил проблему переделкой исходников LimeReport. Закомментировал две строчки (см. ниже), чтобы кол-во строк всегда запрашивалось, когда перемещаешься на первую запись.
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;
}
Если разработчики что-нибудь поменяют и все заработает с их исходниками, буду очень рад :)
-
drow, Поправили :) Убрали проверку. Изначально планировалось, что в сложных случаях, будут реализованы два слота getCallbackData и changePos. getCallbackData может не возвращать количества строк и в этом случае перемещения по источнику данных реализуются в слоте changePos (пример можно посмотреть в demo_r1).