gpt4 book ai didi

JavaBean DataSource 未传递到子子报告

转载 作者:行者123 更新时间:2023-12-02 05:48:23 27 4
gpt4 key购买 nike

我无法找出如何正确地将 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");

在主报告中,我有一个报告,其中有一个子报告,而子报告又具有自己的子报告。在主报告中,我将子报告的数据源设置为数据源表达式 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

所以我的问题是:如何将 JavaBeansDS 传递给子报表以便在子报表中使用它?

最佳答案

解决方案非常简单。您已经将参数传递给子报表,只需在子报表中再次执行相同的操作即可将其传递给子子报表。让我们将您的报告称为 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>
...
<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 再次包含为 subreportParameter 来传递给报告 C。因此报表 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" />

关于JavaBean DataSource 未传递到子子报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23825908/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com