locked
CRM 2011- jscript to revise quote RRS feed

  • Question

  • Hi,

    I'm trying to call script to revise quotation like this:

    crmForm.SubmitCrmForm(QUOTE_CREATE_REVISION_EVENT,true,true,false);

    but I got error, I think it's valid for CRM 4.0


    Sunday, January 26, 2014 2:58 PM

All replies

  • Hi,

    Changing the status of the entity (here is quote) through JavaScript is somehow complicated and you should use SOAP. Have a look at this example.


    Iranian Dynamics CRM Association | انجمن متخصصان ایرانی

    Sunday, January 26, 2014 6:56 PM
    Moderator
  • Hi,

    Use this soap for change the status;

    function ChangeStatus() {
     
     SDK.SAMPLES.SetStateRequest(entityName, entityId, stateValue, StausValue);
     

    }

    if (typeof (SDK) == "undefined")
    { SDK = { __namespace: true }; }
    //This will establish a more unique namespace for functions in this library. This will reduce the
    // potential for functions to be overwritten due to a duplicate name when the library is loaded.
    SDK.SAMPLES = {
        _getServerUrl: function () {
            ///<summary>
            /// Returns the URL for the SOAP endpoint using the context information available in the form
            /// or HTML Web resource.
            ///</summary>
            var OrgServicePath = "/XRMServices/2011/Organization.svc/web";
            var serverUrl = "";
            if (typeof GetGlobalContext == "function") {
                var context = GetGlobalContext();
                serverUrl = context.getServerUrl();
            }
            else {
                if (typeof Xrm.Page.context == "object") {
                    serverUrl = Xrm.Page.context.getServerUrl();
                }
                else
                { throw new Error("Unable to access the server URL"); }
            }
            if (serverUrl.match(/\/$/)) {
                serverUrl = serverUrl.substring(0, serverUrl.length - 1);
            }
            return serverUrl + OrgServicePath;
        },
        SetStateRequest: function (entityName, entityId, stateValue, StausValue) {
            var requestMain = ""
            requestMain += "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">";
            requestMain += "  <s:Body>";
            requestMain += "    <Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">";
            requestMain += "      <request i:type=\"b:SetStateRequest\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\" xmlns:b=\"http://schemas.microsoft.com/crm/2011/Contracts\">";
            requestMain += "        <a:Parameters xmlns:c=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">";
            requestMain += "          <a:KeyValuePairOfstringanyType>";
            requestMain += "            <c:key>EntityMoniker</c:key>";
            requestMain += "            <c:value i:type=\"a:EntityReference\">";
            requestMain += "              <a:Id>" + entityId + "</a:Id>";
            requestMain += "              <a:LogicalName>" + entityName + "</a:LogicalName>";
            requestMain += "              <a:Name i:nil=\"true\" />";
            requestMain += "            </c:value>";
            requestMain += "          </a:KeyValuePairOfstringanyType>";
            requestMain += "          <a:KeyValuePairOfstringanyType>";
            requestMain += "            <c:key>State</c:key>";
            requestMain += "            <c:value i:type=\"a:OptionSetValue\">";
            requestMain += "              <a:Value>" + stateValue + "</a:Value>";
            requestMain += "            </c:value>";
            requestMain += "          </a:KeyValuePairOfstringanyType>";
            requestMain += "          <a:KeyValuePairOfstringanyType>";
            requestMain += "            <c:key>Status</c:key>";
            requestMain += "            <c:value i:type=\"a:OptionSetValue\">";
            requestMain += "              <a:Value>" + StausValue + "</a:Value>";
            requestMain += "            </c:value>";
            requestMain += "          </a:KeyValuePairOfstringanyType>";
            requestMain += "        </a:Parameters>";
            requestMain += "        <a:RequestId i:nil=\"true\" />";
            requestMain += "        <a:RequestName>SetState</a:RequestName>";
            requestMain += "      </request>";
            requestMain += "    </Execute>";
            requestMain += "  </s:Body>";
            requestMain += "</s:Envelope>";
            var req = new XMLHttpRequest();
            req.open("POST", SDK.SAMPLES._getServerUrl(), false)
            // Responses will return XML. It isn't possible to return JSON.
            req.setRequestHeader("Accept", "application/xml, text/xml, */*");
            req.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
            req.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute");
            var successCallback = null;
            var errorCallback = null;
            req.onreadystatechange = function () { SDK.SAMPLES.SetStateResponse(req, null, errorHandler); };
            req.send(requestMain);
        },
        SetStateResponse: function (req, successCallback, errorCallback) {
            ///<summary>
            /// Recieves the assign response
            ///</summary>
            ///<param name="req" Type="XMLHttpRequest">
            /// The XMLHttpRequest response
            ///</param>
            ///<param name="successCallback" Type="Function">
            /// The function to perform when an successfult response is returned.
            /// For this message no data is returned so a success callback is not really necessary.
            ///</param>
            ///<param name="errorCallback" Type="Function">
            /// The function to perform when an error is returned.
            /// This function accepts a JScript error returned by the _getError function
            ///</param>
            if (req.readyState == 4) {
                if (req.status == 200) {
                    if (successCallback != null)
                    { successCallback(); }
                }
                else {
                    errorCallback(SDK.SAMPLES._getError(req.responseXML));
                }
            }
        },
        _getError: function (faultXml) {
            ///<summary>
            /// Parses the WCF fault returned in the event of an error.
            ///</summary>
            ///<param name="faultXml" Type="XML">
            /// The responseXML property of the XMLHttpRequest response.
            ///</param>
            var errorMessage = "Unknown Error (Unable to parse the fault)";
            if (typeof faultXml == "object") {
                try {
                    var bodyNode = faultXml.firstChild.firstChild;
                    //Retrieve the fault node
                    for (var i = 0; i < bodyNode.childNodes.length; i++) {
                        var node = bodyNode.childNodes[i];
                        //NOTE: This comparison does not handle the case where the XML namespace changes
                        if ("s:Fault" == node.nodeName) {
                            for (var j = 0; j < node.childNodes.length; j++) {
                                var faultStringNode = node.childNodes[j];
                                if ("faultstring" == faultStringNode.nodeName) {
                                    errorMessage = faultStringNode.text;
                                    break;
                                }
                            }
                            break;
                        }
                    }
                }
                catch (e) { };
            }
            return new Error(errorMessage);
        },
        __namespace: true
    };

    • Proposed as answer by Akhileshrajpoot Monday, January 27, 2014 4:09 AM
    • Unproposed as answer by YAT_goodman Monday, January 27, 2014 6:53 AM
    Monday, January 27, 2014 4:08 AM
  • Thanks for your reply,

    Actually, if I change the status to revised, it will not create a new quote with the same ID.

    So, is there anyway to use the event of the Revise button in the ribbon?

    Monday, January 27, 2014 6:18 AM
  • Hi,

    You have to create new custom button on ribbon and use your customize java script for it.

    Monday, January 27, 2014 6:23 AM
  • Dear Akhileshrajpoot,

    Change the status will not solve the problem.

    I changed the status from workflow to "revised" but I can't create a new quote with the same old quote ID.

    thanks for your cooperation,

     
    Monday, January 27, 2014 6:32 AM
  • Hi,

    Same quote id not be used for new quotes because its a unique id.

    Monday, January 27, 2014 6:39 AM
  • Hi,

    As a matter of fact, if you revise any quote the new quote(revise one) will take the original quote ID.

    For ex. current quote ID is QUO-01182-H3X2

    so if you click on Revise button the CRM will create a new quote with ID QUO-01182-H3X2 and revision number 1.

    so this is my problem. How can I set the quote ID?

    Monday, January 27, 2014 6:48 AM
  • Hi,

    Using plugin you can set the quote id with previous id and registered your plugin on pre-operation stage of create.

    Monday, January 27, 2014 6:57 AM