我是微软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 = , PageNumber = , 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 >= )
{
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

Dynamics 365 Customer Enagement中的更改跟踪(change tracking)的更多相关文章

  1. SQL Server审计功能入门:更改跟踪(Change Tracking)

    原文:SQL Server审计功能入门:更改跟踪(Change Tracking) 介绍 更改跟踪是一种轻量型解决方案,它为应用程序提供了一种有效的更改跟踪机制.常规的,自定义变更跟踪和读取跟踪数据, ...

  2. Dynamics 365 Customer Engagement中插件的调试

    微软动态CRM专家罗勇 ,回复319或者20190319可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 本文主要根据官方的教 ...

  3. Dynamics 365 Customer Engagement 中对API的调整内容分享

    当前版本中弃用了以下客户端 API 以重新组织 Xrm 客户端 API 对象模型,从而更好地满足以下需求:使用同一客户端脚本而不必基于上下文或基于运行这些脚本的客户端(Web 客户端或新的统一接口)来 ...

  4. Dynamics 365 Customer Engagement中使用JavaScript和C#调用操作Action示例

    微软动态CRM专家罗勇 ,回复334或者20190509可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! Action (操作)是流程的一种,可以在工作流中调用,可以使用 ...

  5. 介绍Dynamics 365 Customer Engagement中的备用键(alternate key)

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  6. 嵌入Canvas App到Dynamics 365 Customer Engagement(Model-Driven App)中,创造更多可能!

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  7. 配置基于服务器认证的Dynamics 365 Customer Engagement和SharePoint Online集成

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  8. 更改Dynamics 365 Customer Engagement本地部署的高级配置

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  9. Dynamics 365 Customer Engagement安装FAQ

    微软动态CRM专家罗勇 ,回复310或者20190308可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 本文参考了包括但不限 ...

随机推荐

  1. Numpy的基础用法

    1.用Numpy创建数组 numpy.array(object):创建数组,与array.array(typecode[, initializer])不同,array.array()只能创建一维数组 ...

  2. 过滤器和监听器实现用户的在线登录人数,以及设置session时长。

    过滤器: package com.bjsxt.filter; import java.io.IOException; import javax.servlet.Filter; import javax ...

  3. HDU2482-Transit search(地图还原+SPFA)

    Henry decides to develop a web site, which will provide the service of transit search. But he can on ...

  4. Redis中的Java分布式缓存

    为什么在分布式Java应用程序中使用缓存?今天学习了两节优锐课讲解分布式缓存的内容,收获颇多,分享给大家. 在提高应用程序的速度和性能时,每毫秒都是至关重要的.例如,根据Google的一项研究,如果网 ...

  5. java笔记 -- 乐观锁与悲观锁

    何谓乐观锁和悲观锁 乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展.这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人. 悲观锁 - ...

  6. Python自动输入【新手必学】

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:哈喽哈嘿哈 这篇文章是我的第一篇文章,写的不好的地方,请大家多多指教哈 ...

  7. 基于 Blazui 的 Blazor 后台管理模板 BlazAdmin 正式尝鲜

    简介 BlazAdmin 是一个基于Blazui的后台管理模板,无JS,无TS,非 Silverlight,非 WebForm,一个标签即可使用. 我将在下一篇文章讨论 Blazor 服务器端渲染与客 ...

  8. Linux系统基础知识

    文件类型属性 '-'代表普通文件 'd'代表目录文件 'l'代表链接文件link 'b'代表块文件block 'c'代表字符设备文件 'p'代表管道文件

  9. Ubuntu上面安装sqlite3可视化数据库软件

    .介绍:sqlite 3是linux上的小巧的数据库,一个文件就是一个数据库. 2.安装:要安装sqlite 3,可以在终端提示符后运行下列命令: sudo apt-get install sqlit ...

  10. 《Java基础知识》Java访问修饰符(访问控制符)

    Java 通过修饰符来控制类.属性和方法的访问权限和其他功能,通常放在语句的最前端.例如: public class className { // body of class } private bo ...