作成日: 2022/04/20 最終更新日: 2023/09/22
文書種別
使用方法
詳細
異なるレポートを合成してひとつのレポートにする方法は、レポートの形式によって実現可否・方法が異なります。
セクションレポートの場合
異なるレポートを合成して1つのレポートとするには以下の方法があります。
-
サブレポートとして構成する方法
SubReportコントロールを使用することで、セクションレポート内に別のセクションレポートを埋め込むことが可能です。使用方法については、製品ヘルプの以下のトピックをご覧ください。
セクションレポートのレポートコントロール > SubReport
サブレポートの作成
サブレポート サンプル
サブレポート - XMLデータ
サブレポート - 実行時のデータソース
スクリプトとサブレポート
サブレポートでパラメータの使用
なお、サブレポート自体は、親レポート内のコントロールの一つに過ぎません。そのため、サブレポートは基本的に「ページ」という概念から切り離されています。サブレポート側にページヘッダ/フッタを定義しても、それらが親レポート側に表示されないのはそのためです。
したがいまして、サブレポートにページに依存する要素(例:ページ数)は含められません。あらかじめご注意ください。
また、サブレポートとして設定できるのは、セクションレポートのみです。ページレポートやRDLレポートをサブレポートとして埋め込むことはできません。
-
ページ単位で追加・挿入する方法
セクションレポートの生成結果は、Document.Pagesプロパティ(PagesCollectionクラス)にページ単位で格納されています。
PagesCollectionクラスのAddやAddRange、InsertやInsertRangeメソッドを使用することで、生成済みのページを直接操作し、ページ単位で追加・挿入することが可能です。
■イメージ図
◆サンプルコード (C#)var rpt1 = new SectionReport1(); var rpt2 = new SectionReport2(); // それぞれのレポートを実行します。 rpt1.Run(false); rpt2.Run(false); // レポート「rpt1」の後ろに、レポート「rpt2」を追加します。 for (int i = 0; i < rpt2.Document.Pages.Count; i++) { rpt1.Document.Pages.Add(rpt2.Document.Pages[i]); } //// ※以下のコードでも同じ合成結果が得られます。 //rpt1.Document.Pages.AddRange(rpt2.Document.Pages); // 合成後のレポートをプレビュー表示します。 this.viewer1.Document = rpt1.Document;
Dim rpt1 As New SectionReport1 Dim rpt2 As New SectionReport2 ' それぞれのレポートを実行します。 rpt1.Run(False) rpt2.Run(False) ' レポート「rpt1」の後ろに、レポート「rpt2」を追加します。 For i As Integer = 0 To rpt2.Document.Pages.Count - 1 rpt1.Document.Pages.Add(rpt2.Document.Pages(i)) Next '' ※以下のコードでも同じ合成結果が得られます。 'rpt1.Document.Pages.AddRange(rpt2.Document.Pages) ' 合成後のレポートをプレビュー表示します。 Me.Viewer1.Document = rpt1.Document
合成した結果は、プレビュー表示するだけでなく、1つのレポートとしてエクスポートすることや印刷することも可能です。
また、ページを挿入する位置や順番を調整すれば、両面印刷時の表面と裏面を別のレイアウトにすることや、最終ページから先頭ページへの逆順印刷することなども可能です。
ただし、合成できるのはセクションレポート同士のみです。ページレポートやRDLレポートを合成することはできません。
※レポートにページ番号を出力している場合、合成前の各レポート内でのページ番号が出力されます。合成後の全体を通したページ番号を出力したい場合は、こちらのナレッジをご参照ください。 -
ページ同士を重ね合わせる方法
Document.Pagesプロパティに格納されているページ単位の生成結果に対して、Overlayメソッドを使用することで、別のページと重ね合わせることが可能です。
■イメージ図
◆サンプルコード (C#)var rpt1 = new SectionReport1(); var rpt2 = new SectionReport2(); // それぞれのレポートを実行します。 rpt1.Run(false); rpt2.Run(false); // レポート「rpt1」の各ページに、レポート「rpt2」の1ページ目を重ね合わせます。 for (int i = 0; i < rpt1.Document.Pages.Count; i++) { rpt1.Document.Pages[i].Overlay( (GrapeCity.ActiveReports.Document.Section.Page) rpt2.Document.Pages[0].Clone()); } // 合成後のレポートをプレビュー表示します。 this.viewer1.Document = rpt1.Document;
Dim rpt1 As New SectionReport1 Dim rpt2 As New SectionReport2 ' それぞれのレポートを実行します。 rpt1.Run(False) rpt2.Run(False) ' レポート「rpt1」の各ページに、レポート「rpt2」の1ページ目を重ね合わせます。 For i As Integer = 0 To rpt1.Document.Pages.Count - 1 rpt1.Document.Pages(i).Overlay(rpt2.Document.Pages(0).Clone()) Next ' 合成後のレポートをプレビュー表示します。 Me.Viewer1.Document = rpt1.Document
合成した結果は、プレビュー表示するだけでなく、1つのレポートとしてエクスポートすることや印刷することも可能です。
ただし、一度合成したページを分ける(重ね合わせる前に戻す)ことはできません。
また、合成できるのはセクションレポート同士のみです。ページレポートやRDLレポートを合成することはできません。
ページレポート/RDLレポートの場合
異なるレポートを合成して1つのレポートとするには以下の方法があります。
- サブレポートとして構成する方法
SubReportコントロールを使用することで、レポート内に別のレポートを埋め込むことが可能です。使用方法については、製品ヘルプの以下のトピックをご覧ください。
ページレポート/RDLレポートのレポートコントロール > SubReport
RDLレポートでのサブレポート
ただし、ページレポート/RDLレポートにセクションレポートを埋め込むことはできません。
また、ページレポートにページレポートを埋め込むこともできません。メインのレポートがページレポートである場合、埋め込めるレポートはRDLレポートのみです。 - レポート単位で結合する方法
ReportCombinerクラスを使用することで、ページレポートおよびRDLレポートを1つのレポートに結合できます。使用方法については、製品ヘルプの以下のトピックをご覧ください。
ページ/RDLレポートの結合 - 複数のレイアウトを定義する方法
レポートの合成とは異なりますが、ページレポートの場合、1つのレポート内に複数のレイアウトを定義することも可能です。
この機能は、TableやListなどのデータ領域にレコードを出力する時、データが1ページに収まりきらず、複数のページにまたがって出力されるような状況で、2ページ目以降のレイアウトを変更したい場合に使用するものです。
■イメージ図
ページレポートで複数レイアウトを定義する方法については、製品ヘルプの以下のトピックをご覧ください。
ページのタブ
OverflowPlaceHolder(ページレポート)
複数のページでデータのオーバーフロー(ページレポートのみ)