2014-05-23 56 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