SharePoint ワークフローで状況依存なフォーム (workflow form) を表示する


環境:
Office SharePoint Server (MOSS) 2007
Visual Studio 2005
Office SharePoint 2007 SDK (ECM Starter Kit)
InfoPath 2007

こんにちは。

今日は、SharePoint ワークフロー (Workflow) で、ステータスやカスタムな属性(ユーザ属性)に応じて異なるフォームを表示する方法について説明します。

InfoPath のフォームを使用したワークフローの作成方法をご存知ない方については、まずは こちらのチュートリアル を参照して理解してください。以下、これを前提として記述していきます。

上記のチュートリアルでもご紹介しているように、タスクにカスタムな UI (フォーム) を割り当てるには、TaskType プロパティに固有の識別子 (Integer の値) を設定して、workflow.xml に InfoPath タスクフォーム用の決められたコンテンツタイプ (TaskListContentTypeId) の指定と、前述の識別子と対応させる形で <Task[識別子]_FormURN> というエントリを設定してここに作成したフォームの ID を指定することで、対応するタスクの InfoPath フォームを割り当てられます。(aspx でタスクフォームを作成する場合は、他のワークフローフォームと異なり、専用のコンテンツタイプを割り当てて workflow.xml に該当のコンテンツタイプを設定します。尚、余談ですが、厳密には、InfoPath の場合も、InfoPath の Web パーツが張り付いた aspx ページとして提供されます。ですので、InfoPath を使ってフォーム上のデータをワークフロー側に渡す場合には、上記のチュートリアルでご紹介しているように submit 時にホストしている ASP.NET に内容を反映させるように実装すると、あとは aspx ページがよろしくやってくれます。)

このように、Task Edit Form など、ワークフローフォームは基本は 1 種類のフォームのみしか割り当てられません (タスクが異なれば別のフォームを指定できますが、別のタスクを割り当てることになってしまいます)。しかし、現実のアプリケーションでは、ログインユーザの種類やワークフローの進行状況など、さまざまな状態/状況に応じて違ったフォームを表示したくなることでしょう。

そこで今日は、その実現方法について記載をおこないます。

まず、aspx のタスクフォームの場合には、作成した各 aspx に別々のコンテンツタイプを割り当て、SharePoint 標準アクティビティの CreateTaskWithContentType アクティビティを使って実装することで、状況に依存してタスクフォームのビューを選択できます。
しかし、InfoPath では、実行中 (OnTaskChanged のループ中) なども含めたもっと動的な状況依存なフォームを実現できます。

InfoPath のフォームの場合には、以下の手順になります。
手順をみていただくとわかりますが、厳密には「異なるフォーム」を表示しているのではなく「異なるビュー」を表示します。

まず、 上記のチュートリアルで記載している ItemMetadata.xml のフィールドとして、ビューの切り替えの基準となるデータを渡せるように入れ物を作成しておきます。例えば、viewflag という値を判断基準としてビューを切り替える場合、ItemMetadata.xml は以下のようになるでしょう。

<z:row xmlns:z="#RowsetSchema"
  ows_field1=""
  ows_field2=""
  ...

  ows_viewflag="" />

では、複数のビューを作成します。
InfoPath のタスクフォーム (Task Edit Form) をデザインする際に、InfoPath の右のデザインタスクのペインから [ビュー] を選択し、新しいビューを追加してください。この2つのビューを使用して、状況に応じた切り替えをおこないます。

つぎに、ロード時の動作規則 (rule) を使って、条件に応じたビューの切り替えの設定をおこないます。
InfoPath の [ツール] - [フォームオプション] を選択し、表示される画面で [開く/保存] カテゴリを選択して、[動作規則] ボタンを押します。表示される画面で動作規則を追加し、[条件の設定] ボタンで条件 (condition) として、左のドロップダウンから [フィールドまたはグループの選択 ...] を選択して、セカンダリデータソース (上記の ItemMetadata.xml) からビューの切り替えの基準となるフィールド (上記の例では ows_viewflag) を選択します。つぎに、動作 (action) として [ビューを切り替える] を選択し、切り替えたいビューを選択します。この条件以外の場合には、「規定」に設定されているビューが表示されます。

尚、OnTaksChanged で task properties を変更してフォームに渡すことはできません。よって条件の元となる値は CreateTask アクティビティで (タスクプロパティに) あらかじめ設定するか、フォームの中でボタンを押した際の動作規則 (rule) で値を変更するなどしてハンドリングします。また、マルチビューの場合、ビューで表示されている内容だけが (ASP.NET ページを経由して) ワークフロー側に渡されますので、この辺りの属性のハンドリングは入念に設計しておきましょう。(表示していないビューの値はハンドリングできません。)

以上でビュー切り替えのための設定は完了です。その他の設定方法については通常のワークフロー作成と同様です。(無論、ワークフロー側には、上記の viewflag フィールドなどを渡せるように、SPWorkflowTaskProperties の ExtendedProperties に値を設定するコードなども書いておきましょう。)

尚、同じ手法はワークフローフォームだけでなく、SharePoint にドキュメントライブラリのテンプレートとして発行した InfoPath フォームについても添付されているワークフローのステータスに応じてビューを切り替えるなどといった形で使用できます。この場合も概念は同じで、関連付けされている SharePoint のドキュメントライブラリの項目をフォーム上でセカンダリのデータソースして参照し、上記同様の方法でこのデータソースから値を取得して利用するというものです。(下記参考情報の InfoPath Team Blog では、この実装例を示してくれています。)

上記は一例をあげたまでですが、要は、こうした方法を使うことで、上述のようなビューの切り替えだけでなく、InfoPath など クライアント(Office)上のさまざまな動作と SharePoint 上のデータを連携させることができる という概念を頭の隅におぼえておいてください(きっと本番時にはこの概念をいろいろ応用できるはずです)。こうした連携の概念は、SharePoint のデータとの関連付けの手順こそ違ってはいますが、InfoPath 以外に、Visio など他の Office 製品でも可能です。

開催予定の TechED では、こうした実務上必要になる方法をご紹介していきます。(今後、トレーニングなどにおいてもこうした実務上のテクニックを中心に整理してご紹介していきますので、Office を使ったビジネス展開をご検討されている方は、MSDN Flash 等のアナウンスなどを是非チェックしておいてください。)

参考情報:

Microsoft SharePoint Product and Technologies Team Blog :
http://blogs.msdn.com/sharepoint/archive/2006/11/26/developing-workflows-in-vs-part-4-design-and-bind-your-forms.aspx

InfoPath Team Blog :
http://blogs.msdn.com/infopath/archive/2006/11/22/workflow-user-experience-in-infopath.aspx

 

Comments (1)

  1. 赤字 -&gt; 2007/08/01 追記 環境: Office SharePoint Server (MOSS) 2007 Visual Studio 2005 Office SharePoint

Skip to main content