はじめに
PowerTools True WinReports for .NETのC1Reportコンポーネントは、XMLファイルに格納されたレポート定義を読み取り、それらをデータソースからのデータと組み合わせてレポートを生成します。
生成されたレポートは、プレビュー、印刷、ファイルへの保存などを行うことができます。また、C1Reportは、レポートを HTML、DHTML、PDF、およびテキストファイルの各形式にエクスポートしたり、C1PrintPreviewコンポーネントに直接描画することができます。
そこで、以前紹介したPowerTools Preview for .NET のC1PrintPreviewControlと組み合わせ、エレキギターの商品データを格納しているAccessデータベースからデータを取り出して一覧表を作成するアプリケーションを作ってみました。
対象読者
Visual Basic 2005またはVisual C# 2005を使ってプログラムを作ったことのある人。
必要な環境
Visual Basic 2005またはVisual C# 2005、Visual Studio 2005でプログラムが作れる環境。
プログラム実行時の注意事項
本稿の実行ファイル(バイナリファイル)を動かすには、zipファイルに同梱してある以下の3つのファイルが必要になります。
- C1.C1Preview.2.dll…C1PrintDocumentコントロール(.NET Framework 2.0 用)
- C1.Win.C1Preview.2.dll…C1PrintPreviewコントロール(.NET Framework 2.0 用)
- C1.Win.C1Report.2.dll…C1Reportコントロール(.NET Framework 2.0 用)
これらのファイルを、実行プログラムと同じフォルダに格納します。なお、.NET Framework 2.0から追加されたクラスやメンバを使用しているので、.NET Framework 2.0がインストールされていることが必須条件です。
また、サンプルデータベース「guiter.mdb」をドライブCのルートにおいてください。
コンポーネントのインストール
はじめてPowerTools True WinReports for .NETおよびPowerTools Preview for .NETを使用する方は、プロジェクトにComponentOne Studio 2007 WinForms Editionをインストールする必要があります。
インストーラは、グレープシティのWebページらダウンロードできますので、ここからダウンロードしてインストールしてください。製品ページ左側の[ダウンロード]-[トライアル版]をクリックし、ダウンロード方法([FTP]または[HTTP])を選択すれば入手できます。ファイルはLZH形式で圧縮されています。
有償のコンポーネントですが、プロダクトキーを入力せずにインストールすることで、トライアル版として使用できます。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。
コントロールの追加
ComponentOne Studio 2007 WinForms Editionをインストールしたら、ツールボックスに専用のタブを作成し、PowerTools True WinReports for .NETおよびPowerTools Preview for .NETを追加します。追加するコンポーネントは、「.NET Frameworkコンポーネント」の名前空間が「C1.Win.C1Preview」で始まる名前空間のコンポーネント「C1PrintPreviewControl」と、「C1.Win.C1Report」で始まる「C1Report」です。
GUIの作成
フォームはPanelを配置し、Dockプロパティを「Top」にして、その上にButtonを2つとComboBoxを1つ配置します。
ComboBoxは、DropDownStyleプロパティを「DropDownList」にし、Itemsコレクションで「メーカー」と「カラー」という2つの項目を組み込みます。また、Panelの下に「C1PrintPreviewControl」を配置し、Dockプロパティを「Fill」にします。
C1Reportコンポーネントを2つ配置しておきます。このコンポーネントは、ユーザーインターフェースは持ちませんので、フォームデザイナの下側に配置されます。
フォームの初期化処理の作成
コードの先頭で、importsまたはusingを使い、C1.Win.C1Reportへの参照を設定します。そして、フォームのLoadイベントハンドラでComboBoxのTextプロパティを設定します。
Imports C1.Win.C1Report Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Me.ComboBox1.SelectedIndex = 0 End Sub
using C1.Win.C1Report; private void Form1_Load(object sender, EventArgs e) { ComboBox1.SelectedIndex = 0; }
C1Report1の設定
最初に、C1Reportコンポーネント「C1Report1」に、サンプルデータベースのテーブルからデータを取り出して表示する、単純な一覧表を作成する処理を組み込みます。
使用するデータベース
サンプルで使用するデータベースは、テーブルが1つの簡単なデータベースです。データを抽出するクエリは、C1Reportの設定で行いますので、データベースには作成していません。
テーブルは4つのフィールドからなり、それぞれ「ID」「メーカー」「製品名」「カラー」にデータが順不同で入力されています。
一覧表の作成
C1Report1コンポーネントを使って一覧表を作成するには、ウィザードを使う方法とデザイナを使用して作成する方法がありますが、最初はウィザードを使って作成してみましょう。
1.レポートの編集
C1Report1をクリックし、タスクメニューから「レポートの編集」を選びます。
「レポート新規作成ウィザード」が開きますので、「接続文字列」の[...]ボタンを押します。
すると、データベースへの接続を設定するおなじみの画面が出てきますので、[プロバイダ]から「Microsoft Jet4.0 OLE DB Provider」を選びます。データベース名に「guiter.mdb」を指定し[接続のテスト]で接続できることを確認します。
2.SQL構文の構築
ウィザードに戻り「SQL構文」にチェックが入っているのを確認し、ツールバーの[SQL構文の構築]ボタンを押します。
「SQLビルダ」が起動するので、テーブルを展開し、フィールドをダブルクリックして抽出するデータのあるフィールドを指定します。
3.レポートに表示するフィールドの指定する
ウィザードを進め、レポートに表示するフィールドを指定します。なお、一覧表はこのフィールドを並べた順番で作成されるので、列の指定順序に注意してください。
4.レイアウトの決定
[レイアウト]で「表形式」を選び、そのままOKボタンを押してウィザードを進め、最後にレポート名を「製品一覧レポート」に変更して[完了]ボタンを押します。
5.プレビュー
作成した一覧表のプレビューが表示されるので、内容を確認してウィンドウを閉じます。
6.イベントハンドラの設定
VSに戻り、ボタン「標準一覧表」のClickイベントハンドラに、作成した一覧表をC1PrintPreviewControlコンポーネントで表示する処理を作成します。
C1ReportコンポーネントのDocumentプロパティの値を、C1PrintPreviewControlのDocumentプロパティに代入し、C1PrintPreviewControlのInvalidate
メソッドを実行して表示を更新するようにすれば完成です。
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Me.C1PrintPreviewControl1.Document = Me.C1Report1.Document Me.C1PrintPreviewControl1.Invalidate() End Sub
private void Button1_Click(object sender, EventArgs e) { c1PrintPreviewControl1.Document = C1Report1.Document; c1PrintPreviewControl1.Invalidate(); }
グループ化した帳票の作成
次に、抽出したデータをメーカー名かカラーでグループ化して一覧表にする処理を作成します。この処理は、もう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つだけの簡単な構造のデータベースを使用して、一覧表を作成するレポート作成プログラムを作ってみました。
複数のレポートを切り替えて使用できる点や、レポート作成時にクエリを作るため、オプションの指定ができるようにユーザーインターフェースを組めば、プログラム実行時のレポート作成処理にかなり自由度を持たせることができると思います。