従業員のプロジェクト割り当てをストアド プロシージャで取得する(IBX 一般チュートリアル)
チュートリアル:InterBase Express を使用してデータベースにアクセスする への移動
このセクションでは、ストアド プロシージャを使用して従業員の担当プロジェクトを検索するフォームを作成します。このフォームの作成プロセスは、「給与変更を監査する」のセクションで用いた手順と非常に似たものになります。特に、今回も "DmCSDemo" TDataModule を使用するからです。ここでは、「給与変更を監査する」セクションで扱ったフォームとは異なり、データベース コンポーネントをいくつか追加します。
コンポーネントを追加すると、プロジェクト割り当てフォームは以下のようになります。
上部の TDBGrid には EMPLOYEE テーブルが表示されます。下部の TDBGrid には、選択した従業員の担当プロジェクトが表示されます。
目次
フォームの作成
まず、プロジェクトに VCL フォームをもう 1 つ追加します。[プロジェクト マネージャ]でプロジェクトを右クリックし、[新規追加|VCL フォーム]のメニュー項目をクリックします。
新しいフォームのプロパティを以下のように設定します。
- [Caption]を「Employee Project Assignments」に設定します。
- [Name]を「FrmQueryProc」に設定します。
- フォームの[Height]を 370 に、[Width]を 380 に、それぞれ変更します。
- [OldCreateOrder]を[True]に設定します。
フォームを保存します。
- Delphi の場合は、ファイルを Frmqrysp.pas という名前で保存します。
このフォームで TDataModule を利用するには、以下のようにします。
- Delphi の場合は、Frmqrysp.pas の
implementation
セクションの冒頭に以下の行を追加します。
uses DmCSDemo;
データベース コンポーネントの追加
- EMPLOYEE テーブルから情報を取得するために、TDataSource コンポーネントを追加します。[DataSet]を、ドロップダウン メニューを使って[DmEmployee.EmployeeTable]に設定します。このデータセットは "DmCSDemo" TDataModule から提供されることに注意してください。[Name]プロパティを「EmployeeSource」に変更します。
- SQL 文を使ってデータベース テーブルにアクセスするために、TIBQuery コンポーネントを追加します。
- [Name]プロパティを「EmployeeProjectsQuery」に変更します。
- [Database]を、ドロップダウン メニューを使って[DmEmployee.EmployeeDatabase]に設定します。
- 必要なら、[Transaction]プロパティを、ドロップダウン メニューを使って[DmEmployee.IBTransaction1]に設定します。
- [SQL]プロパティの参照([...])ボタンをクリックして、そのプロパティ値を設定します。参照ボタンをクリックすると、コマンド テキスト エディタ([CommandText の設定])ダイアログが表示されます。このダイアログの[SQL 文]ペインに以下の行を入力します。
Select * from Get_Emp_Proj( :EMP_NO )
この SQL コードではストアド プロシージャ Get_Emp_Proj
を呼び出します。その結果、指定された従業員番号に該当するプロジェクトをすべて格納したデータセットが返されます。
- TDataSource コンポーネントをもう 1 つ追加します。[Name]プロパティを「EmployeeProjectsSource」に変更します。[DataSet]プロパティを「EmployeeProjectsQuery」に設定します。この TDataSource は、TIBQuery と、次のセクションで追加する TDBGrid データ対応コントロールとのインターフェイスの役目を果たします。
ビジュアル コンポーネントの追加
- フォームの下部に TStatusBar コンポーネントを追加します。これは、現在選択されている従業員の担当プロジェクトに関する情報を表示するのに使用します。[SimplePanel]のチェック ボックスをオンにして[True]に設定します。
- [TPanel]コンポーネントを 3 つ追加し、次の図のように配置します。これらの TPanel は、ビジュアル コンポーネントを配置するためのフレームワークとなります。これらのサイズを変更して、フォームの領域が埋まるようにします(TStatusBar コンポーネントを除きます)。
- データベース レコードのナビゲーション用に、TDBNavigator インスタンスを "Panel1" に追加します。[DataSource]を、ドロップダウン メニューを使って[DmEmployee.EmployeeSource]に設定します。このデータ ソースは TDataModule から提供されます。[VisibleButtons]プロパティで、すべてのチェック ボックスをオンにします。TDBNavigator のツール ボタンのヒントが表示されるように、[ShowHint]プロパティを[True]に設定します。
- "Panel1"の左端に TBitBtn インスタンスを配置します。以下のプロパティを設定します。
- "Panel2" に TDBGrid インスタンスを配置します。そのサイズを変更して、TPanel いっぱいまで拡大します。[DataSource]を、ドロップダウン メニューを使って[EmployeeSource]に設定します。
- "Panel3" に別の TDBGrid インスタンスを配置します。そのサイズを変更して、TPanel いっぱいまで拡大します。[DataSource]を、ドロップダウン メニューを使って[EmployeeProjectsSource]に設定します。TIBQuery 内に設定された SQL クエリでは、指定された従業員番号に該当するプロジェクトをすべて格納したデータセットが取得されます。"EmployeeProjectsSource" TDataSource により、TIBQuery のデータセットが TDBGrid で使用できるようになります。
イベント ハンドラおよびその他のコードの追加
ルーチンを 1 つ追加しイベント ハンドラを 3 つ作成して、フォームを完成させます。TBitBtn にはクリック時に実行されるコマンドが既に関連付けられているため、このボタンのイベント ハンドラは必要ありません。
TStatusBar にメッセージを表示する WriteMsg ルーチンを追加します。
Delphi の場合
Frmqrysp.pas の type
セクションの private
部に、以下の手続きを追加します。
procedure WriteMsg( strWrite : String );
Ctrl+Shift+C
を押してクラス補完を使用すると、この関数のスタブを implementation
セクションに作成することができます。
新しい手続きのコードを以下のとおり追加します。
procedure TFrmQueryProc.WriteMsg(StrWrite: String);
begin
StatusBar1.SimpleText := StrWrite;
end;
次に、"EmployeeSource" TDataSource コンポーネントのイベント ハンドラを作成します。[デザイン]タブで "EmployeeSource" TDataSource を選択した後、[オブジェクト インスペクタ]で [OnDataChange]イベントをダブルクリックします。このイベント ハンドラでは、上部の TDBGrid で現在選択されている従業員を追跡し、TStatusBar と下部の TDBGrid を更新します。このイベント ハンドラのコードを以下のとおり追加します。
Delphi の場合
procedure TFrmQueryProc.EmployeeSourceDataChange(Sender: TObject;
Field: TField);
begin
{ Execute the ProjectsQuery, which uses a query procedure }
EmployeeProjectsQuery.Close;
EmployeeProjectsQuery.Params[0].AsInteger :=
DmEmployee.EmployeeTable.FieldByName('EMP_NO').AsInteger;
EmployeeProjectsQuery.Open;
WriteMsg('Employee ' + DmEmployee.EmployeeTable.FieldByName('EMP_NO').AsInteger +
' is assigned to ' + IntToStr(EmployeeProjectsQuery.RecordCount) +
' project(s).');
end;
最後に、フォーム自体のイベント ハンドラを 2 つ作成します。[デザイン]タブで、フォームを選択します。[オブジェクト インスペクタ]で[OnShow]イベントをダブルクリックして、そのイベントのスケルトン コードを作成します。以下のコードを追加します。
Delphi の場合
procedure TFrmQueryProc.FormShow(Sender: TObject);
begin
DmEmployee.EmployeeTable.Open;
{ Allow data flow from the EmployeeTable to the local EmployeeSource. This
will allow DataChange events to execute the query procedure }
EmployeeSource.Enabled := True;
{ Explicit query preparation is not required, but gives the best possible
performance }
with EmployeeProjectsQuery do if not Active then Prepare;
end;
フォームがまだ選択されている間に、[オブジェクト インスペクタ]で[OnHide]イベントをダブルクリックして、そのイベントのコード スタブを作成します。そのスタブを以下のように編集します。
Delphi の場合
procedure TFrmQueryProc.FormHide(Sender: TObject);
begin
{ Turn off the DataChange event for our form, since DmEmployee.EmployeeTable
is used elsewhere }
EmployeeSource.Enabled := False;
end;
これでフォームは完成です。
テーブル表示フォームの表示
「メイン フォームを作成する」のセクションで作成したメイン フォームを一部変更します。このフォームに、たった今作成した従業員の担当プロジェクト一覧フォームを表示するためのボタンを追加します。
Delphi の場合
Frmmain.pas の implementation
セクションの冒頭にある uses
句に以下の行を追加して、追加したばかりの FrmQrySP ユニットがメイン フォームで認識されるようにします。
uses
FrmQrySP, { The Query Stored Procedure demo }
FrmTrigg, { The Trigger Demo }
FrmViews; { The View Demo }
「メイン フォームを作成する」のセクションで追加した TButton と同様に、Frmmain フォームに別の TButton を追加します。TButton.Caption を「&Query Stored Procedure Demo」に設定します。TButton.Name を「BtnQrySP」に設定します。その次に、Frmmain フォームの[デザイン]タブで新しい TButton をダブルクリックして、そのボタンのイベント ハンドラを追加します。そのイベント ハンドラには以下のコードを使用します。
Delphi の場合
procedure TFrmLauncher.BtnQrySPClick(Sender: TObject);
begin
FrmQueryProc.ShowModal;
end;
アプリケーションの実行
アプリケーションをビルドして実行します。以下のようなメイン フォームが表示されます。
新しい TButton "Query Stored Procedure Demo" をクリックすると、以下の新しいフォームが表示されます。
上部の TDBGrid には、データベース内の EMPLOYEE テーブルが表示されます。TStatusBar には、現在選択されている従業員には担当プロジェクトがないことを示します。この従業員はどのプロジェクトにも割り当てられていないため、下部の TDBGrid にはフィールド名 PROJ_ID 以外のデータが表示されません。プロジェクトを担当している従業員を選択した場合は、以下のような表示になります。
下部の TDBGrid には、TIBQuery コンポーネントの SQL コマンドで返されたデータセット、つまり、指定された従業員番号に該当するプロジェクトをすべて格納したデータセットが表示されます。TStatusBar には、その従業員が担当しているプロジェクトの数が表示されます。
これで、このプロジェクトを終了します。RAD Studio に付属している CsDemos サンプルに倣って、プロジェクトを拡張してもよいでしょう。