SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ComponentZine(ComponentOne)

Accessのデータベースを帳票化する-パラメータクエリの使用

パラメータクエリでデータを取得し帳票を作成する

  • このエントリーをはてなブックマークに追加

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デザイン

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

 コードの先頭で、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;
}

組み込みダイアログを使ったパラメータクエリ

 最初に、C1Reportコンポーネントに組み込まれているパラメータクエリを使ったデータ抽出をレポート化する機能を作成します。

C1Reportコンポーネントでの一覧表の作成

 前回と同様の方法で、C1Reportコンポーネントで一覧表を作成します。詳しい操作方法は、前回の記事「Accessのデータベースを帳票化する」の「一覧表の作成」を参照してください。

パラメータクエリの作成

 C1Reportコンポーネントには、パラメータクエリを実行するための組み込みのダイアログが用意されています。

 そのため、パラメータクエリを使いたければそのSQL文を作成し、DataSourceオブジェクトのRecordSourceプロパティに設定するだけで使うことができます。

 SQL文は、通常のWHERE句とPARAMETERS句を組み合わせて作成します。ここでは、メーカー名から製本データを抽出するパラメータクエリを作成することにします。

 まず、通常のパラメータクエリ文をAccessなどで作成します。

SELECT 製品一覧.メーカー, 製品一覧.製品名, 製品一覧.カラー
  FROM 製品一覧
 WHERE (製品一覧.メーカー)=[?];

 このSELECT句の前に、次のようにPARAMETERS句を追加します。PARAMETERS句のあとには、パラメータとして入力するデータの型を表1の中から選んで指定します。C1Reportコンポーネントは、このデータ型を判断して最適なコントロールをダイアログに表示します。

 ここでは文字列を入力しますので、「Text」を指定しています。なお、PARAMETERS句の最後に;を入れるのを忘れないでください。

PARAMETERS Text ;
パラメータの型
値の型 説明
DateadDate
DateTimeadDate
Bit、Byte、Short、LongadInteger
CurrencyadCurrency
SingleadSingle
DoubleadDouble
Text、StringadBSTR
Boolean、Bool、YesNoadBoolean

 そして、WHERE句の式の[?]を、PARAMETERS句に書いた変数名に置き換えます。

WHERE (製品一覧.メーカー)=Text;

 完成したSQL文は次のようになります。

PARAMETERS Text ;
SELECT 製品一覧.メーカー, 製品一覧.製品名, 製品一覧.カラー
  FROM (製品一覧)
 WHERE (製品一覧.メーカー)=Text;

 この文字列を、変数に格納してRecordSourceプロパティに代入します。

 このとき、SQL文を文字列継続記号で区切るときは、SELECT句やFROM句などの区切りに空白が入るようにしてください。空白で区切られていないと、SQL文字列が正しく作成されずにクエリが失敗します。

 後は、C1PrintPreviewControlコンポーネントのDocumentプロパティに、C1ReportコンポーネントのDocumentプロパティの値を代入するだけです。

Visual Basic
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
C#
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プロパティの値を代入するだけです。

Visual Basic
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
C#
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コンポーネントと組み合わせれば自在なレポート作成が可能になります。

 もちろん、レポートの内容もコードから細かく指定できるため、クエリの結果によってレポートの形式を切り替えることもできます。次回は、コードからレポート内の各部を操作する処理を作ってみたいと思います。

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
ComponentZine(ComponentOne)連載記事一覧

もっと読む

この記事の著者

瀬戸 遥(セト ハルカ)

8ビットコンピュータの時代からBASICを使い、C言語を独習で学びWindows 3.1のフリーソフトを作成、NiftyServeのフォーラムなどで配布。Excel VBAとVisual Basic関連の解説書を中心に現在まで40冊以上の書籍を出版。近著に、「ExcelユーザーのためのAccess再...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1728 2008/06/24 15:08

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング