Tip #1071: Extract images from Power BI

Scott “I don’t want to can’t be an MVP anymore” Sewell may have swallowed the blue pill (or was it the red pill?) but he still produces occasional nuggets of wisdom.

According to Scott, if you need to extract a background image or a custom element from an existing Power BI file, make a backup of the file, then rename the backup’s file extension from .pbix to .zip and extract the contents. The background files are stored as gifs or jpgs or whatever they were uploaded as. You’ll find them under the \Report\StaticResources\RegisteredResources folder within the zip. (And don’t get me started on whether it’s pronounced “gif” or “jif” – because I (Scott, that is – t.j.) prefer “jeef”…)

If you don’t have the report in Power BI Desktop format, you can export the report from the Power BI service.

(Facebook/Twitter cover photo by Vadim Sherbakov on Unsplash)

Tip #1070: Some Tips For Portal Web Forms

My team have built a fair few portal web forms in our current project and, over time, we have learned a few lessons. So, if you are about to launch into building web forms for a project, here are some pointers that may assist.

Plan Out the Web Form

The best lesson I learned from the first year computing course I did at university was to plan before you code (or in this case configure). It is very easy for a web form to get complicated very quickly, especially if there is branching in the form. Plan it out, simplify it where you can so you do not tie yourself in knots.

Use a Custom Entity

We have learned the hard way not to link web forms directly to, say, the Case entity. The problem is, as the number of web forms increases, the number of fields blow out. Putting them all on the one entity is a recipe for disaster (while substantial, there is a limit to the number of fields permissible on an entity.) Store web forms on a custom entity and use workflows to ‘convert’ them (you can always add form values to the Case description field after all). Use the same entity for groups of web forms where it makes sense i.e. where the same fields are used again and again. The other advantage of this approach is you get a definitive record of what was actually entered into the form before the Dynamics Users get a hold of the data.

Build the Web Form Backwards

The web form requires a starting step and each step needs to know the next step to go to. So if you build them in order, you have to remember to go back and link them all up. The alternative is to build the steps in reverse order.

Learn Metadata

Web form metadata provides a simple, yet powerful way to modify the behaviour of the web form steps. Learn what metadata can do. You will be pleasantly surprised.

Get a Good Developer in Your Corner

Configuration and metadata can only get you so far. Get a good developer in your corner for when you need to do something REALLY clever. Remember though, clever does not always come cheap.

Adopt Conventions

Another lesson from the school of bitter experience, is to adopt conventions for your web form configuration. Have conventions on how you name the entities, CRM forms (are they used by multiple web form steps, for example), web forms, web form steps and so on. A little bookkeeping up front will save a lot of headaches later on.

Tip #1069: Dynamics 365 for Marketing Preview is available

The shroud of NDA secrecy around Dynamics 365 for Marketing has been lifted and you can now watch Introduction to Dynamics 365 for Marketing.

EDIT 08-Feb-2018
Official announcement is available as a post by Kishan Chetan, Principal PM Manager, Dynamics 365 for Marketing. Tired of reading? You can now listen to Steve “Mr SMB” Mordue having a podcast conversation with Kishan on the topic.

YouTube player

You can also be awed by the new email designer, learn about customer journeys, or qualify your hottest leads.

The marketing (duh!) blurb reads

Turn prospects into business relationships with Microsoft Dynamics 365 for Marketing. Find and nurture more sales-ready leads using multi-channel campaigns and personalized lead nurturing. Align sales and marketing together with one source of shared information, connected processes, and Office 365 collaboration tools. Make smarter decisions using concise dashboards and reporting to improve marketing ROI.

If you’re fan of marketing but not marketing blurbs then go ahead and sign up for the preview program.

Unlike ill-fated MDM, This.Looks.Promising

(All marketing images look extremely generic and boring so for our Twitter/Facebook cover image I opted for a kitten. By Mikhail Vasilyev on Unsplash. Can’t go wrong with a kitten, right?)

Tip #1068: How to Grant Access to Organization Insights

Back in my first TOTD post, I sung the benefits of Organization Insights. It is truly the administrator’s best friend. But what if a non-administrator wants in on the action? It turns out that, by default, the only two Security Roles that can see the Organization Insights dashboard are the System Administrator and System Customizer roles. For others to see the dashboard, we must either give them one of these two roles (probably unwise) or tweak the role they have.

In this case the role tweak resides in a custom entity called ‘OrgInsights User Dashboard Definition’ which is in the ‘Custom Entities’ of the Security Role you want to adjust. Also remember that, depending on the graphic being shown, the Security Role may also need additional privileges to access the underlying data.

Tip #1067: When two groups say “We want to hide our stuff but see everyone else’s”

Generally my policy is unless there is a REALLY good reason, all data in CRM should be shared. However, on rare occasion, there is a REALLY good reason.

