Monday, 30 May 2016

What use is Visual Hierarchy?

We are all familiar with Organisation charts, and some of us find them useful. Well you can now build them in CRM (since CRM2015). I'm not going to write and tell you how, instead I'll just point you to Sonoma Partners blog 'Dynamics CRM 2015 Hierarchy Visualizations' for that, it's clear and easy to follow (as is all of their stuff).

How can we make use of them?


The answer to this really depends on what you do and how you use CRM. Here are some examples that I've come across:
  • A manufacturer mapping outlets to distribution depots
  • A software provider mapping modules to a suite
  • Mapping customer organisations (Accounts) to show buying centres (think national retail chains buying products locally for each state or region)
  • mapping the users to the company org chart
You don't just have to stick to system entities, you can add a hierarchy to your custom entities too, For example if you wanted to model types of financial institutions : Life, Super, Investment and their funds as a single entity type, but you also wanted to see how they related to each other, for example: ACME Investment Portfolio might be the parent entity for ACME Hedge Fund Investments and ACME Off Shore Diversified funds; Acme Off Shore Diversified Funds may be the parent entity for ACME Off Shore Europe, ACME Off Shore Middle East and AMCE off Shore Americas, etc. Using the Hierarchy feature you can quickly see where an entity fits in. Clicking on any given entity allows you to see its Parent, Siblings and Children, allowing you effectively drill down through the hierarchy.

What do I get from it?

