SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

5分でわかるActiveReports帳票(AD)

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

ActiveReports for .NET 9.0Jで作るサンプル帳票(2)

  • このエントリーをはてなブックマークに追加

レポート実行時にサブレポートにデータを設定

 実際の帳票開発においては、SQL Serverなどのデータベースに格納されたデータではなく、コードで動的に生成したデータをもとにレポートを作成したいケースがあります。ActiveReportsでは、セクションレポート/ページレポートと同様、RDLレポートでもこのケースに対応できます。

 レポート実行時に動的にデータを設定するには、データソースの種類に「DataSet Provider」を設定したうえで、レポートのLocateDataSourceイベントでレポートにデータ(DataTable)を設定します。詳細については、製品ヘルプの[実行時にレポートとデータソースの連結]をご参照ください。

 ここでは、メインレポートおよびサブレポートにそれぞれ動的にデータを設定する方法を紹介します。サンプルとして、「自然数とその約数を表示する」レポートを作成します。

 付属のサンプルは、「04_レポート実行時にサブレポートにデータを設定_Main.rdlx」および、「04_レポート実行時にサブレポートにデータを設定_Sub.rdlx」をご参照ください。

データの作成

 はじめに、レポートで使用するデータ(DataTable)を用意します。

 メインレポート用に、1から10までの自然数を含むDataTableを作成します。

メインレポートのDataTable(VB.NET)
' メインレポート用の実行時データソース
Private Function MakeNaturalNumberTable() As DataTable
    Dim table As New DataTable
    table.Columns.Add("NaturalNumber")
    For i As Integer = 1 To 10
        Dim row As DataRow = table.NewRow
        row("NaturalNumber") = i
        table.Rows.Add(row)
    Next
    Return table