When you have one special group who want to hide their, say, Activities from everyone else, a well-placed Business Unit will do the job (either have one Business Unit above the other, or assign two different roles to the Users who are separated by two Business Units. However, when you have two special groups who want to hide their records but see the generally available records, things get trickier. A hierarchy of Business Units will not work because you can only have one parent Business Unit, not two. Also, Security Roles do not quite get us there because the Users can either see all records in the system or only theirs.

One option is to use a Team. The great thing about Teams is they belong to a Business Unit but Users from anywhere can be added and suddenly gain the benefits as if they were in the Team’s Business Unit. So, in our example, we could use three Business Units, all children of the primary Business Unit of the system; two for the special groups and one for the general population. We have one base Security Role for all Users which allows access to the Activities (or whatever entity is being restricted) in their Business Unit only. We then have a Team on the general population Business Unit with a role with the same privileges as the User role (but not the same role as per Tip 677).

As long as the special group Users get added to the team on creation (either via an automated process or as part of the process for adding new users), they get to see their records and the general populations but no one else’s.

Tip #1066: Discover Azure AD tenant ID with Occam’s razor

As developers, from time to time we are puzzled by simple questions:

How to discover Azure AD tenant ID based on Dynamics 365 organization URL?

Under the normal circumstances I would have put my condescending hat on (did I forget to take it off, again?) and say something like “Use AuthenticationParameters.CreateFromResourceUrlAsync method from ADAL, of course”. Except that in this instance the question was from the PHP developer working on a new version of php-crm-toolkit.

After asking some people, poking around with the irreplaceable Postman, and toying with the discovery API, etc, I’ve decided to adopt Occam’s razor approach.

Send this to the server:
GET /api/data/v9.0/ HTTP/1.1
Host: foobar.crm.dynamics.com

Get a 401 reply with this header:
WWW-Authenticate Bearer authorization_uri=https://login.windows.net/ede123e5-dead-beef-dead-7ee8d5807f08/oauth2/authorize, resource_id=https://foobar.crm.dynamics.com/

The header contains all that you need to perform the authentication dance. Incidentally, according to David “Xrm.Tools” Yack, this approach is exactly how AuthenticationParameters.CreateFromResourceUrlAsync does the discovery under the hood.

Tip #1065: How to get clean Customer Service trial

When Neil “Agile” Benson installed a new Customer Service trial, he got more than he bargained for: Trial Site Map Customization, FreeTrialBaseSolution2, Trial for Field Service, Trial of Microsoft Dynamics 365 for Project Service Automation, etc. And he didn’t select or want Field Service or Project Service Automation apps added either.

Why does the trial sign-up page (https://trials.dynamics.com/Dynamics365/Signup/service) ask what do you want to install and then ignore your request?

One might think that selecting None of the Above when asked during the trial provisioning would solve the problem and it does, but you don’t get access to Customer Service Hub or Sales Hub.

The steps to get the clean Customer Service trial that also includes new Unified Interface experience of the hubs:

  1. Start the trial. Unless you are Global Administrator, use admin trial signup and not your work email sign up
  2. Select None of the Above when asked what experience would you like
  3. Go to Dynamics 365 Administration Center, select instance, click Solutions
  4. Install required hub solutions
    Instance hubs

For differences between sign ups, managed vs unmanaged tenant, and how to become tenant admin, read Email Trial FAQs.

(Cover photo by Rick Mason on Unsplash)

Tip #1064: Another use for leads

Back in “Should you use the lead entity?”, Joel Lindstrom provided an excellent summary of when using Leads is a good idea and what their limitations are. I am not a huge fan of Leads for the excellent reasons he stated in that Tip. The last straw for me was in Dynamics CRM 2013 when they ‘improved’ the Lead conversion process and forced you to create an Opportunity. However, as Joel states, there are times when using a Lead makes sense, it is just not very often.

Thanks to The CRM Viking, Marius Agur Pedersen, I am now aware of at least one more reason to embrace Leads. This reason is the LinkedIn Sales Navigator.

The Sales Navigator is a powerful tool to the point that Microsoft use it in their promotional videos to sell Dynamics 365. Amongst other things, it allows you to search your extended LinkedIn network, using all manner of criteria, to find potential customers. There is integration with Dynamics 365 and this is where Leads come in. The integration between the products uses Accounts, Contacts, and Leads but NOT Opportunities.

If you are building a new Dynamics 365 system which will work with Sales Navigator or adding Sales Navigator to your existing sales processes, you will likely need to embrace Leads as part of your sale qualification process in Dynamics 365.

Tip #1063: Do not touch currency system views

This tip comes from Guillaume Domont. (And you can get your names into the Dynamics 365 History Book™ too by sending your tip to jar@crmtipoftheday.com.

Guest Microphone

I found a quite interesting bug in my last project.

As the CRM/Dynamics 365 is used worldwide, we had to handle the currency changes. The standard currency lookup view looks like this:

OOTB Currency Lookup View

The project architect in his clever thoughts designed this view to be more performant, i.e. remove every columns and just let the currency name:

Customized Currency Lookup View

We modified the currency lookup view and handed it over to the testers. After a few months, the testers came back to us and said: “Did you notice that the currency symbol is not updated?” (when you select a different currency – t.j)

Change currency breaks the symbol

So after a few weeks of the Premier Field Engineering support looking for the problem without any luck, I discovered that the OOTB currency lookup view has the currency symbol in it and that somehow Dynamics 365 is doing some magic tricks to collect that symbol and set the collected symbol in front of every money field on the form.

Lessons learned: never modify the currency lookup view 🙂

Tîpp Jäår

I lied virtualized the reality: Dynamics 365 History Book™ does not (yet?) exist. But you can check the work in progress and leave your comments on a very much real Dynamics 365 Book!

Tip #1062: When recompile is not enough

As was mentioned in the Tip 1058, the most simple and easy way to deal with TLS 1.2 in your code is to recompile it with .net 4.6.2+.

As David “Xrm.Tools” Yack discovered, it may not work for some of the existing projects. The issue is that, when the framework version changes in Visual Studio there is a secondary setting in web.config that can override that!

<compilation debug="true" targetFramework="4.7" />
<httpRuntime targetFramework="4.5.2" />

The httpRuntime target framework stays the same when you change the project settings – it has to be manually updated. If you don’t, then the project will really be running as 4.5.2 while deployed as 4.7. If your project tries to connect to Dynamics 365 version 9 (where TLS 1.2 is enforced), you will receive seemingly unrelated errors, and/or unexpected results from some function calls.

It’s the small things that bite you hard! – David Yack (c) 2018