locked
Bulk complete all cases RRS feed

  • Question

  • Hi, my company is starting to use the CRM Online, and I have imported in block all the historical case studies, taken from Outlook. Each case has it's own closed Activity.
    Now we need to bulk close (sign as completed) all Cases:
    1) I can do it with a script? There are some code snippet?
    2) With scripting it's possible to change last modified date of the case? It would be nice if the closure date of the case could coincide with the effective end of the underlying activity. I would like to avoid creating a custom field.

    Thank you,
    nachille
    Monday, November 19, 2012 9:46 AM

Answers

  • hi you can use JS also to close the case.!

    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;
                   }, 
               CloseIncidentRequest: function () {
                   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:CloseIncidentRequest\" 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>IncidentResolution</c:key>";
                   requestMain += "            <c:value i:type=\"a:Entity\">";
                   requestMain += "              <a:Attributes>";
                   requestMain += "                <a:KeyValuePairOfstringanyType>";
                   requestMain += "                  <c:key>incidentid</c:key>";
                   requestMain += "                  <c:value i:type=\"a:EntityReference\">";
                   requestMain += "                    <a:Id>c9b4702b-6ebc-e011-8d99-1cc1de7955db</a:Id>";
                   requestMain += "                    <a:LogicalName>incident</a:LogicalName>";
                   requestMain += "                    <a:Name i:nil=\"true\" />";
                   requestMain += "                  </c:value>";
                   requestMain += "                </a:KeyValuePairOfstringanyType>";
                   requestMain += "                <a:KeyValuePairOfstringanyType>";
                   requestMain += "                  <c:key>subject</c:key>";
                   requestMain += "                  <c:value i:type=\"d:string\" xmlns:d=\"http://www.w3.org/2001/XMLSchema\">Parent Case has been resolved</c:value>";
                   requestMain += "                </a:KeyValuePairOfstringanyType>";
                   requestMain += "              </a:Attributes>";
                   requestMain += "              <a:EntityState i:nil=\"true\" />";
                   requestMain += "              <a:FormattedValues />";
                   requestMain += "              <a:Id>00000000-0000-0000-0000-000000000000</a:Id>";
                   requestMain += "              <a:LogicalName>incidentresolution</a:LogicalName>";
                   requestMain += "              <a:RelatedEntities />";
                   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>5</a:Value>";
                   requestMain += "            </c:value>";
                   requestMain += "          </a:KeyValuePairOfstringanyType>";
                   requestMain += "        </a:Parameters>";
                   requestMain += "        <a:RequestId i:nil=\"true\" />";
                   requestMain += "        <a:RequestName>CloseIncident</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.CloseIncidentResponse(req, successCallback, errorCallback); };
                   req.send(requestMain);
               },
           CloseIncidentResponse: 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
    };

    look at this link.


    Thanks and Regards. Make sure to "Vote as Helpful" and "Mark As Answer",if you get answer of your question.

    • Marked as answer by nachille Monday, November 26, 2012 2:58 PM
    Monday, November 19, 2012 3:27 PM
  • Hi Nachile,

    you can achieve this using standard workflow as well, so create new on demand workflow against case entity let's call in "CLOSE CASE" and then add step to change staus to resolved in this workflow. (make sure this workflow is marked for on demand only and not automatically run)

    Now do advanced find view to find all your cases and then run on demand workflow against these cases and system will run your workflow and will close the case. in this scenario case modified date would be case resolved date as well.

    Hope this helps..


    MayankP
    My Blog
    Follow Me on Twitter

    Monday, November 19, 2012 3:45 PM
    Answerer

