8

CRM 2011 SOAP Web サービスJavaScriptを使用して、CRM 2011 環境で FetchXML クエリを実行したいと考えています。

2011 環境でまだ使用可能な 4.0 Web サービスの使用方法を示す、このような記事を多数見つけましたが、これは実行したくありません。

このリンクは、 IOrganizationService.RetrieveMultiple が FetchXML を処理できることを示しているようです。ただし、これにはマネージ コードを使用したくありません。

RetrieveMultiple 関数で何をしたいのかを本質的に示しているこのリンクに出くわしましたが、新しいフィルター式ではなく、作成した既存の FetchXML を渡すことができるようにしたいと考えています。

4

4 に答える 4

7

JavaScript で fetchxml クエリを実行するために、一連のフレームワーク / ライブラリが利用可能です。

コードを手動で記述する代わりに、これらのライブラリは、いくつかの操作を実行して結果にアクセスするための簡単な方法を提供します。ただし、(現在) すべてのライブラリがクロスブラウザーをサポートしているわけではないことを考慮してください (Q2.2012)。

于 2012-05-15T07:51:06.167 に答える
2

この MSDN 記事の「HTTP 要求と応答のサンプルをキャプチャする」セクションでは、マネージ コードから CRM 2011 に送信される SOAP メッセージを取得する方法について概説しています。

この MSDN 記事の「クエリの実行」セクションでは、マネージ コードで 2011 の IOrganizationService.RetrieveMultiple を使用して FetchXML クエリを実行する例を示しています。

これらの両方のサンプルを使用して、FetchXML クエリを含む RetrieveMultiple のサンプル SOAP メッセージを抽出できます。

最初の MSDN 記事の「JScript ライブラリの作成」セクションでは、2011 SOAP エンドポイントに対して JavaScript で実行要求を実行する方法を示しています。この例の Assign SOAP 要求を、マネージ コードの実行から取得した RetrieveMultiple SOAP メッセージに置き換えます。

これにより、2011 SOAP エンドポイントに対して JavaScript で FetchXML 要求を実行できます。

上記の情報を使用して作成した JavaScript ライブラリの一部を次に示します。

(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));
于 2011-05-06T17:52:01.110 に答える
2

Microsoft SDKに投稿したリンクから、ODATA サービスに接続する方法がわかります。既にお気づきかもしれませんが、ODATA ではフェッチを実行できません。

代わりに、SOAP サービス ( /XrmServices/2011/Organization.svc ) を使用し、Retrieve Multiple を使用してフェッチを渡す必要があります。

JavaScript を使用して 2011 サービスを使用する方法の詳細については、次を参照してください

返された XML を解析し、簡単に使用できる JavaScript オブジェクトを構築する別のブログ投稿を次に示します。 inside-javascript.html

2011 組織サービスは、そのリターンがかなり異なるため、4.0 のものからのプラグアンドプレイにはなりません。ただし、2011 エンドポイントには多くの優れた改善点があります。

于 2011-05-07T05:05:06.940 に答える
1

「RESTは、すべてのリソースが一意のURIを使用してアドレス指定されるアーキテクチャスタイルです。」 http://msdn.microsoft.com/en-us/library/gg334279.aspx

FetchXmlを使用する必要がある場合、RESTエンドポイントを使用することはできません。

別の方法は、CRM4の例で見たようにSOAPメッセージを作成することです。私はまだこれを行っていませんが、おそらくFiddlerのようなツールを使用して、SOAPメッセージがどのように見えるかを確認し、変更したFetchXmlを使用した環境でそれらを複製できます。

とにかく、今のところただのアイデア。それがどうなるか教えてください、そしてあなたがそれを解決することができればおそらくあなたの解決策を投稿してください。

于 2011-05-04T00:50:18.433 に答える