データの部分割り当て

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

この帳票には、商品のリストと、承認者のリストという2つの明細が含まれています。 帳票の各部に個別のデータを割り当てることで、このような帳票も実現可能になります。

注文書の例
サンプルについて
完成したサンプルが example フォルダ内に以下の名前で含まれています。 帳票定義ファイル: example_dataprovider.rrpt ソースコード: ExampleDataProvider.cs、ExampleDataProvider.vb、ExampleDataProvider.java

ここでは、商品と承認者に割り当てるサンプルのデータを、以下のように定義します。

  // C#

  // 商品リスト
  private static DataTable getDataTable(){
      DataTable ret = new DataTable();
      ret.Columns.Add("HAT_ID", typeof(int));
      ret.Columns.Add("TOKUI_NM", typeof(String));
      ret.Columns.Add("TOKUI_TANTO_NM", typeof(String));
      ret.Columns.Add("HIN_NM", typeof(String));
      ret.Columns.Add("HIN_CD", typeof(String));
      ret.Columns.Add("SURYO", typeof(Decimal));
      ret.Columns.Add("TANKA", typeof(Decimal));
      ret.Columns.Add("SHUKKABI", typeof(DateTime));
      ret.Rows.Add(1, "○○精密", "担当太郎", "パイロットパンチ", "AAA-BBB-CCC-DDD-1000",
          1, 600, DateTime.ParseExact("2011/06/07", "yyyy/MM/dd", null));
      ret.Rows.Add(1, "○○精密", "担当太郎", "ガイドプレート", "AIUEO-999.999", 
          5, 1050, DateTime.ParseExact("2011/06/15", "yyyy/MM/dd", null));
      ret.Rows.Add(1, "○○精密", "担当太郎", "イジェクタピン", "1234-5678-9999", 
          1, 7340, DateTime.ParseExact("2011/06/13", "yyyy/MM/dd", null));
      ret.Rows.Add(2, "△△機械", "担当花子", "ブロックダイ", "9999-8888-7777", 
          10, 1600, DateTime.ParseExact("2011/06/10", "yyyy/MM/dd", null));
      ret.Rows.Add(2, "△△機械", "担当花子", "ブランジャ", "ZZZZZ-YYYYY-XXXXX", 
          5, 800, DateTime.ParseExact("2011/06/10", "yyyy/MM/dd", null));
      return ret;
  }
        
  // 承認者リスト
  private static DataTable getShoninDataTable(){
      DataTable ret = new DataTable();
      ret.Columns.Add("HAT_ID", typeof(int));
      ret.Columns.Add("SHONIN_NM", typeof(String));
      ret.Rows.Add(1, "承認一郎");
      ret.Rows.Add(1, "承認二郎");
      ret.Rows.Add(1, "承認三郎");
      ret.Rows.Add(1, "承認四郎");
      ret.Rows.Add(2, "承認花子");
      return ret;
  }
  ' VisualBasic
  
  ' 商品リスト
  Private Function getDataTable() As DataTable
      Dim ret As New DataTable
      ret.Columns.Add("HAT_ID", GetType(Integer))
      ret.Columns.Add("TOKUI_NM", GetType(String))
      ret.Columns.Add("TOKUI_TANTO_NM", GetType(String))
      ret.Columns.Add("HIN_NM", GetType(String))
      ret.Columns.Add("HIN_CD", GetType(String))
      ret.Columns.Add("SURYO", GetType(Decimal))
      ret.Columns.Add("TANKA", GetType(Decimal))
      ret.Columns.Add("SHUKKABI", GetType(Date))
      ret.Rows.Add(1, "○○精密", "担当太郎", "パイロットパンチ", "AAA-BBB-CCC-DDD-1000", _
          1, 600, DateTime.ParseExact("2011/06/07", "yyyy/MM/dd", Nothing))
      ret.Rows.Add(1, "○○精密", "担当太郎", "ガイドプレート", "AIUEO-999.999", _
          5, 1050, DateTime.ParseExact("2011/06/15", "yyyy/MM/dd", Nothing))
      ret.Rows.Add(1, "○○精密", "担当太郎", "イジェクタピン", "1234-5678-9999", _
          1, 7340, DateTime.ParseExact("2011/06/13", "yyyy/MM/dd", Nothing))
      ret.Rows.Add(2, "△△機械", "担当花子", "ブロックダイ", "9999-8888-7777", _
          10, 1600, DateTime.ParseExact("2011/06/10", "yyyy/MM/dd", Nothing))
      ret.Rows.Add(2, "△△機械", "担当花子", "ブランジャ", "ZZZZZ-YYYYY-XXXXX", _
          5, 800, DateTime.ParseExact("2011/06/10", "yyyy/MM/dd", Nothing))
      Return ret
  End Function

  ' 承認者リスト
  Private Function getShoninDataTable() As DataTable
      Dim ret As New DataTable
      ret.Columns.Add("HAT_ID", GetType(Integer))
      ret.Columns.Add("SHONIN_NM", GetType(String))
      ret.Rows.Add(1, "承認一郎")
      ret.Rows.Add(1, "承認次郎")
      ret.Rows.Add(1, "承認三郎")
      ret.Rows.Add(1, "承認四郎")
      ret.Rows.Add(2, "承認花子")
      Return ret
  End Function
  // Java

  // 商品リスト
  private static DataTable getDataTable() throws Throwable{
      DataTable ret = new DataTable();
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
      ret.setFieldNames("HAT_ID", "TOKUI_NM", "TOKUI_TANTO_NM",
          "HIN_NM", "HIN_CD", "SURYO", "TANKA", "SHUKKABI");
      ret.addRecord().puts(1, "○○精密", "担当太郎", "パイロットパンチ", "AAA-BBB-CCC-DDD-1000",
          1, 600, sdf.parse("2011/06/07"));
      ret.addRecord().puts(1, "○○精密", "担当太郎", "ガイドプレート", "AIUEO-999.999",
          5, 1050, sdf.parse("2011/06/15"));
      ret.addRecord().puts(1, "○○精密", "担当太郎", "イジェクタピン", "1234-5678-9999",
          1, 7340, sdf.parse("2011/06/13"));
      ret.addRecord().puts(2, "△△機械", "担当花子", "ブロックダイ", "9999-8888-7777",
          10, 1600, sdf.parse("2011/06/10"));
      ret.addRecord().puts(2, "△△機械", "担当花子", "ブランジャ", "ZZZZZ-YYYYY-XXXXX",
          5, 800, sdf.parse("2011/06/10"));
      return ret;
  }

  // 承認者リスト
  private static DataTable getShoninDataTable(){
      DataTable ret = new DataTable();
      ret.setFieldNames("HAT_ID", "SHONIN_NM");
      ret.addRecord().puts(1, "承認一郎");
      ret.addRecord().puts(1, "承認次郎");
      ret.addRecord().puts(1, "承認三郎");
      ret.addRecord().puts(1, "承認四郎");
      ret.addRecord().puts(2, "承認花子");
      return ret;
  }

