2015-05-27 40 views
0

我不认为这会发生在我身上,但它所做的:在更新CRM在线2013

我调试/测试我的质量更新控制台应用程序,该程序成功终止后,我意识到,在我的应用程序配置文件指向生产环境,而不是测试环境。说了这么多,大约有200个联系人的信息偏离了轨道。谢天谢地,虽然我只是更新文本字段而不是查找字段。有一个审计日志打开的联系人,所以我可以看到确切的领域被改变。

这可能不是编程相关的问题,但有什么方法可以从审核日志“回滚”这些更新吗?如果不是直接从用户界面,你有没有做过类似的代码?我可以使用“修改日期”和“修改者”信息轻松找到这些联系人。我可以以某种方式检索这些联系人的审计日志,并比较旧值和新值,并在必要时回滚旧值?

+0

,据我所知没有办法做一个自动回滚并且我没有看到周围的工具来帮助你解决这个问题。然而,编写一些代码,将检查审计和恢复值是可能的 –

+0

我发现这个(https://msdn.microsoft.com/en-us/library/gg309735.aspx),我能够创建一个程序,可以读取审计日志并检索旧值。我将在稍后发布我的代码以帮助其他可能面临相同情况的人员。真是一团糟。我也跑到这个(https://crm2013auditundo.codeplex.com/),但在我的情况下,我需要更快的东西。 – kivikall

回答

0

正如我所承诺的,这里的代码为我工作。它对我来说很有效,因为我知道在我的批量更新程序之后没有更新。如果我不知道额外的检查是必要的。不管怎么说,希望这有助于

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; 
     }       
    } 
} 
相关问题