【问题标题】:Dynamics crm rest builder query for many to many relationshipDynamics crm rest builder查询多对多关系
【发布时间】:2017-06-09 11:57:39
【问题描述】:

我需要根据所选帐户和业务部门在 crm 中设置合同查找字段。这是 crm 中的多对多关系。我能想到的最好方法是创建 2 个查询/api 调用(使用 crm rest builder),以便能够根据标准执行此操作。第一个查询访问相交表(account-contract 表)以返回基于帐户的所有合约,秒需要通过循环遍历第一个查询的所有结果并计算所有合约来进一步过滤结果与所选的业务单位相匹配。我现在遇到的问题是,我使用一个数组来推送第一个查询中的所有值,以便能够在第二个查询中循环。但是我创建的数组没有到达 for 循环,因此第二个查询没有执行

function populateContractLookup() {
    var buisnessUnitId = getFieldValue("hc_businessunit");
    var worksiteId = getFieldValue("hc_worksite")[0].id;
    worksiteId = stripCurlies(worksiteId);


    if (buisnessUnitId != null) {
        buisnessUnitId = stripCurlies(buisnessUnitId[0].id);
        var condition = "_hc_businessunit_value eq " + buisnessUnitId + " and";

    }
    else {
        condition = "";
    }//to be able to count the how many contracts that would hav gotten populated to contract lookup field
    var validcontractid;
    var contractCount = 0;
    var contractArray = [];
    //this query gets all contracts based on account
    var req = new XMLHttpRequest();
    req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v8.2/hc_account_contractset?$select=contractid&$filter=accountid eq " + worksiteId, true);
    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 results = JSON.parse(this.response);
               // Xrm.Utility.alertDialog(results.value.length);

                for (var i = 0; i < results.value.length; i++) {
                    var contractid = results.value[i]["contractid"];
                   // Xrm.Utility.alertDialog(contractid);
                    contractArray.push(contractid);


                }
            } else {
                Xrm.Utility.alertDialog(this.statusText);
            }
        }// Xrm.Utility.alertDialog(contractArray.length) prints to the screen here
    };
    req.send();
    //query to furthr filter the above query to get all contracts based on the buisness unit

    //Xrm.Utility.alertDialog(contractArray.length);//not printing to screen
    for (var i = 0; i < contractArray.length; i++) {

        Xrm.Utility.alertDialog("were in the loop"); //not reaching this loop
        var req = new XMLHttpRequest();
        req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v8.2/contracts?$select=contractid&$filter=contractid eq " + contractArray[i] + " and  _hc_businessunit_value eq " + buisnessUnitId, true);
        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 results = JSON.parse(this.response);
                    Xrm.Utility.alertDialog(results.value.length);
                    for (var i = 0; i < results.value.length; i++) {
                        contractCount++;
                    }
                } else {
                    Xrm.Utility.alertDialog(this.statusText);
                }
            }
        };
        req.send();
    }
}

.任何关于为什么我无法访问我的数组的想法?

【问题讨论】:

    标签: javascript dynamics-crm crm microsoft-dynamics


    【解决方案1】:

    您的第一个请求是异步的。第一个req.send() 之后的代码会立即执行,而您需要在执行任何其他代码之前返回第一个请求的结果。

    因此,您需要将第二个请求(取决于第一个请求的结果)包装到一个回调函数中。然后在第一个请求的成功回调中调用此回调函数。

    有关回调函数的信息,请参阅this StackOverflow answer

    顺便说一句,您的第二个请求将不起作用。您正在尝试对检索到的每个合同执行一次请求。您要做的是通过迭代 contractArray 数组并编写 '(contractid eq ' + contractArray[i] + ') or' //... 来构建您的 OData 过滤器

    另外,考虑使用FetchXML aggregate 来计算记录。


    您的代码可能如下所示:

    var buisnessUnitId = getFieldValue("hc_businessunit");
    var worksiteId = getFieldValue("hc_worksite")[0].id;
    
    function populateContractLookup() {        
        worksiteId = stripCurlies(worksiteId);
    
        if (buisnessUnitId != null) {
            buisnessUnitId = stripCurlies(buisnessUnitId[0].id);
            var condition = "_hc_businessunit_value eq " + buisnessUnitId + " and";
        }
        else {
            condition = "";
        }//to be able to count the how many contracts that would hav gotten populated to contract lookup field
        var validcontractid;
        var contractCount = 0;
        var contractArray = [];
        //this query gets all contracts based on account
        var req = new XMLHttpRequest();
        req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v8.2/hc_account_contractset?$select=contractid&$filter=accountid eq " + worksiteId, true);
        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 results = JSON.parse(this.response);
                   // Xrm.Utility.alertDialog(results.value.length);
    
                    for (var i = 0; i < results.value.length; i++) {
                        var contractid = results.value[i]["contractid"];
                        // Xrm.Utility.alertDialog(contractid);
                        contractArray.push(contractid);                        
                    }
                    // Call your callback function.
                    countContracts(contractArray);
                } else {
                    Xrm.Utility.alertDialog(this.statusText);
                }
            }// Xrm.Utility.alertDialog(contractArray.length) prints to the screen here
        };
        req.send();
    }    
    

    你的回调函数(尽管正如我上面提到的,这需要重写):

    function countContracts(contractArray) {
        for (var i = 0; i < contractArray.length; i++) {
            Xrm.Utility.alertDialog("were in the loop"); //not reaching this loop
            var req = new XMLHttpRequest();
            req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v8.2/contracts?$select=contractid&$filter=contractid eq " + contractArray[i] + " and  _hc_businessunit_value eq " + buisnessUnitId, true);
            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 results = JSON.parse(this.response);
                        Xrm.Utility.alertDialog(results.value.length);
                        for (var i = 0; i < results.value.length; i++) {
                            contractCount++;
                        }
                    } else {
                        Xrm.Utility.alertDialog(this.statusText);
                    }
                }
            };
            req.send();
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以尝试通过更改下面的标志来将第一次调用切换为同步调用,结果将在第二次调用之前立即可用。

      req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v8.2/hc_account_contractset?$select=contractid&$filter=accountid eq " + worksiteId, false);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-03
        • 2018-11-02
        • 2015-10-26
        • 2011-08-08
        • 2015-05-29
        • 2019-10-28
        • 2019-01-31
        相关资源
        最近更新 更多