我无法找到如何正确地将JavaBean DS传递给子子报告。我有以下Java代码:
JRDataSource javaBeansKapitelDS = new JRBeanCollectionDataSource(BeanFactory.generateKapitelCollection());
jasperReport = JasperCompileManager.compileReport("JRXML/Subreports.jrxml");
jasperUnterkapitelReport = JasperCompileManager.compileReport("JRXML/Subreports_subreport1.jrxml");
jasperEntryReport = JasperCompileManager.compileReport("JRXML/Subreports_subreport1_subreport1.jrxml");
params.put("SUB_DATASOURCE", BeanFactory.generateUnterKapitelCollection());
params.put("SUB_SUB_DATASOURCE", BeanFactory.generateEntryCollection());
jasperPrint = JasperFillManager.fillReport(jasperReport, params, javaBeansKapitelDS);
JasperExportManager.exportReportToPdfFile(jasperPrint, "output/TestJAVABeansDS.pdf");
在主报告中,我有一个报告,它有一个子报告,而子报告又有自己的子报告。在主报告中,我将子报表的数据源设置为DataSource Expression new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{SUB_DATASOURCE})
并且工作得很好!
在子报表中,我尝试对子报表(new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{SUB_SUB_DATASOURCE})
)执行相同的操作但是我无法将SUB_SUB_DATASOURCE参数从主报表传递到子报表以便在那里使用它。如果我在主报表中定义子报表的参数:
<subreportParameter name="SUB_SUB_DATASOURCE">
<subreportParameterExpression><![CDATA[$P{SUB_SUB_DATASOURCE}]]></subreportParameterExpression>
我得到例外
Caused by: java.lang.NoSuchMethodException: Unknown property '' on class 'class jasperreports.datasource.Entry'
...
Fill 1: exception
net.sf.jasperreports.engine.JRRuntimeException: net.sf.jasperreports.engine.JRException: Error retrieving field value from bean :
...
我正在使用最新的 JasperReports 库5.5.1
所以我的问题是:如何将子报告传递给子报告以便在子报告中使用它?
答案 0 :(得分:2)
解决方案非常简单。您已经将参数传递给子报表,您只需要在子报表中再次执行相同的操作即可将其传递给子报表。让我们调用您的报告A,B和C. A是主报告,其中包含B,其中包含C。
报告A 包含以下参数(您通过调用params.put
从Java设置):
<parameter name="SUB_DATASOURCE" class="java.util.Collection" />
<parameter name="SUB_SUB_DATASOURCE" class="java.util.Collection" />
报告A 还包含第一个subreport
组件:
<subreport>
...
<subreportParameter name="SUB_DATASOURCE">
<subreportParameterExpression><![CDATA[$P{SUB_DATASOURCE}]]></subreportParameterExpression>
</subreportParameter>
<subreportParameter name="SUB_SUB_DATASOURCE">
<subreportParameterExpression><![CDATA[$P{SUB_SUB_DATASOURCE}]]></subreportParameterExpression>
</subreportParameter>
<dataSourceExpression><![CDATA new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{SUB_DATASOURCE})]]></dataSourceExpression>
...
</subreport>
报告B 包含从报告A传递的相同参数:
<parameter name="SUB_DATASOURCE" class="java.util.Collection" />
<parameter name="SUB_SUB_DATASOURCE" class="java.util.Collection" />
您现在需要将SUB_SUB_DATASOURCE
传递给报告C,方法是将其再次包含在subreportParameter
中。因此报告B 将包含第二个子报告组件,如下所示:
<subreport>
...
<subreportParameter name="SUB_SUB_DATASOURCE">
<subreportParameterExpression><![CDATA[$P{SUB_SUB_DATASOURCE}]]></subreportParameterExpression>
</subreportParameter>
<dataSourceExpression><![CDATA new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{SUB_SUB_DATASOURCE})]]></dataSourceExpression>
...
</subreport>
如果您想使用报告C 中的参数,则可以按如下方式将其包含在内:
<parameter name="SUB_SUB_DATASOURCE" class="java.util.Collection" />