Microsoft CRM Dynamics, Microsoft Dynamics 365, Microsoft Dynamics CRM, Power platform

Nested gallery not returning more than 500 records in canvas app

Recently we were using a nested gallery in Canvas app and displaying some data from CDS(Dataverse/ Dynamics CE).

Although connection to CDS is delegable i.e. under the hoods the connector grabs more data as it is displayed on the canvas app but that is not the case if you are using a nested gallery.

Our data set had a max of 1400 records, so for us what worked is a global setting on the app.

The setting is defaulted to 500, you can find it in the settings area of the Canvas App:

The max it can be increased to is 2000

Update of this setting helped us fetch all 1400+ records.

PS: If you have more than 2000 records, then you have to fall back on implementing pagination(Get 500 records at a time and then get the next 500 on trigger of an event.)

CRM, Microsoft CRM Dynamics, Microsoft Dynamics 365, Microsoft Dynamics CRM

Querying entity/attribute metadata in Dynamics 365 from browser

We all usually go to a solution or the customization area to see the entity metadata, may it be attributes or properties related to the entity like auditing etc.

There are also tools that a lot of developers use like the Entity metadata browser, which is a solution that you install in your environment and can browse through the metadata in an easier manner.

What I find most productive is to query the metadata from the browser itself by forming the URL specific to the entity I am looking for.

So let’s say I want to see what all attributes/fields which are available on the account entity, here’s the URL that I would use:

https://{Organization base URL}/api/data/v9.1/EntityDefinitions(LogicalName=’account’)?$select=LogicalName&$expand=Attributes($select=LogicalName;)

This is how the output would look like:

You can use any JSON formatter of your choice to better present the data if you want:

Hope it helped :-)!

Dynamics 365 Field Services, Microsoft CRM Dynamics, Microsoft Dynamics 365, Microsoft Dynamics 365 Field Service, Microsoft Dynamics CRM, Resco Field service Mobile

Connecting to your D365 Field Service instance from Field service mobile app

If you are trying to connect to your Field service instance using the FS mobile app you need to first setup the Field service mobile configuration tool (a.k.a. woodford) , install the Default base mobile template project and then derive a customizations project which would hold your Mobile customizations.

This can be setup following the guide on Microsoft docs:

But even after following the guide if you try connecting to FS mobile, you may end up getting few errors.

Your organization has not created a Bookable Resource for your account and set it to be “Enabled for Field service Mobile”

The issue here is that if you want to access FS mobile app, your user account should have a corresponding Bookable Resource with “Enabled for Field service Mobile” flag checked.

Here I have created a Bookable resource and enabled it for FS mobile:

Once you setup the Bookable resource, try to connect to FS mobile app again, you may get another error message:

Your organization needs to configure Field Service Mobile. There may not be a published mobile project or the mobile project is not configured for a security role assigned to you.

If you remember while setting up the FS Mobile project in woodford, the project was enabled for Field Service related Security roles, you need to make sure the User trying to login to the FS mobile app has at least one of those security roles. Once you give FS related security role to the user you should be able to access FS mobile app.

Happy Field servicing 🙂

Microsoft CRM Dynamics, Microsoft Dynamics 365, Microsoft Dynamics 365 Field Service, Microsoft Dynamics CRM

Restricting resources for customers in Dynamics 365 Field service

I have used Preferred Resource for Accounts in Field services a lot many times, which basically means that you can configure if the customer has some preferred resources and it helps the dispatcher to schedule those resources (if available) for a better customer experience.

Recently I came across how to configure if the customer doesn’t want a Resource to be allocated for their work orders.

How we do it is using the same Resource Preferences records but instead of choosing “Preferred ” preference type we use “Restricted”.

Adding Resource preferences:

Create a Resource preference of type “Restricted”

On schedule assistant, the restricted preferences will be applied and the resources would be filtered on the scheduled board if they are Restricted for a customer.

Dynamics 365 Field Services, Field service, Microsoft Dynamics 365

How to upgrade your Tenant from Field service 7.x to 8.x (UCI Client)

I recently tried upgrading FS for one of my customer’s tenant but couldn’t see an option to upgrade to the latest 8.x from the administrative portal.

Asked the same question to the product team and gladly they shared the process customers can follow to do this.

To Opt-in please perform the following steps:

  1. Access the Dynamics Insider Portal here:
  2. Log in with your Insider credentials.
  3. On the Insider home page, search for a program with the name “Opt-in to Upgrade Project and Field Service – Unified Interface.”
  4. Click that program link in the search results and choose to “Join Now” in the page that opens. This will add you as a participant to the program.
  5. On the program page, access the link provided to sign up:  “Signup Link to opt-in for the latest Field & Project Service UCI Release (GA)
  6. The link will open a simple questionnaire and one of the questions is the instance URL; please provide the URL of the instance.
  7. Microsoft will receive the details you provide and, within a few days, will enable the install or upgrade of the latest versions of Field and Project Service on the instance that you provided. Once enabled, you will receive a confirmation email from Microsoft.
  8. Once you receive the email, you can access your Dynamics 365 Admin portal to install or upgrade Field Service and/or Project Service Automation on the enabled instance.
  9. For any questions and discussion on the functionality, please use the Forum on the program page. Use the Microsoft Support process to log any issues/bugs.
  10. If the identified instance has both Field and Project Service installed, please plan to upgrade both solutions before resuming normal use of the instance.
  11. For a smooth install experience, please make sure that the identified instance meets all the prerequisites listed on the Insider Program page.
  12. These releases of Field and Project Service will only be available for install or upgrade on the identified instances. They will not show up for any other orgs, even if they are on the same tenant.

