2011-04-19 8 views
1

iReportを使用して、顧客が製品の印刷用カタログを生成できるようにします。このプロセスはうまく機能します。私たちが苦労してきたことの1つは、これらの製品カタログの目次を作成する方法です。iReport/JasperReportsに目次を作成するにはどうしたらいいですか?

私はScriptlet機能を使ってこれを撮影することにしました。私たちのレポートはすべて、マスターレポートとサブレポートがあるという点で、すべてマスター詳細です。

最初に、スクリプトレットをマスターレポートに添付し、詳細レポートのすべての製品番号を収集し、その値をマスターレポートに戻す方法を見つけようとしました。サブレポートからマスターに戻すデフォルト変数(例:PAGE_NUMBER、COLUMN_NUMBER、PAGE_COUNT、COLUMN_COUNT)のみを渡すことができるように、マスターレポートに詳細情報を戻す方法を理解できません。

それでは、スクリプトレットを詳細レポートに添付してみました。まあ、詳細レポートでは、マスターのページがわからないので、マスターのpage_numberを詳細レポートの変数に渡し始めました。それは、マスターからのページ番号がスキップされるまで、詳細がオーバーフローすることがあることを除いて、うまくいった。つまり、サブレポートが2ページ分以上のデータを返す場合は、次回にサブレポートが呼び出されるときにページ番号が失われます。

これを行うにはどうすればよいですか?

答えて

2

上記の考え方の1つと同様に、効果的なアプローチが見つかりました。まず、呼び出し側のレポートに値を返し、スクリプトレット内からgetVariableValueを使用してその値を取得するサブレポートを取得できませんでした。私は永遠に努力しましたが、私はそれを働かせることができませんでした。

代わりに、同じスクリプトレットをマスターレポートとサブレポートの両方に添付してアプローチしました。スクリプトレットは、クラスという変数があります。ここでは、私が詳細に遭遇するすべての製品番号のランニング・タリーを保持することができ、このコードはスクリプトレットのafterDetailEval()メソッドの中に入ります。私は、このコードをサブレポート用に実行したいだけなので、特定の詳細フィールド(nullになることはありません)が存在するかどうかを調べます。そうでない場合は、コードを実行しません。そのイベントがマスターレポートによって呼び出されると、コードは実行されません。

ここで私がこの例から学んだ部分です。この例の優れた副作用プログラミングは、 "Print When Expression"プロパティにカスタムスクリプトレットメソッドの呼び出しを含む1x1の次元の行があることです。いい考えだ!したがって、このカスタムメソッドは何があってもfalseを返し、行は決して印刷されません。私はPage Footerバンドで同じことを行い、このメソッドはクラス変数から値を収集し、ページを決定し、その結果をハッシュに格納します。次に、クラス変数をリセットします。

レポートサマリーバンドでは、別のカスタムメソッドを呼び出す別の行が印刷されません。私がここで行うことは、製品番号のマップを繰り返して、それぞれが表示されているすべてのページを表示することです。完了!

+0

このプロセス全体でも、レポートの最後に目次が表示されます。 – Andrea

+0

いいえ、実際のレポートを実行するJavaコードでは、配列内のJasperPrintオブジェクトを収集します。 TOCが作成されると、TOCは自動的に配列の先頭に挿入されます。 – AKWF

1

プロジェクト・フォルダ内(サブレポート付き)内容のテーブルJasperReportsの-x.x.x /デモ/サンプル/ tableofcontentsの例があります。

ハイパーリンクの例も参照してください。

ハイパーリンク、アンカーとブックマーク

JasperReportsのあなたの文書内のコンテンツ のテーブルを導入ドリルダウンレポートを作成したり、ハイパーリンクと呼ばれる特別なレポート要素を使用して外部ドキュメントへの視聴者をリダイレクトすることができます。

+0

この例からいくつかのことを学んだことがありますが、私の状況との違いは、サブレポートでしか詳細がわからないということです。この例では、サブレポートを使用して、マスターからアセンブリされた詳細を印刷します。 – AKWF

関連する問題