Jasper reports 如何在JasperReports/iReport中两次使用同一数据源

Jasper reports 如何在JasperReports/iReport中两次使用同一数据源,jasper-reports,ireport,Jasper Reports,Ireport,我正试图找出如何最好地使用图表,然后使用表示相同数据集的表来生成报告。我需要克服摘要位于底部的定位,因此打算使用子报表和表子报表。我正在试验一个细节带中的两个表格和一个图表 如果我将的datasourceexpression设置为$p{REPORT\u DATA\u SOURCE},则只有图表显示数据(可能是第一个子报表类型项),表为空。似乎数据只能使用一次 如果我使用数据集查询数据库,它会工作,但它会执行三次查询,每个表/图表执行一次。这将是一个巨大的开销 显然我做得不对,但我找不到任何多次使

我正试图找出如何最好地使用图表,然后使用表示相同数据集的表来生成报告。我需要克服摘要位于底部的定位,因此打算使用子报表和表子报表。我正在试验一个细节带中的两个表格和一个图表

如果我将的
datasourceexpression
设置为
$p{REPORT\u DATA\u SOURCE}
,则只有图表显示数据(可能是第一个子报表类型项),表为空。似乎数据只能使用一次

如果我使用数据集查询数据库,它会工作,但它会执行三次查询,每个表/图表执行一次。这将是一个巨大的开销


显然我做得不对,但我找不到任何多次使用同一数据集的示例。

没有简单的答案,因此我提出了一个功能请求

建议的解决办法是:

  • 实现自定义查询执行器以从缓存的数据源检索数据
  • 根据检索到的结果集生成可倒带的数据源

感谢Jasperge论坛上的sanda aka shertage提出这些建议。

另一种解决方案是克隆数据集:

克隆人克隆人=新克隆人()

ArrayList clone=cloner.deepClone(getSomeArrayList())

最终JRDasource ds=新的JRBeanCollectionDataSource(另一个bean)

HashMap参数=新的HashMap()

parameters.put(“PARAM_A”,新的JRBeanCollectionDataSource(getSomeArrayList())


parameters.put(“PARAM_B”,新的JRBeanCollectionDataSource(克隆))

如何生成可倒带数据源?我还没有做过,甚至没有研究过,但我相信您实现了net.sf.jasperreports.engine.JRRewindableDataSource。我认为这不是一个好的解决方案。但是您不需要克隆
ArrayList
本身。只需传递相同的对象,如
parameters.put(“PARAM_C”,新的JRBeanCollectionDataSource(getSomeArrayList())应该可以做到这一点。