 |
[Windowsシステム運用]
InfoPath-SQL Server連携で構築するC/Sシステム
―― ストアド・プロシージャをInfoPathから実行。IT Proでも自力構築できるC/Sシステム入門 ――
第5回(最終回) ストアド・プロシージャで引数を使う
1.ストアド・プロシージャへ引数を渡す方法
兵庫県立西宮香風高等学校システム管理課長
Microsoft MVP for InfoPath
松本 吉生
2007/08/08 |
|
本連載では、SQL Serverのストアド・プロシージャをOffice InfoPathから利用する方法について解説する。InfoPathは電子フォーム・ソリューションの開発で利用されるアプリケーションであるが、SQL Serverを呼び出してデータを処理することもできる。Visual BasicやC#などでコードを記述する必要もない。
前回は「商品管理」テーブルに対して、商品番号が1000から9999までのデータを一括して作成するストアド・プロシージャを作り、これをInfoPathのフォームから実行する方法を説明した。このストアド・プロシージャでは、作成する商品番号がストアド・プロシージャの中に記述されており、動的に設定することはできなかった。この方法では、商品番号を変えるためには、その都度ストアド・プロシージャを書き換えなければならない。これでは実際的ではないので、フォーム上のテキスト・ボックスに作成したい商品番号を入力し、ストアド・プロシージャのパラメータを変更することによって、必要に応じて商品番号の始めと終わりを設定できるようにしたい。
|
引数を使うストアド・プロシージャ
ストアド・プロシージャでこのような処理を行うとき、「引数」を使う方法がある。作成する商品番号の開始番号と終了番号をストアド・プロシージャの実行時に渡して動的に処理を行うのだ。そこで前回のストアド・プロシージャを改良し、引数で開始番号と終了番号を渡すようにしたものが次の「makeitemcodeplus」ストアド・プロシージャである。前回のストアド・プロシージャ「makeitemcode」も再掲するので対比してほしい。
※前回説明した、makeitemcodeストアド・プロシージャを作成するクエリ
CREATE PROCEDURE makeitemcode
AS
DECLARE @myitemcode INT
SET @myitemcode = 1000
WHILE @myitemcode < 10000
BEGIN
INSERT INTO 商品管理
VALUES (CAST(@myitemcode AS char(4)),'','','','','')
SET @myitemcode = @myitemcode + 1
END |
※引数を用いるように改良したmakeitemcodeplusストアド・プロシージャを作成するクエリ
CREATE PROCEDURE makeitemcodeplus
@startitemcode INT,@enditemcode INT
AS
DECLARE @myitemcode INT
SET @myitemcode = @startitemcode
WHILE @myitemcode < @enditemcode
BEGIN
INSERT INTO 商品管理
VALUES (CAST(@myitemcode AS char(4)),'','','','','')
SET @myitemcode = @myitemcode + 1
END |
改良したmakeitemcodeplusの2行目「@startitemcode INT,@enditemcode INT」が引数を規定しているところである。INT型の「@startitemcode」が開始番号で、同じくINT型の「@enditemcode」が終了番号である。このストアド・プロシージャを実行するときは、次のようなクエリを実行する。
makeitemcodeplus [開始番号], [終了番号] |
具体的には、
makeitemcodeplus 1000, 2000 |
とクエリを行えば、商品番号が1000から1999までのデータが作成されることになる。
だがこのストアド・プロシージャは、InfoPathのフォームから利用することはできない。なぜならInfoPathのデータ接続は、フォームのコントロールに入力された値を引数に使うことができないからである。
テーブルの値をパラメータとして読み込むストアド・プロシージャ
引数としてパラメータをストアド・プロシージャに渡すことがInfoPathのフォームからはできないのだが、フォームのコントロールに入力された値をいったん一時テーブルにストアし、ストアド・プロシージャが一時テーブルの値を読み取って一連の商品番号を作成する、という方法を取ることができる。なお、ここで「一時テーブル」というのは、SQL Serverの持つ一時テーブル機能を使うのではなく、単にテーブルを作成して一時的に利用することを指す。以下ではこの方法について説明する。
 |
一時テーブルを使ってパラメータをストアド・プロシージャに渡す |
InfoPathのフォームから引数としてパラメータをストアド・プロシージャに渡すことはできない。代わりに、フォームのコントロールに入力された値をいったん一時テーブルにストアし、ストアド・プロシージャが一時テーブルの値を読み取って、一連の商品番号を作成する。 |
|
 |
フォームのコントロールに入力されたパラメータを一時テーブルに送信する。 |
|
 |
ストアド・プロシージャを起動する。 |
|
 |
ストアド・プロシージャがパラメータの値を一時テーブルから読み込む。 |
|
 |
読み込んだパラメータの値からストアド・プロシージャが商品コードを作成する。 |
|
一時テーブルと一時テーブルを利用するストアド・プロシージャの作成
一時テーブルは開始番号と終了番号を記録するだけであるので次のようなテーブルとし、「商品番号作成」というテーブル名にしておく。
列名 |
データ型 |
開始番号 |
PrimaryKey,int |
終了番号 |
int |
 |
テーブル名「商品番号作成」 |
この一時テーブル「商品番号作成」から「開始番号」と「終了番号」をパラメータとして呼び出し、一連の商品番号を作成するストアド・プロシージャ「makeitemcodenew」は次のようになる。
CREATE PROCEDURE makeitemcodenew
AS
DECLARE @myitemcode INT
DECLARE @startitemcode INT
DECLARE @enditemcode INT
SELECT @startitemcode = 開始番号 FROM 商品番号作成
SELECT @enditemcode = 終了番号 FROM 商品番号作成
SET @myitemcode = @startitemcode
WHILE @myitemcode < @enditemcode
BEGIN
INSERT INTO 商品管理
VALUES (CAST(@myitemcode AS char(4)),'','','','','')
SET @myitemcode = @myitemcode + 1
END |
|
4行目の「@startitemcode」で開始番号を、5行目の「@enditemcode」で終了番号を意味する変数を定義している。6行目のSELECT文は、一時テーブルから開始番号を読み込んで「@startitemcode」変数に格納し、7行目のSELECT文は、一時テーブルから終了番号を読み込んで「@enditemcode」変数に格納している。
InfoPathフォームの作成
InfoPathのフォーム作成は、まず一時テーブルのデータ接続から作成する。InfoPathを起動し、左のペインから[フォームのデザイン]をクリックしてウィザードを開始する。データ接続の作成方法はこれまでに何度も行った方法と同じであるが、念のためウィザードを画面を追って説明すると次のようになる。
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
一時テーブル「商品番号作成」のデータ接続を作成する |
InfoPathのフォームの作成は、まず一時テーブルのデータ接続の作成から始める。 |
|
 |
[フォームのデザイン]をクリックする。 |
|
 |
[データ接続から新規作成]をクリックする。 |
|
 |
[データベース(Microsoft SQL ServerまたはMicrosoft Office Accessのみ)]をクリックする。 |
|
 |
[次へ]をクリックする。 |
|
 |
[データベースの選択]をクリックする。 |
|
 |
[新しいSQL Server接続]を選択する。 |
|
 |
[開く]をクリックする。 |
|
 |
サーバ名を入力する。 |
|
 |
[Windows認証を使用する]の選択を確認する。 |
|
 |
[次へ]をクリックする。 |
|
 |
データベースを選択する。 |
|
 |
テーブル「商品番号作成」を選択する。 |
|
 |
[次へ]をクリックする。 |
|
 |
分かりやすい説明を記述する。 |
|
 |
[完了]をクリックする。 |
|
 |
テーブル「商品番号作成」のフィールドを確認する。 |
|
 |
[次へ]をクリックする。 |
|
 |
データ接続の名前を「一時テーブル接続」に変更する。 |
|
 |
送信状態が有効であることを確認する。 |
|
ウィザードを完了すると、フォーム上にデフォルトでテキストやレイアウト枠、ボタン・コントロールができるので、これをすべて削除する。そしてデータソースの「dataFields」から「商品番号作成」繰り返しグループをフォーム上にドラッグし、「繰り返しテーブル」をクリックして繰り返しテーブルを作成する。
 |
 |
 |
繰り返しテーブルの作成 |
フォーム上のデフォルトのテキストやレイアウト枠、ボタン・コントロールを削除し、次に、データソースから繰り返しグループをドロップする。 |
|
 |
デフォルトで作成されたテキストやレイアウト枠、ボタン・コントロールをすべて削除する。 |
|
 |
[データソース]から「商品番号作成」繰り返しグループをフォームへドラッグする。 |
|
 |
ここでドロップする。 |
|
 |
[繰り返しテーブル]をクリックする。 |
|
できた繰り返しテーブルは、横幅を調節して適切な大きさに変更する。
 |
 |
 |
繰り返しテーブルの幅の調節 |
デフォルトで作成されたテキスト・ボックスの幅が広いので、適切な大きさに調節する。 |
|
 |
元のテーブル。 |
|
 |
レイアウトを変更したテーブル。 |
|
Windows Server Insider フォーラム 新着記事