2015-05-27 65 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; 
     }       
    } 
} 
相關問題