zoukankan      html  css  js  c++  java
  • Dynamics 365 Customer Enagement中的更改跟踪(change tracking)

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),欢迎关注我的微信公众号 MSFTDynamics365erLuoYong ,回复349或者20190810可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!

    Dynamics 365 CRM 从2016版本起新增了一个新的消息叫RetrieveEntityChangesRequest,这个消息可以监控到CRM中数据自上次获取以来的变更。、首先需要为实体启用更改跟踪,可以参考文档 启用更改跟踪以控制数据同步 来做,其实很简单,选中实体的 更改跟踪 属性保存并发布即可。

    为了测试,我先准备如下记录:

    代码如下:

    using Microsoft.Xrm.Client;
    using Microsoft.Xrm.Client.Services;
    using Microsoft.Xrm.Sdk;
    using Microsoft.Xrm.Sdk.Messages;
    using Microsoft.Xrm.Sdk.Query;
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.ServiceModel;
    
    namespace LuoYongLab
    {
        class Program
        {
            static void Main(string[] args)
            {
                try
                {
                    var orgService = new OrganizationService(new CrmConnection("CRM"));
                    string dataToken, changedType;
                    List<Entity> initialrecords = new List<Entity>();
                    RetrieveEntityChangesRequest request = new RetrieveEntityChangesRequest();
                    request.EntityName = "ly_test";
                    request.Columns = new ColumnSet("ly_name", "ly_alternatekey");
                    request.PageInfo = new PagingInfo() { Count = 2, PageNumber = 1, ReturnTotalRecordCount = false };
                    request.DataVersion = "565904!01/05/2016 06:57:22";
                    Console.WriteLine("request.DataVersion = string.Empty;最初的同步,获取所有记录");
                    while (true)
                    {
                        RetrieveEntityChangesResponse response = (RetrieveEntityChangesResponse)orgService.Execute(request);
                        if (response.EntityChanges.Changes.Count >= 1)
                        {
                            foreach (var change in response.EntityChanges.Changes)
                            {
                                if (change.Type == ChangeType.NewOrUpdated)
                                {
                                    NewOrUpdatedItem changedItem = (NewOrUpdatedItem)change;
                                    Entity changedRecord = changedItem.NewOrUpdatedEntity;
                                    if (changedRecord != null)
                                    {
                                        string firstName = changedRecord.GetAttributeValue<string>("ly_name");
                                        changedType = changedItem.Type.ToString();
                                        Console.WriteLine("变更类型={0} 名称={1}", changedType, firstName);
                                    }
                                }
                                else if (change.Type == ChangeType.RemoveOrDeleted)
                                {
                                    RemovedOrDeletedItem removedItem = (RemovedOrDeletedItem)change;
                                    EntityReference removedRecord = removedItem.RemovedItem;
                                    if (removedRecord != null)
                                    {
                                        Guid id = removedRecord.Id;
                                        changedType = removedItem.Type.ToString();
                                        Console.WriteLine("变更类型={0} Id={1}", changedType, id.ToString());
                                    }
                                }
                            }
                        }
                        else
                        {
                            Console.WriteLine("没有记录发生了变更!");
                        }
                        if (!response.EntityChanges.MoreRecords)
                        {
                            dataToken = response.EntityChanges.DataToken;
                            Console.WriteLine("本次获取记录变更时获取到的DataToken={0}", dataToken);
                            using (StreamWriter sw = File.AppendText(@"c:luoyong.txt"))
                            {
                                sw.WriteLine(string.Format("本次获取记录变更时获取到的DataToken= {0}", dataToken));
                            }
                            break;
                        }
                        request.PageInfo.PageNumber++;
                        request.PageInfo.PagingCookie = response.EntityChanges.PagingCookie;
                    }
                    Console.WriteLine("程序运行完成");
                    Console.ReadKey();
                }
                catch (FaultException ex)
                {
                    Console.WriteLine("程序出现异常:ex.Message=" + ex.Message);
                    Console.WriteLine("ex.StackTrace=" + ex.StackTrace);
                    Console.ReadKey();
                }
            }
        }
    }

    我运行代码后截图显示:

    然后我将代码中的 request.DataVersion 的值改成获取到的值565904!01/05/2016 06:55:25后,运行结果如下,结果正确。

    然后我新增了记录,修改了记录,删除了记录看看结果。结果正显示我修改了两条记录,新增了一条记录,删除了两条记录,其中一条是之前存在的被删除了,另外一条是新增后然后删除了,结果是正确的。结论是,这个时间段的新增然后删除的记录只会显示在删除里面,不会显示曾经新增过,所以要和外部系统集成的时候,删除对方系统记录的时候如果不存在也不要大惊小怪。

    更多信息请参考文档: Use change tracking to synchronize data with external systems 

  • 相关阅读:
    Leetcode#145 Binary Tree Postorder Traversal
    Leetcode#146 LRU Cache
    单引号和双引号的区别
    $* $@ $#
    pthread_detach
    pthread_join
    intent 启动activity、service的方法
    multicast based on udp
    ARM指令系统
    ARM寄存器
  • 原文地址:https://www.cnblogs.com/luoyong0201/p/Dynamics_365_Cusotmer_Engagement_use_change_tracking_to_synchronize_data.html
Copyright © 2011-2022 走看看