Jasper报告的模块化:将数据源传递到子报告而不需要不必要的数据库往返?

时间:2013-11-06 11:27:19

标签: jasper-reports datasource ireport subreport

在此帖子how-to-pass-main-report-data-source-to-subreport-jasperreports中,声明重用现有主报告数据源时子报告可能存在问题。 它表示子报表可能会过早地关闭数据源(在调用子报表的其他迭代可能会被处理之前)。

似乎这可能是我的问题,因为报告始终生成(没有错误)......

  • 确定 使用主报告中的连接(因此每次再次执行查询:主服务器一次,另外每个子报告调用:-()< / LI>
  • 错误: 使用主报告中的数据源
    • 可能是一个跟进问题:然后附上一个空白页面

我按如下方式设置了Data Source ExpressionParametersParameter 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插件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不支持它)这样的数据源(或类似的东西)。

0 个答案:

没有答案