All replies

  • hi nachille,

    you can use the below code to close/resolve the case.

    use query to retrieve all cases (guid's ie: "incidentid" attribute) and iterate with the below code to close the case

    Entity caseResolution = new Entity("incidentresolution");
    caseResolution.Attributes.Add("incidentid", new EntityReference("incident", Guid caseGuid));
    caseResolution.Attributes.Add("subject", "Customer was mean so we just closed it.");
    
    //service.Create(caseResolution);
    
    CloseIncidentRequest req = new CloseIncidentRequest();
    req.IncidentResolution = caseResolution;
    req.RequestName = "CloseIncident";
    OptionSetValue o = new OptionSetValue();
    o.Value = 5;
    req.Status = o;
    
    CloseIncidentResponse resp = (CloseIncidentResponse)service.Execute(req);


    Thanks and Regards. Make sure to "Vote as Helpful" and "Mark As Answer",if you get answer of your question.


    • Edited by Ravitheja J Monday, November 19, 2012 10:37 AM
    Monday, November 19, 2012 10:17 AM
  • Hi CRMIG and thanks for your response.
    I'm not sure I can use your code: I am a user of the Online version.
    ..

    I need something with JS logic. But also to know if you can force the modification date using a script.

    Kind regards

    Monday, November 19, 2012 1:57 PM
  • hi you can use JS also to close the case.!

    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;
                   }, 
               CloseIncidentRequest: function () {
                   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:CloseIncidentRequest\" 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>IncidentResolution</c:key>";
                   requestMain += "            <c:value i:type=\"a:Entity\">";
                   requestMain += "              <a:Attributes>";
                   requestMain += "                <a:KeyValuePairOfstringanyType>";
                   requestMain += "                  <c:key>incidentid</c:key>";
                   requestMain += "                  <c:value i:type=\"a:EntityReference\">";
                   requestMain += "                    <a:Id>c9b4702b-6ebc-e011-8d99-1cc1de7955db</a:Id>";
                   requestMain += "                    <a:LogicalName>incident</a:LogicalName>";
                   requestMain += "                    <a:Name i:nil=\"true\" />";
                   requestMain += "                  </c:value>";
                   requestMain += "                </a:KeyValuePairOfstringanyType>";
                   requestMain += "                <a:KeyValuePairOfstringanyType>";
                   requestMain += "                  <c:key>subject</c:key>";
                   requestMain += "                  <c:value i:type=\"d:string\" xmlns:d=\"http://www.w3.org/2001/XMLSchema\">Parent Case has been resolved</c:value>";
                   requestMain += "                </a:KeyValuePairOfstringanyType>";
                   requestMain += "              </a:Attributes>";
                   requestMain += "              <a:EntityState i:nil=\"true\" />";
                   requestMain += "              <a:FormattedValues />";
                   requestMain += "              <a:Id>00000000-0000-0000-0000-000000000000</a:Id>";
                   requestMain += "              <a:LogicalName>incidentresolution</a:LogicalName>";
                   requestMain += "              <a:RelatedEntities />";
                   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>5</a:Value>";
                   requestMain += "            </c:value>";
                   requestMain += "          </a:KeyValuePairOfstringanyType>";
                   requestMain += "        </a:Parameters>";
                   requestMain += "        <a:RequestId i:nil=\"true\" />";
                   requestMain += "        <a:RequestName>CloseIncident</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.CloseIncidentResponse(req, successCallback, errorCallback); };
                   req.send(requestMain);
               },
           CloseIncidentResponse: 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
    };

    look at this link.


    Thanks and Regards. Make sure to "Vote as Helpful" and "Mark As Answer",if you get answer of your question.

    • Marked as answer by nachille Monday, November 26, 2012 2:58 PM
    Monday, November 19, 2012 3:27 PM
  • Hi Nachile,

    you can achieve this using standard workflow as well, so create new on demand workflow against case entity let's call in "CLOSE CASE" and then add step to change staus to resolved in this workflow. (make sure this workflow is marked for on demand only and not automatically run)

    Now do advanced find view to find all your cases and then run on demand workflow against these cases and system will run your workflow and will close the case. in this scenario case modified date would be case resolved date as well.

    Hope this helps..


    MayankP
    My Blog
    Follow Me on Twitter

    Monday, November 19, 2012 3:45 PM
    Answerer