有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JavaBean数据源无法传递到子子报表

我很难找到如何正确地将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_数据源参数从主报表传递到子报表,以便在那里使用它。如果我在主报告中为子报告定义了一个参数:

<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

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


共 (1) 个答案

  1. # 1 楼答案

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