Dynamics crm 2011 从CRM Online 2013中的审核日志回滚更新

Dynamics crm 2011 从CRM Online 2013中的审核日志回滚更新,dynamics-crm-2011,dynamics-crm,dynamics-crm-2013,Dynamics Crm 2011,Dynamics Crm,Dynamics Crm 2013,我没想到这会发生在我身上,但它确实发生了: 我正在调试/测试我的mass updater控制台应用程序,在程序成功终止后,我意识到在我的应用程序配置文件中,它指向的是生产环境,而不是测试环境。不管怎么说,大约200个联系人的信息有点偏离了轨道。谢天谢地,虽然我只是更新文本字段,而不是查找字段。联系人的审核日志已打开,因此我可以查看更改的确切字段 这可能不是与编程相关的问题,但有没有办法从审核日志中“回滚”这些更新?如果不是直接从UI开始的话,你们有没有人用代码做过类似的事情?我可以使用“修改日期

我没想到这会发生在我身上,但它确实发生了:

我正在调试/测试我的mass updater控制台应用程序,在程序成功终止后,我意识到在我的应用程序配置文件中,它指向的是生产环境,而不是测试环境。不管怎么说,大约200个联系人的信息有点偏离了轨道。谢天谢地,虽然我只是更新文本字段,而不是查找字段。联系人的审核日志已打开,因此我可以查看更改的确切字段


这可能不是与编程相关的问题,但有没有办法从审核日志中“回滚”这些更新?如果不是直接从UI开始的话,你们有没有人用代码做过类似的事情?我可以使用“修改日期”和“修改人”信息轻松找到这些联系人。我是否可以检索这些联系人的审核日志,比较新旧值,并在必要时回滚旧值?

正如我承诺的,以下是适用于我的代码。它对我很有效,因为我知道在我的批量更新程序之后没有更新。如果我不知道额外的检查是必要的。不管怎样,希望这有帮助

SystemUser sysUser=crmProxy.SystemUserSet.Where(su=>su.DomainName==“我的值”).Single();
修改日期时间=新日期时间(2015,5,27);
List contacts=crmProxy.ContactSet.Where(c=>c.ModifiedBy.Id==sysUser.Id&&c.ModifiedOn.Value>=modified).ToList();
foreach(触点中的触点con){
RetrieveRecordChangeHistoryRequest changeRequest=新的RetrieveRecordChangeHistoryRequest();
changeRequest.Target=新的EntityReference(Contact.EntityLogicalName,con.Id);
RetrieveRecordChangeHistoryResponse changeResponse=(RetrieveRecordChangeHistoryResponse)crmProxy.Execute(changeRequest);
AuditDetailCollection details=changeResponse.AuditDetailCollection;
foreach(详细信息中的AttributeAuditDetail详细信息。AuditDetails){
AttributeCollection auditBase=detail.AuditRecord.Attributes;
如果((日期时间)auditBase[“createdon”]>=已修改){
AttributeCollection oldBase=detail.OldValue.Attributes;
AttributeCollection newBase=detail.OldValue.Attributes;
Contact contactToBeRolledBack=new Contact(){Id=con.Id};
if(oldBase.Contains(“firstname”)){
contactToBeRolledBack.FirstName=(字符串)oldBase[“FirstName”];
}else{contactToBeRolledBack.FirstName=“”;}
crmProxy.Update(contactToBeRolledBack);
打破
}                        
}
}

据我所知,没有办法进行自动回滚,而且我也没有找到可以帮助您解决此问题的工具。然而,编写一些代码来检查审计并恢复可能的值我发现了这个()并且我能够创建一个可以读取审计日志和检索旧值的程序。稍后我将在这里发布我的代码,以帮助可能面临相同情况的其他人。真是一团糟。我也运行到这个()但是在我的情况下,我需要更快的东西。
SystemUser sysUser = crmProxy.SystemUserSet.Where(su => su.DomainName == "my-value").Single();
DateTime modified = new DateTime(2015, 5, 27);
List<Contact> contacts = crmProxy.ContactSet.Where(c => c.ModifiedBy.Id == sysUser.Id && c.ModifiedOn.Value >= modified).ToList();
foreach(Contact con in contacts) {

    RetrieveRecordChangeHistoryRequest changeRequest = new RetrieveRecordChangeHistoryRequest();
    changeRequest.Target = new EntityReference(Contact.EntityLogicalName, con.Id);
    RetrieveRecordChangeHistoryResponse changeResponse = (RetrieveRecordChangeHistoryResponse)crmProxy.Execute(changeRequest);                    
    AuditDetailCollection details = changeResponse.AuditDetailCollection;

    foreach (AttributeAuditDetail detail in details.AuditDetails) {
        AttributeCollection auditBase = detail.AuditRecord.Attributes;
        if ((DateTime)auditBase["createdon"] >= modified) {
            AttributeCollection oldBase = detail.OldValue.Attributes;
            AttributeCollection newBase = detail.OldValue.Attributes;

            Contact contactToBeRolledBack = new Contact() { Id = con.Id };
            if (oldBase.Contains("firstname")) {
                contactToBeRolledBack.FirstName = (string)oldBase["firstname"];
            } else { contactToBeRolledBack.FirstName = ""; }

            crmProxy.Update(contactToBeRolledBack);

            break;
        }                        
    }
}