Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Dynamics CRM Sdk.ExecuteMultiple.js响应项都具有相同的id_Javascript_Jquery_Soap_Dynamics Crm - Fatal编程技术网

Javascript Dynamics CRM Sdk.ExecuteMultiple.js响应项都具有相同的id

Javascript Dynamics CRM Sdk.ExecuteMultiple.js响应项都具有相同的id,javascript,jquery,soap,dynamics-crm,Javascript,Jquery,Soap,Dynamics Crm,我正在使用现代SOAP端点和Sdk.SOAP.js和Sdk.ExecuteMultiple.js来执行来自Javascript的大量创建请求。一切都正常,除了当我返回响应项时,它会为每个响应项注销相同的id。我不知道如何从响应项中获取ID。在底部,在我注销id的地方,我会一次又一次地注销相同的id。然而,所有的记录都会被创建,并且它们都有唯一的ID。不确定如何获取所有响应ID。这是我的密码: createOpportunities = function(data) { var creat

我正在使用现代SOAP端点和Sdk.SOAP.js和Sdk.ExecuteMultiple.js来执行来自Javascript的大量创建请求。一切都正常,除了当我返回响应项时,它会为每个响应项注销相同的id。我不知道如何从响应项中获取ID。在底部,在我注销id的地方,我会一次又一次地注销相同的id。然而,所有的记录都会被创建,并且它们都有唯一的ID。不确定如何获取所有响应ID。这是我的密码:

createOpportunities = function(data) {
    var createRequest = new Sdk.Collection(Sdk.OrganizationRequest);
    var requestSettings = new Sdk.ExecuteMultipleSettings(true,true);
    var pricelevel = {
      'id': $("#season").find(':selected').data('pricelevelid'),
      'name': $("#season").find(':selected').text()
    };
    var stage = {
        'id': $("#stage").find(':selected').data('stageid'),
        'name': $("#stage").find(':selected').text()
    };
    var product = {
        'id': $("#product").find(':selected').data('productid'),
        'name': $("#product").find(':selected').text()
    };
    var source = {
        'id': $("#source").find(':selected').data('sourceid'),
        'name': $("#source").find(':selected').text()
    };

    data.forEach(function(d,i){
        var Opportunity = new Sdk.jms_opportunity();
        Opportunity.JMS_ContactId.setValue(new Sdk.EntityReference('contact', d.contactid));
        Opportunity.OwnerId.setValue(new Sdk.EntityReference('systemuser', d.ownerid.getId()));
        Opportunity.JMS_pricelevelid.setValue(new Sdk.EntityReference('JMS_pricelevel', pricelevel.id));
        Opportunity.JMS_stageid.setValue(new Sdk.EntityReference('str_ticketstage', stage.id));
        Opportunity.JMS_ProductId.setValue(new Sdk.EntityReference('JMS_product', product.id));
        Opportunity.JMS_sourceid.setValue(new Sdk.EntityReference('jms_source', source.id));
        createRequest.add(new Sdk.CreateRequest(Opportunity));
    });

    var request = new Sdk.ExecuteMultipleRequest(createRequest, requestSettings);

    Sdk.jQ.execute(request).done(function(resp) {
        var responses = resp.getResponses();
        responses.forEach(function(responseItem) {
            var id = responseItem.getResponse().getId();
            console.log(id);
        });
    }).fail(function(error) {
        console.log(error);
    });

};
编辑

在做了更多的调试之后,响应主体将返回正确的guid,但是当解析响应时,每次解析函数循环时都会添加相同的guid…这就是我遇到的问题

答复机构:

<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">
  <s:Body>
    <ExecuteResponse xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\">
      <ExecuteResult xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">
        <a:ResponseName>ExecuteMultiple</a:ResponseName>
        <a:Results xmlns:b=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">
          <a:KeyValuePairOfstringanyType>
            <b:key>IsFaulted</b:key>
            <b:value i:type=\"c:boolean\" xmlns:c=\"http://www.w3.org/2001/XMLSchema\">false</b:value>
          </a:KeyValuePairOfstringanyType>
          <a:KeyValuePairOfstringanyType>
            <b:key>Responses</b:key>
            <b:value i:type=\"c:OrganizationResponseCollection\" xmlns:c=\"http://schemas.microsoft.com/xrm/2012/Contracts\">
              <c:ExecuteMultipleResponseItem>
                <c:Fault i:nil=\"true\"/>
                <c:RequestIndex>0</c:RequestIndex>
                <c:Response>
                  <a:ResponseName>Create</a:ResponseName>
                  <a:Results>
                    <a:KeyValuePairOfstringanyType>
                      <b:key>id</b:key>
                      <b:value i:type=\"d:guid\" xmlns:d=\"http://schemas.microsoft.com/2003/10/Serialization/\">df07d3fb-862c-e511-bdfe-00155d01050d</b:value>
                    </a:KeyValuePairOfstringanyType>
                  </a:Results>
                </c:Response>
              </c:ExecuteMultipleResponseItem>
              <c:ExecuteMultipleResponseItem>
                <c:Fault i:nil=\"true\"/>
                <c:RequestIndex>1</c:RequestIndex>
                <c:Response>
                  <a:ResponseName>Create</a:ResponseName>
                  <a:Results>
                    <a:KeyValuePairOfstringanyType>
                      <b:key>id</b:key>
                      <b:value i:type=\"d:guid\" xmlns:d=\"http://schemas.microsoft.com/2003/10/Serialization/\">e107d3fb-862c-e511-bdfe-00155d01050d</b:value>
                    </a:KeyValuePairOfstringanyType>
                  </a:Results>
                </c:Response>
              </c:ExecuteMultipleResponseItem>
            </b:value>
          </a:KeyValuePairOfstringanyType>
        </a:Results>
      </ExecuteResult>
    </ExecuteResponse>
  </s:Body>
</s:Envelope>

parseResponse函数是设置相同guid的地方,但我对解析xml了解不够,无法知道这可能会出错

this.ExecuteMultipleResponse = function (responseXml) {
  ///<summary>
  /// Response to ExecuteMultipleRequest
  ///</summary>
  if (!(this instanceof Sdk.ExecuteMultipleResponse)) {
   return new Sdk.ExecuteMultipleResponse(responseXml);
  }
  Sdk.OrganizationResponse.call(this)

  // Internal properties
  var _isFaulted = null;
  var _responses = null;

  // Internal property setter functions

  function _setIsFaulted(xml) {
   var valueNode = Sdk.Xml.selectSingleNode(xml, "//a:KeyValuePairOfstringanyType[b:key='IsFaulted']/b:value");
   if (!Sdk.Xml.isNodeNull(valueNode)) {
    _isFaulted = (Sdk.Xml.getNodeText(valueNode) == "true") ? true : false;
   }
  }
  function _setResponses(xml) {
   var valueNode = Sdk.Xml.selectSingleNode(xml, "//a:KeyValuePairOfstringanyType[b:key='Responses']/b:value");
   if (!Sdk.Xml.isNodeNull(valueNode)) {
    _responses = parseResponses(valueNode);
   }
  }

  function parseResponses(xml) {
   //Using Sdk.Collection rather than create a new class for Microsoft.Xrm.Sdk.ExecuteMultipleResponseItemCollection
   var rv = new Sdk.Collection(Sdk.ExecuteMultipleResponseItem);
   for (var i = 0; i < xml.childNodes.length; i++) {
    var emri = new Sdk.ExecuteMultipleResponseItem();

    emri.setRequestIndex(parseInt(Sdk.Xml.selectSingleNodeText(xml.childNodes[i], "l:RequestIndex"), 10));

    var faultNode = Sdk.Xml.selectSingleNode(xml.childNodes[i], "l:Fault");
    if (!Sdk.Xml.isNodeNull(faultNode)) {
     emri.setFault(new Sdk.ExecuteMultipleFault(faultNode));
    }
    else {
     var responseName = Sdk.Xml.selectSingleNodeText(xml.childNodes[i], "l:Response/a:ResponseName") + "Response";
     var responseXml = Sdk.Xml.selectSingleNode(xml.childNodes[i], "l:Response/a:Results");
     emri.setResponse(new Sdk[responseName](responseXml));
    }
    rv.add(emri);
   }
   return rv;
  }
this.ExecuteMultipleResponse=函数(responseXml){
///
///对ExecuteMultipleRequest的响应
///
if(!(此实例为Sdk.ExecuteMultipleResponse)){
返回新的Sdk.ExecuteMultipleResponse(responseXml);
}
Sdk.OrganizationResponse.call(此)
//内部属性
var _isFaulted=null;
var_响应=null;
//内部属性设置器函数
函数_setIsFaulted(xml){
var-valueNode=Sdk.Xml.selectSingleNode(Xml,“//a:KeyValuePairOfstringanyType[b:key='IsFaulted']/b:value”);
如果(!Sdk.Xml.isNodeNull(valueNode)){
_isFaulted=(Sdk.Xml.getNodeText(valueNode)=“true”)?true:false;
}
}
函数_setResponses(xml){
var valueNode=Sdk.Xml.selectSingleNode(Xml,“//a:KeyValuePairOfstringanyType[b:key='Responses']/b:value”);
如果(!Sdk.Xml.isNodeNull(valueNode)){
_响应=解析响应(valueNode);
}
}
函数解析响应(xml){
//使用Sdk.Collection而不是为Microsoft.Xrm.Sdk.ExecuteMultipleResponseItemCollection创建新类
var rv=新的Sdk.Collection(Sdk.ExecuteMultipleResponseItem);
for(var i=0;i
我是Sdk.Soap.js库的作者,我可以重新编写您看到的内容。 您应该能够通过编辑Sdk.ExecuteMultiple.js文件中的parseResponses函数来修复此问题。替换下面的注释行,使其包含
.cloneNode(true)

问题在于,当节点传递给Sdk.CreateResponse的构造函数时,整个xml文档被传递,并且当使用以下方法对其进行计算时:
Sdk.xml.selectSingleNode(xml,“//a:KeyValuePairOfstringanyType[b:key='id']/b:value”);
这会找到整个文档的第一个实例,而不仅仅是指定的子节点


使用cloneNode似乎可以解决这个问题,但我没有在IE以外的浏览器上进行任何测试。如果您发现其他浏览器存在问题,请告诉我。

您是否尝试调试responseItem的其他属性,可能您使用了错误的函数。是的,没有找到任何其他函数。我将.forEach更改为:
,用于(var i=0;i
我仍然得到相同的id。它会迭代,但看起来响应只是具有相同的id。我自己没有使用该库,所以在这里猜测。id是否与记录id匹配?可能是表示响应的id,而不是其中的记录。也许你应该尝试访问属性集合,它可能具有e id也是。例如,xxx_entityided添加了更多信息…开始认为问题出在Sdk.ExecuteMultiple.js库中,特别是parseResponse函数中。吉姆,谢谢!我在Chrome中验证了它的有效性…我很快会查看FireFox。我已经尝试解决这个问题一个月了,很高兴有一个解决方案…再次感谢!!
//var responseXml = Sdk.Xml.selectSingleNode(xml.childNodes[i], "l:Response/a:Results");
var responseXml =   Sdk.Xml.selectSingleNode(xml.childNodes[i].cloneNode(true), "l:Response/a:Results");