Javascript 用于多对多关系的Dynamics crm rest builder查询
我需要根据所选帐户和业务单位在crm中设置合同查找字段。这是crm中的多对多关系。我认为最好的方法是创建2个查询/api调用(使用crm rest builder),以便能够根据条件执行此操作。第一个查询访问intersect表(account contract table),以返回基于帐户的所有合同,秒需要通过循环第一个查询的所有结果进一步过滤结果,并对与所选业务单元匹配的所有合同进行计数。我现在遇到的问题是,我使用一个数组来推送第一个查询中的所有值,以便能够在第二个查询中循环。但是,我创建的数组没有到达for循环,因此第二个查询没有执行Javascript 用于多对多关系的Dynamics crm rest builder查询,javascript,dynamics-crm,crm,microsoft-dynamics,Javascript,Dynamics Crm,Crm,Microsoft Dynamics,我需要根据所选帐户和业务单位在crm中设置合同查找字段。这是crm中的多对多关系。我认为最好的方法是创建2个查询/api调用(使用crm rest builder),以便能够根据条件执行此操作。第一个查询访问intersect表(account contract table),以返回基于帐户的所有合同,秒需要通过循环第一个查询的所有结果进一步过滤结果,并对与所选业务单元匹配的所有合同进行计数。我现在遇到的问题是,我使用一个数组来推送第一个查询中的所有值,以便能够在第二个查询中循环。但是,我创建的
函数populateContractLookup(){
var buisnssunitid=getFieldValue(“hc_业务单元”);
var worksiteId=getFieldValue(“hc_工作站点”)[0].id;
工作站点ID=条带卷曲(工作站点ID);
if(buisnssunitid!=null){
buisnsunitid=stripcullies(buisnsunitid[0].id);
var条件=“\u hc\u businessunit\u value eq”+业务假设+”和”;
}
否则{
条件=”;
}//能够计算将填充到合同查找字段的合同数量
var有效浓度;
var contractCount=0;
var contractArray=[];
//此查询获取基于帐户的所有合同
var req=新的XMLHttpRequest();
请求打开(“GET”,Xrm.Page.context.getClientUrl()+”/api/data/v8.2/hc\u account\u contractset?$select=constractd&$filter=accountid eq“+工作站点ID,true);
请求setRequestHeader(“OData MaxVersion”,“4.0”);
请求setRequestHeader(“OData版本”、“4.0”);
请求setRequestHeader(“接受”、“应用程序/json”);
setRequestHeader(“内容类型”,“应用程序/json;字符集=utf-8”);
req.setRequestHeader(“首选”、“odata.include注释=\”*\”);
req.onreadystatechange=函数(){
if(this.readyState==4){
req.onreadystatechange=null;
如果(this.status==200){
var results=JSON.parse(this.response);
//Xrm.Utility.alertDialog(results.value.length);
对于(var i=0;i }
您的第一个请求是异步的。第一个req.send()
之后的代码将立即执行,而您需要在执行任何其他代码之前返回第一个请求的结果
因此,您需要将依赖于第一个请求结果的第二个请求包装到回调函数中。然后在第一个请求的成功回调中调用此回调函数
有关回调函数的信息,请参阅
顺便说一句,你的第二个请求不起作用。您正在尝试对检索到的每个合同执行一次请求。您要做的是通过迭代contractary
array并写入'(contractedeq'+contractary[i]+')或'/…
另一方面,考虑使用A来计算记录。
您的代码可能如下所示:
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();
}
var buisnessUnitId=getFieldValue(“hc_业务单元”);
var worksiteId=getFieldValue(“hc_工作站点”)[0].id;
函数populateContractLookup(){
工作站点ID=条带卷曲(工作站点ID);
if(buisnssunitid!=null){
buisnsunitid=stripcullies(buisnsunitid[0].id);
var条件=“\u hc\u businessunit\u value eq”+业务假设+”和”;
}
否则{
条件=”;
}//能够计算将填充到合同查找字段的合同数量
var有效浓度;
var contractCount=0;
var contractArray=[];
//此查询获取基于帐户的所有合同
var req=新的XMLHttpRequest();
请求打开(“GET”,Xrm.Page.context.getClientUrl()+”/api/data/v8.2/hc\u account\u contractset?$select=constractd&$filter=accountid eq“+work
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();
}
}
req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v8.2/hc_account_contractset?$select=contractid&$filter=accountid eq " + worksiteId, false);