JasperReports: представление подчиненного отчета - PullRequest
1 голос
/ 14 февраля 2012

Я использую JasperReports с Spring MVC для создания отчетов в моем приложении. По сути, я сначала проектирую отчеты в iReport 4.1.1, а затем помещаю полученный файл .jasper в путь к классам через jasper-view.xml

Когда приходит запрос, контроллер помещает необходимые параметры из сеанса в карту параметров и генерирует отчет.

Сценарий: в моем основном отчете около 15 подотчетов. Из всех этих отчетов печатаются только те отчеты, которые соответствуют критериям (переданные в качестве параметров) (управляются с помощью опции «Печатать при» диапазона)

И мой вопрос: если мой отчет не должен быть напечатан, выполняется ли он (то есть запрос внутри него)? или это просто пропущено?

Моя причина для того, чтобы задать этот вопрос, заключается в том, что создание отчета занимает довольно много времени (около 2 с, что, по моему мнению, слишком долго для моего приложения).

Спасибо.

1 Ответ

5 голосов
/ 14 февраля 2012

Если вы посмотрите на исходный код «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.
...