クロス集計表

このページでは、以下の帳票を作成します。

縦/横それぞれ個別のキーで集計を行う、いわゆるクロス集計表のサンプルになります。

クロス集計表のサンプル
サンプルについて
完成したサンプルが example フォルダ内に以下の名前で含まれています。 帳票定義ファイル: example_crosstab.rrpt ソースコード: ExampleCrosstab.cs、ExampleCrosstab.vb、ExampleCrosstab.java

クロス集計表のデザイン

クロス集計表を作成するには、レポートデザイナの構成ツリーにて、 目的のコンテント上で右クリックして表示されるコンテキストメニューから「クロス集計表を追加」を選びます。

クロス集計表のサンプル

クロス集計表を設定するためのダイアログが表示されるので、各項目を入力します。

クロス集計表のサンプル

今回の例では、縦方向には「事業所コード(branch_cd)」毎に集計を行い、 横方向には「期(period_cd)」毎に集計を行うものとします。

さらに、縦の見出し列として「事業所名(branch_nm)」、横の見出し列として「期の名称(period_nm)」、 集計対象として「金額(amount)」の列名をそれぞれ設定します。

他に、1ページ内に行/列を縦/横に並べる数、集計行/列の有無、書式文字列を必要に応じて設定することができます。

「OK」ボタンを押すと、クロス集計表を構成するグループおよびコンテント群が自動生成されます。

クロス集計表のサンプル

クロス集計表は、複数のグループやコンテントの組み合わせによって構成されます。 表内部のレイアウトを調整する場合は、各コンテントのサイズを個別に変更するのではなく、 構成ツリー上で表のルートグループを選択し、行高さ/列幅変更グリップを利用すると便利です。

なお、今回の例では表のルートグループの[識別子]に、example_crosstab という値を設定しています。 これは、後ほどプログラムから表にデータを渡す際に利用します。

クロス集計表にデータを渡す方法

帳票の出力時に、クロス集計表を含む帳票にデータを与える2種類の方法について説明します。

  • 出力するデータを全て一度に渡す
  • 横に並べる列のデータと、集計対象のデータを個別に渡す

全てのデータを一度に渡す

全てのデータを一度に渡す方法であれば、特別な制御は必要ありません。 以下のように、縦キーの「事業所コード(branch_cd)」、縦見出しの「事業所名(branch_nm」、 横キーの「期コード(period_cd)」、横見出しの「期名称(period_nm)」、集計対象の「金額(amount)」 列全てが含まれたデータを、通常の方法(Report.Fillメソッド)で渡してください。

クロス集計表のサンプル

クロス集計表に渡すデータの行順については気にかける必要はありません。 RapidReportの内部で、渡されたデータに対し適切にソートが行われます。

横並びのデータと、集計対象のデータを個別に渡す

もうひとつの方法では、横に並べる列の定義と、 集計対象となるデータを分けて帳票に渡します。

クロス集計表のサンプル

今回の例では、列定義のデータは、横キーの「期コード(period_cd)」、横見出しの「期名称(period_nm)」といった列を持ち、 Report.AddCrosstabCaptionDataSourceというメソッドによって帳票へ渡します。 この際、デザイン時にクロス集計表のルートグループに指定した[識別子](今回の例では example_crosstab)を指定します。

もう一方の集計対象となるデータは、縦キーの「事業所コード(branch_cd)」、縦見出しの「事業所名(branch_nm」、 横キーの「期コード(period_cd)」、集計対象の「金額(amount)」列を持ち、Report.Fillメソッドによって渡します。

この方法では、集計対象となるデータに全ての横キー値が含まれている必要はありません。 実績のないデータでも、列定義データの通りに列が生成されます。

以下に、具体的なコード例を示します。

  // C#
  Report report = new Report(Json.Read("report\\example_crosstab.rrpt"));
  // 横方向の列データを渡します
  report.AddCrosstabCaptionDataSource("crosstab_example", new ReportDataSource(getCaptionDataTable()));
  // 集計対象のデータを渡します
  report.Fill(new ReportDataSource(getDataTable()));
  ...
  ' VisualBasic
  Dim report As New Report(Json.Read("report\example_crosstab.rrpt"))
  ' 横方向の列データを設定します。
  report.AddCrosstabCaptionDataSource("crosstab_example", New ReportDataSource(getCaptionDataTable()))
  ' 集計対象のデータを渡します
  report.Fill(New ReportDataSource(getDataTable))
  ...
  // Java
  Report report = new Report(ReadUtil.readJson("report/example_crosstab.rrpt"));
  // 横方向の列データを設定します。
  report.addCrosstabCaptionDataSource("crosstab_example", new ReportDataSource(getCaptionDataTable()));
  // 集計対象のデータを渡します  
  report.fill(new ReportDataSource(getDataTable()));
  ...

ページ順

縦の行数または横の列数が、それぞれの並べる数をはみ出した場合は、改ページが行われます。

縦と横にそれぞれはみ出した場合、出力されるページの順序は、横>縦の順となります。 横に3ページ分、縦に2ページ分はみ出した場合の例を、以下に示します。 赤字の数値がページ順です。

クロス集計表のサンプル

クロス集計表が複数ページにわたった場合、合計値は縦/横それぞれの最後のページにのみ出力されます。 例えば、上記の例では横計は、3、6ページにのみ出力され、縦計は4、5、6ページにのみ出力されています。

この制御は、それぞれの合計値を出力するフィールド要素に、 [表示条件]として crosstab.v_last または crosstab.h_last という式が設定されていることによって行われています。 それぞれ、縦または横に並べた最後のページかを返すという意味です。 仮に、この[表示条件]の内容を除去すると、全てのページに合計値が表示されます。