グループ化した帳票の作成
次に、抽出したデータをメーカー名かカラーでグループ化して一覧表にする処理を作成します。この処理は、もう1つのC1Reportコンポーネント「C1Report2」に作成します。
ここでは、C1ReportコンポーネントC1Report1と同じ操作でウィザードを使って一覧表を作成し、次にコードからグループ化処理を組み込みます。
一覧表をウィザードで作成する
C1Report1で行った操作と同じ操作で一覧表を作成します。
グループ化処理の作成
グループ化とは、SQLの「Group By」命令と同じように、データを指定したフィールドごとにまとめて一覧表にできる機能です。
C1Reportコンポーネントでは、グループを指定する項目をGroupオブジェクトとして作成し、AddメソッドでGroupsコレクションに追加する形を取ります。
Addメソッドは、引数に「Groupの名前」「グループ化するフィールドの名前」と「ソートの条件」をSortEnum列挙体のメンバで指定します。
C1Report2.Groups.Add("メーカー", "メーカー", SortEnum.Ascending)
| メンバ名 | 説明 |
| Ascending | レコードを昇順にソートします。 |
| Descending | レコードを降順にソートします。 |
| NoSort | このグループのレコードはソートしません。 |
GroupsコレクションにGroupオブジェクトが追加されると、一覧表作成時に作成した条件でグループ化が行われます。
Groupsコレクションには複数のGroupを持たせることができます。そこで、このプログラムではフィールド「メーカー」と「カラー」の2種類のグループ化処理を作成しGroupsコレクションに追加します。
このとき、必ずどちらかのグループ化だけが実行されるように、GroupsコレクションのCountプロパティでGroupオブジェクトの有無をチェックし、既にGroupオブジェクトがあればそれを削除してから作成するようにします。
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)
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コレクションに追加される形で作成し、表示文字のフォントや文字色、文字位置などを細かく設定できます。
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
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つだけの簡単な構造のデータベースを使用して、一覧表を作成するレポート作成プログラムを作ってみました。
複数のレポートを切り替えて使用できる点や、レポート作成時にクエリを作るため、オプションの指定ができるようにユーザーインターフェースを組めば、プログラム実行時のレポート作成処理にかなり自由度を持たせることができると思います。

