CodeZine(コードジン)

特集ページ一覧

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

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

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

Accessデータベースのデータを帳票にしようとしても、フォームをデザインする操作は意外と面倒です。そこで、PowerTools Preview for .NETのC1PrintPreviewControlと組み合わせ、エレキギターの商品データを格納しているAccessデータベースからデータを取り出し、一覧表を作成するアプリケーションを作ってみました。

はじめに

 PowerTools True WinReports for .NETのC1Reportコンポーネントは、XMLファイルに格納されたレポート定義を読み取り、それらをデータソースからのデータと組み合わせてレポートを生成します。

 生成されたレポートは、プレビュー、印刷、ファイルへの保存などを行うことができます。また、C1Reportは、レポートを HTML、DHTML、PDF、およびテキストファイルの各形式にエクスポートしたり、C1PrintPreviewコンポーネントに直接描画することができます。

 そこで、以前紹介したPowerTools Preview for .NET のC1PrintPreviewControlと組み合わせ、エレキギターの商品データを格納しているAccessデータベースからデータを取り出して一覧表を作成するアプリケーションを作ってみました。

「一覧表」ボタンを押すとクエリを実行し抽出データを一覧表にしてC1PrintPreview コンポーネントに表示する
「一覧表」ボタンを押すとクエリを実行し抽出データを一覧表にしてC1PrintPreview コンポーネントに表示する
条件によってグループ化して一覧表を作成する
条件によってグループ化して一覧表を作成する

対象読者

 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」です。

「C1.Win.C1Preview」で始まる名前空間のコンポーネント「C1PrintPreviewControl」と、「C1.Win.C1Report」で始まる「C1Report」を追加する
「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つ配置しておきます。このコンポーネントは、ユーザーインターフェースは持ちませんので、フォームデザイナの下側に配置されます。

GUIデザイン
GUIデザイン

フォームの初期化処理の作成

 コードの先頭で、importsまたはusingを使い、C1.Win.C1Reportへの参照を設定します。そして、フォームのLoadイベントハンドラでComboBoxのTextプロパティを設定します。

Visual Basic
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
C#
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」を指定し[接続のテスト]で接続できることを確認します。

guiter.mdbを指定し接続を確認する
guiter.mdbを指定し接続を確認する

2.SQL構文の構築

 ウィザードに戻り「SQL構文」にチェックが入っているのを確認し、ツールバーの[SQL構文の構築]ボタンを押します。

 「SQLビルダ」が起動するので、テーブルを展開し、フィールドをダブルクリックして抽出するデータのあるフィールドを指定します。

SQLビルダで抽出するフィールドを指定する
SQLビルダで抽出するフィールドを指定する

3.レポートに表示するフィールドの指定する

 ウィザードを進め、レポートに表示するフィールドを指定します。なお、一覧表はこのフィールドを並べた順番で作成されるので、列の指定順序に注意してください。

レポートに表示するフィールドを指定
レポートに表示するフィールドを指定

4.レイアウトの決定

 [レイアウト]で「表形式」を選び、そのままOKボタンを押してウィザードを進め、最後にレポート名を「製品一覧レポート」に変更して[完了]ボタンを押します。

5.プレビュー

 作成した一覧表のプレビューが表示されるので、内容を確認してウィンドウを閉じます。

レポートのプレビュー
レポートのプレビュー

6.イベントハンドラの設定

 VSに戻り、ボタン「標準一覧表」のClickイベントハンドラに、作成した一覧表をC1PrintPreviewControlコンポーネントで表示する処理を作成します。

 C1ReportコンポーネントのDocumentプロパティの値を、C1PrintPreviewControlのDocumentプロパティに代入し、C1PrintPreviewControlのInvalidateメソッドを実行して表示を更新するようにすれば完成です。

Visual Basic
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
C#
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)
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で送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 瀬戸 遥(セト ハルカ)

    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