共用方式為


使用變更追蹤,同步處理資料與外部系統

 

發行︰ 2016年11月

適用於: Dynamics CRM 2015

Microsoft Dynamics 365 中的變更追蹤功能透過偵測哪些資料在最初擷取或上次同步處理之後已變更,提供方法來保持資料以高效能方式進行同步處理。 先前沒有此新功能時,較難建立可靠且有效率的機制來判斷 Dynamics 365 中哪些記錄已變更。 本主題討論如何擷取實體的變更。

注意

如果是 Microsoft Dynamics CRM Online 組織,只有在組織已更新至 Dynamics CRM Online 2015 更新 1 時,才能使用此功能。 這項功能不適用於 Dynamics CRM (內部部署)。

本主題內容

啟用實體的變更追蹤

擷取實體的變更

範例指令碼

啟用實體的變更追蹤

在擷取實體的變更之前,請確定已啟用該實體的變更追蹤功能。 此功能可以使用自訂使用者介面 (UI) 或程式設計方式啟用,將 ChangeTrackingEnabled 屬性設定為 True。 如需使用自訂使用者介面 (UI) 的詳細資訊,請參閱啟用變更追蹤來控制資料同步處理

擷取實體的變更

啟用實體的變更追蹤時,您可以使用 RetrieveEntityChangesRequest 訊息擷取實體的變更。 首次使用此訊息時,會傳回實體的所有記錄,這些資料可以用來填入外部儲存空間。 訊息也會傳回將在下次使用 RetrieveEntityChangesRequest 訊息時傳回的版本號碼,如此將只會傳回該版本之後發生的變更資料。

擷取實體變更時應該先了解下列限制:

  • 擷取變更中只會追蹤一個實體。 如果擷取變更執行時沒有版本 / 或 Token,則伺服器會將它視為系統最低版本,並將所有記錄當做新記錄傳回。 刪除的物件不會傳回。

  • 如果上一個 Token 是在預設值 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 插入或更新記錄

© 2017 Microsoft. 著作權所有,並保留一切權利。 著作權