locked
CRM 4: Cancel email activity from Java script RRS feed

  • Question

  • Hi,

    I have this requirement, For the case entity, we can't close a case if there is open activity such as Email. So My client want a button on the CRM form which can close all open/draft emails. How do I accomplish it? i'm trying from javascript but still cannot. Any help will be very much appreciated.

    Wednesday, July 10, 2013 2:24 AM

All replies

  • you can do this javascript:

    step 1. retrieve all open/draft email.

    step 2. change their status to completed/send by java script.

    code:

     SDK.SAMPLES.SetStateRequest(1, 3,"email","your emailid");

    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 (val1, val2 ,entityname,enqid) {
        
            enqId = enqId.substring(1, enqId.length - 1);
            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>" + enqId + "</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>" + val1 + "</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>" + val2 + "</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(), true)
            // 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, successCallback, errorCallback); };
            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
    };


    Hope this helps. ----------------------------------------------------------------------- Santosh Bhagat If this post answers your question, please click "Mark As Answer" on the post and "Vote as Helpful"


    Wednesday, July 10, 2013 4:20 AM