Dynamics CRM 4.0 でワークフローを作成するときに、特定の日時のX日前にワークフローアクティビティーを実行させるフローを作成したいと思うことがありませんか?そんなときに便利なのが待機状態の待機条件にワークフローのタイムアウト属性を使用できます。タイムアウトの待機条件と並列待機条件を組み合わせて特定の時間まである属性に変化がなければ何らかの処理をするワークフローなども作成できます。

本記事では、Dynamics CRM 4.0 で、ワークフローのタイムアウトを使用するサンプルを掲載します。タイムアウトを使用すると、予定の開始時間の3日前にリマインドメールや、リマインドの仕事を作成するワークフローを作成できます。

動作確認は、 Dynamics CRM 4.0 UR 11 が適用されたオールインワン環境で動作確認しています。

タイムアウトはワークフローの待機状態のステップでのみ使用できる特殊なワークフローの属性です。タイムアウトを使用するとこでワークフローを特定の期間もしくは、特定の日時の前(or 後)X日(時)までワークフローを待機状態にすることができます。

1. 作成するワークフロー

予定の開始日時の3日前にリマインド用にタスクを作成するサンプルを掲載します。

ワークフローの新規作成画面を表示します。ワークフロー名は CreateReminderTask, エンティティを予定(Appointment)として OK ボタンをクリックします。

ワークフローの作成画面で、スコープを組織全体、開始時期を レコードの作成とします。 ワークフローの実行メニューからオンデマンドでワークフローを開始できるように、オンデマンドにもチェックをしておきます。

ステップの追加で、待機状態を選択します。

ステップが作成されます。 "XX まで待機し"となっている condition のリンクをクリックします。

ワークフロー条件の指定画面が表示されるので、右端のドロップダウンから、ワークフローを選択します。

ワークフローの属性選択で、"タイムアウト" 条件に "が次の値と等しい" , 動的な値で 開始時間の3日前となるようにします。保存して閉じるボタンをクリックし画面を閉じます。

待機のステップで、 XXまで待機が、 XXまでタイムアウトとなっていることが確認できます。

あとは、タイムアウト(3日前まで待機した)後、仕事レコードを作成するように、レコードの作成ステップを追加します。

作成対象のエンティティに仕事を選択します。プロパティの設定ボタンをクリックします。

プロパティの設定画面で適当に編集します。

ワークフローが完了したので、 公開ボタンをクリックして、ワークフローを公開(Publish) します。

公開が成功したら、画面を閉じます。ワークフローの公開に失敗する場合は[DynamicsCRM] ワークフローの公開に失敗する を参照してください。

それでは、予定を新規作成して動作確認をしてみます。処理日は 2010/9/27 です。下図では開始時間を2010/10/1 として新規作成しました。

システムジョブでワークフローを確認すると、ステータスが待機中でワークフローが開始されていることが確認できます。定期的に更新してもワークフローは処理中になりません。

作成した予定の開始時間を2010/9/30に変更して更新します。

待機状態だったワークフローのステータスが変化しワークフローが成功します。

活動を確認すると仕事レコードが作成されていることが確認できます。

 2. まとめ

以上で説明は完了です。待機条件はレコードの属性が変化するまでという待機条件で使用することが多いと思いますが、ワークフローのタイムアウトを使用することで、タイムアウトするまでという待機条件を設定できることを紹介しました。

ワークフローには実行時間(ExecutionTime)というリアルタイムの時間を表す属性がありますが、これを待機条件に使用しないほうがよいです。問題となる例をあげます。待機条件を実行時間(ExecutionTime)が予定レコードの開始時間の3日前とした場合、待機条件を評価した時に、待機解除条件が満たされず、一度ワークフローが待機状態になると、予定レコードが再度更新されない限り、待機条件が再評価されません(たしか)。予定エンティティを更新すれが実行時間を使用していても待機条件はそのときに再評価されます。
そのため、 タイムアウト(Timeout) を使用する必要があります。タイムアウトの場合はタイムアウト条件が満たされる時間になると自動的に待機条件が再評価されるようになります。

実行時間(ExecutionTime)の使い方が間違っているとテスト時に予定の開始時間をいじっているときは気づきませんが、実際の運用に近いシナリオでテストをするとワークフローが待機から処理中の状態にならず頭を悩ませることになります。実行時間(ExecutionTime)は、処理時間を特定の文字列属性に出力する場合などに使用しましょう。