Thursday 26 May 2016

CRM 2016/2015/2013: Applying custom FetchXml to a subgrid using JavaScript

I have faced a scenario to show Account related contacts emails in sub-grid on account form.
In my scenario there is a many to many relationship between account and contact.
and i want to show Account related contacts emails in sub-grid on Account.

To achieve this goal i add a sub-grid of emails on account form.



Then i developed fetch XML in advanced find to show account related contacts emails.

var FetchXml = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true'>" +
                                "<entity name='email'>" +
                                    "<attribute name='subject' />" +
                                    "<order attribute='subject' descending='false' />" +
                                    "<attribute name='to' />" +
                                    "<attribute name='from' />" +
                                    "<attribute name='createdon' />" +
                                    "<attribute name='activityid' />" +
                                    "<link-entity name='activityparty' from='activityid' to='activityid' alias='ad'>" +
                                       "<link-entity name='contact' from='contactid' to='partyid' alias='ae'>" +
                                       "<link-entity name='new_account_contact' from='contactid' to='contactid' visible='false' intersect='true'>" +
                                           "<filter type='and'>" +
                                            "<condition attribute='accountid' uitype='account' value='" + accountid + "' operator='eq'/>" +
                                         "</filter>" +
                                       "</link-entity>" +
                                     "</link-entity>" +
                                    "</link-entity>" +
                                    "</entity>" +
                                  "</fetch>";


To apply this custom fetch XML  to the sub-grid i used the below JavaScript function.

function dynamicallyFilterSubGrid() {
    var objSubGrid = window.parent.document.getElementById("RelatedContactEmails");
    //CRM loads subgrid after form is loaded.. so when we are adding script on form load.. need to wait unitil subgrid is loaded.
    // thats why adding delay..
    if (objSubGrid == null) {
        setTimeout(dynamicallyFilterSubGrid, 2000);
        return;
    }
    else {
        if (objSubGrid.control != null) {
            var accountid = Xrm.Page.data.entity.getId();
            var FetchXml = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true'>" +
                                "<entity name='email'>" +
                                    "<attribute name='subject' />" +
                                    "<order attribute='subject' descending='false' />" +
                                    "<attribute name='to' />" +
                                    "<attribute name='from' />" +
                                    "<attribute name='createdon' />" +
                                    "<attribute name='activityid' />" +
                                    "<link-entity name='activityparty' from='activityid' to='activityid' alias='ad'>" +
                                       "<link-entity name='contact' from='contactid' to='partyid' alias='ae'>" +
                                       "<link-entity name='new_account_contact' from='contactid' to='contactid' visible='false' intersect='true'>" +
                                           "<filter type='and'>" +
                                            "<condition attribute='accountid' uitype='account' value='" + accountid + "' operator='eq'/>" +
                                         "</filter>" +
                                       "</link-entity>" +
                                     "</link-entity>" +
                                    "</link-entity>" +
                                    "</entity>" +
                                  "</fetch>";
            objSubGrid.control.SetParameter("fetchXml", FetchXml);
            objSubGrid.control.Refresh();
        }
        else {
            setTimeout(dynamicallyFilterSubGrid, 2000); // this setTimeout function is necessay because first objSubGrid.control is null
        }
    }
}

Lead not able to qualify in Microsoft Dynamics CRM

When qualifying Lead and it throw error like 

"An error has occurred. Either the data does not exist or you do not have sufficient privileges to view the data. Contact your system administrator for help" 

This error is basically occur because someone have deleted Stakeholder connection role from the CRM.

The Process of adding Stakeholder connection role to the CRM.
Create a solution in the org in which lead is qualifying successfully.
then add the Stakeholder connection role to the solution then export the solution and import the solution to the org in which lead is not qualifying and the above error is coming.
and publish the solution.

so the  above error will be resolved.


Friday 20 May 2016

