Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jasper reports Jasper报表的模块化:将数据源传递到子报表,而无需进行不必要的数据库往返?_Jasper Reports_Datasource_Ireport_Subreport - Fatal编程技术网

Jasper reports Jasper报表的模块化:将数据源传递到子报表,而无需进行不必要的数据库往返?

Jasper reports Jasper报表的模块化:将数据源传递到子报表,而无需进行不必要的数据库往返?,jasper-reports,datasource,ireport,subreport,Jasper Reports,Datasource,Ireport,Subreport,在该线程中,说明在重用现有主报表数据源时,子报表可能存在问题。 它表示,子报表可能会过早地关闭数据源(在处理调用子报表的其他迭代之前) 这似乎是我的问题,因为报告总是生成的(没有错误) 确定:使用主报告中的连接(因此每次再次执行查询:主报告一次,另外每个子报告调用一次:-() 错误:使用主报告中的数据源 可能是后续问题:然后附加一个空白页 我设置了数据源表达式、参数和参数映射表达式,如下所示: <group name="COUNTRY" isStartNewPage="true"

在该线程中,说明在重用现有主报表数据源时,子报表可能存在问题。 它表示,子报表可能会过早地关闭数据源(在处理调用子报表的其他迭代之前)

这似乎是我的问题,因为报告总是生成的(没有错误)

  • 确定:使用主报告中的连接(因此每次再次执行查询:主报告一次,另外每个子报告调用一次:-()
  • 错误:使用主报告中的数据源
    • 可能是后续问题:然后附加一个空白页
我设置了
数据源表达式
参数
参数映射表达式
,如下所示:

<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>
适当的结果报告具有以下性质:

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 )
}
所需的子报表伪功能(从主报表接管数据源,避免进一步的数据库往返):


我希望有人能解释我是否遗漏了一些东西,或者是否有必要(以及如何做)克隆(不支持它)这样的数据源(或类似的东西)。

这里有人说这(不容易)是不可能的,人们应该/可以只重用连接(就像我现在做的那样):这里记录了2004年的一些丑陋的解决方法(基本上是用自定义编写的类克隆数据源):另一个相关查询:
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 )