在此线程how-to-pass-main-report-data-source-to-subreport-jasperreports中指出,在重用现有主报告数据源时,子报告可能存在问题。它表示子报表可能会过早关闭数据源(在调用子报表的其他迭代可能被处理之前)。
看来这可能是我的问题,因为总是生成报告(没有错误)......
- 好的: 使用来自主报告的连接(因此每次再次执行查询:一次用于主报告,另外用于每个子报告调用:-()
- 错误: 使用主报告
中的数据源
- 可能是后续问题:然后附加一个空白页面
我设置了,Data Source Expression
如下:Parameters
Parameter Map Expression
<group name="COUNTRY" isStartNewPage="true" isReprintHeaderOnEachPage="true">
<groupExpression><![CDATA[$F{COUNTRY}]]></groupExpression>
<groupHeader>
<band height="84">
<subreport>
<reportElement uuid="92d7fc8c-9735-4dd1-ab0d-604d734bd659" stretchType="RelativeToBandHeight" x="-2" y="5" width="555" height="75"/>
<parametersMapExpression><![CDATA[$P{REPORT_PARAMETERS_MAP}]]></parametersMapExpression>
<subreportParameter name="COUNTRY">
<subreportParameterExpression><![CDATA[$F{COUNTRY}]]></subreportParameterExpression>
</subreportParameter>
<dataSourceExpression><![CDATA[$P{REPORT_DATA_SOURCE}]]></dataSourceExpression>
<subreportExpression><![CDATA[net.sf.jasperreports.engine.JasperCompileManager.compileReport( $P{BASE_DIR} + "/reports/CITIES.jrxml"]]></subreportExpression>
</subreport>
</band>
</groupHeader>
</group>
我正在使用最新的 (2013-11-06) Jaspersoft Studio Plugin 5.5.0.final(在 Eclipse Kepler 4.3.1.M20130911/1000 中)。
我只想对主报告和一个子报告使用一次执行一次的查询(针对数据库 - 因为它非常昂贵),对于每个组行/带,该子报告可能被称为任意时间。(到目前为止,对我来说,对于许多类似的用例来说,这个要求和方法似乎很合理。我明确地不想在这里避免子报告功能,因为它们提供了我想利用的模块化和可重用性。)
该查询具有这种性质(总共返回不到 100 行;更复杂和昂贵;-)):
query = "select country, city from cities"
正确生成的报告具有以下性质:
country: Germany, cities:
Berlin
Munich
...
country: Austria, cities:
Insbruck
Vienna
Graz
...
...
错误的结果如下所示:
country: Germany, cities:
Berlin
(additional empty page)
所需的主报告伪功能:
ds = getDatasource()
ds.setQuery( query )
rs = ds.executeQuery() // result set of master report
for country in getDistinctCountries( rs ) {
println( "country: " + country + ", cities:" )
subreport.process( country )
}
所需的子报表伪功能(从主报表接管数据源,避免进一步的数据库往返):
subDs = getDatasource()
subDs.setQuery( query + " where country = " + reportParams[0] )
subRs = subDs.executeQuery() // result set of subreport
for city in rs
println( " " + city )
我希望有人能解释我是否遗漏了什么,或者是否有必要(以及如何去做)克隆(JRResultSetDataSource不支持它)这样的数据源(或类似的东西)。