Thursday 13 September 2012

Pros of using early binding in mscrm 2011:

  • East to verify entity and attribute names at compile time.
  • Take the advantage of intelligence while coding.

cons of using early binding in mscrm 2011:

  • Slightly lowe performance compared to the code in late binding.
  • Not possible to write generic code which will be support future expansion.
 
URL to open the workflow in mscrm 2011:


code to open dialog from form java script in mscrm 2011:



function opendialog() {

    // If on a create form then save and reload sot he dialog can open
    if(Xrm.Page.ui.getFormType() == 1)
    {
        Xrm.Page.data.entity.save(null);
        return;
    }

    // If sale appointment then trigger dialog
    if (Xrm.Page.getAttribute("new_issalesappointment").getValue() == true) {

        window.open("/" + Xrm.Page.context.getOrgUniqueName() + "/cs/dialog/rundialog.aspx?DialogId=%7b9D975EF8-74E0-4EE3-9D50-78FE7BAABF74%7d&EntityName=appointment&ObjectId=" + Xrm.Page.data.entity.getId());

        // Set as being displayed so it doesn't trigger again on load
        Xrm.Page.getAttribute("new_displayeddialog").setValue(true);

    }
}

function opendialogonload() {

    if (Xrm.Page.getAttribute("new_displayeddialog").getValue() == null
      || Xrm.Page.getAttribute("new_displayeddialog").getValue() == false) {
        opendialog();
    }

 

 

Trigger workflow with JavaScript:

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;

               },

           ExecuteWorkflowRequest: 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:ExecuteWorkflowRequest\" 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>EntityId</c:key>";

               requestMain += "            <c:value i:type=\"d:guid\" xmlns:d=\"http://schemas.microsoft.com/2003/10/Serialization/\">a46fa1c1-e38d-e011-86ba-1cc1dee8ea49</c:value>";

               requestMain += "          </a:KeyValuePairOfstringanyType>";

               requestMain += "          <a:KeyValuePairOfstringanyType>";

               requestMain += "            <c:key>WorkflowId</c:key>";

               requestMain += "            <c:value i:type=\"d:guid\" xmlns:d=\"http://schemas.microsoft.com/2003/10/Serialization/\">d009c04f-f826-4b3b-90cd-209581cfc2ff</c:value>";

               requestMain += "          </a:KeyValuePairOfstringanyType>";

               requestMain += "        </a:Parameters>";

               requestMain += "        <a:RequestId i:nil=\"true\" />";

               requestMain += "        <a:RequestName>ExecuteWorkflow</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.ExecuteWorkflowResponse(req, successCallback, errorCallback); };

               req.send(requestMain);

           },

       ExecuteWorkflowResponse: 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

};

Tuesday 20 March 2012

Synchronous ODATA call in MSCRM 2011 :



var odataSelect ="http://servername/organization/XRMServices/2011/OrganizationData.svc/OpportunitySet(guid'"+oppid[0].id+"')?$select=new_status"
var retrieveRecordsReq = new XMLHttpRequest();
retrieveRecordsReq.open("GET",odataSelect , false);
retrieveRecordsReq.setRequestHeader("Accept", "application/json");
retrieveRecordsReq.setRequestHeader("Content-Type", "application/json; charset=utf-8");
var temp= retrieveRecordsReq.send();
if (retrieveRecordsReq.readyState == 4 && retrieveRecordsReq.status == 200)
 {
var retrievedRecords = JSON.parse(retrieveRecordsReq.responseText).d
}