Compartilhar via


5 分待たずに重複データを検出

CRM には重複データを検出するために、重複データ検出ルールを設定することができます。
この機能を使用していたのに、重複データが作成されてしまった!という経験はありませんか?

『CRM ヘルプ』にも記述されていますが、最初のレコードを入力してから数分以内に重複するレコードを入力した場合、CRM は重複したレコードを検出しません。
これは、新規および更新されたレコードのマッチコードが、レコードの作成時ではなく、5 分ごとに作成されるためです。

今日は、マッチコードを 5 分待たずに作成し、重複データ検出をリアルタイムで行う CRM SDK プロパティについてご紹介します。

1. オプショナル パラメーター CreateDuplicatesOptionalParameter と PersistInSyncOptionalParameter

CreateRequest、または UpdateRequest インスタンスの OptionalParameters に次の 2 つの OptionalParameter を設定することで、重複データ検出をリアルタイムで行うことができます。次のコードは Web サービスを使用した場合のサンプルで、CRM 標準で定義されている重複データ検出ルール「同じ電子メール アドレスを持つ取引先担当者」が公開されているとします。

 

            // CrmService のインスタンス service を作成する処理があると想定してください。
            // ここでは、取引先担当者エンティティのインスタンスを作成するところからのサンプルです。

            contact myContact = new contact();
            myContact.lastname = "test2";
            myContact.emailaddress1 = "test2@test.com";

            TargetCreateContact target = new TargetCreateContact();
            target.Contact = myContact;

            // Optional parameter: 重複データを作成しない
            CreateDuplicatesOptionalParameter opt1 = new CreateDuplicatesOptionalParameter();
            opt1.Value = false;

            // Optional parameter: マッチコードを同期生成する
            PersistInSyncOptionalParameter opt2 = new PersistInSyncOptionalParameter();
            opt2.Value = true;

            CreateRequest request = new CreateRequest();
            request.Target = target;
            request.OptionalParameters = new OptionalParameter[] { opt1, opt2 };

            service.Execute(request);

 

注意 :

  • 重複検出は、CrmService オブジェクトの Create、Update メソッドでは動作しません、Execute メソッドを使用してください。
  • オプショナル パラメーター PersistInSyncOptionalParameter はレコード作成時にマッチコードを同期生成するためのオプションです。
    マッチコードがリアルタイムで作成されるため重複データ検出もリアルタイムで行うことができますが、マッチコードの同期生成がパフォーマンスの低下を引き起こす可能性があることを考慮してください。

既定では、PersistInSyncOptionalParameter は false に設定されており、重複検出のためのマッチコードはシステムジョブで非同期に生成されます。
最初にも記述しましたが、CRM ユーザー インターフェースから手入力で新規作成、更新されるレコードについては、マッチコードは 5 分ごとに作成されます。

2. エンティティ レコードの作成、更新とマッチコードの作成

上述の SDK コード実行時の SQL プロファイラー トレースです。

SQLTrace

取引先担当者 test2 のレコード作成とマッチコード test2@test.com の生成は、1 つのトランザクションとして管理されています。
BEGIN TRANSACTION と COMMIT TRANSACTION の間に contact テーブルへの INSERT ステートメントと、マッチコード テーブル matchcode への INSERT ステートメントが含まれていることを確認できます。データ更新とマッチコード生成の間に隙間はありません。

では、マッチコード テーブルの情報をみてみましょう。
INSERT ステートメントからも確認できるように、マッチコード テーブルには、エンティティ ObjectId とマッチコード(この場合は、電子メールアドレス)が登録されます。

table

マッチコードが作成された後、同じ電子メールアドレスを持つ新しい取引先担当者レコードが作成されようとした場合は、重複データ検出を行う CRM プラグインがマッチコード テーブルの情報と比較し、すでに重複した値が存在する場合は、重複が検出されます。

注意すべき点は、エンティティ レコードの作成、更新とマッチコードの作成は 1 つのトランザクションとして管理されていますが、このトランザクションの開始が並行で行われる場合があることです。マルチスレッドで同時にレコード作成リクエストが実行され、マッチコード テーブルにマッチコードが存在しない場合、重複検出プラグインは、両方のリクエストを開始します。これらのトランザクションは異なる ObejctId のエンティティ レコードを作成し、その結果重複データが作成される可能性があります。

- 参考情報
CRM SDK ヘルプ

CreateDuplicatesOptionalParameter.Value Property
https://msdn.microsoft.com/ja-jp/library/bb930172(en-us).aspx

PersistInSyncOptionalParameter.Value Property
https://msdn.microsoft.com/ja-jp/library/bb929013(en-us).aspx

情報元 :

Part II - Run-time: SDK Support for Duplicate Detection in Titan
https://blogs.msdn.com/crm/archive/2007/11/12/part-ii-run-time-sdk-support-for-duplicate-detection-in-titan.aspx 

 

Dynamics CRM サポート
斎藤 さち江