Как использовать один и тот же источник данных дважды в JasperReports/iReport

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

Если я установил datasourceexpression для $P{REPORT_DATA_SOURCE}, только диаграмма отображает данные (предположительно, первый элемент типа подотчета), а таблицы пусты. Кажется, данные можно использовать только один раз?

Если я использую набор данных для запроса к базе данных, он работает, однако он выполняет запрос три раза, по одному разу для каждой таблицы/диаграммы. Это будут огромные накладные расходы.

Очевидно, я делаю это неправильно, но я не могу найти примеров использования одного и того же набора данных более одного раза.


person KCD    schedule 28.09.2011    source источник


Ответы (2)


Простого ответа нет, поэтому я поднял запрос на функцию http://jasperforge.org/projects/jasperreports/tracker/view.php?id=5487

Предлагаемые обходные пути были:

  • реализовать собственный исполнитель запросов для извлечения данных из кэшированного источника данных
  • создать перематываемый источник данных на основе полученного набора результатов

Спасибо sanda aka shertage на форуме jasperforge за эти предложения.

person Community    schedule 11.10.2011
comment
Как создать перематываемый источник данных? - person Ricardo; 14.09.2012
comment
Я этого не делал и даже не изучал, но полагаю, что вы реализуете net.sf.jasperreports.engine.JRRewindableDataSource, см. JasperReports — пример источника данных (версия 4.7.0) - person KCD; 17.09.2012

Альтернативное решение, клонирование набора данных:

http://code.google.com/p/cloning/

Cloner cloner=новый Cloner();

Клон ArrayList = cloner.deepClone(getSomeArrayList());

final JRDataSource ds = new JRBeanCollectionDataSource(AnotherBean);

Параметры HashMap = new HashMap();

параметры.put("PARAM_A", новый JRBeanCollectionDataSource(getSomeArrayList()));

параметры.put ("PARAM_B", новый JRBeanCollectionDataSource (клон));

person Fredy Bello    schedule 07.11.2012
comment
Я не думаю, что это хорошее решение. Но вам не нужно клонировать сам ArrayList. Просто передача того же объекта, что и parameters.put("PARAM_C", new JRBeanCollectionDataSource(getSomeArrayList()));, должна помочь. - person iaL; 22.01.2019