Author: Nijo Joseph

Dynamics 365 V9.0 – First Look. It is here..

Dynamics 365 V9.0 MutliSelect Optionset is here say goodbye to custom HTML MutliSelect Optionsets

Jeevarajan Kumar's avatarJeevarajan Kumar

Finally, the expected next version of Dynamics 365, V9.0 is available from today. I’ve been so excited about the V9.0 new features and finally got a chance to play with it today.

I have been playing around with the entities, grids, new controls, settings etc. This will be the first blog post of this ‘First Look’ series, I have added the things I found interesting in the new version so far, I will be writing more about the features of V9.0 in next posts.

Unified Interface:

Alright, let’s start with the Unified Interface (UI) introduced, the UI looks pretty clean and organized now with the borders for the containers, word wraps, etc.

As mentioned in the below image,

  1. Unnecessary white spaces are reduced.
  2. Word wrap, borders for the containers – it gives a clean look
  3. Empty fields have a pretext line now.
  4. Social pane has a bold look now (I’m…

View original post 269 more words

{New Utility} Record Privilege Checker for Dynamics CRM

Record Privilege Checker for Dynamics CRM

Debajit's avatarDebajit's Dynamic CRM Blog

Recently I had a requirement where our client’s support and maintenance team wanted a feature through which they can view the privileges for a record for all active users in the system. Ok, let me take a moment to explain here.

Suppose the support team wants to run a regular security check and identify what privilege does a specific user have on specific account records. You might be thinking that is that this hard? After all we can go to the user and identify the security roles of the user. And then determine what access privilege does the security role have on the account

Simple isn’t it? Well it is not. And specially with CRM 2016, a user might end up getting a specific privilege on record through any of the following.

  • Security roles
  • Sharing
  • Access teams
  • Owner team association
  • Hierarchical relationship.

It can be really complex depending on how…

View original post 295 more words

Microsoft Dynamics CRM is behaving weird!!! (Common troubleshooting tips)

Sometimes your on-premise CRM system will show, some weird behaviors like workflows are not executing / plugins are not working / data imports are failing without any data issues etc…

I have faced certain issues like the entire system is not working , system will  show error messages without any logs, the only message it  displays is “an error has occurred”.

Following are the common issues you can check in such situations.

Ensure CRM Asynchronous services are running

From the server Administrative Tools select Services, and if the CRM Asynchronous services are not running ensure to start the services (if the Asynchronous  services are not running CRM will stop working).

Ensure CRM Sandbox services are running

From the server Administrative Tools select Services, and if the CRM Sandbox services are not running ,please start the services. If the Sandbox services are not running CRM will stop working or the normal system jobs will fail without showing any valid errors .

Check IIS

Ensure the following in IIS

CRM application pool and CRM  website are up. Try browsing the CRM website from IIS.

Make sure your SQL server and Reporting services are up

Ensure your local machine time is in sync with the server time 

This may sound funny but trust me this simple point can save your many productive hours.

Recently my system failed to  perform certain operations and I wasn’t able to connect the Xrm tools too. When I debugged I got the keyword “past time” , then I identified that the server time was different from my local machine.

If you have tried all the above steps and still you are not able to identify the issue,please check the server event viewer this may give you some details regarding the failure.

Hope this helps!!!…  🙂

 

 

 

 

 

On demand backups for CRM Online instance

With on demand backups, you can make your own backup before making some significant customization change or applying a version update.

CRM Online Administrator Center

About CRM managed on demand backups:

  • You can back up Production and Sandbox instances.
  • You can only restore to a Sandbox instance. To restore to a Production instance, first switch it to a Sandbox instance. See Switch an instance.
  • Only CRM Online 2016 Update 1 or later versions are supported for backup.
  • On demand backups are retained for up to three days. Check your expiration date.
  • On demand backups are identified as created by someone other than System and by the presence of Edit | Delete | Restore in the details section. System backups only have Restore.

Backup and restore CRM online instance

Configure SLA for Custom Entities

In previous releases, you could create SLAs only for case records. With CRM Online 2016 Update 1 and CRM 2016 SP1, you can now create enhanced SLAs for entities that are enabled for SLA. A system administrator or customizer can enable SLAs for the following entities and also for custom entities and custom activities:

  • Account
  • Contact
  • Order
  • Invoice
  • Quote
  • Opportunity
  • Lead
  • All activity entities like email, phone, and appointment except recurring appointment and its instances.

 

To enable SLA for custom entities you can select Enable for SLA option in the entity.

Untitled

once the entity is published you can configure SLA using the same steps we used for case, system will ask for the related entity at the time of SLA creation  .

Untitled

Please note that only enhanced SLA is available for custom entities , standard SLA can be used only with case entity.

To create see how to configure SLA please follow the link :Define SLA

To add a timer control to the form please follow : Add Timer

Hope this was helpful……..

 

 

WEB API- Part 6 : Create record

Create record using WEB API 

Following code shows how to create an Account record using WEB API and how to set different types of fields

function CreateAccount() {
 
    var serverURL = Xrm.Page.context.getClientUrl();
    var account = {};
    account["name"] = "New Account";
   
   
 //Set LookUp
    account["primarycontactid"] = {
        "firstname": "Sample",
        "lastname": "Contact"
    };// this will create new contact ,if you need to link an existing contact use the following
 //account["primarycontactid@odata.bind"]="/contacts(contactId)"; 
 
    //optionset
    account["companytype"] = 2;
    //two options
    account["donotemail"] = true;
    //number
    account["numberofemployees"] = 30;
 
    var req = new XMLHttpRequest();
    req.open("POST", serverURL + "/api/data/v8.0/accounts", true);
    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.onreadystatechange = function() {
        if (this.readyState == 4 /* complete */ ) {
            req.onreadystatechange = null;
            if (this.status == 204) {
                var NewAccount = this.getResponseHeader("OData-EntityId");
                var NewAccountId = NewAccount.substr(NewAccount.length - 38).substring(1, 37); 
                Xrm.Utility.openEntityForm("account", NewAccountId); //Open newly created account record
            } else {
                var error = JSON.parse(this.response).error;
                alert(error.message);
            }
        }
    };
    req.send(JSON.stringify(account));
}

 

Please note following code for setting an existing lookup value

 account["primarycontactid@odata.bind"]="/contacts(contactId)";

“contacts” is plural name for contact entity .

var NewAccount = this.getResponseHeader(“OData-EntityId”);  will give  you the newly created record…

WEB API- Part 5 : Get lookup text

Get lookup text using WEB API

Following code will fetch the originating lead lookup text and Id from an opportunity .

var req = new XMLHttpRequest();
req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v8.0/opportunities?$select=_originatingleadid_value&$filter=_originatingleadid_value ne null", true);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("Prefer", "odata.include-annotations=\"OData.Community.Display.V1.FormattedValue\"");
req.onreadystatechange = function () {
    if (this.readyState === 4) {
        req.onreadystatechange = null;
        if (this.status === 200) {
            var results = JSON.parse(this.response);
            for (var i = 0; i < results.value.length; i++) {
                 var _originatingleadid_value = results.value[i]["_originatingleadid_value"];// Id
                 var _originatingleadid_value_formatted = results.value[i]["_originatingleadid_value@OData.Community.Display.V1.FormattedValue"];// text value
            }
        }
        else {
            alert(this.statusText);
        }
    }
};
req.send();

