グループ化した帳票の作成
次に、抽出したデータをメーカー名かカラーでグループ化して一覧表にする処理を作成します。この処理は、もう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つだけの簡単な構造のデータベースを使用して、一覧表を作成するレポート作成プログラムを作ってみました。
複数のレポートを切り替えて使用できる点や、レポート作成時にクエリを作るため、オプションの指定ができるようにユーザーインターフェースを組めば、プログラム実行時のレポート作成処理にかなり自由度を持たせることができると思います。