2014-05-23 55 views
0

我无法正确找到如何将JavaBean DS正确传递到子子报表。我有以下的Java代码:JavaBean DataSource未传递给子子报告

 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为了使用它sububreport?

回答

2

该解决方案非常简单。您已将参数传递给子报表,您只需在子报表内再次执行相同的操作即可将其传递给子报表。让我们打电话给你的报告A,B和C,A是主报告,其中包含B,其中包含C.

报告A包含以下参数(你从Java设置通过调用params.put):

<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> 

报告乙包含相同的参数,从报表中流传下来:

<parameter name="SUB_DATASOURCE" class="java.util.Collection" /> 
<parameter name="SUB_SUB_DATASOURCE" class="java.util.Collection" /> 

现在,您需要通过SUB_SUB_DATASOURCE通过包括其作为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" /> 
+0

感谢,你完美地描述了这个场景!但这正是我已经完成的。 第二我尝试在报告B中使用参数SUB_SUB_DATASOURCE我得到上述异常。 – Alex