Friday, June 3, 2011

How to Set Up Remote Debugging for Plugins in Microsoft Dynamics CRM 2011

This article today caught my eye, it was written by Ben Hosking.  It shows how to remotely debug plugins / plug-ins using Visual Studio that are registered with an on-premise CRM instance.  If you use online I recommend having an on-premise development instance you can test your sandbox plugins in so you can take advantage of this same technique.

To read how this works please visit the link below:

http://crmbusiness.wordpress.com/2011/06/03/crm-2011-how-to-set-up-remote-debugging-for-plugins/\


I hope this helps and have a nice weekend!

Aggregation (count, max, min, etc..) and Grouping Using FetchXML with Jscript or .NET in Microsoft Dynamics CRM 2011

This illustration builds on yesterday's post about how to get an entity count or row count using FetchXML in Microsoft Dynamics CRM 2011 to show how you can do other types of aggregation.   These examples will be given in SOAP (JScript) and in C# (.NET).

Again, yesterday's example below counts the number of active account entities in my CRM org.  But the main point of today's post is that you can do other types of aggregation using FetchXML in jscript or in .NET.

I will also include an example of a group by clause for .NET and Jscript.

The types I am aware of and I can find examples of are:
  • sum
  • avg
  • min
  • max
  • count(*)
  • count(attribute name)

You can also find examples of the FetchXML for all of these here:
http://technet.microsoft.com/en-us/library/gg328122.aspx
and here, http://msdn.microsoft.com/en-us/library/gg309565.aspx

Ok, here is what the code for the row count aggregation looks like!
First Example in C#:

RetrieveMultipleRequest req = new RetrieveMultipleRequest();
FetchExpression fetch = new FetchExpression("<fetch distinct='false' mapping='logical' aggregate='true'>" +
   "<entity name='account'>" +
   "<attribute name='accountid' aggregate='count' alias='testcount'/>" +
   "</entity>" +
   "</fetch>");
req.Query = fetch;
RetrieveMultipleResponse resp = (RetrieveMultipleResponse)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 posthttp://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;
               }, 
           CountAccountsRequest: function () {
               var requestMain = ""
               requestMain += "<pre style=\"font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%\"><code>RetrieveMultipleRequest req = new RetrieveMultipleRequest();";
               requestMain += "FetchExpression fetch = new FetchExpression(&quot;&lt;fetch distinct='false' mapping='logical' aggregate='true'&gt;&quot; +";
               requestMain += "   &quot;&lt;entity name='account'&gt;&quot; +";
               requestMain += "   &quot;&lt;attribute name='accountid' aggregate='count' alias='testcount'/&gt;&quot; +";
               requestMain += "   &quot;&lt;/entity&gt;&quot; +";
               requestMain += "   &quot;&lt;/fetch&gt;&quot;);";
               requestMain += "req.Query = fetch;";
               requestMain += "RetrieveMultipleResponse resp = (RetrieveMultipleResponse)slos.Execute(req);";
               requestMain += "</code></pre>";
               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.CountAccountsResponse(req, successCallback, errorCallback); };
               req.send(requestMain);
           },
       CountAccountsResponse: 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.CountAccountsRequest function from your form jscript handler.

Second (Group By) Example in C#:

string groupby1 = @" 
   <fetch distinct='false' mapping='logical' aggregate='true'> 
       <entity name='account'> 
          <attribute name='name' alias='account_count' aggregate='countcolumn' /> 
          <attribute name='ownerid' alias='ownerid' groupby='true' /> 
       </entity> 
   </fetch>";

RetrieveMultipleRequest req = new RetrieveMultipleRequest();
FetchExpression fetch = new FetchExpression(groupby1);
req.Query = fetch;
RetrieveMultipleResponse resp = (RetrieveMultipleResponse)service.Execute(req);

