はじめに
前回に引き続き、PowerTools True WinReports for .NETのC1Reportコンポーネントを使ってAccessのデータから帳票を作成するアプリケーションを作りました。今回はパラメータクエリを実行し、特定のメーカーの商品データを取得して帳票にします。
パラメータクエリは、C1Reportコンポーネントが持っているダイアログを使い、直接メーカー名を入力して実行する方法と、コンボボックスからメーカー名を選択して実行する方法の2つを使いました。
使用するデータベースは前回と同じく、2つのテーブルを持つ簡単なものです。作成したレポートも、前回と同様にC1PrintPreviewControlコンポーネントで表示します。
対象読者
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]コレクションで次の項目を組み込みます。
GIBSON FERNANDES PRS FENDER USA Epiphone Jackson Stars Rickenbacker
また、Panelの下に「C1PrintPreviewControl」を配置し、[Dock]プロパティを「Fill」にします。
C1Reportコンポーネントを1つ配置しておきます。このコンポーネントは、ユーザーインターフェースは持ちませんので、フォームデザイナの下側に配置されます。
フォームの初期化処理の作成
コードの先頭で、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; }
組み込みダイアログを使ったパラメータクエリ
最初に、C1Reportコンポーネントに組み込まれているパラメータクエリを使ったデータ抽出をレポート化する機能を作成します。
C1Reportコンポーネントでの一覧表の作成
前回と同様の方法で、C1Reportコンポーネントで一覧表を作成します。詳しい操作方法は、前回の記事「Accessのデータベースを帳票化する」の「一覧表の作成」を参照してください。
パラメータクエリの作成
C1Reportコンポーネントには、パラメータクエリを実行するための組み込みのダイアログが用意されています。
そのため、パラメータクエリを使いたければそのSQL文を作成し、DataSourceオブジェクトのRecordSourceプロパティに設定するだけで使うことができます。
SQL文は、通常のWHERE句とPARAMETERS句を組み合わせて作成します。ここでは、メーカー名から製本データを抽出するパラメータクエリを作成することにします。
まず、通常のパラメータクエリ文をAccessなどで作成します。
SELECT 製品一覧.メーカー, 製品一覧.製品名, 製品一覧.カラー FROM 製品一覧 WHERE (製品一覧.メーカー)=[?];
このSELECT句の前に、次のようにPARAMETERS句を追加します。PARAMETERS句のあとには、パラメータとして入力するデータの型を表1の中から選んで指定します。C1Reportコンポーネントは、このデータ型を判断して最適なコントロールをダイアログに表示します。
ここでは文字列を入力しますので、「Text」を指定しています。なお、PARAMETERS句の最後に;
を入れるのを忘れないでください。
PARAMETERS Text ;
値の型 | 説明 |
Date | adDate |
DateTime | adDate |
Bit、Byte、Short、Long | adInteger |
Currency | adCurrency |
Single | adSingle |
Double | adDouble |
Text、String | adBSTR |
Boolean、Bool、YesNo | adBoolean |
そして、WHERE句の式の[?]
を、PARAMETERS句に書いた変数名に置き換えます。
WHERE (製品一覧.メーカー)=Text;
完成したSQL文は次のようになります。
PARAMETERS Text ; SELECT 製品一覧.メーカー, 製品一覧.製品名, 製品一覧.カラー FROM (製品一覧) WHERE (製品一覧.メーカー)=Text;
この文字列を、変数に格納してRecordSourceプロパティに代入します。
後は、C1PrintPreviewControlコンポーネントのDocumentプロパティに、C1ReportコンポーネントのDocumentプロパティの値を代入するだけです。
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Dim sqlstr As String sqlstr = "PARAMETERS Text ;SELECT DISTINCT 製品一覧.メーカー, "& _ "製品一覧.製品名, 製品一覧.カラー" & _ " FROM(製品一覧)" & _ " WHERE (製品一覧.メーカー)=Text;" Me.C1Report1.DataSource.RecordSource = sqlstr Me.C1PrintPreviewControl1.Document = Me.C1Report1.Document Me.C1PrintPreviewControl1.Invalidate() End Sub
private void Button1_Click(object sender, EventArgs e) { String sqlstr; sqlstr = "PARAMETERS Text ;SELECT DISTINCT 製品一覧.メーカー, " + "製品一覧.製品名, 製品一覧.カラー" + " FROM(製品一覧)" + " WHERE (製品一覧.メーカー)=Text;"; c1Report1.DataSource.RecordSource = sqlstr; c1PrintPreviewControl1.Document = c1Report1.Document; c1PrintPreviewControl1.Invalidate();} }
リストからメーカー名を選んでクエリを実行する処理の作成
この、組み込みダイアログを使ったパラメータクエリは、一度パラメータにデータを設定すると、2回目以降も同じデータを返してしまいます。また、毎回クエリの条件を入力するのも間違いの元となりますから、コンボボックスのドロップダウンリストからメーカー名を選んで、クエリを実行する処理を作成します。
この処理もコードでSQL文を作成します。SQL文はComboBoxコントロールのTextプロパティの値を取得し、これをWHERE句に組み込みます。
SELECT 製品一覧.メーカー, 製品一覧.製品名, 製品一覧.カラー FROM (製品一覧) WHERE ((製品一覧.メーカー)= Me.ComboBox1.Text);
後は、作成したSQL文をRecordSourceプロパティに代入し、C1PrintPreviewControlコンポーネントのDocumentプロパティにC1ReportコンポーネントのDocumentプロパティの値を代入するだけです。
Private Sub Button2_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button2.Click Dim sqlstr As String sqlstr = "SELECT 製品一覧.メーカー, 製品一覧.製品名, " & _ "製品一覧.カラー FROM(製品一覧)" & _ " WHERE ((製品一覧.メーカー)='" & Me.ComboBox1.Text & "');" Me.C1Report1.DataSource.RecordSource = sqlstr Me.C1PrintPreviewControl1.Document = Me.C1Report1.Document Me.C1PrintPreviewControl1.Invalidate() End Sub
private void button2_Click(object sender, EventArgs e) { String sqlstr; sqlstr = "SELECT 製品一覧.メーカー, 製品一覧.製品名, " & _ "製品一覧.カラー FROM(製品一覧)" & _ " WHERE ((製品一覧.メーカー)='" & Me.ComboBox1.Text & "');"; c1Report1.DataSource.RecordSource = sqlstr; c1PrintPreviewControl1.Document = c1Report1.Document; c1PrintPreviewControl1.Invalidate(); }
まとめ
コードからSQL文を組み込むだけで、いろいろなクエリを使ってデータを抽出し、レポート化することができます。
特に、パラメータクエリはプログラム実行時にリアルタイムにデータの抽出ができますので、C1Reportコンポーネントと組み合わせれば自在なレポート作成が可能になります。
もちろん、レポートの内容もコードから細かく指定できるため、クエリの結果によってレポートの形式を切り替えることもできます。次回は、コードからレポート内の各部を操作する処理を作ってみたいと思います。