Microsoft CRM Dynamics, Microsoft Dynamics 365, Web Application, Windows Service

Not able to install windows service using InstallUtil.exe command

We recently faced an issue where we had a few windows services interacting with Dynamics 365 CE instance on prem.

We were using the InstallUtil utility in windows to install the service in all environments and never faced issue with installation, but the service failed to install in Prod.

Here is the InstallUtil command we were using:

InstallUtil "C:\xyz\abc.exe"

The problem was after executing the utility there was no error in console and no error in event logs but we couldn’t see the service in windows services explorer.

Also we checked the count of services before and after running the InstallUti utility and the result was the same

powershell   (Get-Service | Measure-Object).Count

We ended up using the SC CREATE command to install the service and it worked just fine for us.

SC CREATE "abc.exe" binpath="C:\xyz\abc.exe" displayname="abc.exe"

Field service, Microsoft Dynamics 365, Microsoft Dynamics 365 Field Service

A generic Sync filter for Customer Assets in Field services

As we know the Microsoft Field service app has offline capability but there are few design decisions that can help you and your customers in long run.

One important aspect is to decide upon the sync filters which drive what data is available for Users while they work in offline mode.

In this post I would be focussing on Sync filter for Customer assets and it becomes even more important if your customer has a lot of Assets in the field.

Deciding upon sync filters should be a continuous improving/ agile process rather than spending time on thinking  the best solution for the very first time.

Here was our Sync filter journey for Customer assets:

  • We started with No sync filter. This is because we weren’t sure how many assets would the customer have/create over the period
  • Next step was to at least filter out inactive assets
  • Now when the asset number started growing, we deciding upon just showing the Assemblies which are nothing but Asset containers at each site. This worked for a while but then technicians had no insight when at a site that this assembly had what assets.
  • We finalised upon showing all Assets (Parent/ Child) in the territories that the User works in. This was great, now the User could see every asset that he/she deals with.
  • After a while this also starting blowing apart as few Users were catering to multiple territories and by default there’s a hard limit of 10000 records that you can sync for an entity in offline mode.
  • The business then decided to re do their territories and create new territories for overlapping areas.

The point here is that no one solution will fit all customers and solution for today may become obsolete tomorrow.

One good thing with woodford sync filters is that we can use fetchxml to build them,

Here’s the sync filter fetch xml we finalised upon:

<?xml version="1.0" encoding="utf-8"?>
<fetch xmlns:xsi="" xmlns:xsd="" version="1.0">
<entity name="msdyn_customerasset">
<filter type="and">
<condition attribute="statecode" operator="eq" value="0" />
<link-entity name="account" alias="L0" from="accountid" to="msdyn_account" link-type="inner">
<link-entity name="territory" alias="L1" from="territoryid" to="msdyn_serviceterritory" link-type="inner">
<link-entity name="msdyn_resourceterritory" alias="L2" from="msdyn_territory" to="territoryid" link-type="inner">
<link-entity name="bookableresource" alias="L3" from="bookableresourceid" to="msdyn_resource" link-type="inner">
<filter type="and">
<condition attribute="userid" operator="eq-userid" />
Microsoft CRM Dynamics, Microsoft Dynamics 365

New PowerBI dashboard button not showing in D365

Recently we had a requirement to show existing PowerBI dashboards in Dynamics 365.

When we tried to create a Power BI dashboard in dynamics, we couldn’t see the “New PowerBI dashboard” option on Dashboards page.


The problem was the PowerBI dashboards feature in Dynamics has to be enabled before we can go ahead and add a dashboard.

This is how to enable it:

  • Sign-in to Microsoft Dynamics 365 as a user with the system administrator security role.
  • Go to Settings > Administration > System Settings.
  • On the Reporting tab in the Allow Power BI visualization embedding option, select Yes to enable.
  • Click OK.

Once you are done, refresh the Dashboards page and you should now be able to see the Add new button.



Note: To access PowerBI dashboards in Dynamics, the users would need Power BI pro license. Exception being if customer has power BI premium, in that case only users creating power bi reports need to have power bi pro licenses.


CRM, Dynamics 365 Field Services, Microsoft CRM Dynamics, Microsoft Dynamics 365, Microsoft Dynamics 365 Field Service

Creating Booking Rules in Microsoft Dynamics 365 Field Services

