2015-06-16 59 views
0

我正在使用现代SOAP端点和Sdk.Soap.js和Sdk.ExecuteMultiple.js执行一堆来自Javascript的创建请求。一切工作正常,除了当我得到响应项目,它注销每个响应项目相同的ID。我无法弄清楚如何从响应项目中获取id。在底部,我注销ID的位置,我一次又一次地注销了相同的ID。然而,所有的记录都被创建,并且它们都有唯一的ID。不知道如何获得所有的响应id。这里是我的代码:Dynamics CRM Sdk.ExecuteMultiple.js响应项目都具有相同的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> 

在从这里采取微软的Sdk.ExecuteMultiple.js的ExecuteMultipleResponse功能:https://code.msdn.microsoft.com/SdkSoapjs-9b51b99a/sourcecode?fileId=113716&pathId=823928626的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; 
    } 
+0

您是否尝试过调试responseItem的其他属性,也许您使用的是错误的函数。 –

+0

是的,还没有找到任何其他功能。我将.forEach改为:for(var i = 0; i jmsims2

+0

我自己并没有使用这个库,所以在这里猜测。该ID是否与记录ID匹配?也许它是一个代表响应的id而不是其中的记录。也许你应该尝试访问可能具有id的属性集合。例如。 xxx_entityid –

回答

0

我是Sdk.Soap.js库的作者,我可以重新制作你看到的内容。 您应该可以通过编辑Sdk.ExecuteMultiple.js文件中的parseResponses函数来解决此问题。替换下面的注释行,以便包括.cloneNode(true)

//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"); 

的问题是,当节点通过传递给Sdk.CreateResponse的构造,整个XML文档被通过并当它被使用评价:Sdk.Xml.selectSingleNode(xml, "//a:KeyValuePairOfstringanyType[b:key='id']/b:value");此发现整个文档的第一个实例而不仅仅是指定的childNode。

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

+0

吉姆,谢谢!我验证了它在Chrome中的作用...我将尽快检查FireFox。我一直试图找出一个月,很高兴有一个解决方案...再次感谢! – jmsims2