このスレッドhow-to-pass-main-report-data-source-to-subreport-jasperreportsでは、既存のマスター レポート データ ソースを再利用する際にサブレポートに問題がある可能性があると述べられています。サブレポートがデータソースを途中で閉じる可能性があることを示しています(サブレポートを呼び出す他の反復が処理される前に)。
レポートは常に(エラーなしで)生成されるため、これは私の問題かもしれません...
- ok:マスター レポートから の接続を使用します(したがって、クエリを再度実行するたびに: マスターに対して 1 回、さらにサブレポート呼び出しごとに :-( )
- 間違っています: マスター レポート
のデータソースを使用しています
- おそらくフォローアップの問題: 空のページが添付されている
次のように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) を使用しています。
マスター レポートと、各グループ行/バンドに対して任意の回数呼び出される可能性があるサブレポートに対して、(データベースに対して - 非常にコストがかかるため) 1 回だけ実行されるクエリを 1 つだけ使用したいと考えています。(これまでのところ、この要件と方法論は、私にとって多くの同様のユースケースで非常に妥当であるように思われます。サブレポート機能は、私が利用したいモジュール性と再利用性を提供するため、ここで明示的に回避したくありません。)
クエリには次の性質があります (合計で 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はサポートしていない) 必要がある場合 (およびその方法) を誰かが説明してくれることを願っています。