Thursday 14 January 2016

Encode Xml Special Character (<,>,',",&) in javaScript and C#

These special character (<,>,',",&) will be encode first when making xml because on these special character the xml will broke.
The below function is used when string containing the above special character,

function specialXmlCharacterEncode(str) {
    return String(str)
            .replace(/&/g, '&amp;')
            .replace(/"/g, '&quot;')
            .replace(/'/g, '&apos;')
            .replace(/</g, '&lt;')
            .replace(/>/g, '&gt;');
}


In C# this line of code is used when string containing  special character and you make xml query and use string in xml query like in fetchXml query.

 string  str =  SecurityElement.Escape(str);

Monday 11 January 2016

Difference between FetchXML and QueryExpression

To Query MS CRM DB there are the two distinct ways.
  • Using QueryExpression
  • Using FetchXML
Limitation of the QueryExpression is , If you are Querying CRM DB using QueryExpression you cannot able to set Related Entity columns as filter criteria or 
to provide a column of a linked entity to be returned as the query result.
So you are not able to execute a query similar to the following
Select Opportunity.name, Opportunity.estimatedvalue, Account.address1_city from FilteredOpportunity Opportunity
Inner join
FilteredAccount Account on Opportunity.customerid = Account.accountis
Where account.address1_country = “US”
Also you cannot use aggregate functions in query expression.
In Fetch Xml Query you can retrieve the columns of related entity and you can set the related entity columns  as filter criteria and you can use the aggregate functions in Fetch Xml query.
Query Expression can only be used in server side language i.e C#.
But Fetch Xml query can only be used in SSRS , JavaScript(Webapi),C#.
But in performance  Query Expression is better than Fetch Xml query. 



Sunday 10 January 2016

Change Record Status in CRM 2016 through Webapi in javascript

In the below code i am deactivating account record to Inactive


function decativateRecordThroughWebapi() {

    var entityId = Xrm.Page.data.entity.getId();
    var clientURL = Xrm.Page.context.getClientUrl();
    entityId = entityId.replace("{","");
    entityId = entityId.replace("}", "");

    var req = new XMLHttpRequest();
    var odataQuery = encodeURI(clientURL + "/api/data/v8.0/accounts(" + entityId + ")");
    req.open("PATCH", odataQuery, false);
    req.setRequestHeader("Accept", "application/json");
    req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    req.setRequestHeader("OData-MaxVersion", "4.0");
    req.setRequestHeader("OData-Version", "4.0");
    //Parameters
    var account = {};
    account["statecode"] = 1; // State code value
    account["statuscode"] = 2; //  status reason Value

    req.send(JSON.stringify(account));

    if (req.readyState == 4) {
        if (req.status == 204) {

            alert("Success");
        } else {
            var error = JSON.parse(req.response).error;
            alert(error.message);
        }

    }

}

Thursday 7 January 2016

Debugging in Dynamics CRM 2015 and 2016 Plugin

Use tracing in Dynamics CRM plugin for debugging purposes.
(ITracingService)serviceProvider.GetService(typeof(ITracingService));
tracingService.Trace("Plugin Message" + context.MessageName.ToUpper());


After the Spring Update 1 of CRM 2015 you can write and check these trace logs in Plugin Tracing Logs.
For using this feature you have to enable Plugin Tracing Logs in your organization.
To enable Plugin tracing logs follow the following steps.
  • Select Settings and under the System menu, Select Administration.
  • On Administration page click on System Settings and navigate to Customization tab.
  • Change “Enable logging to plug-in tracing log” to All or Exception.


To open Plugin Tracing Logs select Settings and under the Customization menu, select Plug-In Trace Logs.


Tuesday 5 January 2016

Pass entity reference attributes and other attribute to global action by calling action through Webapi in JavaScript Dynamics CRM 2016

In the following code actionName  is the name of action.
primarycontact and parentaccount is the entityreference attribute in action.
name and email is the string attribute in action


var oDataEndpointUrl = Xrm.Page.context.getClientUrl() + "/api/data/v8.0/actionName";
        var service = new XMLHttpRequest();
        service.open("POST", oDataEndpointUrl, false);
        service.setRequestHeader("Accept", "application/json");
        service.setRequestHeader("Content-Type", "application/json; charset=utf-8");
        service.setRequestHeader("OData-MaxVersion", "4.0");
        service.setRequestHeader("OData-Version", "4.0");
        var parameter = { "name": "nizam",
                          "email": "syed.nizam69@gmail.com",
                          "primarycontact": { "contactid": "AEAD37F8-F39D-E511-80D3-2C59E5420648", "@odata.type": "Microsoft.Dynamics.CRM.contact" },
                          "parentaccount": { "accountid": "54AD37F8-F39D-E511-80D3-2C59E5420648", "@odata.type": "Microsoft.Dynamics.CRM.account" }
                         }

        service.send(JSON.stringify(parameter));
        if (service.readyState == 4 /* complete */) {
            if (service.status == 201 || service.status == 200) {
            }
        }

Change State of Record in Dynamics CRM in JavaScript by Soap Call

function changeStateOfRecord() {
    debugger;
  var entityName = Xrm.Page.data.entity.getEntityName();
  var entityId = Xrm.Page.data.entity.getId();
  SetStateRequest(entityName,entityId,2,4);
}

SetStateRequest = function (_entityname, entityid, _state, _status)
{
    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:SetStateRequest\" 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>EntityMoniker</c:key>";
    requestMain += "            <c:value i:type=\"a:EntityReference\">";
    requestMain += "              <a:Id>" + entityid + "</a:Id>";
    requestMain += "              <a:LogicalName>" + _entityname + "</a:LogicalName>";
    requestMain += "              <a:Name i:nil=\"true\" />";
    requestMain += "            </c:value>";
    requestMain += "          </a:KeyValuePairOfstringanyType>";
    requestMain += "          <a:KeyValuePairOfstringanyType>";
    requestMain += "            <c:key>State</c:key>";
    requestMain += "            <c:value i:type=\"a:OptionSetValue\">";
    requestMain += "              <a:Value>" + _state + "</a:Value>";
    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>" + _status + "</a:Value>";
    requestMain += "            </c:value>";
    requestMain += "          </a:KeyValuePairOfstringanyType>";
    requestMain += "        </a:Parameters>";
    requestMain += "        <a:RequestId i:nil=\"true\" />";
    requestMain += "        <a:RequestName>SetState</a:RequestName>";
    requestMain += "      </request>";
    requestMain += "    </Execute>";
    requestMain += "  </s:Body>";
    requestMain += "</s:Envelope>";
    var req = new XMLHttpRequest();
    req.open("POST", getClientUrl() + "XRMServices/2011/Organization.svc/web", 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");
    var successCallback = null;
    var errorCallback = null;
    req.onreadystatechange = function () { SetStateResponse(req, successCallback, errorCallback); };
    req.send(requestMain);
}

SetStateResponse = function (req, successCallback, errorCallback) {
    debugger;
    if (req.readyState == 4) {
        if (req.status == 200) {
            if (successCallback != null)
            { successCallback(); }
        }
        else {
            errorCallback
(_getError(req.responseXML));
        }
    }
}

//Also need below two supportive methods.

_getError = function (faultXml) {
    debugger;
    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];
                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);
}

function getClientUrl() {

    var strUrl = Xrm.Page.context.getClientUrl();

    if (strUrl.substr(strUrl.length - 1) != "/") {
        strUrl += "/";
    }

    return strUrl;
}

Add mapping for custom attribute of Opportunity Product to Quote Product, Quote product to Order Product and Order product to Invoice product in Dynamics CRM

Friday 1 January 2016

Change Business Process flow in JavaScript in CRM 2016 by Business Process Flow Name

 


In  the following function I am getting Business Process name from an Option Set and passing to Webapi query by getting Business Process flow Id and then Changing  Business flow  on Opportunity Entity form.


function ChangeBusinessProcessFlow() {
        try {

            var opportunityType = Xrm.Page.getAttribute("po_opportunitytype");
            if (opportunityType != null) {

                var opportunityTypeName = opportunityType.getSelectedOption().text;

                if (opportunityTypeName != null || opportunityTypeName != '') {

                    var odataQuery = "workflows?$select=workflowid,name &$filter=name eq '" + opportunityTypeName + "'";
                    var oDataEndpointUrl = Xrm.Page.context.getClientUrl() + "/api/data/v8.0/" + odataQuery;
                    var service = new XMLHttpRequest();
                    service.open("GET", oDataEndpointUrl, false);
                    service.setRequestHeader("Accept", "application/json");
                    service.setRequestHeader("OData-MaxVersion", "4.0");
                    service.setRequestHeader("OData-Version", "4.0");

                    service.send();

                    if (service.readyState == 4 /* complete */) {
                        if (service.status == 201 || service.status == 200) {
                            var data = JSON.parse(service.response);
                            if (data.value.length > 0) {
                                if (data.value[0].workflowid != null) {

                                    Xrm.Page.data.save().then(function () {

                                        Xrm.Page.data.process.setActiveProcess(data.value[0].workflowid, afterChangeBpf);

}
            }
        } catch (ex) {
            alert("error occured in ChangeBusinessProcessFlowOnOpportunityType() function");
        }
    
}
function afterChangeBpf() {
    
}

  

Numbering Table Parent group and child group ssrs report

 Recently I have faced a scenario to numbering parent group and subgroup in the following formate 10 parentGroupRow1    10.1 childGroupRow1 ...