分岐ワークフローを作成する
適用対象: Office 2010 | Project 2010 | Project Server 2010 | SharePoint Server 2010
Microsoft Project Server 2010 では、ガバナンス ワークフローを使用してプロジェクト提案とポートフォリオ分析を管理しています。この記事の例は、需要管理の作成フェーズの 3 つのステージと、4 番目となる管理フェーズのステージが統合された基本的なガバナンス ワークフローです。BranchingWorkflow サンプルでは、Project Server 2010 と共にインストールされる既定のステージを使用します (この記事は、Microsoft Corporation の Sam Chung によるコンテンツを出典としています)。
注意
この記事は、Microsoft Visual Studio 2010 の使用に基づいています。Project Server 2010 のワークフローの開発を始める前に、「[方法] Project Server ワークフロー用に Visual Studio 2010 を構成する」を参照してください。
この記事は、以下のセクションで構成されています。
複数のステージに分岐するワークフローの作成
マルチステージ ワークフローの計画
Project Server ワークフローの作成
Project Server ワークフロー アクティビティの追加
ワークフロー アクティビティのステージへのバインド
ステージ状態の更新
比較アクティビティの作成
If – Else 分岐の作成
IfTrue 分岐の [提案の詳細] ステージへのバインド
IfFalse 分岐の [自動的に却下] ステージへのバインド
最終実行ステージへのバインド
完全なコード例
重要
プレリリース版の Project Server 2010 で開発したワークフローは、変更してワークフロー コンテキストとワークフロー プロパティを破棄し (手順 1b. を参照)、リリース バージョンで再コンパイルおよび再展開する必要があります。
運用環境の Project Server コンピューターにワークフローを展開するか、コードを変更した場合にワークフローを更新するには、SharePoint ソリューション パッケージの作成方法とワークフローの更新方法について記載されている「[方法] Project Server ワークフローを展開する」を参照してください。
Visual Studio 2010 を使用していて、Project Server のテスト インストールにワークフローをインストールする場合は、「[方法] Project Server ワークフローをインストールおよびテストする」を参照してください。
Project Server 2010 におけるワークフローの概念の概要については、「ワークフローおよび需要管理」を参照してください。
複数のステージに分岐するワークフローの作成
需要管理における Project Server ワークフローは、シーケンシャル ワークフローです。ステート マシン ワークフローでは、状態を保存したり前の状態に戻ることができますが、需要管理のプロセスおよび関連するプロジェクト詳細ページでは、シーケンシャル ワークフローが必要です。
マルチステージの分岐ワークフロー開発プロジェクトを作成する一般的な手順は、次のとおりです。
ワークフロー プロジェクトを計画し、ワークフロー アクティビティを使用してロジックのシーケンシャル ワークフローを設計します。
ヒント
Visual Studio で SharePoint ワークフロー デザイナーを使用してアクティビティを作成する前に、Microsoft Visio 2010 を使用すると、ワークフロー アクティビティとロジックを図で表すことができます。
Visual Studio で、SharePoint 2010 ワークフロー プロジェクトを作成し、Project Server ワークフロー フレームワークを追加します。
Project Server アクティビティと SharePoint アクティビティを使用してワークフローを開発します。アクティビティを需要管理プロセス内のステージにリンクします。
ワークフローをコンパイルし、展開します。詳細については、「[方法] Project Server ワークフローをインストールおよびテストする」を参照してください。
マルチステージ ワークフローの計画
Project Server ワークフローは、需要管理プロセスの複数のステージおよびフェーズと統合できます。ワークフローとステージは複雑になる可能性があるので、開発プロジェクトを開始する前に、ビジネス要件について十分に理解し、ワークフローを慎重に計画する必要があります。
Project Server 2010 と共にインストールされているワークフロー フェーズを表示するには、Project Web App を起動し、サイド リンク バーの [サーバー設定] をクリックし、[ワークフローおよびプロジェクト詳細ページ] セクションの [ワークフロー フェーズ] をクリックします。既定のワークフロー フェーズは、[作成]、[選択]、[計画]、[管理]、および [終了] です。各フェーズおよび関連するユーザー設定フィールド内のワークフロー ステージを表示するには、[サーバー設定] ページの [ワークフロー ステージ] をクリックします。たとえば、[作成] フェーズには、[初期段階の提案の詳細]、[提案の詳細]、[自動的に却下] などのステージが含まれています。[管理] フェーズには、[実行] ステージが含まれています。
図 1. Project Web App のフェーズおよびステージ
図 2 は、この記事で使用する単純な分岐ワークフローの例の基本設計を、Visio のワークフロー図テンプレートを使用して示しています。ワークフローは、[初期段階の提案の詳細] ステージで開始します。ワークフロー アクティビティでは、[初期段階の提案の詳細] ステージで設定されたユーザー設定フィールドから、提案プロジェクトのコストを取得します。この例では、コストが $25,000 USD を越える場合は、ワークフローが [自動的に却下] ステージに移動します。越えない場合は、[提案の詳細] ステージに進み、関連するプロジェクトの詳細ページ (PDP) の終了を待機し、ユーザーがプロジェクトの管理を開始できる [実行] ステージに移動します。
図 2. Visio のワークフロー図テンプレートを使用したワークフローの設計
Project Server ワークフローの作成
Project Server のシーケンシャル ワークフローのフレームワークには、他のすべてのワークフロー アクティビティから成る ProjectSequence アクティビティが含まれています。各アクティビティには、同じ WorkflowContext プロパティを設定する必要があります。
手順 1. ワークフロー プロジェクトを作成するには
管理者として Visual Studio を実行します。SharePoint 2010 シーケンシャル ワークフロー テンプレートを使用するプロジェクトを作成します。プロジェクトを作成するには、「[方法] Project Server ワークフロー用に Visual Studio 2010 を構成する」を参照してください。たとえば、[新しいプロジェクト] ダイアログ ボックスで、プロジェクト名として「BranchingWorkflow」と入力します。対象のフレームワークは Microsoft .NET Framework 3.5 である必要があります。
SharePoint カスタマイズ ウィザードの [デバッグするワークフロー名の指定] ページで、ワークフロー名として「BranchingWorkflow – BranchingWorkflow」と入力します。
[サイト ワークフロー] をクリックし、ウィザードの [次へ] をクリックします。残りの既定の設定値をそのまま使用して、ウィザードを終了します。
注意
新しいシーケンシャル ワークフロー プロジェクトを作成する場合は、SharePoint カスタマイズ ウィザードの [サイト ワークフロー] を必ずクリックしてください。
既定のワークフロー ファイルの名前は Workflow1.cs です。デザイン ビューとコード ビューを両方とも開きます。Workflow1 クラスは SequentialWorkflowActivity から派生しており、ワークフローのデザイン ビュー ウィンドウの名前は [シーケンシャル ワークフロー] です。デザイン ビューには、onWorkflowActivated1 アクティビティが含まれています。
注意
次のステップ a. ~ c. はオプションです。Project Web App 内のワークフローの名前は、Visual Studio のプロジェクト名から取得されます。この記事の中の手順と図では、ワークフロー クラス名が BranchingWorkflow として示されています。クラス名を Workflow1 のままにする場合は、ステップ 4. に進みます。
既定の Workflow1 クラスの名前を変更しても、Workflow1.Designer.cs ファイル内のすべての関連文字列が正しく名前変更されるわけではありません。ワークフロー クラスの名前を変更する場合は、ステップ a. ~ c. を実行します。
ソリューション エクスプローラーで、[Workflow1] ノードを右クリックし、[名前の変更] をクリックします。新しい名前を入力します。たとえば、「BranchingWorkflow」と入力します。[BranchingWorkflow] ノードを展開し、Workflow1.cs ファイルの名前も変更します。
[BranchingWorkflow.cs] ノードを展開し、BranchingWorkflow.Designer.cs ファイルを開きます。
[検索と置換] ダイアログ ボックスを開き (Ctrl + H)、古い名前 Workflow1 を新しい名前 BranchingWorkflow に置き換えます。ソリューション全体で Workflow1 のインスタンスを検索し、置換します。
BranchingWorkflow.cs のデザイン ビューを開き、[onWorkflowActivated1] アクティビティをクリックして、[プロパティ] ウィンドウを開きます。次に、[CorrelationToken] ノードと [WorkflowProperties] ノードを展開します (図 3)。
図 3. onWorkflowActivated1 の CorrelationToken プロパティおよび WorkflowProperties プロパティの表示
BranchingWorkflow クラスの名前を変更した場合、CorrelationToken と WorkflowProperties のプロパティ値は図 3 のようになります。どちらかのプロパティにエラーがある場合、デザイン ビュー内の onWorkflowActivated1 アイテムには、赤い通知アイコンが含まれます (図 3 の中で onWorkflowActivated1 の下にある赤いアイコンは通知ではなく、ワークフローの終了を示しています)。
重要
ワークフローには、次に、ProjectSequence アクティビティを追加する必要があります。これにより、Project Server 内の現在のプロジェクト提案に対してアクティブ化されているワークフローが初期化されます。Project Server ワークフローに追加するすべてのアクティビティは、ProjectSequence アクティビティ内に配置する必要があります。
Project Server 2010 の ProjectSequence アクティビティには InitiationData プロパティがあります。このプロパティは、onWorkflowActivated1 オブジェクトの WorkflowProperties.InitiationData プロパティに設定する必要があります。
ツールボックスで、[Project Server - ワークフロー] タブを展開します (タブがない場合は、「[方法] Project Server ワークフロー用に Visual Studio 2010 を構成する」で説明されているワークフロー プロジェクトでツールボックス タブを作成する方法を参照してください)。ツールボックスの [ProjectSequence] アクティビティをクリックし、それをワークフロー図の onWorkflowActivated1 アクティビティのすぐ下へドラッグします。
InitiationData プロパティを次のように設定します。
[projectSequence1] アクティビティをクリックします。
[プロパティ] ウィンドウで、InitiationData プロパティの [...] をクリックします。
[アクティビティのプロパティへの 'InitiationData' のバインド] ダイアログ ボックスの [既存のメンバーへのバインド] タブで、[onWorkflowActivated1] ノードを展開し、[WorkflowProperties] ノードを展開します。
[InitiationData] をクリックし、[OK] をクリックします。
projectSequence1 アクティビティの InitiationData プロパティに、"Activity=onWorkflowActivated1, Path=WorkflowProperties.InitiationData" という値が設定されていることを確認します。
ツールボックスの [Project Server - ワークフロー] タブで、[SetProjectStage] アクティビティをクリックし、それを projectSequence1 アクティビティの内側へドラッグします。赤いアイコンが表示され、SetProjectStage アクティビティに関して問題があることが示されます。SetProjectStage は必須のプロパティがいくつか不足しています。
projectSequence1 に追加するすべてのプロジェクト アクティビティに対して、WorkflowContext プロパティを設定する必要があります。
[シーケンシャル ワークフロー] デザイン ビューで、[setProjectStage1] を右クリックし、[プロパティ] をクリックします。
WorkflowContext プロパティについて、[…] をクリックし、[アクティビティのプロパティへの ‘Workflowcontext’ のバインド] ダイアログ ボックスを表示します。
[既存のメンバーへのバインド] タブで、[projectSequence1] アクティビティを展開します (図 4)。
[WorkflowContext] プロパティをクリックし、[OK] をクリックします。
図 4. WorkflowContext プロパティの設定
StageOrder プロパティを 1 に設定します。
Project Server ワークフローのフレームワークには、ProjectSequence アクティビティ (他のワークフロー アクティビティを格納するため) と、ワークフローが開始する最初の SetProjectStage アクティビティが必ず含まれています。手順 2. は、setProjectStage1 アクティビティを指定のステージにバインドする方法を示しています。
注意
[ワークフロー デザイナー] ウィンドウで Project Server ワークフロー アクティビティを追加すると、Visual Studio 2010 では、Project Server 2010 の間接的なアセンブリへの参照を追加します。そのいくつかは削除できます。
手順 1a. Project Server ワークフローの参照を設定するには
Project Server ワークフロー アクティビティを追加すると Visual Studio 2010 によって追加される以下の参照を削除します。
Microsoft.Office.Project.Schema ユーザー設定のワークフロー アクティビティ、または DataSet イベント引数を使用する Project Server イベント ハンドラーでのみ必要です。
Microsoft.Office.Project.Server
Microsoft.Office.Project.Server.Administration
Microsoft.Office.Project.Server.Communications
Microsoft.Office.Project.Shared
[Program Files]\Microsoft Office Servers\14.0\Bin ディレクトリにある以下の参照は保持します。
Microsoft.Office.Project.Server.Library
Microsoft.Office.Project.Server.Workflow
重要
BranchingWorkflow クラス コンストラクターの既定の実装では、ワークフローの終了時にワークフロー コンテキストおよびワークフロー プロパティが破棄されません。そのため、ユーザー設定のワークフローを実行すると、メモリー リークを引き起こすことがあります。メモリー リークを防ぐには、手順 1b. を使用して以下の処理を行います。
-
クラス コンストラクターを変更して、ワークフロー コンテキストを初期化します。
-
Dispose メソッドをオーバーライドして、ワークフロー コンテキストおよびワークフロー プロパティを破棄します。
-
ワークフロー プロパティを初期化する OnWorkflowActivated アクティビティの Invoked イベント ハンドラーを追加します。
既定の Workflow1.cs ファイル (または、名前を変更した場合は BranchingWorkflow.cs ファイル) では、workflowId 変数 および workFlowProperties 変数が次のように定義されています。
namespace BranchingWorkflow.Workflow1
{
public sealed partial class Workflow1 : SequentialWorkflowActivity
{
public Workflow1()
{
InitializeComponent();
}
public Guid workflowId = default(System.Guid);
public SPWorkflowActivationProperties workflowProperties = new SPWorkflowActivationProperties();
}
}
手順 1b. は、クラス コンストラクターの変更、ワークフロー コンテキストとワークフロー プロパティの破棄、および Invoked イベント ハンドラーの追加の方法を示しています。
手順 1b. ワークフロー コンテキストおよびワークフロー プロパティを初期化および破棄するには
workflowProperties 定義を削除し、以下に示すように、workflowProperties クラス プロパティと、wfContext というワークフロー コンテキスト クラス プロパティを追加します。
public SPWorkflowActivationProperties workflowProperties { get; set; } public Microsoft.SharePoint.WorkflowActions.WorkflowContext wfContext { get; set; }
クラス コンストラクター内で wfContext オブジェクトを作成します。
public Workflow1() { wfContext = new Microsoft.SharePoint.WorkflowActions.WorkflowContext(); InitializeComponent(); }
SequentialWorkflowActivity 基本クラスの Dispose メソッドをオーバーライドし、ワークフロー コンテキストおよびワークフロー プロパティの変数を破棄します。
protected override void Dispose(bool disposing) { base.Dispose(disposing); if (disposing) { wfContext.Dispose(); workflowProperties.Dispose(); } }
ワークフローの起動時に wfContext オブジェクトを初期化するように、onWorkflowActivated1_Invoked イベント ハンドラーを作成します。
private void onWorkflowActivated1_Invoked(object sender, ExternalDataEventArgs e) { wfContext.Initialize(workflowProperties); }
[シーケンシャル ワークフロー] デザイン ビューで、[onWorkflowActivated1] アクティビティをクリックします。[プロパティ] ページで、[イベント] アイコンをクリックし、Invoked イベントのドロップダウン リストで、[onWorkflowActivated1_Invoked] を選択します。
以下は、更新された Workflow1 クラスの実装です (クラスの名前を BranchingWorkflow に変更した場合は、「完全なコード例」を参照してください)。
namespace BranchingWorkflow.Workflow1
{
public sealed partial class Workflow1 : SequentialWorkflowActivity
{
public Guid workflowId = default(System.Guid);
public Workflow1()
{
wfContext = new Microsoft.SharePoint.WorkflowActions.WorkflowContext();
InitializeComponent();
}
// Class property for the workflow properties.
public SPWorkflowActivationProperties workflowProperties
{ get; set; }
// Class property for the workflow context.
public Microsoft.SharePoint.WorkflowActions.WorkflowContext wfContext
{ get; set; }
// Dispose the workflow properties and workflow context when disposing the workflow.
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (disposing)
{
wfContext.Dispose();
workflowProperties.Dispose();
}
}
// Event handler for the OnWorkflowActivated activity; initializes the workflow context.
private void onWorkflowActivated1_Invoked(object sender, ExternalDataEventArgs e)
{
wfContext.Initialize(workflowProperties);
}
}
}
Project Server ワークフロー アクティビティの追加
以下の Project Server ワークフロー アクティビティでは、ステージ、ユーザー設定フィールド、参照テーブル値、またはセキュリティ グループの GUID が必要です。
CompareProjectProperty
ReadProjectProperty
ReadProjectSecurityGroupMembers
SetProjectStage
UpdateProjectProperty
UpdateProjectStageStatus
ワークフロー アクティビティのステージへのバインド
手順 2. では、SetProjectStage アクティビティをプロジェクト提案内の [初期段階の提案の詳細] ステージにバインドします。
手順 2. アクティビティを [初期段階の提案の詳細] ステージにバインドするには
[初期段階の提案の詳細] ステージの GUID を見つけます。
Project Web App に管理者としてログオンし、サイド リンク バーの [サーバー設定] をクリックします。
[ワークフローおよびプロジェクト詳細ページ] セクションで、[ワークフロー ステージ] をクリックします。
[初期段階の提案の詳細] ステージをクリックします。
[初期段階の提案の詳細] ページの末尾までスクロールし、[システム ID データ] セクションを展開し、GUID をコピーします。
[初期段階の提案の詳細] ステージの GUID を使用するように、setProjectStage1 アクティビティを構成します。
ソリューション エクスプローラーで、BranchingWorkflow.cs ファイルを右クリックし、[コードの表示] をクリックします。
BranchingWorkflow クラスにコードを追加して、stage1Guid クラス変数を作成します。ステップ 1. の [初期段階の提案の詳細] ステージの GUID 値を使用します。
public Guid stage1Guid = new Guid("4fd56302-cb51-4a81-958c-47d499456a61");
[シーケンシャル ワークフロー] デザイン ビューで、[setProjectStage1] アクティビティをクリックし、[プロパティ] ウィンドウの [StageUid] フィールドをクリックし、参照ボタン ([…]) をクリックしてダイアログ ボックスを開きます。
[アクティビティのプロパティへの 'StageUid' のバインド] ダイアログ ボックスの [既存のメンバーへのバインド] タブで (図 5)、[stage1Guid] をクリックし、[OK] をクリックします。
図 5. アクティビティへのステージ GUID の設定
BranchingWorkflow.cs コード内で stage1Guid 値を変更するだけで、ステージを変更できます。
ステージ状態の更新
UpdateProjectStageStatus アクティビティでは、StageUid プロパティおよび WorkflowContext プロパティを使用して、正しいステージの状態を更新します。
手順 3. ワークフロー ステージ状態を更新するには
ツールボックスで、[UpdateProjectStageStatus] アクティビティをクリックし、それをデザイン ビュー内の setProjectStage1 アクティビティの下へドラッグします。updateProjectStateStatus1 が projectSequence1 の境界ボックス内にあることを確認します。
図 4 のように、WorkflowContext プロパティを設定します。
図 5 のように、StageUid プロパティを設定します。
UpdateProjectStageStatusField プロパティのドロップダウン リストで、[入力待ち] をクリックします (図 6)。
図 6. UpdateProjectStageStatus のプロパティの設定
[初期段階の提案の詳細] ステージのワークフロー シーケンスは終了です。ワークフローにより、ステージ内に存在するすべてのプロジェクト詳細ページ (PDP) が表示され、Project Web App 内の必須フィールドへのユーザー入力を待機し、ステージを提出して、ユーザーは次のステージへと進みます。
比較アクティビティの作成
CompareProjectProperty アクティビティを使用すると、プロジェクト提案のステージで指定されるプロパティを、他のプロパティや値と比較できます。
手順 4. 比較アクティビティを作成するには
ツールボックスで、[CompareProjectProperty] をクリックし、それを updateProjectStageStatus1 アクティビティの下へドラッグします。
compareProjectProperty1 の以下のプロパティを変更します。
CompareOperator を [が次の値以下] に設定します。
NumericPropertyValue を 25000 に設定します。
WorkflowContext プロパティを前述のように設定します。
compareProjectProperty1 で ConditionValid プロパティを以下のように設定します。
BranchingWorkflow.cs のコード ビューで、以下のコードを変数宣言の下に追加します。CompareBudgetCostResult という名前の BranchingWorkflow クラスに Boolean プロパティが作成されます。
public bool CompareBudgetCostResult { get; set; }
デザイン ビューで、ConditionalValid プロパティ名の横の黄色の円柱 (図 7 で赤い円の中) をダブルクリックします。
図 7. CompareBudgetCostResult プロパティへの ConditionValid のバインド
[アクティビティのプロパティへの 'ConditionValid' のバインド] ダイアログ ボックスで、[CompareBudgetCostResult] をクリックし、[OK] をクリックします。ConditionValid の False 値が "Activity=BranchingWorkflow, Path=CompareBudgetCostResult" に変わります。
compareProjectProperty1 が使用するユーザー設定フィールドを設定します。[初期段階の提案の詳細] ステージの [サンプル提案のコスト] というユーザー設定フィールドを使用するには、そのユーザー設定フィールドの GUID が必要です。
Project Web App に管理者としてログオンし、サイド リンク バーの [サーバー設定] をクリックします。
[エンタープライズ ユーザー設定フィールドと参照テーブル] をクリックし、[エンタープライズ ユーザー設定フィールド] リストの [サンプル提案のコスト] をクリックします。
[ユーザー設定フィールドの編集 : サンプル提案のコスト] ページの末尾までスクロールし、[システム ID データ] セクションを展開し、GUID をコピーします。
BranchingWorkflow.cs のコード ビューで、新しい Guid 変数を以下のように定義します。使用する GUID はこれとは異なる可能性があります。
public Guid proposedCostUid = new Guid("dc68b96a-965e-4b25-ac8a-15a5df729831");
compareProjectProperty1 アクティビティの [プロパティ] ページで、[MdPropUid] をクリックし、参照ボタン ([…]) をクリックして [アクティビティのプロパティへの 'MdPropUid' のバインド] ダイアログ ボックス (図 8) を開きます。次に、[proposedCostUid] をクリックし、[OK] をクリックします。
図 8. MdPropUid プロパティへの proposedCostUid のバインド
図 9 は、compareProjectProperty1 の完成したプロパティを示しています。
図 9. compareProjectProperty1 アクティビティの完成したプロパティ
If – Else 分岐の作成
基本の Windows Workflow アクティビティ内の IfElse アクティビティにより、ワークフロー内での論理分岐が可能となります。各分岐ではワークフローが異なるステージにバインドされ、それぞれのワークフロー アクティビティがオプションを評価し、異なる処理を実行できます。BranchingWorkflow サンプルでは、IfTrue 分岐によってワークフローが [提案の詳細] ステージに進み、IfFalse 分岐は [自動的に却下] ステージに進んでワークフローをキャンセルします。
手順 5. If – Else 分岐を作成するには
ツールボックスで、[Windows Workflow v3.0] タブを展開します。
[IfElse] アクティビティをクリックし、それを compareProjectProperty1 アクティビティの下へドラッグします。
コード ビューで、以下の CompareBudgetCost メソッドを CompareBudgetCostResult プロパティ宣言の下に追加します。
internal void CompareBudgetCost(object sender, ConditionalEventArgs args) { args.Result = CompareBudgetCostResult; }
デザイン ビューで、[ifElseBranchActivity1] をクリックします (図 10)。
図 10. IfElse アクティビティの IfTrue 分岐の選択
[プロパティ] ページで、Condition プロパティを [コードの条件] に設定し、[Condition] ノードを展開します。
[Condition] サブノードのドロップダウン メニューの [CompareBudgetCost] メソッドを選択します。
Condition プロパティを設定することにより、ifElseActivity1 の左への分岐が IfTrue 分岐になります。右への分岐は自動的に Else 分岐になります。手順 6. と手順 7. では、SetProjectStage アクティビティと UpdateProjectStage アクティビティをそれぞれの分岐に追加します。
IfTrue 分岐の [提案の詳細] ステージへのバインド
ifElseActivity1 の左への分岐は IfTrue 分岐です。SetProjectStage アクティビティと UpdateProjectStage アクティビティを使用して、Project Server の [提案の詳細] ステージにバインドします。手順 6. のステップは、SetProjectStage アクティビティと UpdateProjectStage アクティビティを構成した前の手順と同様です。
手順 6. IfTrue 分岐を [提案の詳細] ステージにバインドするには
SetProjectStage アクティビティをツールボックスから左分岐 (ifElseBranchActivity1) へドラッグします。
stage2Guid という名前の Guid 変数を作成します。
Project Web App の [提案の詳細] ステージの GUID を stage2Guid 値へコピーします。
setProjectStage2 の [プロパティ] ウィンドウで、StageUid プロパティを stage2Guid にバインドします。
StageOrder プロパティを 2 に設定します。
前のアクティビティの場合と同じになるように WorkflowContext プロパティを設定します。
UpdateProjectStageStatus アクティビティを setProjectStage2 の下へドラッグします。
setProjectStage2 の場合と同じになるように、StageUid プロパティと WorkflowContext プロパティを設定します。
UpdateProjectStageStatusField を [入力待ち] に設定します。
IfFalse 分岐の [自動的に却下] ステージへのバインド
ifElseActivity1 の右への分岐は ifElseBranchActivity2 であり、これは、Condition プロパティがドロップダウン リスト内の [(なし)] に設定されると、IfFalse 分岐になります。IfFalse 分岐では、SetProjectStage アクティビティと UpdateProjectStage アクティビティを使用して [自動的に却下] ステージにバインドします。
手順 7. IfFalse 分岐を [自動的に却下] ステージにバインドするには
SetProjectStage アクティビティをツールボックスから右分岐 (ifElseBranchActivity2) へドラッグします。
stage3Guid という名前の Guid 変数を作成します。
Project Web App の [自動的に却下] ステージの GUID を stage3Guid 値へコピーします。
setProjectStage3 の [プロパティ] ウィンドウで、StageUid プロパティを stage3Guid にバインドします。
StageOrder プロパティを 3 に設定します。
前のアクティビティの場合と同じになるように WorkflowContext プロパティを設定します。
UpdateProjectStageStatus アクティビティを setProjectStage3 の下へドラッグします。
StageUid プロパティと WorkflowContext プロパティを、setProjectStage3 の場合と同じようになるように設定します。
UpdateProjectStageStatusField プロパティを [なし] に設定します。
ツールボックスの [Windows Workflow v3.0] タブから、Terminate アクティビティをドラッグして、updateProjectStageStatus3 アクティビティの下へドロップします。
プロジェクト提案のコストが $25,000 を越える場合、ワークフローは右分岐 (IfFalse) を経由して [自動的に却下] ステージへと進み、終了します。
最終実行ステージへのバインド
ワークフローが IfTrue 分岐を通過すると、BranchingWorkflow サンプルは、[実行] ステージにバインドした時点で終了します。[実行] ステージには、Project スケジュールの Web パーツが含まれているプロジェクト詳細ページがあり、ユーザーはプロジェクトの計画を開始できます。
手順 8. 最後のアクティビティを最終実行ステージにバインドするには
SetProjectStage アクティビティをツールボックスからドラッグして、ifElseActivity1 のボックスの下へドロップします。
stage4Guid という名前の Guid 変数を作成します。
pwa の [実行] ステージの GUID を stage4Guid 値にコピーします。
setProjectStage4 の [プロパティ] ウィンドウで、StageUid プロパティを stage4Guid にバインドします。
StageOrder プロパティを 4 に設定します。
前のアクティビティの場合と同じになるように WorkflowContext プロパティを設定します。
UpdateProjectStageStatus アクティビティを setProjectStage4 の下へドラッグします。
updateProjectStageStatus4 の StageUid プロパティと WorkflowContext プロパティを、setProjectStage4 の場合と同じになるように設定します。
UpdateProjectStageStatusField を [入力待ち] に設定します。
図 11 は、BranchingWorkflow.cs の完全なデザイン ビューを示しています。最終ステージには、Project スケジュールの Web パーツが含まれている PDP があります。ワークフローが終了すると、ユーザーは [実行] ステージを経由して進み、プロジェクトを計画できます。
図 11. デザイン ビューの完全な BranchingWorkflow
BranchingWorkflow ソリューションを Project Server に展開すると、以下の処理が行われます。
初期段階のプロジェクト提案の詳細を収集します。
プロジェクト提案のコストが $25,000 を越えるかどうかを判断します。
提案が予算を越える場合は、プロジェクトが却下され、ワークフローが終了します。
提案のコストが $25,000 以下の場合は、[提案の詳細] ステージへと進み、ユーザーは関連する PDP に情報を追加できます。
[提案の詳細] ステージの PDP が完了すると、ワークフローは [実行] ステージに入り、終了します。
ローカルの Project Server コンピューター上でのワークフローのテストの詳細については、「[方法] Project Server ワークフローをインストールおよびテストする」を参照してください。SharePoint ソリューション パッケージを作成して別の Project Server コンピューターまたは Project Web App インスタンスに展開する方法の詳細については、「[方法] Project Server ワークフローを展開する」を参照してください。
完全なコード例
以下に示すのは、BranchingWorkflow.cs の完全なコードです。コードをコンパイルするには、上記の手順のすべてのステップを実行する必要があります。
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
using System.Drawing;
using System.Linq;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Workflow;
using Microsoft.SharePoint.WorkflowActions;
namespace BranchingWorkflow.BranchingWorkflow
{
public sealed partial class BranchingWorkflow : SequentialWorkflowActivity
{
public Guid workflowId = default(System.Guid);
// Stage 1: Initial Proposal Details stage. Replace GUIDs with your values.
public Guid stage1Guid = new Guid("4fd56302-cb51-4a81-958c-47d499456a61");
// Stage 2: Proposal Details stage.
public Guid stage2Guid = new Guid("400060e9-5f2b-4e60-82f6-451b83165190");
// Stage 3: Automated Rejection stage.
public Guid stage3Guid = new Guid("c39007f5-9338-4a0f-af99-761dc7a2e97c");
// Stage 4: Execution stage.
public Guid stage4Guid = new Guid("43a1eb7b-562d-42e8-9a96-88817ef74295");
// Custom field: Sample Proposal Cost.
public Guid proposedCostUid = new Guid("dc68b96a-965e-4b25-ac8a-15a5df729831");
public BranchingWorkflow()
{
wfContext = new Microsoft.SharePoint.WorkflowActions.WorkflowContext();
InitializeComponent();
}
// Class property for the workflow properties.
public SPWorkflowActivationProperties workflowProperties
{ get; set; }
// Class property for the workflow context.
public Microsoft.SharePoint.WorkflowActions.WorkflowContext wfContext
{ get; set; }
// Dispose the workflow properties and workflow context when disposing the workflow.
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (disposing)
{
wfContext.Dispose();
workflowProperties.Dispose();
}
}
// Event handler for the OnWorkflowActivated activity; initializes the workflow context.
private void onWorkflowActivated1_Invoked(object sender, ExternalDataEventArgs e)
{
wfContext.Initialize(workflowProperties);
}
// Property for comparing the budget cost result.
public bool CompareBudgetCostResult
{ get; set; }
// Method to compare the budget cost.
internal void CompareBudgetCost(object sender, ConditionalEventArgs args)
{
args.Result = CompareBudgetCostResult;
}
}
}
エラー: プロジェクトのビルド時に以下のエラーが表示される場合は、ステージ、ユーザー設定フィールド、およびその他のエンティティの GUID を確認します。
Error 1 Could not create activity of type 'BranchingWorkflow.BranchingWorkflow'.
System.FormatException: Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
at System.Guid..ctor(String g)
at BranchingWorkflow.BranchingWorkflow..ctor()
E:\Project\ Workflow\BranchingWorkflow 1 1
その他のエラーについては、手順 1a. に示されているように参照が正しく設定されていることを確認します。
堅牢なプログラミング
BranchingWorkflow.cs サンプルには、キャンセルやエラーのハンドラー アクティビティが含まれていません。実稼働品質のワークフローには、ワークフローのキャンセルおよび例外に対するイベント ハンドラー アクティビティが含まれている必要があります。たとえば、Project Web App で [提案の詳細] ステージが削除された場合、ワークフローは例外を処理する必要があります。
BranchingWorkflow デザイン ビューで以下のいずれかのアクティビティを選択したら、アクティビティの上部の下矢印をクリックして (図 12)、メイン ビュー、[キャンセル ハンドラーの表示] オプション、および [エラー ハンドラーの表示] オプションから成るメニューを表示します。
上部の SequentialWorkflow アクティビティ (デザイン ビューの上部にある緑の丸の中の矢印)
ProjectSequence アクティビティ
IfElse アクティビティ
EfElseBranch アクティビティ (左への分岐または右への分岐)
図 12. デザイン ビューにおける ProjectSequence アクティビティのオプション メニューの使用
関連項目
タスク
[方法] Project Server ワークフロー用に Visual Studio 2010 を構成する
[方法] Project Server ワークフローをインストールおよびテストする
[方法] Project Server ワークフローを展開する