InfoPath + SharePoint のフォームライブラリにおける自動採番

今回は最近流行り(?)の InfoPath についてです。

InfoPath を利用した簡単なフォームによる簡易ワークフローや情報収集システムは何かと利用され始めているようです。

最近のお問い合わせなども InfoPath の技術的な仕様についての問い合わせをよく受けます。

その中でも特に多いのが、自動採番です。

ユニークな番号の発番はよくあるニーズだと思うのですが、実際に実現するとなると以外と手間がかかるものです。

今回は InfoPath と SharePoint と Access DB を利用した簡単な自動採番の方法についてご紹介したいと思います。

機能的には以下のような感じです。

  • InfoPath から送信時に MDB にレコードを追加
  • 追加されたレコードの行数を取得して InfoPath のフィールドに返す。
  • 受けたフィールドの値を SharePoint のライブラリの列と連動。
  • 保存されたフォームを更新しても発番はされない。

言語は Jscript、通信は XMLHTTP、データ接続は ADO の Connectionと RecordSet、XML の操作には XML DOM を利用しています。

InfoPath のコーディングはいろいろな開発要素が入り混じるので、最初は取っ付きにくいと思われがちですが、

慣れると本当に面白いです。(賛否両論ですが。。。)技術屋魂が燃えます。コメントを見てみると動きが分かるかと思います。

XMLHTTP の通信の戻り値を利用したロジックは面白いと思いました。InfoPath ならではです。

手順:

1. 以下のようなAccess の MDB を用意します。

※列はID(オートナンバー型)と任意のテキスト型です。

2. MDB をどこかの共有に保存します。

3.任意のInfoPath のテンプレートでテキスト型のフィールドを利用します。

※ここではルートの”マイフィールド”ノードの下に”管理番号”というフィールドを作成しています。

XPATH では ”/my:マイフィールド/my:管理番号” になります。

4.[ツール]-[送信オプション]から”ユーザーによるこのフォームの送信を許可する”にチェックを入れます。

5. “コードを使用してユーザー設定操作を実行する” を選択し、”コードの編集” をクリックします。

6. 送信ボタンクリック時のイベント “function XDocument::OnSubmitRequest(eventObj)” が生成されますので、こちらに下記のコードを挿入します。

function XDocument::OnSubmitRequest(eventObj)

{

// 送信処理が成功した場合、次の値を返します:

// eventObj.ReturnStatus = true;

// ここにコードを書き込んでください。

var blnSubmitSuccess = false;

// ファイル名の変数を指定します。

  var stryear = "08-";

var strNo = XDocument.DOM.selectSingleNode("/my:マイフィールド/my:管理番号").text;

var strname = stryear + strNo;

// 下記のURL に送信する URL を記述します。

var strUrl = "https://ServerName/DocLib1/" + strname +".xml";

try

{

// ファイル転送のための XMLHTTP オブジェクトを作成します。

var objXmlHttp = new ActiveXObject("MSXML2.XMLHTTP.5.0");

// 送信先に同じファイル名が存在するかどうかをチェックします。

objXmlHttp.Open("HEAD", strUrl, false);

objXmlHttp.Send();

// 同じファイル名が存在しない(404 エラー)なら、ファイルを送信します。

// また、同時に自動採番のためのIDを作成し取得します。

if (objXmlHttp.Status == 404)

{

var conn = new ActiveXObject("ADODB.Connection");

var connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\\\ServerName\\DBName.mdb";

conn.open(connStr);

strSQL = "INSERT INTO 管理番号連番" + "(管理番号連番)" + "VALUES(1) ";

conn.BeginTrans();

try{

conn.Execute(strSQL);

conn.CommitTrans();

}

catch(e){

conn.RollbackTrans();

}

conn.Close();

conn = null;

var conn = new ActiveXObject("ADODB.Connection");

var rs = new ActiveXObject("ADODB.Recordset");

conn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\\\ServerName\\DBName.mdb");

rs.open("Select * From 管理番号連番",conn,1,3);

rs.MoveLast();

var lastID = rs("ID").value;

XDocument.UI.Alert("申請を受け付けました。受付番号は08-"+ lastID + " " + "です。");

XDocument.DOM.selectSingleNode("/my:マイフィールド/my:管理番号").text = lastID;

eventObj.ReturnStatus = true;

rs.Close();

conn.Close();

// フォームライブラリに送信します。

var strUrl = "https://ServerName/DocLib1/08-" + lastID +".xml";

objXmlHttp.Open("PUT", strUrl, false);

objXmlHttp.Send(XDocument.DOM.xml);

}

//もしも同じ名前が存在するなら、上書きします。

//具体的には存在しているファイルを一度削除して送信するファイルで上書きします。

else (objXmlHttp.Status == 200|| objXmlHttp.Status == 201)

{

objXmlHttp.Open("DELETE", strUrl, false)

objXmlHttp.Open("PUT", strUrl, false);

objXmlHttp.Send(XDocument.DOM.xml);

if (objXmlHttp.Status == 200 || objXmlHttp.Status == 201)

{

blnSubmitSuccess = true;

}

}

}

catch (ex)

{

XDocument.UI.Alert("申請に失敗しました。r.\n\n" + ex.number + " - " + ex.description);

}

if (blnSubmitSuccess)

{

eventObj.ReturnStatus = true;

}

else

{

eventObj.ReturnStatus = false;

}

}

           

8. フォームを保存して発行します。

9. 発行時に SharePoint のフォームライブラリの列として InfoPath の ”管理番号” フィールドを設定します。

10.フォームテンプレートを起動して “送信”ボタンをクリックします。

以下のように発番されフォームが保存されます。

また、フォームライブラリの列に番号が表示されます。

以上です。