今回の例では商品リストのほうが、この帳票にとって主要なデータであると見なします。 つまり、Fillメソッドに渡すデータソースには商品リストのデータを渡します。

この帳票のデザイン上において、 承認者のリストは"group_shonin"という識別子が振られたグループ以下に配置されています。 そこで、このグループに対しては承認者データが割り当てられるようにします。

このような操作は、データプロバイダというオブジェクトを利用することで可能になります。 今回の例のように、あらかじめ用意されたデータを割り当てるならば、 GroupDataProviderというオブジェクトを利用できます。

まず、GroupDataProviderオブジェクトを生成し、GroupDataMapというメンバに、 データを割り当てるグループの識別子をキーとして承認者データを表すデータソースを登録します。 作成したGroupDataProviderオブジェクトはFillメソッドの第2引数に渡します。

"group_shohin"という識別子の振られたGroupは、 "HAT_ID"列をキーとして分割されるグループの子として定義されています。 そこで、承認者データも"HAT_ID"をキーに分割された上で該当するページに割りつけられます。

帳票出力のコードは以下のようになります。

  // C#

  Report report = new Report(Json.Read("report\\example_dataprovider.rrpt"));

  // "group_shohin"という識別子を持ったグループには、
  // getShoninDataTableから得られるデータを割り当てます
  GroupDataProvider dataProvider = new GroupDataProvider();
  dataProvider.GroupDataMap.Add("group_shonin", new ReportDataSource(getShoninDataTable()));

  // 第2引数にdataProviderを渡します
  report.Fill(new ReportDataSource(getDataTable()), dataProvider);

  ReportPages pages = report.GetPages();

  // PDF出力
  using (FileStream fs = new FileStream("output\\example_dataprovider.pdf", FileMode.Create))
  {
      PdfRenderer renderer = new PdfRenderer(fs);
      renderer.Setting.ReplaceBackslashToYen = true;
      pages.Render(renderer);
  }
  ' VisualBasic

  Dim report As New Report(Json.Read("report\example_dataprovider.rrpt"))

  ' "group_shohin"という識別子を持ったグループには、
  ' getShoninDataTableから得られるデータを割り当てます
  Dim dataProvider As New GroupDataProvider
  dataProvider.GroupDataMap.Add("group_shonin", New ReportDataSource(getShoninDataTable))

  ' 第2引数にdataProviderを渡します
  report.Fill(New ReportDataSource(getDataTable), dataProvider)

  Dim pages As ReportPages = report.GetPages()

  ' PDF出力
  Using fs As New FileStream("output\example_dataprovider.pdf", IO.FileMode.Create)
      pages.Render(New PdfRenderer(fs))
  End Using
  // Java

  Report report = new Report(ReadUtil.readJson("report/example_dataprovider.rrpt"));

  // "group_shohin"という識別子を持ったグループには、
  // getShoninDataTableから得られるデータを割り当てます
  GroupDataProvider dataProvider = new GroupDataProvider();
  dataProvider.groupDataMap.put("group_shonin", new ReportDataSource(getShoninDataTable()));

  // 第2引数にdataProviderを渡します
  report.fill(new ReportDataSource(getDataTable()), dataProvider);
  ReportPages pages = report.getPages();