使用调用 HTTPRequest 的 FetchXml 查询检索 CRM Dynamics 365 版本 8.2 中的多条记录,但 HTTPRequest 将不起作用

Retrieve multiple records in CRM Dynamics 365 version 8.2 using FetchXml query calling HTTPRequest but HTTPRequest will not work

例如,在一个表单上有两个字段 new_paymenttypeid 和 new_revenueid(这些是它们的 id's/field 名称) 我正在为他们创建一个委托,因为每次他们更改时我希望他们将它们加在一起并将其存储在局部变量中。

Total = Attribute["new_paymenttypeid"].getValue() + Attribute["new_revenueid"].getValue()

Xrm.Page.getAttribute("new_paymenttypeid").addOnChange(PaymentTypeDependency);  
Xrm.Page.getAttribute("new_revenueid").addOnChange(RevenueTypeDependency);

我使用 FetchXml 从下面的方法中读取了 TotalRevenue 的值 在父案例下可能有许多包含 TotalRevenue 的记录。 我正在尝试从下面的 FetchXml 中执行 RertriveAllREcords。然后从 SUM(new_paymenttypeid + new_revenueid) 中减去 SUM(TotalRevenue) 并将其存储在另一种形式的字段中。该进程将从其他表单 运行 作为 javascript 在 change/on save/on 加载。但它就是行不通。 我们正在使用 Dynamics 365 版本 8.2。由于它,我陷入了 CalculateSurplusdeficit 方法。 我打算使用 XMLHttpRequest API。如果你能通过向我展示如何使用下面的查询 (fetchXml) 检索多条记录并创建处理程序来指导我,以便在我将数据输入到这些文本框中时它们会在更改时被触发,以便它们可以将数字相加那些盒子。并在保存时从 Totapplicationtotalrevenue 中减去添加的数字,并使用该值在此实体表单上设置一个字段。

function CalculateSurplusDeficit()
{
    var caseId = Xrm.Page.data.entity.getId(); // case guid 
 //var grantYearLookup = Xrm.Page.getAttribute("new_grantyear").getValue();
//Retrieve Account Names whose Account Name Starts with word "M" using WEB API
//Step-1 : create fetch xml in adv find and replace all double quotes with single quote inside properties to shape it as a string
         var fetchXml = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'> " +
      "<entity name='new_applicationrevenue'> " +
       " <attribute name='new_applicationtotalrevenue' /> " +
       " <attribute name='new_grantyear' /> " +  
       " <order attribute='title' descending='false' /> " +
       " <filter type='and'> " +
       "   <condition attribute='new_parentcase' operator='eq' uitype='incident' value='{'" + caseId  + "}' />  " +    
       " </filter> " +
      " </entity> " +
    "</fetch> " ;
//Step-2 : encode URI : var encodedFetchXML = encodeURI(fetchxml)
    var encodedFetchXML = encodeURI(fetchXml);
    
    var data = {
            "EntityId": caseId
        };

    //Step-3 : create a query path with query and odata partial uurl : var query = "/api/data/v8.0/accounts?fetchXml="+encodedFetchXML ;
    var query = "/api/data/v8.2/Revenue?fetchXml=" + encodedFetchXML;

    //Step-4 : create complete path : var path = Xrm.Page.context.getClientUrl() + query ;
    var finalpathwithquery = Xrm.Page.context.getClientUrl() + query;

    //Step-5 : create a XmlHttpRequest to retrieve data
    var data = null;
    var isAsync = false;

    var  req = new XMLHttpRequest();

    req.open("POST",finalpathwithquery);
    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=\"*\"");
    req.onreadystatechange = function () {
        if (this.readyState === 4) {
            req.onreadystatechange = null;
            if (this.status === 200) {
                var result = JSON.parse(this.response);
                data = result;
            } 
            else {
                Xrm.Utility.alertDialog(this.statusText);
            }
        }
    };
    req.send();

    //Step-6 show return result values
    var acclist = null;
    for(var i=0;i< data.value.length;i++){ 
        Totapplicationtotalrevenue= Totapplicationtotalrevenue + data.value[i].new_applicationtotalrevenue;         
    }
   

}

下面的一些修改应该可以使它工作。

  1. 实体名称应为复数名称。验证这一点:new_applicationrevenues

    var query = "/api/data/v8.2/new_applicationrevenues?fetchXml=" + encodedFetchXML;

  2. 将请求方法更改为 GET 而不是 POST。调用可以是异步的,所以我保留为 true

    req.open("GET",finalpathwithquery,true);

  3. 将代码移到成功块中

         if (this.status === 200) {
             var result = JSON.parse(this.response);
             data = result;
    
             for(var i=0;i< data.value.length;i++){ 
                  Totapplicationtotalrevenue= Totapplicationtotalrevenue + data.value[i].new_applicationtotalrevenue;         
             }
         }