It's not a silver bullet, it doesn't solve everything, but for visual oriented people (like me) it can be a very quick and simple way to navigate between entities.
As a management tool you can leverage it by modifying the information displayed. For example, if you are running a helpdesk you can model your client hierarchy so that the number of help requests is displayed on the Organisation and rolled up to the parent Organisation (you'll need to do a bit of scripting for that). When you view the organization hierarchy you'll see the number of requests coming in from that particular Organisation, if it is above expectations you can simply drill down to the child Organisation until you see where the bulk of the requests are coming from (think national support desk for a large Organisation like Telstra stores, for example) and you can quickly see sibling comparisons before having to switch to the actual helpdesk module.
As a sales tool, you can use it to model the client contacts to build your own Organisation chart allowing you to see where that contact fits in to the overall structure of your client organisation. It can help in identifying the decision makers, the influencers and the decenters.

what can't it do?

Well, it only works on 1 to many relationships where each end of the relationship is of the same (entity) type. So you can't mix Accounts and Contacts for example. You are also limited by the amount of information you can display on the card (in the hierarchy), so if you want to display 20 fields on each card, this won't work for you. Overall, it's only handy if you have a use for it. There's no point creating a hierarchy because you like it or to make yourself look cool, this feature should be part of your tool kit to solve specific requests, This feature just makes it a whole lot easier.

Thursday, 19 May 2016

Creating a Global Option set from a spreadsheet

You may have come across this before. A user wants you to create an option set that can be used across multiple entities, and they give you a spreadsheet with a 1000 rows in it! Don’t despair, you can create a global option set with them in. Just not in a single step. Here’s how you do it:
  1. Create a field of type option set on your required form
  2. Add a column to your spreadsheet so that you can easily Identify the new records you are about to create.
  3. Import the data in the CRM system using your spreadsheet. The Identifier should be the primary key field for your record (i.e. last Name for contacts)
  4. When mapping the to the option set, set it to create missing options
  5. Import
  6. Now you should have all the rows added as new items to your option set
  7. Locate all the records you just imported and delete them
  8. Your option set will still be there and still have all the imported values.
  9. Now use a tool to convert the local option set to a global option set, here are two:
Hey presto, you should now have a global option set with all the values you imported. Simple, huh?

Wednesday, 18 May 2016

Knowing what to charge

When it comes to charging clients for work done, there is (well sometimes at least) a bit of a feeling from the client that you've overcharged them. Giveaway phrases include " What, Really? it only took you 12 minutes!". I personally have fallen foul of this over the years and have given far too much of my time away for free, much to the annoyance of my business partners or bosses. As a very highly qualified and experienced individual, it still takes a certain belief to stand behind your fees.
I recently read a short story that helped me get my head around just how much my time is worth, and it has nothing to do with $ per hour. The story went something like:
A large shipping company had one of it's ships in doc for an engine repair. The cost of keeping it out of the water, as you can imagine is somewhat high. Their mechanics and technicians, although well trained and well qualified, could get the engine to run. They ordered the engine removed so that they could work on it further. Despite their combined knowledge, they still could not get it to run. Finally, they called for help.
Albert, a 70 year veteran mechanic turned up, walked around the engine (remember they had already taken it out of the ship), tapped it gently a few times with his glasses, smiled, walked over to his tool bag, pulled out a hammer, gave the engine an almighty bang, and asked them to try again. It ran, they tested it, ran up, ran it down, stopped it, started it. It worked fine. Albert sent his Invoice in to be paid. The next day he received a phone call from the boss of the shipping company. "$20,000? you were only on site for 10 minutes! Send me an itemized bill". Albert, without getting in to an argument agreed. The next day, the boss received the itemised invoice it read
Hitting engine with hammer $10

Knowing where to hit $19,990
He got paid!
The moral of the story, customers rarely don't pay because of the cost, it's because they don't understand the value. Your job is to help them see the value, that starts with seeing your own value!

Tuesday, 17 May 2016

Alphanumeric string generator

#CodeSnippet #CSharp #theMazeRunner #CRM How to create an alphanumeric string for use as a password or an Account Number On many occasions you may need to create a unique password or identifier string. There are already methods out there to create random strings of a given or variable length. I have taken the concept and modified it to suit my own need. Basically I create an array of characters and an array of numbers (removing any that may be easy to confuse). I then pass a parameter to determine how long the string will be. Finally I use a combination of the char string and a string of numbers to create my desired length output string (consisting in this case of 3 letters followed by 3 numbers followed by 3 letters). This particular code snippet is C# and is used to generate my web service. You can adapt it to other languages or make it part of your existing C# Library. [pre class="brush:csharp" title="Alphanumeric string generator"] using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace utilLib { public class AccNumGen { // what's available; I have removed the Letters 'I' and 'O' public static string possibleChars = "ABCDEFGHJKLMNPQRSTUVWXYZ"; // to help readability I have also removed 0 and 1 public static string possibleNums = "23456789"; // optimized (?) what's available public static char[] possibleCharsArray = possibleChars.ToCharArray(); public static char[] possibleNumsArray = possibleNums.ToCharArray(); // optimized (precalculated) count public static int possibleCharsAvailable = possibleChars.Length; public static int possibleNumsAvailable = possibleNums.Length; // shared randomization thingy public static Random random = new Random(); public string getRandomChars(int num) { /* use the random method to select a char and repeat * for the numbe of times passed in as a parameter */ var result = new char[num]; while (num-- > 0) { result[num] = possibleCharsArray[random.Next(possibleCharsAvailable)]; } return new string(result); } public string getRandomNums(int num) { var result = new char[num]; while (num-- > 0) { result[num] = possibleNumsArray[random.Next(possibleNumsAvailable)]; } return new string(result); } public string createAccNum() { // build the desired pattern using combination of chars and numbers // in this case I have 3 Chars then 3 numbers then 3 chars var AccNum = getRandomChars(3) + getRandomNums(3) + getRandomChars(3); return AccNum; } } } [/pre]

The Maze Runner?

Dynamics CRM Consultant

Why 'The Maze Runner"?  After working exclusively with Dynamics CRM since 2005, I still come across situations, be it, building a new custom form and workflows, building a new JavaScript or updating a C# Web Service library, I still occasionally hit a brick wall and have to back track a while and try a different approach.  Always working under pressure to meet a deadline I sometimes feel like I’m running through a maze of possibilities – hence..

The Maze Runner
#TheMazeRunner #DynamicsCRM