[Windowsシステム運用]
InfoPath−SQL Server連携で構築するC/Sシステム

第3回 データ接続におけるSQL文を編集する

2.InfoPathのデータ接続にサブクエリを記述する

兵庫県立西宮香風高等学校システム管理課長
Microsoft MVP for InfoPath
松本 吉生
2007/05/24

 先の例で、InfoPathのデータ接続には一般的なSQL文を書けることが確かめられたが、単にWHERE句で選択するだけでは実際的でないので、サブクエリを利用したデータ接続を作ってみよう。利用するテーブルとして、先に作った「商品管理」テーブルにフィールド「登録ユーザID」を加えて、そのデータを登録したActive Directoryのユーザー名を記録することとし、それとは別に「ユーザ」テーブルを作って、この2つのテーブルからサブクエリを作成することにしよう。

列名 データ型
商品コード PK,varchar(10)
商品名 varchar(50)
作者 varchar(50)
発行所 varchar(50)
分類 varchar(20)
登録ユーザID varchar(50)
テーブル名「商品管理」
赤字のフィールド「登録ユーザID」を追加した。このフィールドには、次の「ユーザ」テーブルに記録した「ユーザID」のどれかを記録しておく。

列名 データ型
ユーザ名 PK,varchar(10)
ユーザID varchar(50)
所属 varchar(50)
テーブル名「ユーザ」

 「商品管理」の「登録ユーザID」には、商品管理データを登録するときに、SQL Serverからアクティブディレクトリのユーザー名を取得してストアすることとし、「ユーザ」テーブルには、ユーザーに関する次のデータが入っていることとする。

ユーザ名 ユーザID 所属
松本吉生 IBM-X40\yoshio 関西営業部
山本次郎 IBM-X40\jirom 本店営業部
近藤三郎 IBM-X40\saburom 本店営業部
井上太郎 IBM-X40\taro 東京統括本部
「ユーザ」テーブルの内容例

 ここでテーブル「商品管理」から、ユーザー「松本吉生」が登録した「商品名」のデータだけを抽出するデータ接続を作成したいとき、テーブルに記録された「ユーザID」はActive Directoryのユーザー名であるので、「登録ユーザID」が「IBM-X40\yoshio」である条件を付けて、次のようなSQL文で抽出することができる。

select "商品コード" , "商品名" from "dbo"."商品管理" where "登録ユーザID" = 'IBM-X40\yoshio'

 このとき、「ユーザ」テーブルを使ったサブクエリによって、「松本吉生」というユーザー名で抽出するためには、次のようなSQL文を書けばよい。なお、クエリの結果が確認できるように、「登録ユーザID」のフィールドも取得するようにしている。

select "商品コード" , "商品名" , "登録ユーザID" from "dbo"."商品管理" where "登録ユーザID" = ( select "ユーザID" from  "dbo"."ユーザ" where "ユーザ名" = '松本吉生' )

SQL編集の画面
  サブクエリによって、「ユーザ」テーブルからActive Directoryのユーザー名を取得して「商品名」テーブルに抽出条件を設定するSQL文をデータ接続に書いた。

 このデータ接続を保存し、InfoPathのフォームでクエリを実行すると、次のようにActive Directoryのユーザ名「松本吉生」が「登録ユーザID」となっているデータだけを抽出できている。

サブクエリによるInfoPathのデータ取得結果
  サブクエリのSQL文によって、「登録ユーザ名」から「登録ユーザID」を取得し、抽出条件としてクエリを正しく実行できた。

 ではInfoPathのデータ接続で、このサブクエリを次のように変更してみよう。サブクエリが複数の値を返すときは、条件の記述に「WHERE 〜 IN」句を使う。

select "商品コード" , "商品名" , "登録ユーザID" from "dbo"."商品管理" where "登録ユーザID" in (select "ユーザID" from  "dbo"."ユーザ" where "所属" = '本店営業部' )

サブクエリの書き換え
SQLの編集でサブクエリを書き換える。
  サブクエリの抽出条件に「WHERE 〜 IN」句を使い、複数の値を抽出条件として実行できるようにする。

実行結果
WHERE 〜 IN句を使ったサブクエリによるInfoPathのデータ取得結果。
  「ユーザ」テーブルから「所属」が「本店営業部」であるデータをサブクエリによって抽出した。「本店営業部」には2名のユーザーがおり、そのデータが抽出されている。

 このようなSQL文をデータ接続に用意しておけば、「ユーザ」テーブルの「所属」データを変更することで、柔軟なデータ取得のフォームを作ることができる。


 INDEX
  [Windowsシステム運用]InfoPath−SQL Server連携で構築するC/Sシステム
  第3回 データ接続におけるSQL文を編集する
    1.InfoPathのデータ接続にSELECT文を記述する
  2.InfoPathのデータ接続にサブクエリを記述する
    3.InfoPathのデータ接続にDELETE文を記述する
 
 運用


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間