WEB API- Part 4 : Get option-set text

Get option-set text and value using Web API

Following code fetches lead source option-set value and text from lead entity.

var req = new XMLHttpRequest();
req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v8.0/leads?$select=firstname,leadsourcecode&$filter=fullname eq 'Alex%20Eric'", true);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("Prefer", "odata.include-annotations=\"OData.Community.Display.V1.FormattedValue\"");
req.onreadystatechange = function () {
    if (this.readyState === 4) {
        req.onreadystatechange = null;
        if (this.status === 200) {
            var results = JSON.parse(this.response);
            for (var i = 0; i < results.value.length; i++) {
                 var firstname = results.value[i]["firstname"];
                 var leadsourcecode = results.value[i]["leadsourcecode"];
                 var leadsourcecode_formatted = results.value[i]["leadsourcecode@OData.Community.Display.V1.FormattedValue"];
            }
        }
        else {
            alert(this.statusText);
        }
    }
};
req.send();

Please note the following code

" var leadsourcecode_formatted = results.value[i]["leadsourcecode@OData.Community.Display.V1.FormattedValue"];"

“fields name@OData.Community.Display.V1.FormattedValue” will give you the text value of the filed.

Note : Don’t forget to add req.setRequestHeader(“Prefer”, “odata.include-annotations=\”OData.Community.Display.V1.FormattedValue\””);
in the request header

WEB API- Part 3 : Retrieve records modified within last few hours

Using Query Functions:  Retrieve records modified within last few hours 

Query Functions  are intended to be used to compose a query. These functions can be used in a manner similar to the standard library functions,

The following example shows how to use the “LastXHours” to return all account entities modified in the past 12 hours.

var req = new XMLHttpRequest();
req.open("GET", Xrm.Page.context.getClientUrl() +/api/data/v8.1/accounts?$select=name,accountnumber&$filter=Microsoft.Dynamics.CRM.LastXHours(PropertyName=@p1,PropertyValue=@p2)&@p1='modifiedon'&@p2=12

For complete list of query functions please follow the link Query functions.

 

WEB API- Part 2: Retrieve Single Record Using WEB API

Retrieve Single Record Using WEB API

Following  code shows how to fetch an account record using  Guid

var req = new XMLHttpRequest();

var AcccountID="257bAC5D5240-8B31-E611-80E4-5065F38B4681";
req.open("GET", Xrm.Page.context.getClientUrl() +"/api/data/v8.0/accounts(AcccountID)?$select=name", true);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("Prefer", "odata.include-annotations=\"OData.Community.Display.V1.FormattedValue\"");
req.onreadystatechange = function () {
if (this.readyState === 4) {
req.onreadystatechange = null;
if (this.status === 200) {
var result = JSON.parse(this.response);
var name = result["name"];
}
else {
alert(this.statusText);
}
}
};
req.send();