mirror of
https://github.com/fralx/LimeReport.git
synced 2025-11-25 00:18:06 +03:00
aggregate functions can be called in data header
This commit is contained in:
@@ -259,11 +259,8 @@ void ReportRender::renderPage(PageDesignIntf* patternPage)
|
||||
clearPageMap();
|
||||
startNewPage(true);
|
||||
|
||||
|
||||
renderReportHeader(m_patternPageItem, AfterPageHeader);
|
||||
|
||||
// renderBand(m_patternPageItem->bandByType(BandDesignIntf::ReportHeader), 0, StartNewPageAsNeeded);
|
||||
|
||||
BandDesignIntf* lastRenderedBand = 0;
|
||||
for (int i=0;i<m_patternPageItem->dataBandCount() && !m_renderCanceled;i++){
|
||||
lastRenderedBand = m_patternPageItem->dataBandAt(i);
|
||||
@@ -318,6 +315,7 @@ void ReportRender::initRenderPage()
|
||||
m_renderPageItem->initFromItem(m_patternPageItem);
|
||||
m_renderPageItem->setItemMode(PreviewMode);
|
||||
m_renderPageItem->setPatternName(m_patternPageItem->objectName());
|
||||
m_renderPageItem->setPatternItem(m_patternPageItem);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -393,6 +391,21 @@ void ReportRender::extractGroupsFunction(BandDesignIntf *band)
|
||||
}
|
||||
}
|
||||
|
||||
bool ReportRender::containsGroupsFunction(BandDesignIntf *band){
|
||||
foreach(BaseDesignIntf* item,band->childBaseItems()){
|
||||
ContentItemDesignIntf* contentItem = dynamic_cast<ContentItemDesignIntf*>(item);
|
||||
if (contentItem){
|
||||
QString content = contentItem->content();
|
||||
foreach(QString functionName, m_datasources->groupFunctionNames()){
|
||||
QRegExp rx(QString(Const::GROUP_FUNCTION_RX).arg(functionName));
|
||||
if (rx.indexIn(content)>=0){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void ReportRender::replaceGroupsFunction(BandDesignIntf *band)
|
||||
{
|
||||
@@ -517,20 +530,20 @@ void ReportRender::renderDataBand(BandDesignIntf *dataBand)
|
||||
BandDesignIntf* header = dataBand->bandHeader();
|
||||
BandDesignIntf* footer = dataBand->bandFooter();
|
||||
|
||||
if (header && header->printAlways()) renderBand(header, 0);
|
||||
if (header && header->printAlways()) renderDataHeader(header);
|
||||
|
||||
if(bandDatasource && !bandDatasource->eof() && !m_renderCanceled){
|
||||
|
||||
QString varName = QLatin1String("line_")+dataBand->objectName().toLower();
|
||||
datasources()->setReportVariable(varName,1);
|
||||
|
||||
if (header && !header->printAlways())
|
||||
renderBand(header, 0);
|
||||
|
||||
if (dataBand->bandHeader() && dataBand->bandHeader()->reprintOnEachPage())
|
||||
if (header && header->reprintOnEachPage())
|
||||
m_reprintableBands.append(dataBand->bandHeader());
|
||||
|
||||
renderChildHeader(dataBand,PrintNotAlwaysPrintable);
|
||||
if (header && !header->printAlways())
|
||||
renderDataHeader(header);
|
||||
|
||||
//renderChildHeader(dataBand,PrintNotAlwaysPrintable);
|
||||
renderGroupHeader(dataBand, bandDatasource, true);
|
||||
|
||||
bool firstTime = true;
|
||||
@@ -578,7 +591,8 @@ void ReportRender::renderDataBand(BandDesignIntf *dataBand)
|
||||
firstTime = false;
|
||||
}
|
||||
|
||||
m_reprintableBands.removeOne(dataBand->bandHeader());
|
||||
m_reprintableBands.removeOne(header);
|
||||
if (header) recalcIfNeeded(header);
|
||||
|
||||
renderGroupFooter(dataBand);
|
||||
|
||||
@@ -702,13 +716,48 @@ void ReportRender::renderChildBands(BandDesignIntf *parentBand)
|
||||
}
|
||||
}
|
||||
|
||||
BandDesignIntf* ReportRender::findRecalcableBand(BandDesignIntf* patternBand){
|
||||
|
||||
QList<BandDesignIntf*>::iterator it = m_recalcBands.begin();
|
||||
for (;it !=m_recalcBands.end() ;++it){
|
||||
if ((*it)->patternItem() == patternBand){
|
||||
BandDesignIntf* result = (*it);
|
||||
m_recalcBands.erase(it);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ReportRender::recalcIfNeeded(BandDesignIntf* band){
|
||||
BandDesignIntf* recalcBand = findRecalcableBand(band);
|
||||
if (recalcBand){
|
||||
QString bandName = recalcBand->objectName();
|
||||
recalcBand->restoreItems();
|
||||
recalcBand->setObjectName(recalcBand->patternItem()->objectName());
|
||||
replaceGroupsFunction(recalcBand);
|
||||
recalcBand->updateItemSize(datasources());
|
||||
recalcBand->setObjectName(bandName);
|
||||
datasources()->clearGroupFunctionValues(recalcBand->patternItem()->objectName());
|
||||
}
|
||||
}
|
||||
|
||||
void ReportRender::renderDataHeader(BandDesignIntf *header)
|
||||
{
|
||||
recalcIfNeeded(header);
|
||||
BandDesignIntf* renderedHeader = renderBand(header, 0);
|
||||
if (containsGroupsFunction(header))
|
||||
m_recalcBands.append(renderedHeader);
|
||||
}
|
||||
|
||||
void ReportRender::renderGroupHeader(BandDesignIntf *parentBand, IDataSource* dataSource, bool firstTime)
|
||||
{
|
||||
foreach(BandDesignIntf* band,parentBand->childrenByType(BandDesignIntf::GroupHeader)){
|
||||
IGroupBand* gb = dynamic_cast<IGroupBand*>(band);
|
||||
if (gb&&gb->isNeedToClose(m_datasources)){
|
||||
if (gb&&gb->isNeedToClose(datasources())){
|
||||
if (band->childBands().count()>0){
|
||||
dataSource->prior();
|
||||
|
||||
foreach (BandDesignIntf* subBand, band->childrenByType(BandDesignIntf::GroupHeader)) {
|
||||
foreach(BandDesignIntf* footer, subBand->childrenByType(BandDesignIntf::GroupFooter)){
|
||||
renderBand(footer, 0);
|
||||
@@ -723,10 +772,6 @@ void ReportRender::renderGroupHeader(BandDesignIntf *parentBand, IDataSource* da
|
||||
dataSource->next();
|
||||
}
|
||||
closeDataGroup(band);
|
||||
// if (gb->isNeedToStartNewPage()){
|
||||
// savePage();
|
||||
// startNewPage();
|
||||
// }
|
||||
}
|
||||
|
||||
if (!gb->isStarted()){
|
||||
@@ -734,12 +779,15 @@ void ReportRender::renderGroupHeader(BandDesignIntf *parentBand, IDataSource* da
|
||||
m_reprintableBands.append(band);
|
||||
gb->startGroup(m_datasources);
|
||||
openDataGroup(band);
|
||||
BandDesignIntf* renderedHeader = 0;
|
||||
if (!firstTime && gb->startNewPage()){
|
||||
if (gb->resetPageNumber()) resetPageNumber(BandReset);
|
||||
renderBand(band, 0, ForcedStartPage);
|
||||
renderedHeader = renderBand(band, 0, ForcedStartPage);
|
||||
} else {
|
||||
renderBand(band, 0, StartNewPageAsNeeded);
|
||||
renderedHeader = renderBand(band, 0, StartNewPageAsNeeded);
|
||||
}
|
||||
if (containsGroupsFunction(band))
|
||||
m_recalcBands.append(renderedHeader);
|
||||
}
|
||||
|
||||
renderGroupHeader(band, dataSource, firstTime);
|
||||
@@ -753,6 +801,7 @@ void ReportRender::renderGroupFooterByHeader(BandDesignIntf* groupHeader){
|
||||
foreach (BandDesignIntf* footer, groupHeader->childrenByType(BandDesignIntf::GroupFooter)){
|
||||
renderBand(footer, 0, StartNewPageAsNeeded);
|
||||
}
|
||||
recalcIfNeeded(groupHeader);
|
||||
}
|
||||
|
||||
void ReportRender::renderGroupFooter(BandDesignIntf *parentBand)
|
||||
@@ -780,6 +829,7 @@ void ReportRender::initGroups()
|
||||
if (band->isHeader()){
|
||||
IGroupBand* gb = dynamic_cast<IGroupBand*>(band);
|
||||
if (gb) gb->closeGroup();
|
||||
extractGroupsFunction(band);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -852,6 +902,7 @@ void ReportRender::closeDataGroup(BandDesignIntf *band)
|
||||
groupBand->closeGroup();
|
||||
if (band->reprintOnEachPage()) m_reprintableBands.removeOne(band);
|
||||
}
|
||||
recalcIfNeeded(band);
|
||||
closeGroup(band);
|
||||
}
|
||||
|
||||
@@ -1056,6 +1107,11 @@ BandDesignIntf *ReportRender::renderData(BandDesignIntf *patternBand)
|
||||
if (patternBand->isFooter()){
|
||||
replaceGroupsFunction(bandClone);
|
||||
}
|
||||
|
||||
if (patternBand->isHeader()){
|
||||
replaceGroupsFunction(bandClone);
|
||||
}
|
||||
|
||||
bandClone->updateItemSize(m_datasources);
|
||||
|
||||
baseDesignIntfToScript(bandClone);
|
||||
|
||||
Reference in New Issue
Block a user