End Function
メインレポートのDataTable(C#)
// メインレポート用の実行時データソース
private System.Data.DataTable MakeNaturalNumberTable()
{
    DataTable table = new DataTable();
    table.Columns.Add("NaturalNumber");
    for (int i = 1; i <= 10; i++)
    {
        DataRow row = table.NewRow();
        row["NaturalNumber"] = i;
        table.Rows.Add(row);
    }
    return table;
}

 サブレポート用に、1から10までの自然数および、その約数を含むDataTableを作成します。

サブレポートのDataTable(VB.NET)
' サブレポート用の実行時データソース
Private Function MakeDivisorTable() As DataTable
    Dim table As New DataTable
    table.Columns.Add("NaturalNumber")
    table.Columns.Add("Divisor")
    For i As Integer = 1 To 10
        For j As Integer = 1 To i
            If i Mod j = 0 Then
                Dim row As DataRow = table.NewRow
                row("NaturalNumber") = i
                row("Divisor") = j
                table.Rows.Add(row)
            End If
        Next
    Next
    Return table
End Function
サブレポートのDataTable(C#)
// サブレポート用の実行時データソース
private DataTable MakeDivisorTable()
{
    DataTable table = new DataTable();
    table.Columns.Add("NaturalNumber");
    table.Columns.Add("Divisor");
    for (int i = 1; i <= 10; i++)
    {
        for (int j = 1; j <= i; j++)
        {
            if (i % j == 0)
            {
                DataRow row = table.NewRow();
                row["NaturalNumber"] = i;
                row["Divisor"] = j;
                table.Rows.Add(row);
            }
        }
    }
    return table;
}

データの設定

 次に、メインレポートおよびサブレポートに各データ(DataTable)を設定します。具体的には、LocateDataSourceイベントの引数を利用してレポート名を参照し、レポートに応じて必要なデータを設定します。

実行時にデータソースを渡す(VB.NET)
Private Sub pDoc_LocateDataSource(ByVal sender As Object, ByVal args As GrapeCity.ActiveReports.LocateDataSourceEventArgs)
    Select Case args.Report.PageReport.Report.Name
        Case "04_レポート実行時にサブレポートにデータを設定_Sub"
            args.Data = Me.MakeDivisorTable()
        Case ""
            args.Data = Me.MakeNaturalNumberTable()
        Case Else
            args.Data = New System.Data.DataTable()
    End Select
End Sub
実行時にデータソースを渡す(C#)
void pageDocument_LocateDataSource(object sender, GrapeCity.ActiveReports.LocateDataSourceEventArgs args)
{
    switch (args.Report.PageReport.Report.Name)
    {
        case "04_レポート実行時にサブレポートにデータを設定_Sub": args.Data = MakeDivisorTable();
            break;
        case "": args.Data = MakeNaturalNumberTable();
            break;
        default: args.Data = new DataTable();
            break;
    }
}

 LocateDataSourceイベントは、メインレポートおよびサブレポートの実行時にそれぞれ呼び出されます。どのレポートに対して呼び出されたかはargv.Report.PageReport.Report.Nameの値で判定できます。メインレポートの場合は、空文字列になります。上記コードでは2番目の条件に該当し、メインレポート用のDataTableを渡しています。サブレポートの場合は、そのレポート名になります。上記コードでは1番目の条件に該当し、”04_レポート実行時にサブレポートにデータを設定_Sub”がサブレポートの名称なので、サブレポート用のDataTableを渡しています。それ以外の場合は、念のために空のDataTableを渡しておきます。

 以上の手順で、サブレポートにデータを渡すことができました。しかしこのままでは、1の約数だけを表示したいのに、1~10までの数の約数がすべて表示されてしまいます。先ほどの例でパラメータを介さない場合と同様の結果になります。

フィルタをかけない場合
フィルタをかけない場合

 このサブレポートで使っているデータソースはDataSet Providerのため、クエリは使用していません。そのため、この場合には、フィルタを使用してデータを抽出します。

フィルタの追加

 まずは、サブレポートにパラメータを追加します。次に、「データセット」ダイアログで「フィルタ」ページを開き、追加したパラメータを利用してデータを抽出します。「フィルタ」ページでフィルタを追加し、「式」には、条件として使いたいフィールド名を指定します。「演算子」には「Equal」、「値」にはパラメータを指定します。

備考

 式の値は短縮形で表示されることに気をつけてください。式の値は直接編集せずに、式エディタを使って設定するほうが便利です。式の詳細については、以前の記事(5分でわかるActiveReports帳票(2013年度版)-ページレポートにおけるグループ化と式)をご参照ください。

フィルタの追加
フィルタの追加

 フィルタの追加によって、SQLクエリに「WHERE ~ = ~」と記述するのと同じような効果が得られます。また、メインレポートには、先ほどと同様にSubReportコントロールにパラメータを追加しておきます。以上の設定により、各自然数ごとの約数が表示されるようになります。

フィルタを追加したレポート
フィルタを追加したレポート

まとめ

 今回は、9.0Jの新しいレポート形式であるRDLレポートを紹介しました。RDLレポートの特長であるマルチデータソースおよびサブレポートを活用することで、帳票を柔軟に作成することが可能になります。

 次回は、「レイヤー」機能を活用したレポートレイアウトの作成方法を紹介します。

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
5分でわかるActiveReports帳票連載記事一覧

もっと読む

この記事の著者

グレープシティ株式会社 ActiveReportsチーム(グレープシティカブシキガイシャ アクティブレポートチーム)

 宮城県仙台市に本社を構えるグレープシティでは、日本の業務に適したシステムをより早く開発するためのソフトウェアを提供しています。エンドユーザーの利用しやすさ、幅広いユーザー環境への対応、そして何よりプログラマの作業を軽減することを一番に目指しています。 ActiveReportsは、帳票開発に必要なあらゆる機能を備えた当社を代表するコンポーネントの1つ。1998年の発売以来、日本だけでなく全世界で多数の帳票開発者に使用されています。製品開発は同チームが中心になり、「日本仕様」の厳しい要望を実現することを目指しています。...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/8943 2015/11/10 15:31

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング