0

我正在進行服務呼叫以檢索在「商機」表單上選擇帳戶查找的帳戶明細(貨幣,與帳戶相關的折扣)(表單類型= = 1 //創建)使用Web API in CRM 2016 On-Premise。一切工作正常,但機會最初保存時,它是馬上想出未保存的更改保存按鈕旁邊的初始保存後,迫使我做另一個保存(異常行爲)。我不太確定什麼初始保存後價值正在變化。在動態CRM機會初始保存後,數值似乎發生變化

服務調用是同步的,並且在初始保存之前,正在更改帳戶查找時觸發。任何幫助讚賞!

function SetOpportunityCurrencyAndDiscount(){ 
    var accountId = (GetValue("vm_accountid"))[0].id; 
    var result = RetrieveRecord("account", null, accountId.slice(1,-1)); 
    var accountDiscount = result["vm_accountdiscount"]; 
    var transactionCurrencyId = result["_transactioncurrencyid_value"]; 
    var currencyName = result["[email protected]dValue"]; 
    SetValue("vm_discount", accountDiscount); 
    Xrm.Page.getAttribute("transactioncurrencyid").setValue([{ id: transactionCurrencyId, name: currencyName, entityType: "transactioncurrency"}]); } 

function RetrieveRecord(recordType, alternateKey, accountId){ 
    var result = null; 
    var entityType = recordType; 
    var query = null; 
    if(alternateKey != null && agencyId == null) 
     query = "/api/data/v8.0/accounts(emailaddress1='"+alternateKey+"')?$select=name,accountid,_transactioncurrencyid_value,vm_agencydiscount"; 
    else 
     query = "/api/data/v8.0/accounts("+agencyId+")?$select=name,accountid,_transactioncurrencyid_value,vm_agencydiscount"; 
    var req = new XMLHttpRequest(); 
    req.open("GET", Xrm.Page.context.getClientUrl() + query, false); 
    req.setRequestHeader("OData-MaxVersion", "4.0"); 
    req.setRequestHeader("OData-Version", "4.0"); 
    req.setRequestHeader("Accept", "application/json"); 
    req.setRequestHeader("Content-Type", "application/json; charset=utf-8"); 
    req.setRequestHeader("Prefer", "odata.include-annotations=\"OData.Community.Display.V1.FormattedValue\""); 
    req.onreadystatechange = function() { 
     if (this.readyState === 4) { 
      req.onreadystatechange = null; 
      if (this.status === 200) { 
       result = JSON.parse(this.response); 
      } 
      else { 
       alert(this.statusText); 
      } 
     } 
    }; 
    req.send(); 
    return result; 
} 

回答

3

保存記錄並且窗體再次變髒後,打開開發工具並將其粘貼到控制檯中。它會告訴你哪些字段很髒。

function showDirtyFields() { 
    var Xrm = Array.prototype.slice.call(document.querySelectorAll('iframe')).filter(function(d) { 
     return d.style.visibility !== 'hidden'; 
    })[0].contentWindow.Xrm; 
    var message='The following fields are dirty: \n'; 
    Xrm.Page.data.entity.attributes.forEach(function(attribute,index){ 
     if(attribute.getIsDirty()==true){message+="\u2219 "+attribute.getName()+"\n";} 
    }); 
    Xrm.Utility.alertDialog(message); 
} 
showDirtyFields(); 

完成同樣事情的另一種方法是打開實體審計。審計日誌將顯示哪些字段已提交。

+0

嗨Polshgiant,我試過兩種方式,不幸的是我無法得到骯髒的領域的細節。當我在控制檯上粘貼上面的代碼時:Undefined。當我在所有級別和所有可能的字段上啓用了審計時,我收到了以下消息:由此操作更改的字段未啓用審計跟蹤。如果我禁用Retrieve(服務調用)功能,則這種行爲是正常的。 – Raghu

+0

Xrm.Page.data.entity.getDataXml()如何?這是否顯示你有用的東西?你可以做的另一件事是打開Fiddler檢查第二次保存的流量,看看哪些字段正在提交。 – Polshgiant

+0

感謝Polshgiant !.這是貨幣字段,我正在嘗試更新由於某種原因再次更新。 – Raghu