Uncategorized

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

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

こんにちは。

では、実際に、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です。
      • [フォームを開くときに自動的にデータを取得する] のチェックボックスはオフにします

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

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

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

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

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

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

      https://tsmatz.wordpress.com/2006/08/23/vsta-infopath-web-publish-2103/

管理者の作業

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

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

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

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

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

 

Advertisements

Categories: Uncategorized

Tagged as:

3 replies »

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s