Saturday, October 8, 2011

I will be Speaking at Twin Cities Code Camp Tomorrow if anyone wants to come out. It's FREE!!

I will be Speaking at Twin Cities Code Camp Tomorrow if anyone wants to come out.  It's FREE!!
I will be speaking on CRM Development and Integration from 2:15pm to 3:30pm.

It will be at the U of M campus.
http://www.twincitiescodecamp.com/TCCC/Default.aspx

Farewell Jim Glass! Good Luck in Retirement!

The hub of the wheel that is the CRM community has officially left the building.  Jim Glass has retired after 20 years at Microsoft (after having spent 20 years in the military previously).  I never met the man, but we have crossed paths many times in the course of our work in the community. He was very pivotal in making the community what it is today!

Here are one or two other related posts and blogs I found:
http://blogs.msdn.com/b/jim_glass/
http://crmbusiness.wordpress.com/2011/10/08/jim-glass-quits-microsoft-after-20-years/

He will be missed!

Friday, October 7, 2011

Generate Mappings Between Entity Fields Automatically in Microsoft Dynamics CRM 2011 Using .NET or Jscript

This illustration shows how to generate mappings between entity fields automatically in Microsoft Dynamics CRM 2011 with AutoMapEntityRequest.   This example will be given in Jscript (SOAP) and in C# (.NET).
    Ok, here is what the code looks like!
    First in C#:

    AutoMapEntityRequest req = new AutoMapEntityRequest();
    //documentation doesn't show EntityMapId as required but it is and must be valid.
    req.EntityMapId = new Guid("0dc1265a-eaee-e011-8ee5-1cc1dee89a95");
    AutoMapEntityResponse resp = (AutoMapEntityResponse)slos.Execute(req);
    
    

    If you need help instantiating a service object in .NET within a plugin check out this post:
    http://mileyja.blogspot.com/2011/04/instantiating-service-object-within.html

    Now here is the Jscript nicely formatted by the CRM 2011 SOAP formatter. Available at: http://crm2011soap.codeplex.com/

    Now in Jscript


    This example is asynchronous, if you want to learn how to make JScript SOAP calls synchronously please visit this post: http://mileyja.blogspot.com/2011/07/using-jscript-to-access-soap-web.html

    
    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;
                   }, 
               AutoMapEntityRequest: 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:AutoMapEntityRequest\" 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>EntityMapId</c:key>";
                   requestMain += "            <c:value i:type=\"d:guid\" xmlns:d=\"http://schemas.microsoft.com/2003/10/Serialization/\">0dc1265a-eaee-e011-8ee5-1cc1dee89a95</c:value>";
                   requestMain += "          </a:KeyValuePairOfstringanyType>";
                   requestMain += "        </a:Parameters>";
                   requestMain += "        <a:RequestId i:nil=\"true\" />";
                   requestMain += "        <a:RequestName>AutoMapEntity</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.AutoMapEntityResponse(req, successCallback, errorCallback); };
                   req.send(requestMain);
               },
           AutoMapEntityResponse: 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
    };
    
    

    To understand how to parse the response please review my post on using the DOM parser.
    Now you can call the SDK.SAMPLES.AutoMapEntityRequest function from your form jscript handler.
    Thats all there is to it!
    -

    Thursday, October 6, 2011

    Get a Localized List of Time Zone Info for All Time Zones in Microsoft Dynamics CRM 2011 Using .NET or Jscript

    This illustration shows how to get a localized list of time zone info for all time zones in Microsoft Dynamics CRM 2011 with GetAllTimeZonesWithDisplayNameRequest.   This example will be given in Jscript (SOAP) and in C# (.NET).

    IMPORTANT NOTE:  I am using a LocalId of 1036 below to show that it returns the list in French.  Use 1033 for US English or else substitute your LocaleId for any installed language in CRM.
      Ok, here is what the code looks like!
      First in C#:

      GetAllTimeZonesWithDisplayNameRequest req = new GetAllTimeZonesWithDisplayNameRequest();
      //1036 will return French, use 1033 for English, or add your LocaleId
      req.LocaleId = 1036;
      GetAllTimeZonesWithDisplayNameResponse resp = (GetAllTimeZonesWithDisplayNameResponse)slos.Execute(req);
      

      If you need help instantiating a service object in .NET within a plugin check out this post:
      http://mileyja.blogspot.com/2011/04/instantiating-service-object-within.html

      Now here is the Jscript nicely formatted by the CRM 2011 SOAP formatter. Available at: http://crm2011soap.codeplex.com/

      Now in Jscript


      This example is asynchronous, if you want to learn how to make JScript SOAP calls synchronously please visit this post: http://mileyja.blogspot.com/2011/07/using-jscript-to-access-soap-web.html

      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;
                     }, 
                 GetAllTimeZonesWithDisplayNameRequest: 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:GetAllTimeZonesWithDisplayNameRequest\" 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>LocaleId</c:key>";
                     requestMain += "            <c:value i:type=\"d:int\" xmlns:d=\"http://www.w3.org/2001/XMLSchema\">1033</c:value>";
                     requestMain += "          </a:KeyValuePairOfstringanyType>";
                     requestMain += "        </a:Parameters>";
                     requestMain += "        <a:RequestId i:nil=\"true\" />";
                     requestMain += "        <a:RequestName>GetAllTimeZonesWithDisplayName</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.GetAllTimeZonesWithDisplayNameResponse(req, successCallback, errorCallback); };
                     req.send(requestMain);
                 },
             GetAllTimeZonesWithDisplayNameResponse: 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
      };
      
      

      To understand how to parse the response please review my post on using the DOM parser.
      Now you can call the SDK.SAMPLES.GetAllTimeZonesWithDisplayNameRequest function from your form jscript handler.
      Thats all there is to it!
      -

      Wednesday, October 5, 2011

      Cancel a Contract in Microsoft Dynamics CRM 2011 Using .NET or Jscript

      This illustration shows how to cancel a contract in Microsoft Dynamics CRM 2011  with CancelContractRequest.   This example will be given in Jscript (SOAP) and in C# (.NET).
        Ok, here is what the code looks like!
        First in C#:

        CancelContractRequest req = new CancelContractRequest();
        req.ContractId = new Guid("F11D5D0B-58EF-E011-8EE5-1CC1DEE89A95");
        req.CancelDate = DateTime.Now;  
        OptionSetValue o = new OptionSetValue();
        o.Value = 5;
        req.Status = o;
        CancelContractResponse resp = (CancelContractResponse)service.Execute(req);
        

        If you need help instantiating a service object in .NET within a plugin check out this post:
        http://mileyja.blogspot.com/2011/04/instantiating-service-object-within.html

        Now here is the Jscript nicely formatted by the CRM 2011 SOAP formatter. Available at: http://crm2011soap.codeplex.com/

        Now in Jscript


        This example is asynchronous, if you want to learn how to make JScript SOAP calls synchronously please visit this post: http://mileyja.blogspot.com/2011/07/using-jscript-to-access-soap-web.html

        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;
                       }, 
                   CancelContractRequest: 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:CancelContractRequest\" 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>ContractId</c:key>";
                       requestMain += "            <c:value i:type=\"d:guid\" xmlns:d=\"http://schemas.microsoft.com/2003/10/Serialization/\">f11d5d0b-58ef-e011-8ee5-1cc1dee89a95</c:value>";
                       requestMain += "          </a:KeyValuePairOfstringanyType>";
                       requestMain += "          <a:KeyValuePairOfstringanyType>";
                       requestMain += "            <c:key>CancelDate</c:key>";
                       requestMain += "            <c:value i:type=\"d:dateTime\" xmlns:d=\"http://www.w3.org/2001/XMLSchema\">2011-10-05T08:50:53.6615794-05:00</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>CancelContract</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.CancelContractResponse(req, successCallback, errorCallback); };
                       req.send(requestMain);
                   },
               CancelContractResponse: 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
        };
        
        

        To understand how to parse the response please review my post on using the DOM parser.
        Now you can call the SDK.SAMPLES.CancelContractRequest  function from your form jscript handler.
        Thats all there is to it!
        -

        Tuesday, October 4, 2011

        Cancel a Sales Order in Microsoft Dynamics CRM 2011 Using .NET or Jscript

        This illustration shows how to cancel a sales order in Microsoft Dynamics CRM 2011 with CancelSalesOrderRequest.   This example will be given in Jscript (SOAP) and in C# (.NET).
          Ok, here is what the code looks like!
          First in C#:

          
          CancelSalesOrderRequest req = new CancelSalesOrderRequest();
          OrderClose orderClose = new OrderClose();
          orderClose.SalesOrderId = new EntityReference("salesorder", new Guid("CD14FA49-59E4-E011-8DFF-1CC1DEE8EA01"));
          orderClose.Subject = "Sales Order Cancelled - No Money";
          req.OrderClose = orderClose;
          OptionSetValue o = new OptionSetValue();
          o.Value = 4;
          req.Status = o;
          CancelSalesOrderResponse resp = (CancelSalesOrderResponse)service.Execute(req);
          

          If you need help instantiating a service object in .NET within a plugin check out this post:
          http://mileyja.blogspot.com/2011/04/instantiating-service-object-within.html

          Now here is the Jscript nicely formatted by the CRM 2011 SOAP formatter. Available at: http://crm2011soap.codeplex.com/

          Now in Jscript


          This example is asynchronous, if you want to learn how to make JScript SOAP calls synchronously please visit this post: http://mileyja.blogspot.com/2011/07/using-jscript-to-access-soap-web.html

          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;
                         }, 
                     CancelSalesOrderRequest: 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:CancelSalesOrderRequest\" 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>OrderClose</c:key>";
                         requestMain += "            <c:value i:type=\"a:Entity\">";
                         requestMain += "              <a:Attributes>";
                         requestMain += "                <a:KeyValuePairOfstringanyType>";
                         requestMain += "                  <c:key>salesorderid</c:key>";
                         requestMain += "                  <c:value i:type=\"a:EntityReference\">";
                         requestMain += "                    <a:Id>cd14fa49-59e4-e011-8dff-1cc1dee8ea01</a:Id>";
                         requestMain += "                    <a:LogicalName>salesorder</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\">Sales Order Cancelled - No Money</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>orderclose</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>4</a:Value>";
                         requestMain += "            </c:value>";
                         requestMain += "          </a:KeyValuePairOfstringanyType>";
                         requestMain += "        </a:Parameters>";
                         requestMain += "        <a:RequestId i:nil=\"true\" />";
                         requestMain += "        <a:RequestName>CancelSalesOrder</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.CancelSalesOrderResponse(req, successCallback, errorCallback); };
                         req.send(requestMain);
                     },
                 CancelSalesOrderResponse: 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
          };
          
          

          To understand how to parse the response please review my post on using the DOM parser.
          Now you can call the SDK.SAMPLES.CancelSalesOrderRequest  function from your form jscript handler.
          Thats all there is to it!
          -

          Monday, October 3, 2011

          Fulfill a Sales Order in Microsoft Dynamics CRM 2011 Using .NET or Jscript

          This illustration shows how to fulfill a sales order in Microsoft Dynamics CRM 2011 with FulfillSalesOrderRequest.   This example will be given in Jscript (SOAP) and in C# (.NET).
            Ok, here is what the code looks like!
            First in C#:

            FulfillSalesOrderRequest req = new FulfillSalesOrderRequest();
            OrderClose orderClose = new OrderClose();
            orderClose.SalesOrderId = new EntityReference("salesorder", new Guid("CD14FA49-59E4-E011-8DFF-1CC1DEE8EA01"));
            orderClose.Subject = "Sales Order Closed";
            req.OrderClose = orderClose;
            OptionSetValue o = new OptionSetValue();
            o.Value = 100001;
            req.Status = o;
            FulfillSalesOrderResponse resp = (FulfillSalesOrderResponse)service.Execute(req);
            

            If you need help instantiating a service object in .NET within a plugin check out this post:
            http://mileyja.blogspot.com/2011/04/instantiating-service-object-within.html

            Now here is the Jscript nicely formatted by the CRM 2011 SOAP formatter. Available at: http://crm2011soap.codeplex.com/

            Now in Jscript


            This example is asynchronous, if you want to learn how to make JScript SOAP calls synchronously please visit this post: http://mileyja.blogspot.com/2011/07/using-jscript-to-access-soap-web.html

            
            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;
                           }, 
                       FulfillSalesOrderRequest: 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:FulfillSalesOrderRequest\" 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>OrderClose</c:key>";
                           requestMain += "            <c:value i:type=\"a:Entity\">";
                           requestMain += "              <a:Attributes>";
                           requestMain += "                <a:KeyValuePairOfstringanyType>";
                           requestMain += "                  <c:key>salesorderid</c:key>";
                           requestMain += "                  <c:value i:type=\"a:EntityReference\">";
                           requestMain += "                    <a:Id>cd14fa49-59e4-e011-8dff-1cc1dee8ea01</a:Id>";
                           requestMain += "                    <a:LogicalName>salesorder</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\">Sales Order Closed</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>orderclose</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>100001</a:Value>";
                           requestMain += "            </c:value>";
                           requestMain += "          </a:KeyValuePairOfstringanyType>";
                           requestMain += "        </a:Parameters>";
                           requestMain += "        <a:RequestId i:nil=\"true\" />";
                           requestMain += "        <a:RequestName>FulfillSalesOrder</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.FulfillSalesOrderResponse(req, successCallback, errorCallback); };
                           req.send(requestMain);
                       },
                   FulfillSalesOrderResponse: 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
            };
            
            

            To understand how to parse the response please review my post on using the DOM parser.
            Now you can call the SDK.SAMPLES.FulfillSalesOrderRequest  function from your form jscript handler.
            Thats all there is to it!
            -