複数のレポートを合成して、一つのレポートにする方法は?

文書番号 : 37761     文書種別 : 使用方法     登録日 : 2015/02/18     最終更新日 : 2015/11/11
文書を印刷する
対象製品
ActiveReports for .NET 9.0J
詳細
異なるレポートを合成してひとつのレポートにする方法は、レポートの形式によって実現可否・方法が異なります。
詳細については、以下の内容をご覧ください。


セクションレポートの場合

セクションレポートの場合、異なるレポートを合成して1つのレポートとするにはいくつかの方法があります。
  1. サブレポートとして構成する方法
  2. ページ単位で追加・挿入する方法
  3. ページ同士を重ね合わせる方法
詳細については、以下の内容をご覧ください。
  1. サブレポートとして構成する方法
    SubReportコントロールを使用することで、セクションレポート内に別のセクションレポートを埋め込むことが可能です。

    サブレポートの使用方法については、製品ヘルプの以下のトピックをご覧ください。

    ActiveReportsユーザーガイド
     - 概念
      - セクションレポートの概念
       - セクションレポートのレポートコントロール
        - SubReport
     - 基本操作
      - セクションレポートの基本操作
       - サブレポートの作成
     - サンプルとチュートリアル
      - サンプル
       - セクションレポートのサンプル(Standard)
        - Layout
         - サブレポート サンプル
      - チュートリアル
       - セクションレポートのチュートリアル
        - レイアウト
         - サブレポート - XMLデータ
         - サブレポート - 実行時のデータソース
        - スクリプト
         - スクリプトとサブレポート
        - パラメータ
         - サブレポートでパラメータの使用

    なお、サブレポート自体は、親レポート内のコントロールの一つに過ぎません。そのため、サブレポートは基本的に「ページ」という概念から切り離されています。サブレポート側にページヘッダ/フッタを定義しても、それらが親レポート側に表示されないのはそのためです。

    したがいまして、サブレポートにページに依存する要素(例:ページ数)は含められません。あらかじめご注意ください。(詳細については、製品ヘルプの「概念(SubReport)」をご覧ください。)

    また、サブレポートとして設定できるのは、セクションレポートのみです。ページレポートやRDLレポートをサブレポートとして埋め込むことはできません。


  2. ページ単位で追加・挿入する方法
    セクションレポートの場合、レポートの生成結果は、Document.Pagesプロパティ(PagesCollectionクラス)にページ単位で格納されています。

    PagesCollectionクラスのAddやAddRange、InsertやInsertRangeメソッドを使用することで、生成済みのページを直接操作し、ページ単位で追加・挿入することが可能です。

    ■イメージ図
    ページ単位で追加・挿入する方法

    ◆サンプルコード(VB.NET)
    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).Clone())
    Next
    '' ※以下のようなコードでも同じ合成結果が得られます。
    'rpt1.Document.Pages.AddRange(rpt2.Document.Pages.Clone())


    ' 合成後のレポートをプレビュー表示します。
    Me.Viewer1.Document = rpt1.Document

    ◆サンプルコード(C#)
    SectionReport1 rpt1 = new SectionReport1();
    SectionReport2 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].Clone());
    }
    //// ※以下のようなコードでも同じ合成結果が得られます。
    //rpt1.Document.Pages.AddRange(
    //  (GrapeCity.ActiveReports.Document.Section.PagesCollection)
    //    rpt2.Document.Pages.Clone());


    // 合成後のレポートをプレビュー表示します。
    this.viewer1.Document = rpt1.Document;


    なお、合成した結果は、プレビュー表示するだけでなく、1つのレポートとしてエクスポートすることや印刷することも可能です。

    また、ページを挿入する位置や順番を調整すれば、両面印刷時の表面と裏面を別のレイアウトにすることや、最終ページから先頭ページへの逆順印刷することなども可能です。

    ただし、合成できるのはセクションレポート同士のみです。ページレポートやRDLレポートを合成することはできません。


  3. ページ同士を重ね合わせる方法
    セクションレポートの場合、Document.Pagesプロパティに格納されているページ単位の生成結果に対して、Overlayメソッドを使用することで、別のページと重ね合わせることが可能です。

    ■イメージ図
    ページ同士を重ね合わせる方法

    ◆サンプルコード(VB.NET)
    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

    ◆サンプルコード(C#)
    SectionReport1 rpt1 = new SectionReport1();
    SectionReport2 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;


    なお、合成した結果は、プレビュー表示するだけでなく、1つのレポートとしてエクスポートすることや印刷することも可能です。

    ただし、一度合成したページを分ける(重ね合わせる前に戻す)ことはできません。

    また、合成できるのはセクションレポート同士のみです。ページレポートやRDLレポートを合成することはできません。



ページレポートの場合

ページレポートには、別々のレポートを合成して1つのレポートとする機能・方法は用意されておりません。

なお、ページレポートの場合、1つのレポート内に複数のレイアウトを定義することは可能です。

ただし、この機能は、TableやListなどのデータ領域にレコードを出力する時、データが1ページに収まりきらず、複数のページにまたがって出力されるような状況で、2ページ目以降のレイアウトを変更したい場合に使用するものです。

■ページレポートで複数レイアウトを定義した時の出力例
ページレポートで複数レイアウトを定義した時の出力例

ページレポートで複数レイアウトを定義する方法やサンプルについては、製品ヘルプの以下のトピックをご覧ください。

ActiveReportsユーザーガイド
 - 概念
  - ActiveReports for .NETデザイナの使用
   - ページのタブ
  - レポートの種類
   - ページレポート
  - ページレポート/RDLレポートの概念
   - ページレポート/RDLレポートのレポートコントロール
    - OverflowPlaceHolder(ページレポートのみ)
 - サンプルとチュートリアル
  - サンプル
   - レポートギャラリー サンプル
    - 「Report¥Page Reportフォルダ」
     - 「Otherフォルダ」
      - 「SalesReport」
  - チュートリアル
   - ページレポート/RDLレポートのチュートリアル
    - レイアウト
     - 複数のページでデータのオーバーフロー(ページレポートのみ)



RDLレポートの場合

RDLレポートの場合、SubReportコントロールを使用することで、レポート上に別のレポートをサブレポートとして埋め込むことが可能です。

RDLレポートにおけるサブレポートの使用方法については、以下のヘルプトピックや技術資料をご覧ください。

ActiveReportsユーザーガイド
 - 概念
  - ページレポート/RDLレポートの概念
   - ページレポート/RDLレポートのレポートコントロール
    - Subreport(RDLレポートのみ)
 - サンプルとチュートリアル
  - サンプル
   - レポートギャラリー サンプル
    - 「Report¥RDL Reportフォルダ」
     - 「Othersフォルダ」
      - 「Seiseki_Main/Seiseki_Sub」
     - 「Reelsフォルダ」
      - 「CustomerOrders/CustomerOrdersCoupon」
  - チュートリアル
   - ページレポート/RDLレポートのチュートリアル
    - レイアウト
     - RDLレポートでのサブレポート(RDLレポートのみ)

CodeZine|5分でわかるActiveReports帳票|RDLレポート

なお、セクションレポートをサブレポートして設定することはできません。サブレポートとして設定できるのは、RDLレポートまたはページレポートのみです。
関連情報
キーワード
HowTo デザイン・レイアウト