Если вы посмотрите на исходный код «Jasper Reports», логика говорит, что сначала вычисляется «printWhenExpression», а затем заполняется элемент отчета, если он должен быть напечатан.
Ниже приведенометод с именем ' fillNoData ' из JRVerticalFiller.java (версия 4.0), который говорит так:
private void fillNoData() throws JRException
{
if (log.isDebugEnabled() && !noData.isEmpty())
{
log.debug("Fill " + fillerId + ": noData");
}
noData.evaluatePrintWhenExpression(JRExpression.EVALUATION_DEFAULT);
if (noData.isToPrint())
{
while (noData.getBreakHeight() > pageHeight - bottomMargin - offsetY)
{
addPage(false);
}
noData.evaluate(JRExpression.EVALUATION_DEFAULT);
JRPrintBand printBand = noData.fill(pageHeight - bottomMargin - offsetY);
if (noData.willOverflow() && noData.isSplitPrevented() && isSubreport())
{
resolveGroupBoundElements(JRExpression.EVALUATION_DEFAULT, false);
resolveColumnBoundElements(JRExpression.EVALUATION_DEFAULT);
resolvePageBoundElements(JRExpression.EVALUATION_DEFAULT);
scriptlet.callBeforePageInit();
calculator.initializeVariables(ResetTypeEnum.PAGE, IncrementTypeEnum.PAGE);
scriptlet.callAfterPageInit();
addPage(false);
printBand = noData.refill(pageHeight - bottomMargin - offsetY);
}
fillBand(printBand);
offsetY += printBand.getHeight();
while (noData.willOverflow())
{
resolveGroupBoundElements(JRExpression.EVALUATION_DEFAULT, false);
resolveColumnBoundElements(JRExpression.EVALUATION_DEFAULT);
resolvePageBoundElements(JRExpression.EVALUATION_DEFAULT);
scriptlet.callBeforePageInit();
calculator.initializeVariables(ResetTypeEnum.PAGE, IncrementTypeEnum.PAGE);
scriptlet.callAfterPageInit();
addPage(false);
printBand = noData.fill(pageHeight - bottomMargin - offsetY);
fillBand(printBand);
offsetY += printBand.getHeight();
}
resolveBandBoundElements(noData, JRExpression.EVALUATION_DEFAULT);
}
}
Что вам нужно посмотреть, так это то, какИспользование вложенных отчетов влияет на производительность и использование памяти.Похоже, у вас слишком много вложенных отчетов в основной отчет.Вот что-то из этой ссылки JasperForge :
Есть ли проблемы с производительностью в подотчетах?
Ответ зависит от вашей системы,источник данных и дизайн вашего отчета.Несколько замечаний по подотчетам:
- Каждое выполнение подотчета может порождать новый поток (см. Ниже).
- По мере выполнения подотчета в динамической памяти будет создаваться больше объектов.
По теме темы.Поддержка продолжений Java была добавлена в качестве альтернативы потокам.Это было сделано с использованием библиотеки Jakarta Commons Javaflow.Свойство JasperReports: net.sf.jasperreports.subreport.runner.factory можно использовать со следующими двумя настройками:
- net.sf.jasperreports.engine.fill.JRContinuationSubreportRunnerFactory
- net.sf.jasperreports.engine.fill.установить, тогда подход Javaflow будет использоваться для заполнения отчетов, а не потоков.Если выбрана эта опция, Jararta Commons Javaflow jar должен быть включен в путь к классу приложения.Этот файл находится в каталоге lib пакета распространения проекта отчетов JasperReport.Файл jasperreports-javaflow.properties иллюстрирует, как это свойство может быть установлено в реальной реализации.Другими альтернативами для обработки различных запросов в одном и том же отчете являются использование элемента List и Sub Datasets.