Jasper API печатает только первый отчет, остальные отчеты печатаются пустыми

Мы используем jasper API (JasperFillManager.fillReport, JasperExportManager.exportReportToPdfFile)

Мы хотим выполнить этот отчет в цикле с разными параметрами, поэтому добавили следующий код

    JasperPrint jasperPrint = null;
            // Fill report
            Iterator i1 = l1.iterator();
            Iterator i2 = l2.iterator();
            int i = 1;
            while (i1.hasNext() && i2.hasNext()) {
                parameters.put("SUBJECTOID", (String) i1.next());
                parameters.put("HISTORYRECORD", (String) i2.next());
                try (ProfilePoint fillReport = ProfilePoint
                        .profileAction("ProfAction_ReportHelper_fillJasperReport")) {
                    jasperReport = JasperCompileManager.compileReport(jrxmlPath);

                    jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, emptyDataSource);
                    System.out.println("fillReport**********" + i);

                }

                // Export to PDF
                try (ProfilePoint exportReport = ProfilePoint
                        .profileAction("ProfAction_ReportHelper_exportJasperReport")) {
                    JasperExportManager.exportReportToPdfFile(jasperPrint,
                            "C:\\JASPER\\JASPEROUTPUT\\Report" + i + ".pdf");
                    System.out.println("exportReportToPdfFile**********" + i);
                }
                i++;
                jasperPrint = null;
                jasperReport = null;

Итак, что происходит: у нас есть 15 параметров, поэтому создается 15 PDF-файлов, но только первый PDF-файл содержит данные, остальные 14 пусты.

Мы пробовали несколько вещей, таких как компиляция один раз, компиляция несколько раз, извлечение кода jasper в метод, но все равно результат тот же.

Есть ли кеш или какая-то настройка в яшме или что-то подобное?

1) Похоже, вы передаете пустой источник данных JasperFillManager.fillReport(jasperReport, parameters, emptyDataSource); 2) Возможно, что-то не так с вашими параметрами parameters.put("SUBJECTOID", (String) i1.next()); 3) Вы не опубликовали полный простой пример - вам трудно помочь. Возможно, jrxml неверен; 4) Is there any cache or some kind of setting in jasper or similar something? - Кеша нет. Вы проверяли jasperPrint объект на каждой итерации?

Alex K 22.05.2019 20:55

Мы передаем пустой источник данных, потому что в самом jrxml мы передаем набор данных следующим образом code new net.sf.jasperreports.engine.data.JRXmlDataSource("http://i45‌​15-vm2.ptcnet.ptc.co‌​m/Windchill/servlet/‌​XML4Cognos?proc=com_‌​ptc_windchill_enterp‌​rise_report_ReportTa‌​sk%23QMS-CustomerExp‌​erience&SUBJECT_OID=‌​OR%3acom.ptc.quality‌​management.cem.Custo‌​merExperience%3a"+$P‌​{SUBJECTOID}+"&HISTO‌​RY_RECORD_OID=OR%3ac‌​om.ptc.windchill.his‌​tory.HistoryRecord%3‌​a"+$P{HISTORYRECORD}‌​+"&uid=demo&locale=e‌​n-us&jasper=true","/‌​dataset/data/row")

Dungeon Master 23.05.2019 08:07

так что пустой источник данных не должен быть проблемой, мы создали два параметра в яшме, и то же самое мы вставили в URL-адрес набора данных, мы добавили операторы регистратора и определили, что параметры передаются правильно, но очень удивительно, что цикл работает только для первого iteration , начиная со следующей итерации, он просто печатает пустые файлы PDF, jrxml довольно большой.

Dungeon Master 23.05.2019 08:14

Вы создаете новый пустой экземпляр источника данных на каждой итерации или используете один экземпляр для всех итераций? Последнее не будет работать, потому что экземпляр источника данных потребляется во время создания отчета, вам нужно каждый раз использовать новый экземпляр или, по крайней мере, перематывать источник данных с помощью moveFirst().

dada67 23.05.2019 11:32

Спасибо за ваш ответ ... Источник данных вы имеете в виду переданный параметр JREmptyDataSource emptyDataSource верно? Я передал этот источник данных только один раз, мне нужно каждый раз создавать новый? его пустой источник данных, почему это имеет значение?

Dungeon Master 23.05.2019 11:43

Да, каждый раз нужно создавать новый. Источник данных подобен java.util.Iterator, вы можете использовать его только один раз.

dada67 23.05.2019 12:10
Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
2
6
192
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Спасибо @dada67 для предложения это сработало

Я передал новый пустой источник данных для каждой итерации, и это сработало.

Большое спасибо..!!!

Другие вопросы по теме