レコードを複製しないように検証を行うアカウント更新メッセージで実行されるプラグインを作成します。しかし、そのアカウントを無効にするか、別のアカウントとマージしようとすると、プラグインがトリガーされます。
プラグインがアクティブ化/非アクティブ化/マージ アクション、または CRM Dynamics 2011 Save Event Arguments Referenceのようなイベント モードによってトリガーされたかどうかを確認するにはどうすればよいですか?
レコードを複製しないように検証を行うアカウント更新メッセージで実行されるプラグインを作成します。しかし、そのアカウントを無効にするか、別のアカウントとマージしようとすると、プラグインがトリガーされます。
プラグインがアクティブ化/非アクティブ化/マージ アクション、または CRM Dynamics 2011 Save Event Arguments Referenceのようなイベント モードによってトリガーされたかどうかを確認するにはどうすればよいですか?
Pete Oakeyの答えに追加するには、プラグインステップの「フィルタリング属性」を変更することで、実際のコード@ランタイムでこれをテストすることに加えて、登録フェーズで特定のフィールドが変更された場合にのみプラグインを起動するようにプラグインに指示できます。したがって、検証ロジックが正しく処理するためにStateCode
/StatusCode
属性を特に必要としない限り、これら2つの属性を除外するか、検証ロジックに必要な属性を含めることができます。
元の答え:
IExecutionContext.Depth Property
オブジェクトのを参照できると思いIPluginExecutionContext
ます。
実行中のプラグインまたはワークフローがWebサービスにメッセージ要求を発行して、別のプラグインまたはワークフローの実行をトリガーするたびに、実行コンテキストのDepthプロパティが増加します。設定された制限時間内にdepthプロパティが最大値に増加すると、プラットフォームはこの動作を無限ループと見なし、それ以降のプラグインまたはワークフローの実行は中止されます。最大深度(8)と制限時間(1時間)は、MicrosoftDynamicsCRM管理者が構成できます。
したがって、ifステートメントを使用してDepth > 1
。
1 つの方法は、プラグインのアカウント エンティティで変更された前後の値を比較することです。たとえばactive
、値に (それが正しいプロパティ名である場合) しかない場合、after 値を見て何が起こったかを確認できます。
別の方法は、これらのメッセージに特定のプラグインを追加し、更新プラグインでチェックできるプロパティ/フラグを設定することです。明らかに、これは更新プラグインの前に実行する必要があります。