InfoPath と Forms Services を使ったデータベース連携


  1. SharePoint におけるさまざまな活用場面
  2. 例1 : InfoPath と Forms Services を使ったデータベース連携
  3. 例2 : Excel と Excel Services を使ったデータベース連携 
  4. こんにちは。 

    では、実際に、InfoPath を使って、企業のリレーショナルデータと連携する InfoPath の簡単な Web (ブラウザ互換) フォームを作成してみましょう。作成するシナリオは単純で、InfoPath の Web フォームで入力をおこなったら、データベースにその情報を反映するというものです。

    InfoPath の Web フォームを使ってデータ登録 (変更) をおこなうには、実は、コードや Web サービスを使った実装が必要になります。(今回は Web サービスを使用します。) ということは、「開発」が必要になります !

    通常、InfoPath の開発では、エンドユーザーのみでノンコーディングで作成できるというメリットがありますが、こうした処理 (単純な「参照」以外の処理) を含む業務を実装する場合には、開発者が更新部分のコンポーネントを構築して、これをエンドユーザー (現場の業務管理者) が InfoPath を使って組み合わせるといった処理が必要になります。さらに、こうしたコードや Web サービスを使った実装では、エンドユーザーが勝手にフォームを登録することもできません。管理者用のフォームとして SharePoint に登録する必要があるという点も憶えておきましょう。(管理者による設定作業も必要です)

    開発者の作業 

    1. まず、テーブルとストアドプロシージャを作成しておきましょう。
      今回は以下の簡単なテーブルを使用します。

      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

    2. 登録されたデータの ID を Web フォームに返すように、以下のストアドプロシージャを作成しておきます。

      create procedure InsertTestData
        @Name nvarchar(255),
        @Cost int,
        @Id int out
      as
        insert into TestTbl (Name, Cost) values (@Name, @Cost)
        set @Id = scope_identity()
      go

    3. このストアドプロシージャを 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;
              }
          }
      }

    ユーザー (または業務管理者) の作業

    1. InfoPath を使ってフォームを以下のようにデザインします。
      (下記の Id は、本来は内部で保持しておくものですが、今回は、デバッグ用に下記の通り表示させておきます。)



    2. InfoPath の [ツール] - [データ接続] メニューで、上記で開発者が作成した Web サービスに接続するためのデータ接続をウィザードに従って作成し、そのデータ接続の名前を「TestConnection」として保存します。(設定内容は以下で述べます)




      今回は、更新 (追加/変更) のために Web サービスに接続をおこなうのですが、戻り値として作成された Id を受信する必要がありますので、データ接続の種類として [データの受信] を選択してウィザードを進めます。
      以降のウィザードでは、下記の設定をおこないます。
    • データ接続の種類 : [データの受信]
    • データのソース :  [Web サービス]
    • Web サービスの場所 : (上記で作成した Web サービスの URL)
    • Web サービスの処理 : SetData (上記で作成した WebMethod のメソッド名です)
    • 「パラメータ」として id, name, cost が表示され値を InfoPath のデータと関連付けることが可能ですが、今回は、あとで値の設定をおこなうため、特に値の設定はしなくてOKです。
    • [フォームを開くときに自動的にデータを取得する] のチェックボックスはオフにします

  5. すると、InfoPath は、Web サービス (SOAP の wsdl) の定義を読み込んで、以下のセカンダリデータソースを自動生成します。



  6. 必要に応じ、[ツール] - [フォームオプション] の [ブラウザ] タブで、ブラウザフォームに表示される上部や下部のメニューを設定しておきます。(今回は、以下の通り設定しておきましょう)



  7. これで Web サービスへの接続の設定は完了しました。
    上図のフォームで作成した「データベースへ反映」ボタンのプロパティ画面を表示し、ボタンが押された際の [動作規則] として以下の [動作] を追加します。
    • フィールドの値を設定する : セカンダリデータソース (Webサービス) の引数である id, name, cost (上図参照) に、メインデータソースの Id, Name, Cost (上図参照) の値をそれぞれ設定します。(3 つ作成します)
    • データ接続を使用してクエリを送信する : 先ほど作成した「TestConnection」を実行します
    • フィールドの値を設定する : 今度は逆に、メインデータソースの Id に、セカンダリデータソースの結果(戻り値)である SetDataResult を設定します



  8. 今回は Web サービスに接続するフォームですので、InfoPath の [ツール] - [フォームオプション] メニューの [セキュリティと信頼] タブで [完全信頼] を選択します。

    あるいは、[ツール] - [データ接続] メニューで、上記で作成した「TestConnection」のデータ接続の情報を [変換] ボタンを押して SharePoint のデータ接続ライブラリに保存 (.udcx ファイル) し、このデータ接続情報を参照するようにします。(この方法だと、udcx に、認証の情報など、追加の情報も記述可能です)

  9. 冒頭でも記載しましたが、Web サービスを使用する場合やコードを使う場合は、InfoPath は 管理者用に 発行しておく必要があります。
    この手順については、以前、以下の Post で記載していますので参照してください。(ここでは手順は省略します)

    http://blogs.msdn.com/tsmatsuz/archive/2006/08/23/vsta-infopath-web-publish.aspx
  10. 管理者の作業

    1. SharePoint の全体管理で、[InfoPath Form Services の構成] をクリックし、SQL 認証、クロスドメイン設定を有効にしておきましょう。(クロスドメイン設定を有効にしないと、SharePoint のサイト以外に登録された上記の Web サービスなどに InfoPath から接続できません)
      さらに、上記の URL (リンク先) で記載しているように、ユーザーが管理者用に登録した InfoPath のフォームをサイトにアクティブ化します。
       

    以上で使える状態になりました。

    ユーザー (もしくは業務管理者) は、サイト上で、このフォームを設定 (コンテンツタイプとして設定) したフォームライブラリを作成して使用すると下図のようにフォームが表示され、[データベースへ反映] ボタンを押すと Id が SQL Server により自動採番されて表示されます。

    ここでは省略しましたが、他にも、フォームを表示する際に、この Id を元にデータベースから Name や Cost の内容を取得してフォームに設定すると、データベースの内容と完全に連携したフォームになるでしょう。

    上記の「ユーザー (または業務管理者) の作業」の 5 の処理は、VSTA と呼ばれるコードを使用して実装することもできます。コードレベルでないと実装が難しいロジックを埋めたい場合には、エンドユーザーによりこうした簡易コードを記述するといった実装も可能です。(この場合も、勿論、管理者発行が必要です)

     

Comments (1)

  1. SharePoint におけるさまざまな活用場面 InfoPath と Forms Services を使ったデータベース連携 Excel と Excel Services を使ったデータベース連携 こんにちは。

Skip to main content