0

このスレッドhow-to-pass-main-report-data-source-to-subreport-jasperreportsでは、既存のマスター レポート データ ソースを再利用する際にサブレポートに問題がある可能性があると述べられています。サブレポートがデータソースを途中で閉じる可能性があることを示しています(サブレポートを呼び出す他の反復が処理される前に)。

レポートは常に(エラーなしで)生成されるため、これは私の問題かもしれません...

  • ok:マスター レポートから の接続を使用します(したがって、クエリを再度実行するたびに: マスターに対して 1 回、さらにサブレポート呼び出しごとに :-( )
  • 間違っています: マスター レポート のデータソースを使用しています
    • おそらくフォローアップの問題: 空のページが添付されている

次のようにData Source ExpressionParametersおよびを設定しました。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はサポートしていない) 必要がある場合 (およびその方法) を誰かが説明してくれることを願っています。

4

0 に答える 0