オープンソースのBIとして定評のあるJaspersoftのレポートデザインツールJaspersoft Studio(旧iReport)の機能のひとつであるサブレポートを使用すると、レポート定義の中に別のレポート定義ファイルを埋め込む事ができます。繰り返し表示する事が必要となる明細行のレイアウトなどに活用すると便利です。ここでは、そのサブレポートについて調査及び研究し、その成果をまとめています。
サブレポート(Subreport)の基本設定
サブレポートのアイコンは、パレットのエレメントにあります。サブレポートを使用する場合は、そのアイコンをレポートレイアウトにドラッグ&ドロップします。ここではオープンソースのERP iDempiereの受注伝票の一覧を表示する想定で、その一覧表示するデータをサブレポートに定義する方法を例に説明します。
サブレポートの配置
サブレポートのアイコンを"Title"の帯(バンド)にドラッグ&ドロップします。そうすると、下記のようなポップアップウィンドウが表示されますので、次の3つから適切な方法を選択します。
- Create a new report…サブレポートにする新しいレポート定義を作成する場合に選択します。
- Select an existing report…既存のレポート定義をサブレポートとして使用する場合に選択します。
- Just create the subreport element…サブレポートのエレメントをレポートレイアウトに配置したいだけの場合に選択します。
ここでは、"Crate a new report"を選択して説明します。
"Crate a new report"を選択すると、New Report Wizardが起動しますので、適宜レポート設定をして下さい。C_Order.jrxms とそのサブレポートとしてC_OrderList.jrxmsの2つのレポート定義を作成し、同じフォルダにファイルが保存されているという前提で説明を続けます。
New Report Wizardの設定が完了すると、サブレポートのファイルが作成され、サプレポートのアイコンがレポートレイアウトに配置されています。レイアウトは適宜調整して下さい。
サブレポートの基本プロパティ設定
サプレポートのアイコンを選択すると、サプレポートのプロパティが表示されます。多くのサブレポートでは、サブレポートの呼び出し元となる親レポートのなんからの情報を引き継いで、データを表示すると思います。親レポートから情報を引き継ぐための設定として"Parameters Map Expression"が用意されています。ここでは$P{REPORT_PARAMETERS_MAP}と入力します。
サブレポートのレポート定義
サプレポートを次のように定義し、例として使用します。
◆レイアウト
◆クエリ
親レポートのからのパラメータを引き継いでその条件文に指定し、親レポートで表示されているデータと整合性が取れるようにします。
確認
レポートのレイアウトを適宜調整してプレビューで確認します。
サブレポート(Subreport)からの戻り値を取得する
サブレポートで表示したレコードの件数などを戻り値として取得し、親レポート側で表示したい場合があります。サブレポートが表示したレコード件数を戻り値として取得し、親レポートに表示する方法を例に説明します。
サブレポートからの戻り値を格納する変数の追加
アウトラインビューのVariablesの所で、右クリックし、"Create Variable"を選択します。
追加した変数のプロパティを設定します。
・Name…変数名です。例ではわかりやすいようにSUBREPORT_COUNTとしています。
・Value Class Name…戻り値の型を設定します。例ではレコード件数なので、整数の型を設定しています。
・Calculation…System
サブレポートエレメントの設定
変数を追加したら、サブレポートのエレメントの設定を行います。アブレポートのアイコンをクリックし、プロパティーを編集して行きます。
サブレポートのエレメントのプロパティで、Return Valuesボタンを押します。
サブレポートには、表示したレコード件数を数えている変数"REPORT_COUNT"があらかじめ用意されていますので、その値を先に作成した変数"SUBREPORT_COUNT"で受け取るように定義します。
変数をレポートに配置する
作成したSUBREPORT_COUNTの変数をレポートの表示したい場所に配置します。ここでは、例として同じバンドに件数を表示するのと、別のバンドに件数を表示するようにしています。
サブレポートのエレメントと同じバンドで戻り値を表示する場合、その変数を描画するタイミングをEvalution Timeに"Band"として設定しないと、正しく表示されません。