CodeZine(コードジン)

特集ページ一覧

Accessのデータベースを帳票化する

PowerTools True WinReports for .NETの帳票作成機能を使う

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2007/09/19 14:00
目次

グループ化した帳票の作成

 次に、抽出したデータをメーカー名かカラーでグループ化して一覧表にする処理を作成します。この処理は、もう1つのC1Reportコンポーネント「C1Report2」に作成します。

 ここでは、C1ReportコンポーネントC1Report1と同じ操作でウィザードを使って一覧表を作成し、次にコードからグループ化処理を組み込みます。

一覧表をウィザードで作成する

 C1Report1で行った操作と同じ操作で一覧表を作成します。

グループ化処理の作成

 グループ化とは、SQLの「Group By」命令と同じように、データを指定したフィールドごとにまとめて一覧表にできる機能です。

 C1Reportコンポーネントでは、グループを指定する項目をGroupオブジェクトとして作成し、AddメソッドでGroupsコレクションに追加する形を取ります。

 Addメソッドは、引数に「Groupの名前」「グループ化するフィールドの名前」と「ソートの条件」をSortEnum列挙体のメンバで指定します。

C1Report2.Groups.Add("メーカー", "メーカー", SortEnum.Ascending)
SortEnum列挙体のメンバ
メンバ名説明
Ascendingレコードを昇順にソートします。
Descendingレコードを降順にソートします。
NoSortこのグループのレコードはソートしません。

 GroupsコレクションにGroupオブジェクトが追加されると、一覧表作成時に作成した条件でグループ化が行われます。

 Groupsコレクションには複数のGroupを持たせることができます。そこで、このプログラムではフィールド「メーカー」と「カラー」の2種類のグループ化処理を作成しGroupsコレクションに追加します。

 このとき、必ずどちらかのグループ化だけが実行されるように、GroupsコレクションのCountプロパティでGroupオブジェクトの有無をチェックし、既にGroupオブジェクトがあればそれを削除してから作成するようにします。

Visual Basic
Private Sub Button2_Click(ByVal sender As System.Object, _
           ByVal e As System.EventArgs) Handles Button2.Click
    Dim grp As Group
    Dim f As Field

    If Me.ComboBox1.Text = "メーカー" Then
        If Me.C1Report2.Groups.Count <> 0 Then
            Me.C1Report2.Groups.Remove(0)
        End If

        grp = Me.C1Report2.Groups.Add("メーカー", "メーカー", 
                                      SortEnum.Ascending)
C#
private void Button2_Click(object sender, EventArgs e)
{
    Group grp;
    Field f;

    if (ComboBox1.Text == "メーカー") {
        if (c1Report2.Groups.Count != 0){
            c1Report2.Groups.Remove(0);
        }
                
        grp = c1Report2.Groups.Add("メーカー", "メーカー", 
                                   SortEnum.Ascending);

項目見出しの作成

 一覧表を作成する際に、グループの各表示データに項目見出しを設定します。これには、Fieldオブジェクトを作成し各プロパティを使って体裁を整えます。

 Fieldオブジェクトは、Groupクラス内のSectionHeaderクラスの下層にあるFieldsコレクションに追加される形で作成し、表示文字のフォントや文字色、文字位置などを細かく設定できます。

Visual Basic
        With grp.SectionHeader
            .Height = 500
            .Visible = True
            f = .Fields.Add("メーカー", "メーカー", 0, 0, 
                            C1Report2.Layout.Width, 500)
            f.Calculated = True
            f.Align = FieldAlignEnum.LeftMiddle
            f.Font.Bold = True
            f.Font.Size = 12
            f.BorderStyle = BorderStyleEnum.Solid
            f.BorderColor = Color.FromArgb(0, 0, 150)
            f.BackColor = Color.FromArgb(150, 150, 220)
            f.MarginLeft = 100
        End With
    Else
        If Me.C1Report2.Groups.Count <> 0 Then
            Me.C1Report2.Groups.Remove(0)
        End If
        grp = Me.C1Report2.Groups.Add("カラー", "カラー", 
                                      SortEnum.Ascending)
        With grp.SectionHeader
            .Height = 500
            .Visible = True
            f = .Fields.Add("カラー", "カラー", 0, 0, 
                            C1Report2.Layout.Width, 500)
            f.Calculated = True
            f.Align = FieldAlignEnum.LeftMiddle
            f.Font.Bold = True
            f.Font.Size = 12
            f.BorderStyle = BorderStyleEnum.Solid
            f.BorderColor = Color.FromArgb(0, 0, 150)
            f.BackColor = Color.FromArgb(150, 150, 220)
            f.MarginLeft = 100
        End With
    End If
    Me.C1PrintPreviewControl1.Document = Me.C1Report2.Document
    Me.C1PrintPreviewControl1.Invalidate()
End Sub
C#
        grp.SectionHeader.Height = 500;
        grp.SectionHeader.Visible = true;
        f = grp.SectionHeader.Fields.Add("メーカー", "メーカー", 0, 0,
                                         c1Report2.Layout.Width, 500);
        f.Calculated = true;
        f.Align = FieldAlignEnum.LeftMiddle;
        f.Font.Bold = true;
        f.Font.Size = 12;
        f.BorderStyle = BorderStyleEnum.Solid;
        f.BorderColor = Color.FromArgb(0, 0, 150);
        f.BackColor = Color.FromArgb(150, 150, 220);
        f.MarginLeft = 100;
    }else{
        if (c1Report2.Groups.Count != 0){
            c1Report2.Groups.Remove(0);
        }
        grp = c1Report2.Groups.Add("カラー", "カラー", 
                                   SortEnum.Ascending);
        grp.SectionHeader.Height = 500;
        grp.SectionHeader.Visible = true;
        f = grp.SectionHeader.Fields.Add("カラー", "カラー", 0, 0, 
                                         c1Report2.Layout.Width, 500);
        f.Calculated = true;
        f.Align = FieldAlignEnum.LeftMiddle;
        f.Font.Bold = true;
        f.Font.Size = 12;
        f.BorderStyle = BorderStyleEnum.Solid;
        f.BorderColor = Color.FromArgb(0, 0, 150);
        f.BackColor = Color.FromArgb(150, 150, 220);
        f.MarginLeft = 100;
    }
    c1PrintPreviewControl1.Document = c1Report2.Document;
    c1PrintPreviewControl1.Invalidate();
}

まとめ

 テーブルが1つだけの簡単な構造のデータベースを使用して、一覧表を作成するレポート作成プログラムを作ってみました。

 複数のレポートを切り替えて使用できる点や、レポート作成時にクエリを作るため、オプションの指定ができるようにユーザーインターフェースを組めば、プログラム実行時のレポート作成処理にかなり自由度を持たせることができると思います。



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

バックナンバー

連載:ComponentZine(ComponentOne)

もっと読む

著者プロフィール

  • 瀬戸 遥(セト ハルカ)

    8ビットコンピュータの時代からBASICを使い、C言語を独習で学びWindows 3.1のフリーソフトを作成、NiftyServeのフォーラムなどで配布。Excel VBAとVisual Basic関連の解説書を中心に現在まで40冊以上の書籍を出版。近著に、「ExcelユーザーのためのAccess再...

あなたにオススメ

All contents copyright © 2005-2022 Shoeisha Co., Ltd. All rights reserved. ver.1.5