Comment exécuter FetchXML dans CRM 2011 en utilisant un service Web CRM 2011 et JavaScript?

Je souhaite exécuter des requêtes FetchXML dans un environnement CRM 2011 à l'aide des services Web de CRM 2011 SOAP et JavaScript .

J'ai trouvé un certain nombre d'articles comme celui-ci montrant comment utiliser le service Web 4.0 qui est encore disponible dans l'environnement 2011, mais je ne veux pas le faire.

Ce lien semble indiquer que IOrganizationService.RetrieveMultiple peut gérer FetchXML. Cependant, je ne veux pas utiliser de code géré pour cela.

J'ai rencontré ce lien qui montre essentiellement ce que je veux faire dans la fonction RetrieveMultiple, mais je veux pouvoir passer dans FetchXML existant que j'ai écrit, pas une nouvelle expression de filtre.

    Pour exécuter les requêtes fetchxml avec JavaScript, un tas de frameworks / bibliothèques sont disponibles:

    • XrmSvcToolkit
    • XrmServiceToolkit
    • CrmFetchKit.js

    Au lieu d'écrire le code à la main, ces bibliothèques fournissent un moyen simple d'effectuer plusieurs opérations et d'accéder aux résultats. Mais prenez en compte que toutes les bibliothèques (actuellement) ne prennent pas en charge le navigateur croisé (Q2.2012).

    À partir du lien que vous avez posté sur le SDK de Microsoft , vous verrez comment vous connecter au service ODATA. Comme vous l'avez peut-être déjà trouvé, ODATA ne vous permet pas d'exécuter l'extraction.

    Au lieu de cela, vous devrez utiliser le service SOAP ( /XrmServices/2011/Organization.svc ) et passer votre récupération en utilisant Récupérer plusieurs.

    Voici un aperçu plus détaillé de l'utilisation du service 2011 via JavaScript: http://blog.customereffective.com/blog/2011/05/execute-fetch-from-javascript-in-crm-2011.html

    Voici une autre publication du blog qui analyse le XML renvoyé et crée un objet JavaScript facilement consommable: http://blog.customereffective.com/blog/2011/05/parsing-and-consuming-the-crm-2011-soap-service- Inside-javascript.html

    Le Service d'organisation 2011 est tout à fait différent dans son retour, donc il ne sera pas plug-n-play à partir de vos 4.0 choses; Cependant, le point final 2011 a beaucoup d'améliorations.

    La section «Demande de demande de capture d'échantillons et réponse» de cet article MSDN décrit comment obtenir un message SOAP qui est envoyé à CRM 2011 à partir du code managé.

    La section "Exécuter la requête" de cet article MSDN donne un exemple d'utilisation de IOrganizationService.RetrieveMultiple 2011 dans le code managé pour exécuter une requête FetchXML.

    À l'aide de ces deux exemples, vous pouvez extraire un exemple de message SOAP pour RetrieveMultiple qui contient une requête FetchXML.

    La section "Créer une bibliothèque JScript" du premier article MSDN montre comment effectuer une requête Execute en JavaScript par rapport au point final SOAP 2011. Remplacez la requête ASSign SOAP dans cet exemple par le message SOAP RetrieveMultiple que vous obtenez d'exécuter le code managé.

    Cela vous permet d'exécuter une requête FetchXML en JavaScript par rapport au point final SOAP 2011.

    Voici quelques extraits d'une bibliothèque de JavaScript que j'ai écrit en utilisant les informations ci-dessus:

    (function (window, undefined) { var _window = undefined; if (window.Xrm) _window = window; else if (window.parent.Xrm) _window = window.parent; else throw new Error("Unable to determine proper window"); (function (Crm) { (function (Service, $, JSON, Xrm) { if (!Xrm) throw new Error("Unable to locate Xrm"); if (!JSON) throw new Error("Unable to locate JSON"); if (!$) throw new Error("Unable to locate jQuery"); Service.Create = function (ODataSetName, EntityObject) { if (!EntityObject) { throw new Error("EntityObject is a required parameter"); return; } if (!ODataSetName) { throw new Error("ODataSetName is a required parameter"); return; } var jsonEntityObject = JSON.stringify(EntityObject); var req = new XMLHttpRequest(); req.open("POST", Service.GetODataEndPoint() + "/" + ODataSetName, false); req.setRequestHeader("Accept", "application/json"); req.setRequestHeader("Content-Type", "application/json; charset=utf-8"); req.onreadystatechange = function () { debuggingCallBack(this); }; req.send(jsonEntityObject); }; function debuggingCallBack(req) { if (req.readyState == 4 /* complete */) { if (req.status == 201 || req.status == 204 || req.status == 1223) { //Success //201 = create //204 = update //1223 = delete } else { //Failure debugger; } } }; Service.Fetch = function (FetchXML) { var request = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"; request += "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">"; request += "<s:Body>"; request += "<RetrieveMultiple xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">"; request += "<query i:type=\"a:FetchExpression\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\">"; request += "<a:Query>"; request += Service.FetchEncode(FetchXML); request += "</a:Query>"; request += "</query>"; request += "</RetrieveMultiple>"; request += "</s:Body>"; request += "</s:Envelope>"; var req = new XMLHttpRequest(); req.open("POST", Service.GetSOAPEndPoint(), false) req.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/RetrieveMultiple"); req.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); req.setRequestHeader("Content-Length", request.length); req.send(request); results = Service.GetResults(req.responseXML); return results; }; Service.Delete = function (ODataSetName, EntityID) { if (!EntityID) { throw new Error("EntityID is a required parameter"); return; } if (!ODataSetName) { throw new Error("ODataSetName is a required parameter"); return; } var req = new XMLHttpRequest(); req.open("POST", Service.GetODataEndPoint() + "/" + ODataSetName + "(guid'" + EntityID + "')", false) req.setRequestHeader("Accept", "application/json"); req.setRequestHeader("Content-Type", "application/json; charset=utf-8"); req.setRequestHeader("X-HTTP-Method", "DELETE"); req.onreadystatechange = function () { debuggingCallBack(this); }; req.send(); }; Service.GetServerUrl = function () { var serverUrl = null; serverUrl = Xrm.Page.context.getServerUrl(); if (serverUrl.match(/\/$/)) { serverUrl = serverUrl.substring(0, serverUrl.length - 1); } return serverUrl; }; Service.GetODataEndPoint = function () { return Service.GetServerUrl() + "/XRMServices/2011/OrganizationData.svc"; }; Service.GetSOAPEndPoint = function () { return Service.GetServerUrl() + "/XRMServices/2011/Organization.svc/web"; }; Service.GetResults = function (responseXML) { var sFetchResult = responseXML.selectSingleNode("//RetrieveMultipleResult").xml; var oResultDoc = new ActiveXObject("Microsoft.XMLDOM"); oResultDoc.async = false; oResultDoc.loadXML(sFetchResult); var oResults = new Array(oResultDoc.firstChild.firstChild.childNodes.length); var iLen = oResultDoc.firstChild.firstChild.childNodes.length; for (var i = 0; i < iLen; i++) { var oResultNode = oResultDoc.firstChild.firstChild.childNodes[i]; var oBE = new BusinessEntity(oResultNode.selectSingleNode("//a:LogicalName").text); var iLenInner = oResultNode.firstChild.childNodes.length; for (var j = 0; j < iLenInner; j++) { var oRA = new Object(); var value = null; if (oResultNode.firstChild.childNodes[j].lastChild.childNodes.length == 3) { if (oResultNode.firstChild.childNodes[j].lastChild.getElementsByTagName("a:Id").length == 1) value = oResultNode.firstChild.childNodes[j].lastChild.getElementsByTagName("a:Id")[0].text; if (oResultNode.firstChild.childNodes[j].lastChild.getElementsByTagName("a:Value").length == 1) value = oResultNode.firstChild.childNodes[j].lastChild.getElementsByTagName("a:Value")[0].text; } if (!value) value = oResultNode.firstChild.childNodes[j].lastChild.text; oRA["value"] = value; oBE.attributes[oResultNode.firstChild.childNodes[j].firstChild.firstChild.text] = oRA; } oResults[i] = oBE; } return oResults; }; Service.BusinessEntity = function BusinessEntity(sName) { this.name = sName; this.attributes = new Object(); }; Service.FetchEncode = function (FetchXML) { var c; var HtmlEncode = ''; if (FetchXML == null) { return null; } if (FetchXML == '') { return ''; } for (var cnt = 0; cnt < FetchXML.length; cnt++) { c = FetchXML.charCodeAt(cnt); if (((c > 96) && (c < 123)) || ((c > 64) && (c < 91)) || (c == 32) || ((c > 47) && (c < 58)) || (c == 46) || (c == 44) || (c == 45) || (c == 95)) { HtmlEncode = HtmlEncode + String.fromCharCode(c); } else { HtmlEncode = HtmlEncode + '&#' + c + ';'; } } return HtmlEncode; }; } (Crm.Service = Crm.Service || {}, _window.jQuery, _window.JSON, _window.Xrm)); } (_window.Crm = _window.Crm || {})); } (window)); 

    "REST est un style architectural dans lequel chaque ressource est résolue en utilisant un URI unique". http://msdn.microsoft.com/en-us/library/gg334279.aspx

    Vous ne pourrez pas utiliser le point final REST si vous devez utiliser FetchXml.

    L'alternative est de construire un message SOAP comme vous l'avez vu dans vos exemples CRM4. Je ne l'ai pas encore fait, mais peut-être que vous pourriez utiliser un outil comme Fiddler pour voir à quoi ressemble le message SOAP afin que vous puissiez les reproduire dans votre environnement, votre FetchXml modifié.

    De toute façon, juste une idée pour l'instant. Permettez-moi de savoir comment cela se passe, et si vous parvenez à le résoudre, posez peut-être votre solution.