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つ配置しておきます。このコンポーネントは、ユーザーインターフェースは持ちませんので、フォームデザイナの下側に配置されます。
![GUIデザイン GUIデザイン](http://cz-cdn.shoeisha.jp/static/images/article/1728/1728_04.gif)
フォームの初期化処理の作成
コードの先頭で、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コンポーネントと組み合わせれば自在なレポート作成が可能になります。
もちろん、レポートの内容もコードから細かく指定できるため、クエリの結果によってレポートの形式を切り替えることもできます。次回は、コードからレポート内の各部を操作する処理を作ってみたいと思います。