Booking Rules are Javascript validations that you can attach to the Booking creation event which is triggered when a booking is created on the schedule board or the schedule assistant.

To create a Booking Rule,  Field Service > Administration, and then choose Booking Rules.


What we need to do is attach a JS web resource with the Booking rule. The JS web resource should have a function which takes in the context and is called when a Resource requirement is dragged and dropped on to the Schedule board or the assistant.

Let’s see some code, in this example we are restricting creating of a Booking on the basis of how many bookings are already being created for a Resource.

function validateRules(sbContext) {
var ruleResult = {};
var resourceReqId = '';
if (sbContext.newValues.ResourceRequirementId != undefined) {
resourceReqId = sbContext.newValues.ResourceRequirementId;
else if (sbContext.newValues.ResourceScheduleSource != undefined && sbContext.newValues.ResourceScheduleSource == 690970004) {//SA
var rr = Xrm.Page.getAttribute('msdyn_resourcerequirement');
if (rr != null && rr.getValue() != null && rr.getValue().length > 0) {
resourceReqId = rr.getValue()[0].id;
if (resourceReqId == '') {
console.log('RR is null. Exiting..');

ruleResult.IsValid = true;
ruleResult.Message = “No RR”;
ruleResult.Type = ‘success’;
return ruleResult;

resourceReqId = resourceReqId.replace(‘{‘, ”).replace(‘}’, ”);
var resourceId = sbContext.newValues.ResourceId;
var startTime = sbContext.newValues.StartTime;
var endTime = sbContext.newValues.EndTime;
var hearingType = ”;

var req = new XMLHttpRequest();“GET”, encodeURI(Xrm.Page.context.getClientUrl() + ‘/api/data/v8.2/msdyn_resourcerequirements?$filter=msdyn_resourcerequirementid eq ‘ + resourceReqId + ‘&$expand=new_wa_case($select=wa_hearingtype)’), 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.setRequestHeader(“Prefer”, “odata.include-annotations=OData.Community.Display.V1.FormattedValue”);
if (req.readyState === 4) {
req.onreadystatechange = null;
if (req.status === 200) {
var result = JSON.parse(req.response);
hearingType = result.value[0].new_wa_case[‘wa_hearingtype’];

if (hearingType == null) {
hearingType = 953860001; // Motion as default
console.log(‘motion set as default’);

var dt = new Date(startTime).toISOString();
var st = dt.substr(0, dt.indexOf(‘T’)) + ‘T00:00:00Z’;
var et = dt.substr(0, dt.indexOf(‘T’)) + ‘T23:59:59Z’; //2018-07-17T11:59:59Z
console.log(dt); // today’s date
var req = new XMLHttpRequest();“GET”,
encodeURI(Xrm.Page.context.getClientUrl() +
‘/api/data/v8.2/bookableresourcebookings?$select=bookableresourcebookingid,starttime,endtime&$expand=Resource($select=wa_jurytrialhearinglimit,wa_motion)&$filter=_resource_value eq ‘ +
resourceId +
‘ and wa_hearingtype eq ‘ +
hearingType +
‘ and starttime gt (‘ + st + ‘) and endtime lt (‘ + et + ‘)’),
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.setRequestHeader(“Prefer”, “odata.include-annotations=OData.Community.Display.V1.FormattedValue”);
if (req.readyState === 4) {
req.onreadystatechange = null;
if (req.status === 200) {
var res = JSON.parse(req.response);
var data = res.value;

ruleResult.IsValid = true;
ruleResult.Message = “Validation succeeded”;
ruleResult.Type = ‘success’;

if (data.length > 0 && data[0].Resource != null) { // Court Room
var juryLimit = data[0].Resource.wa_jurytrialhearinglimit;
var motionLimit = data[0].Resource.wa_motion;
console.log(data, data.length, juryLimit, motionLimit);
var isDone = false;
for (var i = 0; i = new Date(data[i].starttime) && startTime = juryLimit) {
ruleResult.IsValid = false;
ruleResult.Message = ‘Jury Hearing capacity reached. Bookings not allowed.’;
ruleResult.Type = ‘error’;
} else if (hearingType == 953860001 && data.length >= motionLimit) {
ruleResult.IsValid = false;
ruleResult.Message = ‘Motion Hearing capacity reached. Bookings not allowed.’;
ruleResult.Type = ‘error’;
} else {
else {
return ruleResult;

CRM, Dynamics 365 Field Services, Microsoft Dynamics 365, Microsoft Dynamics 365 Field Service

How to hide Initial public view from schedule board in D365 Field services

As you would know in D365 field services schedule board, we can configure multiple boards and configure different filters or one scenario which is very common is having a board for each Organization unit/Territory.

We have a request from customer that they want to hide the Default Initial Public view from the board. There’s an easy way to configure this in D365.

Go to Advanced find and search for “Schedule board Settings entity”:

Find the record with Tab Name: “Initial public view” and change the Share Type to System instead of Everyone.

This is going to hide the tab from the schedule board.