こんにちは。
では、実際に、InfoPath を使って、企業のリレーショナルデータと連携する InfoPath の簡単な Web (ブラウザ互換) フォームを作成してみましょう。作成するシナリオは単純で、InfoPath の Web フォームで入力をおこなったら、データベースにその情報を反映するというものです。
InfoPath の Web フォームを使ってデータ登録 (変更) をおこなうには、実は、コードや Web サービスを使った実装が必要になります。(今回は Web サービスを使用します。) ということは、「開発」が必要になります !
通常、InfoPath の開発では、エンドユーザーのみでノンコーディングで作成できるというメリットがありますが、こうした処理 (単純な「参照」以外の処理) を含む業務を実装する場合には、開発者が更新部分のコンポーネントを構築して、これをエンドユーザー (現場の業務管理者) が InfoPath を使って組み合わせるといった処理が必要になります。さらに、こうしたコードや Web サービスを使った実装では、エンドユーザーが勝手にフォームを登録することもできません。管理者用のフォームとして SharePoint に登録する必要があるという点も憶えておきましょう。(管理者による設定作業も必要です)
開発者の作業
まず、テーブルとストアドプロシージャを作成しておきましょう。
今回は以下の簡単なテーブルを使用します。create table TestTbl ( Id int identity(1,1) not null, Name nvarchar(255), Cost int, constraint PK_TestTbl_Id primary key clustered (Id asc))go
登録されたデータの ID を Web フォームに返すように、以下のストアドプロシージャを作成しておきます。
create procedure InsertTestData @Name nvarchar(255), @Cost int, @Id int outas insert into TestTbl (Name, Cost) values (@Name, @Cost) set @Id = scope_identity()go
このストアドプロシージャを InfoPath から直接呼び出す方法もあるかもしれませんか、今回は、このストアドプロシージャを使って、以下の Web サービスを作成し、この Web サービスを公開しておきます。
この Web サービスでは、「追加の処理」の場合には上記のストアドプロシージャを使ってデータを追加し (さらに、作成されたデータの ID を取得して返す)、「変更の処理」の場合には ID をキーとしてデータの変更をおこないます。public class TestDataService : System.Web.Services.WebService{[WebMethod]public int SetData(int id, string name, int cost){int res;using (SqlConnection con = new SqlConnection(@"data source=.sqlexpress;initial catalog=TestDB;user id=Demo;password=P@ssw0rd")){con.Open();if (id > 0){SqlCommand cmd = new SqlCommand(@"update TestTbl set Name = @Name, Cost = @Cost where Id = @Id", con);cmd.Parameters.Add("@Id", SqlDbType.Int).Value = id;cmd.Parameters.Add("@Name", SqlDbType.NVarChar, 255).Value = name;cmd.Parameters.Add("@Cost", SqlDbType.Int).Value = cost;cmd.ExecuteNonQuery();res = id;}else{SqlCommand cmd = new SqlCommand(@"InsertTestData", con);cmd.CommandType = CommandType.StoredProcedure;cmd.Parameters.Add("@Name", SqlDbType.NVarChar, 255).Value = name;cmd.Parameters.Add("@Cost", SqlDbType.Int).Value = cost;SqlParameter retParam = cmd.Parameters.Add("@Id", SqlDbType.Int);retParam.Direction = ParameterDirection.Output;using (SqlDataReader reader = cmd.ExecuteReader()){res = (int) retParam.Value;reader.Close();}}con.Close();return res;}}}
ユーザー (または業務管理者) の作業
- InfoPath を使ってフォームを以下のようにデザインします。
(下記の Id は、本来は内部で保持しておくものですが、今回は、デバッグ用に下記の通り表示させておきます。) InfoPath の [ツール] – [データ接続] メニューで、上記で開発者が作成した Web サービスに接続するためのデータ接続をウィザードに従って作成し、そのデータ接続の名前を「TestConnection」として保存します。(設定内容は以下で述べます)
今回は、更新 (追加/変更) のために Web サービスに接続をおこなうのですが、戻り値として作成された Id を受信する必要がありますので、データ接続の種類として [データの受信] を選択してウィザードを進めます。
以降のウィザードでは、下記の設定をおこないます。
- データ接続の種類 : [データの受信]
- データのソース : [Web サービス]
- Web サービスの場所 : (上記で作成した Web サービスの URL)
- Web サービスの処理 : SetData (上記で作成した WebMethod のメソッド名です)
- 「パラメータ」として id, name, cost が表示され値を InfoPath のデータと関連付けることが可能ですが、今回は、あとで値の設定をおこなうため、特に値の設定はしなくてOKです。
[フォームを開くときに自動的にデータを取得する] のチェックボックスはオフにします
すると、InfoPath は、Web サービス (SOAP の wsdl) の定義を読み込んで、以下のセカンダリデータソースを自動生成します。
必要に応じ、[ツール] – [フォームオプション] の [ブラウザ] タブで、ブラウザフォームに表示される上部や下部のメニューを設定しておきます。(今回は、以下の通り設定しておきましょう)
- これで Web サービスへの接続の設定は完了しました。
上図のフォームで作成した「データベースへ反映」ボタンのプロパティ画面を表示し、ボタンが押された際の [動作規則] として以下の [動作] を追加します。- フィールドの値を設定する : セカンダリデータソース (Webサービス) の引数である id, name, cost (上図参照) に、メインデータソースの Id, Name, Cost (上図参照) の値をそれぞれ設定します。(3 つ作成します)
- データ接続を使用してクエリを送信する : 先ほど作成した「TestConnection」を実行します
フィールドの値を設定する : 今度は逆に、メインデータソースの Id に、セカンダリデータソースの結果(戻り値)である SetDataResult を設定します
今回は Web サービスに接続するフォームですので、InfoPath の [ツール] – [フォームオプション] メニューの [セキュリティと信頼] タブで [完全信頼] を選択します。
あるいは、[ツール] – [データ接続] メニューで、上記で作成した「TestConnection」のデータ接続の情報を [変換] ボタンを押して SharePoint のデータ接続ライブラリに保存 (.udcx ファイル) し、このデータ接続情報を参照するようにします。(この方法だと、udcx に、認証の情報など、追加の情報も記述可能です)
- 冒頭でも記載しましたが、Web サービスを使用する場合やコードを使う場合は、InfoPath は 管理者用に 発行しておく必要があります。
この手順については、以前、以下の Post で記載していますので参照してください。(ここでは手順は省略します)/2006/08/23/vsta-infopath-web-publish-2103/
管理者の作業
- SharePoint の全体管理で、[InfoPath Form Services の構成] をクリックし、SQL 認証、クロスドメイン設定を有効にしておきましょう。(クロスドメイン設定を有効にしないと、SharePoint のサイト以外に登録された上記の Web サービスなどに InfoPath から接続できません)
さらに、上記の URL (リンク先) で記載しているように、ユーザーが管理者用に登録した InfoPath のフォームをサイトにアクティブ化します。
以上で使える状態になりました。
ユーザー (もしくは業務管理者) は、サイト上で、このフォームを設定 (コンテンツタイプとして設定) したフォームライブラリを作成して使用すると下図のようにフォームが表示され、[データベースへ反映] ボタンを押すと Id が SQL Server により自動採番されて表示されます。
ここでは省略しましたが、他にも、フォームを表示する際に、この Id を元にデータベースから Name や Cost の内容を取得してフォームに設定すると、データベースの内容と完全に連携したフォームになるでしょう。
上記の「ユーザー (または業務管理者) の作業」の 5 の処理は、VSTA と呼ばれるコードを使用して実装することもできます。コードレベルでないと実装が難しいロジックを埋めたい場合には、エンドユーザーによりこうした簡易コードを記述するといった実装も可能です。(この場合も、勿論、管理者発行が必要です)
Categories: Uncategorized
SharePoint におけるさまざまな活用場面 InfoPath と Forms Services を使ったデータベース連携 Excel と Excel Services を使ったデータベース連携 こんにちは。
LikeLike