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

时间:2015-05-27 11:15:06

标签: dynamics-crm-2011 dynamics-crm dynamics-crm-2013

我认为这不会发生在我身上,但确实如此:

我正在调试/测试我的批量更新程序控制台应用程序,在程序成功终止后,我意识到在我的应用程序配置文件中它指向的是生产环境,而不是测试环境。说完了,大约200个联系人的信息有点偏离轨道。值得庆幸的是,我只是更新文本字段而不是查找字段。已为联系人启用了审核日志,因此我可以看到已更改的确切字段。

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

1 个答案:

答案 0 :(得分: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;
        }                        
    }
}