目的:
Dynamics CRMの開発では、最も一般的にプラグインの更新プラグインやカスタマイズ機能のさまざまなを作成することによって達成される、当然のことながら、ここでの使用の削除プラグインの例もありますが、これは単に削除プラグインを使用する方法について話しています。
シーン:
CRMの開発では、テーブルとルックアップフィールドによって確立されたテーブルの間で、今、次のシナリオのニーズを考えてみましょう:
表A表Bの存在及び副生成物のような生成物は、ルックアップ表A、表Bのフィールドを確立するために、表Aは、表B内のサブ製品の数(すなわち、どのように多くの記録指示をカウントするフィールドがあります)自身、(レコードの削除)サブプロダクトが削除されると、統計は、対応する親製品アップデートする必要があり、この時、あなたはこの要求を実現するために、削除プラグインを使用することができます。
実装:
コードは比較的簡単です、実行可能な場合かどうか、Deleteメッセージコンテキスト決定されます。
1つの 公共 ボイド(IServiceProviderサービス・プロバイダ)を実行 2 { 3 ITracingServiceトレーサー=(ITracingService)serviceProvider.GetService(typeof演算(ITracingService))。 4 IPluginExecutionContextコンテキスト=(IPluginExecutionContext)serviceProvider.GetService(typeof演算(IPluginExecutionContext))。 5 IOrganizationServiceFactory工場=(IOrganizationServiceFactory)serviceProvider.GetService(typeof演算(IOrganizationServiceFactory))。 6 IOrganizationServiceサービス= factory.CreateOrganizationService(context.UserId)。 7 8 試す 9 { 10 // 実行(Do)のもの:TODO 11 場合(context.MessageName.Equals(" 作成" )) 12 { 13 tracer.Trace(" 舞台" + ; context.Stage) 14 スイッチ(context.Stage) 15 { 16 ケース 20 : 17 CreatePlugin(トレーサー、コンテキスト、サービス工場)。 18 ブレーク; 19 ケース 40 : 20 休憩; 21 デフォルト: 22 休憩。 23 } 24 } 25 そう であれば(context.MessageName.Equals(" 更新" )) 26 { 27 スイッチ(context.Stage) 28 { 29 ケース 20 : 30 UpdatePlugin(トレーサー、コンテキスト、サービス工場)。 31 ブレーク; 32 ケース 40 : 33 休憩; 34 デフォルト: 35 休憩。 36 } 37 } 38 そう であれば(context.MessageName.Equals(" 削除" ))//削除プラグインの 39 { 40 スイッチ(context.Stage) 41 { 42 ケース 10 : 43 DeletePlugin(トレーサー、コンテキスト、サービス工場) ; 44 ブレーク; 45 } 46 } 47 48 } 49 キャッチ(例外e) 50 { 51 投 新しいInvalidPluginExecutionException(e.Message)。 52 } 53 54 }
次のようにどのように現在のレコードDetele要求内のすべての情報を取得するには、コードは、最初に対応するレコードを検索するためにオブジェクトを介して、その後のEntityReferenceにオブジェクトを取得し、されています。
1 プライベート 無効DeletePlugin(ITracingServiceトレーサー、IPluginExecutionContextコンテキスト、IOrganizationServiceサービス、IOrganizationServiceFactory工場) 2 { 3 tracer.Trace(" スタートDeletePlugin()" ); 4 試行 5 { 6 のEntityReferenceエンティティ=((実体参照)context.InputParameters [ " 対象" ])。 7 Entities.new_entity = service.Retrieve(entity.LogicalName、entity.Id、新しい ColumnSet(真))ToEntity <Entities.new_entity> ();//レコードを現在のすべての情報を取得し、それはルックアップフィールドに従って親製品を見つけることができる。8 } 。9 キャッチ(例外EX) 10 { 11 IF(ex.GetType()。ザ名==「InvalidPluginExecutionException 」) 12であり 、{ 13はスロー新しい新 InvalidPluginExecutionException(ex.Message + Environment.NewLine); 14 } 15 他の16 { 17。文字列 ERRORTEXT = ex.Message.ToString(); 18れている19。ながら(ex.InnerException =!
ヌル) 20 { 21 ERRORTEXT + = ex.InnerException.Message。 22 EX = ex.InnerException。 23 } 24 スロー 新しい例外(" エラー:" + ERRORTEXT + " \ n個" ); 25 } 26 } 27 tracer.Trace(" エンドDeletePlugin()" )。 28 }
注: 実装削除要求でCRM、およびエンティティオブジェクトへのキャストが文句を言う場合は作成/更新要求は、削除コンテキストを取得するエンティティオブジェクトの現在のレコードとは異なるが、実体参照オブジェクトであるので、この方法を実行することを忘れないでくださいこのコードで削除:
エンティティエンティティ=(エンティティ)context.InputParameters [ " 対象" ]。
最後に、削除メッセージの下に登録する10段階(プレバリデーション)または20ステージ(プレ動作)を使用することができ、ステージ20にかかるPartyListのタイプなどのいくつかの関係を削除した可能性があるため、一般に、10ステージを使用することが推奨されていますフィールドは、20ながら値を取得します。