Skip to content

benjaminjohn.de Posts

Disable a section on profile form on Dynamics 365 portal dynamically

Posted in Dynamics 365, Power Platform, PowerApps Portals, and Revive

At the moment I’m setting up a community portal, where it is planned that the users can register themselves.

The portal users should also be able to enter their company name.
To do this, I use the field “adx_organizationname” provided by the portal because with an account lookup everyone could see our customers. The backoffice then checks whether this contact is related to an existing company or a new one. As soon as the contact is then connected to an account record, the organization name should no longer be changeable by the portal user.

What not worked

  • Javascript on CRM form.
  • Business Rule on CRM form (because it is Javascript).
  • Add the field twice to the form to have one editable and one readonly and hide the the not applicable with jQuery in the portal.
    The same fields two times on the profile form let the portal crash.
  • Make the field readonly on the CRM form and enable it in the portal with jQuery did not save the data back to CRM.

Solution

I have created a separate section for the company-related fields

and make it read only when parentcustomer is not empty.

This creates following tag in the HTML structure.

The result looks like this.

Oh wait, happy times, Dynamics portals has arrived my blog for the first time!

Get isActivity from Metadata

Posted in Dynamics 365, Power Platform, and Revive

This week I had to differentiate between normal entities and activities in Javascript. I had a look into the SDK and remembered my previous post “Get EntitySetName from Metadata“. A little modification and I get true or false from the ‘isActivity’ information in the metadata.

Here it is fo you: Get isActivity from Metadata

function isActivity(strEntityLogicalName)
{
    var req = new XMLHttpRequest();
    req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v8.0/" +
        "EntityDefinitions(LogicalName='" + strEntityLogicalName + "')?$select=IsActivity", false);
    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.onreadystatechange = function ()
    {
        if (this.readyState === 4)
        {
            req.onreadystatechange = null;
            if (this.status === 200)
            {
                var result = JSON.parse(this.response);
                var isActivity = result.IsActivity;
            }
        }
    };
    req.send();
}

isActivity

CalculateRollupField with WebApi function in Javascript

Posted in Dynamics 365, Power Platform, and Revive

Microsoft added with Service Pack 1 a new function called “CalculateRollupField” in Dynamics CRM (v 8.1) which enables us to recalculate a rollup field on demand.
I will show you here how you can use it in Javascript with a http request against the WebApi.

The CalculateRollupField function inside the webrequest needs a few parameter to know which rollup field you want to to calulate:

CalculateRollupField in Javascript:

function calcRollupField(strTargetEntitySetName, strTargetRecordId, strTargetFieldName)
{
    strTargetRecordId = strTargetRecordId.replace("{", "").replace("}", "");
    var req = new XMLHttpRequest();
    req.setRequestHeader("OData-Version", "4.0");
    req.setRequestHeader("OData-MaxVersion", "4.0");
    req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v8.2/" +
        "CalculateRollupField(Target=@p1,FieldName=@p2)?" +
        "@p1={'@odata.id':'" + strTargetEntitySetName + "(" + strTargetRecordId + ")'}&" +
        "@p2='" + strTargetFieldName + "'", true);

    req.onreadystatechange = function ()
    {
        if (this.readyState === 4)
        {            
            req.onreadystatechange = null;
            if (this.status === 200)
            {
                var results = JSON.parse(this.response);
            }
            else
            {
                Xrm.Utility.alertDialog(this.statusText);
            }
        }
    };    
    req.send(JSON.stringify({}));
}

The answer of the webservice for the CalculateRollupField function contains the value for the target field, the date of the last calculation and its state.

Missing privilege for editable grids

Posted in Dynamics 365, Power Platform, and Revive

In one of our last projects we used an editable grid from Microsoft, but had a strange issue.
Read here how we detected and identified a missing privilege for editable grids.

Issue

During testing with an user account we found that the editable grid for a custom entity does not render. For admins is all fine.
This is how it should look.

This what it actually was.

Analysis

First thing we’ve checked was whether someone has changed the form rendering mode because editable subgrids don’t work on legacy forms. But it was still correct set.

Also we checked the known editable grids limitations for fields from related entities, the state field, partylists, customer and composite fields. But there was no such field in the view.

Further we’ve checked the users security roles. They have a custom role, but it includes all privileges for the parent and child entity.

Next we proved what happens when we remove the editable grid control and use the read only version instead. As a result, everything was ok in the read only grid.

Now I had a look at the browser console and found an error . . . a few times.

As desperation act we gave the user the default sales person security role and were surprised that now everything worked fine.

Identify the missing privilege for editable grids

We compared the two security roles and identified the “prvReadRole” as origin of the issue.
It was set to “None Selected”. I assume it is needed by the editable grid control the check if the user has all necessary privileges to edit the records in his security roles.

CRM background color

Posted in Dynamics 365, Power Platform, and Revive

With Dynamics CRM 2015 Update 1 Microsoft introduced the possibility to create own themes. In this post I won’t show you default settings and screenshots of unicorn colored CRM systems, I will show you the hidden setting for the CRM background color.

When you query the properties of a theme you will discover a setting that isn’t visible on the theme record (the highlighted line).
Please spare yourself the trail to customize the theme formular, it is not possible.

{
   "name": "CRM Default Theme",
   "isdefaulttheme": false,
   "logotooltip": "Microsoft Dynamics 365",
   "_logoid_value": null,
   "navbarbackgroundcolor": "#000000",
   "navbarshelfcolor": "#DFE2E8",
   "headercolor": "#1160B7",
   "globallinkcolor": "#1160B7",
   "selectedlinkeffect": "#B1D6F0",
   "hoverlinkeffect": "#D7EBF9",
   "processcontrolcolor": "#D24726",
   "defaultentitycolor": "#001CA5",
   "defaultcustomentitycolor": "#006551",
   "controlborder": "#CCCCCC",
   "controlshade": "#F3F1F1",
   "backgroundcolor": "#FFFFFF",
}

So I had the idea to update the value directly through a web service call and it works.
After publishing the theme, I had a new CRM background color.

What you need to know is that Microsoft changes value back to the original CRM background color (#FFFFFF), every time you save the record through th UI.

The CRM background color bookmarklet

Since I’m a lazy guy who likes it when things are reusable, I’ve created the following bookmarklet.

Drag and drop the “CRM background color” button on your bookmark toolbar.
 

With the bookmarklet your process to change the CRM background color is:

  1. Open your theme record
  2. Make your customizations
  3. Save the theme
  4. Use the bookmarklet
  5. Publish your theme

I’m not sure if Microsoft will support it.
From a technical point of view is it only an update of a record through the webservice. Considered a manufacturers point of view, they don’t want that we can change it – otherwise we had probably an option for it in the UI.

Happy styling!