我怎么能为CRM 2011 UR 12重制FetchUtil.js

时间:2013-03-02 22:37:51

标签: javascript dynamics-crm-2011 crm fetchxml

我必须重新制作FetchUtil.js才能在CRM 2011 UR 12中使用它。我的javascript不是很好,所以我需要一些帮助。

这是本机代码

 var sFetchResult = xmlhttp.responseXML.selectSingleNode("//a:Entities").xml;
 var resultDoc = new ActiveXObject("Microsoft.XMLDOM");
 resultDoc.async = false;
 resultDoc.loadXML(sFetchResult);

它现在甚至在IE中都不起作用,因为.selectSingleNode(“// a:Entities”)。xml 我是这样做的,但那里没有xml字段。

sFetchResult = xmlhttp.responseXML.getElementsByTagName('a:Entities')[0].xml;
    var resultDoc = new ActiveXObject("Microsoft.XMLDOM");
    resultDoc.async = false;
    resultDoc.loadXML(sFetchResult);

帮我为IE和Chrome重新制作这个。 非常感谢!

3 个答案:

答案 0 :(得分:2)

这是我的调用模块(包含为webresource)

(function (module, undefined) {

    module.buildFetchRequest = function (fetch) {
        /// <summary>
        /// builds a properly formatted FetchXML request
        /// based on Paul Way's blog post "Execute Fetch from JavaScript in CRM 2011"
        /// http://blog.customereffective.com/blog/2011/05/execute-fetch-from-javascript-in-crm-2011.html
        /// </summary>
        var request = "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">";
        request += "<s:Body>";

        request += '<Execute xmlns="http://schemas.microsoft.com/xrm/2011/Contracts/Services">' +
            '<request i:type="b:RetrieveMultipleRequest" ' +
            ' xmlns:b="http://schemas.microsoft.com/xrm/2011/Contracts" ' +
            ' xmlns:i="http://www.w3.org/2001/XMLSchema-instance">' +
            '<b:Parameters xmlns:c="http://schemas.datacontract.org/2004/07/System.Collections.Generic">' +
            '<b:KeyValuePairOfstringanyType>' +
            '<c:key>Query</c:key>' +
            '<c:value i:type="b:FetchExpression">' +
            '<b:Query>';

        request += CrmEncodeDecode.CrmXmlEncode(fetch);

        request += '</b:Query>' +
            '</c:value>' +
            '</b:KeyValuePairOfstringanyType>' +
            '</b:Parameters>' +
            '<b:RequestId i:nil="true"/>' +
            '<b:RequestName>RetrieveMultiple</b:RequestName>' +
            '</request>' +
            '</Execute>';

        request += '</s:Body></s:Envelope>';
        return request;
    };

    module.sendFetchQuery = function (fetchRequest, doneCallback, failCallback) {
        //path to CRM root
        var server = window.location.protocol + "//" + window.location.host;

        //full path to CRM organization service - you may need to modify this depending on your particular situation
        var path = server + "/XRMServices/2011/Organization.svc/web";

        $.ajax({
            type: "POST",
            dataType: 'xml',
            async: false,
            contentType: "text/xml; charset=utf-8",
            processData: false,
            url: path,
            data: fetchRequest,
            beforeSend: function (xhr) {
                xhr.setRequestHeader(
                    "SOAPAction",
                    "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute"
                ); //without the SOAPAction header, CRM will return a 500 error
            }
        }).done(doneCallback)
          .fail(failCallback);

    };

}(window.xFetch = window.xFetch || {}));

用法 (解析器需要jQuery ...我在web资源的html页面中进行了大部分的fetch调用,所以这不是问题)这适用于IE浏览器并且Chrome没有检查firefox但是我不明白为什么它不会'工作。

   var fetchXml =
                xFetch.buildFetchRequest("<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>" +
                    "   <entity name='ENTITYNAME'>" +
                    "    <attribute name='ATTRIBUTE' />" +
                    "  </entity>" +
                    "</fetch>");

            var entityList = new Array();

            xFetch.sendFetchQuery(fetchXml,
                function (fetchResponse) {

                    // chrome doesn't like the namespaces because of 
                    // selectSingleNode implementations (which make sense btw)
                    // I'll never understand why Microsoft have to pepper their xml 
                    // with namespace dross
                    $(fetchResponse).find("a\\:Entity, Entity").each(function () {

                        var entityData = {};

                        $(this).find("a\\:KeyValuePairOfstringanyType, KeyValuePairOfstringanyType").each(function () {
                            var xmlElement = $(this);
                            var key = xmlElement.find("b\\:key, key").text();
                            var value = xmlElement.find("b\\:value, value").text();
                            entityData[key] = value;
                        });

                        //inner loop
                        $(this).find("a\\:KeyValuePairOfstringstring, KeyValuePairOfstringstring").each(function () {
                            var xmlElement = $(this);
                            var key = xmlElement.find("b\\:key, key").text();
                            var value = xmlElement.find("b\\:value, value").text();
                            entityData[key] = value;
                        });

                        entityList.push(entityData);
                    });

                }, function (jqXhr, textStatus, errorThrown) {
                    // if unsuccessful, generate an error alert message
                });


            for (var i = 0; i < entityList.length; i++) {

                if (entityList[i].ATTRIBUTE === "Yes" ){ 
                   // DO WHATEVER
                }
            }

我只需要使用KeyValuePairOfstringstring和KeyValuePairOfstringanyType的属性,但您可以使用正确的选择器组合解析任何属性

检索到的每个项目

答案 1 :(得分:2)

我遇到了类似的问题,我通过使用以下解决方法解决了这个问题。

var sFetchResult = xmlhttp.response;
var tempresultDoc = new ActiveXObject("Microsoft.XMLDOM");
tempresultDoc.async = false;
tempresultDoc.loadXML(sFetchResult);

//现在我们将拥有XML文件。使用下面的代码从XML获取singleNode。

var resultDoc = new ActiveXObject("Microsoft.XMLDOM");
resultDoc.async = false;
resultDoc.loadXML(tempresultDoc.childNodes[0].selectSingleNode("//a:Entities").xml);

此致 Krutika Suchak

答案 2 :(得分:0)

如果您正在寻找不需要JQuery的版本,以及解析结果的版本,check this out。它不仅包装了FetchXML,还将响应XML解析为JavaScript对象,以便于检索。