SHOEISHA iD

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

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

ComponentZine(ComponentOne)

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

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

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

今回はパラメータクエリを実行し、特定のメーカーの商品データをAccessから取得して帳票にします。パラメータクエリは、C1Reportコンポーネントが持っているダイアログを使い、直接メーカー名を入力して実行する方法と、コンボボックスからメーカー名を選択して実行する方法の2つを使いました。

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

はじめに

 前回に引き続き、PowerTools True WinReports for .NETのC1Reportコンポーネントを使ってAccessのデータから帳票を作成するアプリケーションを作りました。今回はパラメータクエリを実行し、特定のメーカーの商品データを取得して帳票にします。

 パラメータクエリは、C1Reportコンポーネントが持っているダイアログを使い、直接メーカー名を入力して実行する方法と、コンボボックスからメーカー名を選択して実行する方法の2つを使いました。

 使用するデータベースは前回と同じく、2つのテーブルを持つ簡単なものです。作成したレポートも、前回と同様にC1PrintPreviewControlコンポーネントで表示します。

C1Reportコンポーネントが持っているダイアログを使い直接メーカー名を入力して実行する
C1Reportコンポーネントが持っているダイアログを使い直接メーカー名を入力して実行する
コンボボックスからメーカー名を選択して実行
コンボボックスからメーカー名を選択して実行

対象読者

 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]コレクションで次の項目を組み込みます。

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

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

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

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

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

この記事をシェア

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

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング