Tuesday, 28 April 2015

Query FetchXml thorugh Soap Request

FetchXml can be query using Soap call. There are plenty of libraries available that you can use to make this task work but i will explain you how to make it own library.

There are three steps to that, which are as follows:
1) Build your XML and Encode them in XML Document object, for example

 var fetchQuery="<fetch version=\"1.0\" output-format=\"xml-platform\" mapping=\"logical\" distinct=\"false\"><entity name=\"lead\"><attribute name=\"fullname\" /><attribute name=\"companyname\" /><attribute name=\"telephone1\" /><attribute name=\"leadid\" /><order attribute=\"fullname\" descending=\"false\" /><link-entity name=\"account\" from=\"accountid\" to=\"parentaccountid\" alias=\"ad\"><filter type=\"and\"><condition attribute=\"accountid\" operator=\"eq\" uiname=\"A. Datum Corporation (sample)\" uitype=\"account\" value=\"{A9D32F2F-58D4-E411-
80F0-C4346BAC094C}\" /></filter></link-entity></entity></fetch>";

    var encodedFetchQuery = _xmlEncode(fetchQuery);
 
 function _xmlEncode(strInput) {
  var c;
  var XmlEncode = '';
  if (strInput == null) {
   return null;
  }
  if (strInput == '') {
   return '';
  }
  for (var cnt = 0; cnt < strInput.length; cnt++) {
   c = strInput.charCodeAt(cnt);
   if (((c > 96) && (c < 123)) ||
            ((c > 64) && (c < 91)) ||
            (c == 32) ||
            ((c > 47) && (c < 58)) ||
            (c == 46) ||
            (c == 44) ||
            (c == 45) ||
            (c == 95)) {
    XmlEncode = XmlEncode + String.fromCharCode(c);
   }
   else {
    XmlEncode = XmlEncode + '&#' + c + ';';
   }
  }
  return XmlEncode;
 }
 
2) Make a Soap Envelop, for example
 
var request = [
        '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><
s:Body>',
            '<Execute xmlns="http://schemas.microsoft.com/xrm/2011/Contracts/Services" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" >',
                '<request i:type="a:RetrieveMultipleRequest" xmlns:a="http://schemas.microsoft.com/xrm/2011/Contracts">',
                    '<a:Parameters xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic">',
                        '<a:KeyValuePairOfstringanyType>',
                            '<b:key>Query</b:key>',
                            '<b:value i:type="a:FetchExpression">',
                                '<a:Query>', encodedFetchQuery , '</a:Query>',
                            '</b:value>',
                        '</a:KeyValuePairOfstringanyType>',
                    '</a:Parameters>',
                    '<a:RequestId i:nil="true"/>',
                    '<a:RequestName>RetrieveMultiple</a:RequestName>',
                '</request>',
            '</Execute>',
        '</s:Body></s:Envelope>'
    ].join("");
 
3) Make a soap Request, for example
 
//Synchronous XMLHttpRequest to retrieve contact records
    var req = new XMLHttpRequest();
    req.open("POST", encodeURI(Xrm.Page.context.
getClientUrl() + "/XRMServices/2011/Organization.svc/web"), false);
    try { req.responseType = 'msxml-document' } catch (e) { }
    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");  
      req.onreadystatechange = function () {
        if (this.readyState == 4 /* complete */) {
            req.onreadystatechange = null; //Addresses potential memory leak issue with IE
            if (this.status == 200  /*success*/) {
                var doc = req.responseXML;
                successCallback(doc);
            }
            else {
                errorCallback(accountId);
            }
        }
    }
    req.send(request);
 
You will get your output in  req.responseXML.xml in XML format. its your choice how you wish to use it.

Thanks.
 
 

Wednesday, 15 April 2015

Calling Actions through java script

Action is a new and very powerful feature of Microsoft Dynamics CRM. Action can be called through Soap Call which goes like following some steps which goes like this.
            1) You are require create soap envelop.
            2) calling soap service.

Complete Js to call your Action

function CallActionFromJavaScript() {
   debugger;
    var entityId = Xrm.Page.data.entity.getId();;
    var entityName = Entity name;
    var requestName = Action Name;

    ExecuteActionCreateProject(entityId, entityName, requestName);

}

function ExecuteActionCreateProject(EntityId,entityId, entityName, requestName) {
    // Creating the request XML for calling the Action
    var requestXML = ""
    requestXML += "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">";
    requestXML += "  <s:Body>";
    requestXML += "    <Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">";
    requestXML += "      <request xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\">";
    requestXML += "        <a:Parameters xmlns:b=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">";
    requestXML += "          <a:KeyValuePairOfstringanyType>";
    requestXML += "            <b:key>Target</b:key>";
    requestXML += "            <b:value i:type=\"a:EntityReference\">";
    requestXML += "              <a:Id>"+entityId+"</a:Id>";
    requestXML += "              <a:LogicalName>"+entityName+"</a:LogicalName>";
    requestXML += "              <a:Name i:nil=\"true\">";
    requestXML += "            </a:Name></b:value>";
    requestXML += "          </a:KeyValuePairOfstringanyType>";

    requestXML += "          <a:KeyValuePairOfstringanyType>";
    requestXML += "            <b:key>EntityId</b:key>";
    requestXML += "            <b:value i:type=\"c:string\" xmlns:c=\"http://www.w3.org/2001/XMLSchema\">"+EntityId+"</b:value>";
    requestXML += "          </a:KeyValuePairOfstringanyType>";

    requestXML += "        </a:Parameters>";
    requestXML += "        <a:RequestId i:nil=\"true\">";
    requestXML += "         </a:RequestId>";
    requestXML += "        <a:RequestName>"+requestName+"</a:RequestName>";
    requestXML += "      </request>";
    requestXML += "    </Execute>";
    requestXML += "  </s:Body>";
    requestXML += "</s:Envelope>";

    var req = new XMLHttpRequest();

    req.open("POST", GetClientUrl(), false)
    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");
    req.send(requestXML);
    //Get the Response from the CRM Execute method
    //var response = req.responseXML.xml;
    req.onerror = function (e) {
        alert(req.statusText);
    };

    if (req.status === 200) {
        alert(req.responseText);
    }
}

function GetClientUrl() {
    if (typeof Xrm.Page.context == "object") {
        clientUrl = Xrm.Page.context.getClientUrl();
    }
    var ServicePath = "/XRMServices/2011/Organization.svc/web";
    return clientUrl + ServicePath;
}

Thanks.