Second (Group By) Example in Jscript:

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;
               }, 
           FetchXmlRequest: 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=\"a:RetrieveMultipleRequest\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\">";
               requestMain += "        <a:Parameters xmlns:b=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">";
               requestMain += "          <a:KeyValuePairOfstringanyType>";
               requestMain += "            <b:key>Query</b:key>";
               requestMain += "            <b:value i:type=\"a:FetchExpression\">";
               requestMain += "              <a:Query> ";
               requestMain += "            &lt;fetch distinct='false' mapping='logical' aggregate='true'&gt; ";
               requestMain += "                &lt;entity name='account'&gt; ";
               requestMain += "                   &lt;attribute name='name' alias='account_count' aggregate='countcolumn' /&gt; ";
               requestMain += "                   &lt;attribute name='ownerid' alias='ownerid' groupby='true' /&gt; ";
               requestMain += "                &lt;/entity&gt; ";
               requestMain += "            &lt;/fetch&gt;</a:Query>";
               requestMain += "            </b:value>";
               requestMain += "          </a:KeyValuePairOfstringanyType>";
               requestMain += "        </a:Parameters>";
               requestMain += "        <a:RequestId i:nil=\"true\" />";
               requestMain += "        <a:RequestName>RetrieveMultiple</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.FetchXmlResponse(req, successCallback, errorCallback); };
               req.send(requestMain);
           },
       FetchXmlResponse: 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(); }
               alert(req.responseXML.xml);
               }
               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
};


Now you can call the SDK.SAMPLES.FetchXmlRequest function from your form jscript handler.

Thats all there is to it!

I hope this helps!

Update Roll-up 1 Outlook Client is Incompatible with Update Roll-up 2 (at least as applied to Microsoft Dynamics CRM 2011 Online)

It appears that update roll-up 2 is not compatible with the update roll up 1 Outlook client for Microsoft Dynamics CRM 2011.  The same day that Microsoft Released roll-up 2 there have been several people complained of strange errors.  This is mainly seen where customers are using CRM Online at this time and it appears that installing roll-up 2 fixes the issue.

Update 1: as of 6/3/2011 Microsoft's suggested fix of upgrading to update rollup 2 to fix the problem is not working for some CRM Online clients.


Update 2 :as of 6/3/2011 Microsoft says it will have a fix out within 2 weeks.

- I hope this helps!

Thursday, June 2, 2011

ISSUE!! Microsoft Dynamics CRM 2011 Rollup 2 Breaking Outlook Client Functionality?? - FIXED - NOT ROLLUP 2

I have seen at least three people so far having problems with CRM 2011 for Outlook since Rollup 2  a couple days ago  I thougth this was the result of the rollup but I am hearing now that I was wrong.  It just happenned to happen around the same time.

It seems now that this has been resolved my MSFT!  So we can all go back to using our beloved Outlook clients with CRM Online

-

Microsoft Dynamics CRM 2011 Update Rollup 2 RELEASED!!

Update Rollup 2 is released for CRM 2011!

Check it out!
http://blogs.msdn.com/b/crm/archive/2011/06/02/update-rollup-2-for-microsoft-dynamics-crm-2011.aspx

Have a great rest of your day!

-

Getting Row Count or Entity Count in Jscript or .NET in Microsoft Dynamics CRM 2011 using FetchXML

This illustration shows you how get a rowcount or entity count for an entity type using FetchXML queries in code in jscript and also C# in Microsoft Dynamics CRM 2011 though RetrieveMultipleRequest.   This example will be given in SOAP (JScript) and in C# (.NET).

This example counts the number of active account entities in my CRM org.  I know from looking in the system that there are 14.

Ok, here is what the code look like!
First in C#:

RetrieveMultipleRequest req = new RetrieveMultipleRequest();
FetchExpression fetch = new FetchExpression("<fetch distinct='false' mapping='logical' aggregate='true'>" +
   "<entity name='account'>" +
   "<attribute name='accountid' aggregate='count' alias='testcount'/>" +
   "</entity>" +
   "</fetch>");
