変更の追跡を使用してデータを外部システムに同期

 

公開日: 2017年1月

対象: Dynamics 365 (online)、Dynamics 365 (on-premises)、Dynamics CRM 2016、Dynamics CRM Online

Microsoft Dynamics 365 の新しい変更追跡機能は、データが最初に抽出されてから、または最後に同期化されてからどのデータが変更されたかを検出することによって、データの同期を効率の良い方法で維持する方法を提供します。 以前は、この新しい機能がなかったので、Dynamics 365 のどのレコードが変更されたかを決定する、信頼性のある効率の良いメカニズムを構築することは困難でした。 このトピックでは、エンティティの変更を取得する方法について説明します。

このトピックの内容

エンティティに対する変更の追跡を有効化

エンティティの変更の取得

サンプル コード

エンティティに対する変更の追跡を有効化

エンティティの変更を検索するには、その前に、機能の変更がこのエンティティに対して有効になっていることを確認します。 この機能は、カスタマイズ ユーザー インターフェイス (UI) を使用することによって、またはプログラムで ChangeTrackingEnabled プロパティを True に設定することによって有効にすることができます。 カスタマイズ ユーザー インターフェイス (UI) の使用の詳細については、「変更の追跡を有効にしてデータの同期を制御」を参照してください。

エンティティの変更の取得

エンティティに対する変更の追跡を有効にすると、RetrieveEntityChangesRequest メッセージを使用して、そのエンティティの変更を取得できます。 このメッセージは、最初に使用されるときは、エンティティのすべてのレコードを返し、そのデータは外部の記憶域に入力するために使用できます。 また、このメッセージは、次の RetrieveEntityChangesRequest メッセージの使用で返されるバージョン番号を返します。これによって、このバージョン番号が返された以降に発生した変更に対するデータのみが返されます。

エンティティの変更の取得に際しては、以下の制限に注意ください。

  • 変更の取得では、1 つのエンティティのみが追跡されます。 バージョンまたはトークンなしで変更の取得が実行された場合、サーバーは、それをシステムの最小バージョンとして処理して、すべてのレコードを新規として返します。 削除済みのオブジェクトは返されません。

  • 最後のトークンが既定値の 90 日以内である場合、変更は返されます。 それが 90 日 を超えている場合は、すべてのレコードが返されます。

  • クライアントにエンティティに対する変更のセット、たとえば、バージョン 1 が存在し、次の変更のクエリの前にレコードが作成され、そのレコードが削除された場合、初めに削除されたアイテムがクライアントに存在しない場合でも、そのアイテムを取得します。

  • レコードは、サーバー側ロジックによって決定される順序で取得されます。 通常、エンド ユーザーは、常に、最初に新規のまたは更新されたすべてのレコード (バージョン番号で並べ替え) と、それに続く削除されたレコードを取得します。  3000 レコードが作成または更新され、2000 レコードが削除された場合は、Dynamics 365 は 5000 レコードのコレクションを返します。これは、最初の 3000 エントリが新規または更新されたレコードで構成され、後の 2000 エントリが削除されたレコードの分です。

  • 新規または更新された アイテムのコレクションが 5000 を超える場合、コレクションを複数ページで表示できます。

サンプル コード

次のコード スニペットは、RetrieveEntityChangesRequest メッセージを使用してエンティティの変更を取得する方法を示しています。 完全なサンプルについては、「変更の追跡を使用して外部システムにデータを同期」を参照してください。


string token;

// Initialize page number.
int pageNumber = 1;
List<Entity> initialrecords = new List<Entity>();

// Retrieve records by using Change Tracking feature.
RetrieveEntityChangesRequest request = new RetrieveEntityChangesRequest();
request.EntityName = _customBooksEntityName.ToLower();
request.Columns = new ColumnSet("sample_bookcode", "sample_name", "sample_author");
request.PageInfo = new PagingInfo() { Count = 5000, PageNumber = 1, ReturnTotalRecordCount = false };


// Initial Synchronization. Retrieves all records as well as token value.
Console.WriteLine("Initial synchronization....retrieving all records.");
while (true)
{
    RetrieveEntityChangesResponse response = (RetrieveEntityChangesResponse)_serviceProxy.Execute(request);

    initialrecords.AddRange(response.EntityChanges.Changes.Select(x => (x as NewOrUpdatedItem).NewOrUpdatedEntity).ToArray());
    initialrecords.ForEach(x => Console.WriteLine("initial record id:{0}", x.Id));
    if (!response.EntityChanges.MoreRecords)
    {
        // Store token for later query
        token = response.EntityChanges.DataToken;
        break;

    }
    // Increment the page number to retrieve the next page.
    request.PageInfo.PageNumber++;
    // Set the paging cookie to the paging cookie returned from current results.
    request.PageInfo.PagingCookie = response.EntityChanges.PagingCookie;
}

関連項目

エンティティの代替キーの定義
代替キーを使用してレコードを作成
Upsert を使用してレコードを挿入または更新

Microsoft Dynamics 365

© 2017 Microsoft. All rights reserved. 著作権