Delete Record in in Microsoft Dynamics CRM 2016 using Web API


  function DeleteAccount() {
      //get Server url
        var serverURL = Xrm.Page.context.getClientUrl();

        //create Xml request object 
        var service = new XMLHttpRequest();

        //below line is used to delete the entity record  
        service.open("DELETE", serverURL + "/api/data/v8.0/accounts(1DD18913-11CB-E511-80D2-C4346BDC11C1)", 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");
        service.send();

        if (service.readyState == 4 /* complete */) {
        if (service.status == 204) {
            //show alert message 
            alert('Field Value Deleted');
        }
        else {
            var error = JSON.parse(service.response).error;
            //show error message
            alert(error.message);
        }
    }      
}
 

Update Record in Microsoft Dynamics CRM 2016 using Web API


  function UpdateAccount() {

    var serverURL = Xrm.Page.context.getClientUrl();
    var account = {};
    account["name"] = "Create record Web API Example"; //set single line of text field
    account["address1_city"] = "Islamabad";//set single line of text field
    //Lookup
    account["primarycontactid@odata.bind"] = "/contacts(0D7AFC02-891C-E611-80E1-5065F38B0371)";  //setting existing lookup
    //Below code will create contact on fly and set in primarycontact 
    //account["primarycontactid"] = {
    //    "firstname": "Mahender",
    //    "lastname": "Pal"
    //};

    //optionset
    account["industrycode"] = 1; // set optionSet field
    //two options
    account["donotphone"] = true; //set boolean field
    //number
    account["numberofemployees"] = 20;//set whole no field
    //date time
    //account["him_approvaldate"] = new Date();

    var req = new XMLHttpRequest();
    req.open("PATCH", serverURL + "/api/data/v8.0/accounts(1DD18913-11CB-E511-80D2-C4346BDC11C1)", 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");
    req.send(JSON.stringify(account));

    if (req.readyState == 4 /* complete */) {
        if (req.status == 204) {
            
        } else {
            
        }
    }
}
 

Create Record in Microsoft Dynamics CRM 2016 using Web API


  function CreateAccount() {

    var serverURL = Xrm.Page.context.getClientUrl();
    var account = {};
    account["name"] = "Create record Web API Example"; //set single line of text field
    account["address1_city"] = "Islamabad";//set single line of text field
    //Lookup
    account["primarycontactid@odata.bind"] = "/contacts(0D7AFC02-891C-E611-80E1-5065F38B0371)";  //setting existing lookup
    //Below code will create contact on fly and set in primarycontact 
    //account["primarycontactid"] = {
    //    "firstname": "Mahender",
    //    "lastname": "Pal"
    //};

    //optionset
    account["industrycode"] = 1; // set optionSet field
    //two options
    account["donotphone"] = true; //set boolean field
    //number
    account["numberofemployees"] = 20;//set whole no field
    //date time
    //account["him_approvaldate"] = new Date();

    var req = new XMLHttpRequest();
    req.open("POST", serverURL + "/api/data/v8.0/accounts", 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");
    req.send(JSON.stringify(account));

    if (req.readyState == 4 /* complete */) {
        if (req.status == 204) {
            var accountUri = this.getResponseHeader("OData-EntityId");
            var ID = accountUri.substr(accountUri.length - 38).substring(1, 37); //get only GUID
           // Xrm.Utility.openEntityForm("account", ID); //Open newly created account record
        } else {
            var error = JSON.parse(req.response).error;
            alert(error.message);
        }
    }
}
 

Create Activity and associated Activity Party in Microsoft Dynamics CRM 2016 using Web API


 function CreateEmail() {
    var quoteId = Xrm.Page.data.entity.getId();
    quoteId = quoteId.replace(/[{}]/g, "");
    var OwnerLookup = Xrm.Page.getAttribute("ownerid").getValue();
    OwnerGuid = OwnerLookup[0].id;
    OwnerGuid = OwnerGuid.replace(/[{}]/g, "");
    var CustomerLookUp = Xrm.Page.getAttribute("customerid").getValue();
    var AccountId = CustomerLookUp[0].id;
    AccountId = AccountId.replace(/[{}]/g, "");

    var webapiPath = Xrm.Page.context.getClientUrl() + "/api/data/v8.0/emails";
    var email = {};
    //Lookup
    email["regardingobjectid_quote@odata.bind"] = "/quotes(" + quoteId + ")"; //Regarding is quote
    email["subject"] = "New Email";
    email["description"] = "Email Description";
    var parties = [];
    //ActivityParty (From)
    var sender = {};
    sender["partyid_systemuser@odata.bind"] = "/systemusers(" + OwnerGuid + ")";
    sender["participationtypemask"] = 1; //From

    //ActivityParty (To)
    var receiver = {};
    receiver["partyid_account@odata.bind"] = "/accounts(" + AccountId + ")";
    receiver["participationtypemask"] = 2; //To 
    //add this to collection
    parties.push(sender);
    parties.push(receiver);

    email["email_activity_parties"] = parties;

    var service = new XMLHttpRequest();
    service.open("POST", webapiPath, 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");
    service.send(JSON.stringify(email));
    if (service.readyState == 4 /* complete */) {
        if (service.status == 204) {
            
        }
    }
}
ActivityParty entity : https://msdn.microsoft.com/en-us/library/gg328549.aspx

Thursday 19 May 2016

Query Data using the Web API

In the below function RetrieveParentAccount() i want to  show how to retrieve string, option Set, lookup and  to Two Option fields
I have test the   RetrieveParentAccount() function on form OnLoad of contact entity.


  function RetrieveParentAccount() {
   
    var accountLookup = Xrm.Page.getAttribute("parentcustomerid");
    if (accountLookup != null) {
        var accountLookupValue = accountLookup.getValue();
        var accountGuid = accountLookupValue[0].id;
        accountGuid = accountGuid.replace("{", "");
        accountGuid = accountGuid.replace("}", "");

        //name : is single line of text field
        //primarycontactid : is Lookup field
        //preferredcontactmethodcode: is optionset field
        //donotemail : is two option field

        //filter by lookup field
        // var filter = "&$filter=_primarycontactid_value eq 0F7AFC02-891C-E611-80E1-5065F38B0371";

        //filter byOptionset field
        //var filter = "&$filter=preferredcontactmethodcode eq 2";

        //filter TwoOption field
        var filter = "&$filter=donotemail eq false";
        var orderBy = "&$orderby=name asc";
        var expand = "&$expand=incident_customer_accounts($select=title)";

        //var query = "accounts?$select=name,_primarycontactid_value,preferredcontactmethodcode,donotemail" + filter + orderBy + expand ;

        var query = "accounts(" + accountGuid + ")?$select=name,_primarycontactid_value,preferredcontactmethodcode,donotemail" + expand;
        var webapiPath = Xrm.Page.context.getClientUrl() + "/api/data/v8.0/" + query;

        var service = new XMLHttpRequest();
        service.open("GET", webapiPath, 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");
        service.setRequestHeader("Prefer", "odata.include-annotations=*"); 
        //service.setRequestHeader("Prefer", "odata.maxpagesize = 3"); this tag isused to retrieve no of records
        service.send();

        if (service.readyState == 4 /* complete */) {

            if (service.status == 201 || service.status == 200) {

                var result = eval('(' + service.responseText + ')');
                var name = result.name; // extract single line of text field
                var lookupGuid = result._primarycontactid_value; // extract Look up guid
                var lookupEntityName = result['_primarycontactid_value@Microsoft.Dynamics.CRM.lookuplogicalname']; //extract look up logical name
                var lookupName = result['_primarycontactid_value@OData.Community.Display.V1.FormattedValue']; // extract lookup text
                var booleanFieldValue = result.donotemail; // boolean field
                var booleanFieldText = result['donotemail@OData.Community.Display.V1.FormattedValue']; // boolean field text
                var optionsetValue = result.preferredcontactmethodcode; // extract optionSetValue
                var optionsetText = result['preferredcontactmethodcode@OData.Community.Display.V1.FormattedValue'];//extract optionset text
                var releatedEntityCaseTitle = result.incident_customer_accounts[0].title;
            }
        }
    }
}  

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 ...