req.Query = fetch;
RetrieveMultipleResponse resp = (RetrieveMultipleResponse)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:


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;
               }, 
           CountAccountsRequest: function () {
               var requestMain = ""
               requestMain += "<pre style=\"font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%\"><code>RetrieveMultipleRequest req = new RetrieveMultipleRequest();";
               requestMain += "FetchExpression fetch = new FetchExpression(&quot;&lt;fetch distinct='false' mapping='logical' aggregate='true'&gt;&quot; +";
               requestMain += "   &quot;&lt;entity name='account'&gt;&quot; +";
               requestMain += "   &quot;&lt;attribute name='accountid' aggregate='count' alias='testcount'/&gt;&quot; +";
               requestMain += "   &quot;&lt;/entity&gt;&quot; +";
               requestMain += "   &quot;&lt;/fetch&gt;&quot;);";
               requestMain += "req.Query = fetch;";
               requestMain += "RetrieveMultipleResponse resp = (RetrieveMultipleResponse)slos.Execute(req);";
               requestMain += "</code></pre>";
               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.CountAccountsResponse(req, successCallback, errorCallback); };
               req.send(requestMain);
           },
       CountAccountsResponse: 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.CountAccountsRequest function from your form jscript handler.
Thats all there is to it!

I hope this helps!

Wednesday, June 1, 2011

Use FetchXML Queries in Jscript and .NET in Microsoft Dynamics CRM 2011 Using RetrieveMultipleRequest

This illustration shows you how to use FetchXML queries in code in jscript and also C# in Microsoft Dynamics CRM 2011 using the RetrieveMultipleRequest.   This example will be given in SOAP (JScript) and in C# (.NET).

Ok, here is what the code look like!
First in C#:

//The fetch xml query we want to execute
string fetchquery = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>" +
                       "<entity name='account'>" +
                           "<attribute name='name' /> " +
                           "<attribute name='address1_city' /> " +
                           "<attribute name='primarycontactid' /> " +
                           "<attribute name='telephone1' /> " +
                           "<attribute name='accountid' /> " +
                           "<order attribute='name' descending='false' /> " +
                           "<filter type='and'>" +
                               "<condition attribute='statecode' operator='eq' value='0' /> " +
                           "</filter>" +
                           "<link-entity name='contact' from='contactid' to='primarycontactid' visible='false' link-type='outer' alias='accountprimarycontactidcontactcontactid'>" +
                               "<attribute name='emailaddress1' /> " +
                           "</link-entity>" +
                       "</entity>" +
                   "</fetch>";

RetrieveMultipleRequest req = new RetrieveMultipleRequest();
FetchExpression fetch = new FetchExpression(fetchquery);
req.Query = fetch;
RetrieveMultipleResponse resp = (RetrieveMultipleResponse)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/

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

Now in Jscript:

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;
               }, 
           ExecuteFetchXmlRequest: 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=\"a:RetrieveMultipleRequest\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\">";
               requestMain += "        <a:Parameters xmlns:b=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">";
               requestMain += "          <a:KeyValuePairOfstringanyType>";
               requestMain += "            <b:key>Query</b:key>";
               requestMain += "            <b:value i:type=\"a:FetchExpression\">";
               requestMain += "              <a:Query>&lt;fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'&gt;&lt;entity name='account'&gt;&lt;attribute name='name' /&gt; &lt;attribute name='address1_city' /&gt; &lt;attribute name='primarycontactid' /&gt; &lt;attribute name='telephone1' /&gt; &lt;attribute name='accountid' /&gt; &lt;order attribute='name' descending='false' /&gt; &lt;filter type='and'&gt;&lt;condition attribute='statecode' operator='eq' value='0' /&gt; &lt;/filter&gt;&lt;link-entity name='contact' from='contactid' to='primarycontactid' visible='false' link-type='outer' alias='accountprimarycontactidcontactcontactid'&gt;&lt;attribute name='emailaddress1' /&gt; &lt;/link-entity&gt;&lt;/entity&gt;&lt;/fetch&gt;</a:Query>";
               requestMain += "            </b:value>";
               requestMain += "          </a:KeyValuePairOfstringanyType>";
               requestMain += "        </a:Parameters>";
               requestMain += "        <a:RequestId i:nil=\"true\" />";
               requestMain += "        <a:RequestName>RetrieveMultiple</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.ExecuteFetchXmlResponse(req, successCallback, errorCallback); };
               req.send(requestMain);
           },
       ExecuteFetchXmlResponse: 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(); }
               alert(req.responseXML.xml);
               }
               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.ExecuteFetchXmlRequest function from your form jscript handler.
Thats all there is to it!

I hope this helps!