“Mind the gap” to make your CRM charts look better

Supercar

In the supercar and racing industries, the key question for all major design decisions is “does it make the car go faster?” This can be interpreted fairly loosely, for example better brakes or gripper tyres make it possible to drive the car faster without compromising safety. And beyond that, there is still room for creativity and the aesthetics of beautiful design, but in the end, the question still reveals a single-minded focus that we can learn from in other disciplines too.

When designing charts, I aim for functionality first and foremost. I want the end result help people to understand their data better, see patterns and trends, identify outliers and gain insights that support better decisions. But as with the design of a desirable sports car, we can still spend some time on making data visualisations pleasing to look at, and make the best use of the space we have available on a range of devices from small tablets to widescreen monitors.

Charts shrink and stretch depending on the space available

When you view a dashboard, charts are always the same height, regardless of the size of the window, whereas the width will reduce proportionally as the window width decreases. Using CRM 2013 or 2015, dashboards use a responsive design, so the layout will change and components will be pushed down so they don’t just become ridiculously narrow. The only time the height of a chart will be reduced significantly is when you use a view combined with the chart pane above it, with CRM in a window that is already not very high.

For the purposes of this article, I am going to focus on column charts, because they will more often be displayed at a variable width. This means that your design should take account of what they will look like in very narrow windows, but also how they might appear when stretched very wide or viewed on their own. Everything discussed applies in exactly the same way to row charts, but is less likely to be an issue in reality.

Manage column widths versus white space

There are two key properties for a series in a column chart that manage the column widths and white space: PointWidth and MaxPixelPointWidth. These are both contained within the CustomProperties, which is a comma-separated set of properties, as seen in this XML snippet from a simple chart built in CRM and exported:

<Series ChartType="Column" CustomProperties="PointWidth=0.75, MaxPixelPointWidth=40"...>

These same properties can be used with Column, StackedColumn, StackedColumn100, and the equivalent row chart types.

PointWidth

if you have ever played around with changing these properties, you may have found that they don’t always seem to do very much, so let’s figure out what they are each supposed to do and how they relate to one another.

Let’s take a look at PointWidth first. This is a decimal value from 0 to 1, and simply represents how much of the chart is taken up by the columns, relative to the white space. A setting of 0.75 means that the columns should take up 75% of the space, So when your charts are relatively narrow, the columns and gaps are both resized so that if you measure from the left side of one category column to the left side of the next category, the columns take up 75% of that width.To put it another way, taking the inverse of the PointWidth, the gaps will take up 25% of the available space. Whether you have a single column, or multiple clustered columns in each category, the gaps will be 25% of the chart width, and the columns together will take up 75%.

The example below shows two charts of the same two series of data, one using stacked columns, one using normal (clustered) columns. In both cases the PointWidth is set to 0.5 for both series. You can see the gaps are 50% of the available space in both charts, so the PointWidth is the value for all series together, not each one.

Two charts with PointWidth 0.5 cropped

Personally, I prefer to make the columns a bit wider than the OOB setting; I find around 0.85 works well for single or stacked columns, and 0.8 for multi-column charts. You should be wary of using a value of 1 for PointWidth

If there is more space available, charts expand to use it, so in reality if your chart has plenty of room, the columns will be spread out and the gaps between them will be considerably more than the 25% you might expect. So you should take the PointWidth, figure out the inverse of it, and think of this as a the minimum space for the gaps, remembering that it can be larger.

Comparing PointWidth to Excel’s Gap Width

Excel handles the relative widths of columns and gaps quite differently. For a series in an Excel chart you can specify the gap width from 0 to 500%. This is a measure of the width of the gaps relative to the width of a column. By default this is set to 150%. If you plot only a single column or stacked column, this is definitely excessive in my view. However, if you have two or more “clustered” columns, higher values for this setting start to make a bit more sense because it measures the size of the gap relative to one of the columns, not the group. So for a single column a setting of 20-30% could be fine, but if you have four clustered series for example then 70-100% might be more suitable, as this is equivalent to 15-20% gaps overall.

In the example below, a gap width of 100% means that the gap is the same width as one of the clustered columns.

Excel gap width 100 percent highlighted

Also notice that Excel always scales both the columns and the gaps to retain the selected proportions all the time, regardless of the size of the chart. So in Excel the gap width is always used, rather than being a minimum as it is in CRM.

MaxPixelPointWidth

This setting is in contrast to PointWidth, and is used to manage the opposite problem – when a chart is stretched out sideways, you might not want to have columns that are are too wide. As a general rule, if the column widths exceed the heights, the sheer amount of “ink” visible can make it much harder to focus on subtle differences in height. Conversely, if the gaps between columns are too wide, it can be difficult to compare column heights to one another accurately.

If you have a column chart with only a few categories that is likely to be displayed fairly wide, such as half the width of a dashboard on a widescreen monitor, you should test this with some different values for this property. I find that the default 40 pixels is a bit narrow most of the time, so I generally go for about 80 to 100 pixels here. Don’t forget, this does not mean your columns will normally be this wide, this is setting a maximum that you will only ever see if the chart is displayed very wide, or has very few categories. If the columns reach the maximum width, the chart is plotted with increasingly large gaps to make up the space.

As an example, if you are looking at a chart of “My Cases resolved per month”, this might look fine most if the time, combined with a view of Cases resolved in the last 12 months. But someone who just joined the organisation would only have one month showing up, so the columns would be much wider than usual and this maximum width can prevent the chart looking awful. This scenario would of course be avoided if you instead plot all the data for everyone in the business (so there are always records for every month), and highlight the current user’s contribution by filtering the chart to produce a “conditional formatting” effect.

In the final example of this article, exactly the same stacked chart shown above is displayed across the full screen. Notice that the PointWidth of 0.5 is now ignored, and instead the MaxPointWidth of 100 pixels is being used to limit how wide the columns appear (click for full size version).

Stacked chart with PointWidth 0.5 wide display

Now that you know how these two properties control the display of your charts, you can start to use these to make your charts look a bit more polished and professional, and possibly more attractive and “easy on the eye”, no matter what size they are displayed at.

Highlighting contribution using conditional formatting in CRM charts

Following on from my previous about conditional formatting in Dynamics CRM leaderboard charts I thought I would take a look at another use for this approach, this time in relation to customer service rather than sales.

You will often be asked to produce charts to help managers see the amount of work being done by a department, such as the number of Cases being resolved per month. While this is useful in itself, an individual user might like to see how they have contributed to the overall effort, using a chart such as this:

Resolved Cases with contribution highlighted

Steps to build this chart

Create the basic chart using the UI tools

Start off by creating a chart of Cases, and add a series to count them. In order to count the records you still have to choose a field. I always recommend to choose the field that has the same name as the entity. This is the internal primary key field that has the record’s GUID, so it is absolutely guaranteed to be filled in every time. I know there are other system fields such as Created On or Modified By that are also reliably populated, but I find it is much simpler for someone to interpret your intentions if you do Case > Count:All than Modified By > Count:All. In the second example I am distracted by the choice of field and start to wonder what the user who modified the record has to do with the way the chart works.

So, select the Case field, and select Count:Non-empty for the aggregation. We will come back to this point later. Add a second series exactly the same.Make sure both of these series are set as stacked column charts.

Add a category – use Modified On, since we don’t really have a “resolved on” date, but we know that Cases cannot be updated after they are resolved, so Modified On can be used as a substitute, or “proxy” for this. Select Month as the date grouping level. So your chart creation dialog box should look like this:
Create chart for resolved Cases by month

Save the chart and export the XML, so we can get to work on filtering the series to produce our conditional formatting effect.

Filtering the records

We filter the series just like we did in the previous conditional formatting chart example, by adding link-entity sections to the chart XML that refer back to the same entity. Note I have also changed the aliases used to something I can easily read and understand. The code below highlights the first link-entity clause and corresponding measure alias..

<datadefinition>
<fetchcollection>
<fetch mapping="logical" aggregate="true">
<entity name="incident">
 <attribute groupby="true" alias="MonthResolved" dategrouping="month" name="modifiedon" />
 <link-entity name="incident" from="incidentid" to="incidentid" link-type="outer">
  <attribute alias="CountMine" name="incidentid" aggregate="countcolumn" />
  <filter type="and">
    <condition attribute="ownerid" operator="eq-userid" />
  </filter>
 </link-entity>
 <link-entity name="incident" from="incidentid" to="incidentid" link-type="outer">
  <attribute alias="CountNotMine" name="incidentid" aggregate="countcolumn" />
  <filter type="and">
    <condition attribute="ownerid" operator="ne-userid" />
  </filter>
 </link-entity>
</entity>
</fetch>
</fetchcollection>
<categorycollection>
 <category alias="MonthResolved">
  <measurecollection>
    <measure alias="CountMine" />
  </measurecollection>
  <measurecollection>
    <measure alias="CountNotMine" />
  </measurecollection>
 </category>
</categorycollection>
</datadefinition>

Notice the use of the special FetchXML operators for the ownerid of eq-userid and ne-userid, as well as how the aggregate type shows up as countcolumn rather than just count. This is essential, because otherwise both series will actually count all the records and ignore the filters, instead of only counting the rows that have a value in that column because they match the filters. (This weird behaviour is a borderline bug, but at least the workaround for it is easy).

Change the overall layout

We also have the same problem as before, in that we have the two series being drawn against two separate Y axes. Since each axis will automatically adjust its own scale, this won’t work, and also means the two columns will not be stacked on top of each other, since they are on independent axes.

However, for time-based charts like this one, I find that people are often most interested in the most recent data, so if they are going to try and read any value off the chart, it will be from the last column, at the right hand side. So, rather than rushing to remove the second Y axis like we did last time, this time we will leave that alone, and instead configure the first series to also be plotted on the second axis by adding YAxisType=”Secondary”. Let’s also change the palette colours and hide both series in the legend at the same time (so the legend disappears) using IsVisibleInLegend=”False”:

<presentationdescription>
<Chart Palette="None" PaletteCustomColors="210,96,18; 241,151,90;">
<Series>
 <Series ChartType="StackedColumn" YAxisType="Secondary" IsVisibleInLegend="False"
   Font="{0}, 9.5px" LabelForeColor="59, 59, 59" CustomProperties="PointWidth=0.75, MaxPixelPointWidth=40"  >
 </Series>
 <Series ChartType="StackedColumn" YAxisType="Secondary" IsVisibleInLegend="False"
   Font="{0}, 9.5px" LabelForeColor="59, 59, 59" CustomProperties="PointWidth=0.75, MaxPixelPointWidth=40"  >
 </Series>
</Series>

Reduce the clutter on the axes

Now we can tidy up the axes a little bit too, to reduce the visual distractions. Some things you should always consider here:

  • Do you need tick marks on the category axis?
  • Can you make the axis line colour lighter?
  • Will it help to remove the margin on one or other axis, to use more of the space?
  • Do you need titles on either axis, and if so, should you add a custom title rather than the default one?

When it comes to this last point, a good option can be to use a tooltip rather than a title. Labelling a chart clearly is obviously important so that people can be sure of what they are looking at. But once someone has been using the same chart every day for weeks, a title such as “Count of Cases” can be an unnecessary distraction, especially if it is clearly implied by the chart’s name anyway. A tooltip can be a good way to get the right balance – add a description for those who need it, avoid any ambiguity about scaling and generally make sure people know how to interpret the chart.

I have chosen to make the following changes, highlighted in the code below:

  • remove the margins on the horizontal axis to make the chart fill more of the space across the screen
  • remove the titles on both axes (by making them transparent and 3 pixels in size
  • remove the X axis tick marks
  • added a tooltip to the Y axis (Note: ToolTip with two capital Ts – properties must be entered in the correct case)
  • set a fixed interval for the Y axis so there is a label for every 100 Cases – there were too many numbers being shown by default, and they were entirely unnecessary.
  • made the tick marks on the Y axis a little lighter in colour
<AxisX IsMarginVisible="False" LabelAutoFitMinFontSize="8"
TitleForeColor="Transparent" TitleFont="{0}, 3px"
LineColor="165, 172, 181" IntervalAutoMode="VariableCount">
<MajorGrid LineColor="Transparent" />
<MajorTickMark LineColor="Transparent" />
<LabelStyle Font="{0}, 12px" ForeColor="59, 59, 59" />
</AxisX>
<AxisY2 LabelAutoFitMinFontSize="8"
TitleForeColor="Transparent" TitleFont="{0}, 3px"
ToolTip="Count of resolved Cases, highlighting your own contribution"
LineColor="165, 172, 181" Interval="100" IntervalAutoMode="VariableCount">
<MajorGrid LineColor="239, 242, 246" />
<MajorTickMark LineColor="204,204,204" />
<LabelStyle Font="{0}, 10.5px" ForeColor="59, 59, 59" />
</AxisY2>

Further thoughts

There are of course lots of different ways you could present this chart. If the timeframe was very long, it might make sense to use a line chart to show the filtered series for “my” Cases, and a second line for an unfiltered series of all Cases.

If you want to emphasise “my” performance and only show the whole team / business for comparison, you could use a column for mine (much bolder and highly visible) and a line or point chart for the overall team results.

If you want to emphasise the level of contribution, you could use a 100% stacked chart. This means that in months with more or fewer Cases being logged and resolved, the viewer remains focussed on the proportion of those that they have dealt with, rather than the actual number. To change this simply requires a change of chart type to StackedColumn100, and some thought about the interval for the Y axis, a custom number format, and a different tooltip to explain to the user what they are looking at. An example of this same chart as a 100% stack is shown below. It is obvious in both versions of the chart that this user contributed less in March (perhaps because of an absence). In December their contribution appears to be lower than usual in the normal stacked chart, but we can see from this one that as a proportion it actually remained pretty level, in a month when there was simply less work to be done (perhaps because everyone is off at the same time during the holidays).

Resolved Cases with contribution 100% stacked

In a follow up post I will look at some other options and settings used in this chart to manage the width of the columns, and demonstrate how you could display the Y axis on both the left and right hand sides without them being scaled differently.

Conditional formatting in Dynamics CRM Leaderboard Charts

When you plan a data visualisation, the primary defining factor is always “what relationship am I trying to show?”, or to put it another way, “what question should this chart answer?”. For example, if you are displaying a chart of recent sales you might break this down by month or by salesperson, depending on whether you are trying to show how sales are changing over time, or how the members of the sales team compare to one another.

If you are comparing sales performance then you might decide to sort according to the sales revenue to produce a ranked chart or “leaderboard” showing best to worst sales performance (or maybe just top ten, for example). It might look something like this:

Sales ranked by owner - single series stacked bar chart

Me me me me me, it’s all about me

This sort of display tends to lead to another question almost immediately in the minds of the sales people who see this chart – “where am I in the rankings?” What you really want to be able to do is produce a chart that displays the same data for everyone, but highlights the most relevant data, usually the data belonging to the current user. For this, you need to customise your chart to do conditional formatting, to get something that looks more like this:

Sales ranked by owner - reformatted axes

The problem is, there is no such thing as conditional formatting for Dynamics CRM charts. So what we need to do is to out-think the system and configure a chart that gives the result we want, using magic.

“Any sufficiently advanced technology is indistinguishable from magic” – Arthur C. Clarke

Remember – there is no spoon, it is your mind that bends

ThereIsNoSpoon

I have been doing some pretty strange things with data visualisation for more years than I care to remember. Before getting involved with CRM I did a lot of advanced Excel stuff for clients, and the same sort of approaches I would have used there still stand me in good stead. In general, if you want to display something in more than one way, such as in different colours, or selectively displaying data values, or highlighting high and low points, the way to go about it is to cheat. I recently wrote an article about where I learned to cheat at charts from some great sources.

Usually this involves splitting the data into parts, to display these as multiple series, each formatted as you want, but then put back together. The laws of Gestalt psychology tell us that our brains are wired in such a way that we will usually see things very strongly as belonging together. So while we might change the colour of some data points, we will still see them as part of an overall single continuum, even though the inner workings of the chart structure are actually using two or more series.

Building our sales leaderboard chart with conditional formatting

Let’s start out the easy way, building as much as possible using the UI before exporting the XML and editing it. So create a chart showing sales opportunities by owner, with a sum of the Actual Revenue. Change the chart style to a stacked bar chart. A bar chart will make the labels easier to read compared to using a column layout.

Add a “Top X” rule – this will sort the bars according to their values to produce a ranked leaderboard, and will filter so that you are showing only the best performing sales people. The top 10 or 20 might be good; or you can use any number up to the maximum of 100. If you choose a number higher than the number of salespeople you need to include then you will get the ranking without any filtering effect.

Add the Actual Revenue field a second time and make sure that this one is a stacked bar too. Use a suitable view for the chart preview, such as Completed Opportunities this Fiscal Year while you are doing this, to make sure it looks right, then save your chart. You should get something that has the revenue doubled up, like this:

Sales ranked by owner - two series stacked bar chart

Unfortunately, despite telling CRM to use stacked charts, it still shows these side by side, and plots the second series on a secondary axis instead, which you will need to remove. However, by choosing stacked charts at this stage this saves having to change the chart type later, and stacked charts by default do not show values on the data points, so this helps reduce the chart junk already.

Export the chart and open the XML file with a suitable editor, such as Notepad++.

Sort out the aliases

The first thing I always do at this point is to change the auto-generated aliases into something more human readable. In this case I have three aliases to replace in multiple places as highlighted below:

<datadefinition>
<fetchcollection>
<fetch mapping="logical" aggregate="true" count="5">
<entity name="opportunity">
<order alias="_CRMAutoGen_aggregate_column_Num_0" descending="true" />
<attribute groupby="true" alias="_CRMAutoGen_groupby_column_Num_0" name="ownerid" />
<attribute alias="_CRMAutoGen_aggregate_column_Num_0" name="actualvalue" aggregate="sum" />
<attribute alias="_CRMAutoGen_aggregate_column_Num_14" name="actualvalue" aggregate="sum" />
</entity>
</fetch>
</fetchcollection>
<categorycollection>
  <category alias="_CRMAutoGen_groupby_column_Num_0">
    <measurecollection><measure alias="_CRMAutoGen_aggregate_column_Num_0" /></measurecollection>
    <measurecollection><measure alias="_CRMAutoGen_aggregate_column_Num_14" /></measurecollection>
  </category>
</categorycollection>
</datadefinition>

The first one is used to aggregate Actual Revenue for all records, which is also used to sort the bars. The second is the category – the Owner of the Opportunity in this case. The third will be for the first series which will later be filtered, so for now I will use the alias ActualMine for this one. I have also rearranged the lines in the fetch collection – I sometimes find it easier to make sense of the XML quickly if I keep things in the same order, so I have the category (groupby) attribute(s) first, then the series measures in order. I also prefer to specify an attribute and alias before using it, such as for the order property here, even though these will work if they are the other way round.

<datadefinition>
  <fetchcollection>
    <fetch mapping="logical" aggregate="true" count="5">
      <entity name="opportunity">
        <attribute groupby="true" alias="Owner" name="ownerid" />
        <attribute alias="ActualSales" name="actualvalue" aggregate="sum" />
        <order alias="ActualSales" descending="true" />
        <attribute alias="ActualMine" name="actualvalue" aggregate="sum" />
      </entity>
    </fetch>
  </fetchcollection>
  <categorycollection>
    <category alias="Owner">
      <measurecollection><measure alias="ActualMine" /></measurecollection>
      <measurecollection><measure alias="ActualSales" /></measurecollection>
    </category>
  </categorycollection>
</datadefinition>
</datadescription>

Get rid of the secondary Y axis

Next you should delete the references to this second Y axis from the chart XML. Remember, that the X axis is always the category axis, and the Y axis is always the values axis, regardless of the orientation (bar or column). There are two places you need to get rid of this: in the second series definition you need to delete the reference to the YAxisType

<Series ... YAxisType="Secondary">

and then also delete the secondary axis definition, that is everything from

<AxisY2 ...>
  [through to]
</AxisY2>

Choose better colours

I then changed the PaletteCustomColours to two shades of the same hue. Since both series represent actual sales revenue, it is generally best for them to be in the same colour, whereas if this were a chart comparing sales forecast to actual, then different colours might be a better choice. In this case I chose a dark and light green, mainly so we can see the clear distinction from the original colours. In reality, I would tend to stick to a specific palette for a project, for example where sales are green, customer service is blue, marketing is purple, or whatever makes sense. Keeping to a theme like this so that a given colour always has a similar meaning can really help users to understand their data more intuitively.

<Chart Palette="None" PaletteCustomColors="45, 126, 45; 102, 204, 102;">

You need to make sure you get the colours in the right order relative to the series. The alternative would be to specify the colour directly in each series instead.

Add custom legend text

I have also added a LegendText property to each series at this stage, so I can easily see which series is which. This will replace the default “Sum (Actual Revenue) (£)”. I also removed the from both series.

<Series...LegendText="Mine">
<Series...LegendText="Not Mine">

By now, having made quite a few changes already, we should reimport the chart to take a look. You should now have something that looks like this:
Sales ranked by owner - two series stacked bar chart single Y axis new colours

Configure the series filtering

So far we have still ended up plotting the same values twice over. Now we need to split those so that one series is plotted only for the current user, and the other is drawn for everyone who is not the current user. Because the charts are stacked, we will have one value plotted with a zero value invisible on top of it, and then a whole series with one gap, plotted on top of a load of zeroes. The effect will look like one complete series, with a single bar being highlighted by using a darker colour.

The general approach here is to use a link-entity, just as you would to get an attribute from a parent entity record, but in this case link to the original entity, get the attribute you need and filter the records. Then do a second link to the original entity, get the necessary attribute, and apply a different, mutually exclusive, filter. For our leaderboard, we need to get the Actual Revenue value in both cases, whereas for other charts you might need different attributes – such as Estimated Revenue for Open Opportunities, and Actual Revenue for closed ones. Set up the two link-entity clauses, one of which will re-define the previous ActualMine alias, the second will define a new alias ActualNotMine. We still need the original ActualSales alias to use for the sorting to keep the ranked chart in the right order. So the data definition now looks like this, with the changed alias rows highlighted:

<datadefinition>
<fetchcollection>
<fetch mapping="logical" aggregate="true" count="5">
<entity name="opportunity">
<attribute groupby="true" alias="Owner" name="ownerid" />
<attribute alias="ActualSales" name="actualvalue" aggregate="sum" />
<order alias="ActualSales" descending="true" />
<link-entity name="opportunity" from="opportunityid" to="opportunityid" link-type="outer">
<attribute name="actualvalue" aggregate="sum" alias="ActualMine" />
<filter type="and">
<condition attribute="ownerid" operator="eq-userid" />
</filter>
</link-entity>
<link-entity name="opportunity" from="opportunityid" to="opportunityid" link-type="outer">
<attribute name="actualvalue" aggregate="sum" alias="ActualNotMine" />
<filter type="and">
<condition attribute="ownerid" operator="ne-userid" />
</filter>
</link-entity>
</entity>
</fetch>
</fetchcollection>
<categorycollection>
  <category alias="Owner">
    <measurecollection><measure alias="ActualMine" /></measurecollection>
    <measurecollection><measure alias="ActualNotMine" /></measurecollection>
  </category>
</categorycollection>
</datadefinition>

Now for each record in the dataset, it is linked to itself, compared against the filters and if it matches, the attribute value is included in the aggregate (sum, count, etc).

Tidying up the axis format

The axis has a lot of annoying digits displayed, which just add to the visual clutter, so it will help to apply a custom number format to reduce this. Getting rid of the decimal places would be a good start, but I chose to display these values as “thousands” to reduce them even further. To help make this clear to the reader, I included a different format for the zero on the axis as “0 K”.

I have also added a title for the axis to describe what is being displayed and reinforce the scale, and configured this to be shown at the far end of the axis where it is less distracting. So our Y axis looks like this:

<AxisY Title="Actual Revenue ('000)" TitleAlignment="Far" ...>
    ...
    <LabelStyle Format="#,;-#,;0 K" .../>
</AxisY>

Reducing wasteful white space

I also find that for a lot of charts, we don’t need so much white space, and we can draw things closer to the edges of the chart area. This makes an even bigger difference if you are using a chart like this one with very few bars in the chart pane, or if you click to enlarge the chart from a dashboard. The white spaces are “margins”, and you can hide these by setting IsMarginVisible to False. Note again that the X axis here is the category axis, displayed vertically because we have a bar chart. Hiding the margins on the X axis will spread out the bars along the category axis. If you also hide the margins on the Y axis, then the longest bar will very nearly reach the edge of the chart area, rather than leaving a significant gap before the end of the axis. The amount of gap on the Y axis varies, and depends on the size of the intervals between axis tick marks and labels, amd as you can see in the screenshots on this page, it can be as little as about 5% and as high as nearly 20% wasted. I left the Y axis alone here, and just modified the X axis.

<AxisX IsMarginVisible="False" ...>

Removing more chart junk on the X axis

There are a couple more things you can do to improve this chart by reducing visual clutter. The X axis has clear categories with labels that fit and align neatly with the bars, so there is really no need for tick marks along this axis. Also, the name of the chart and the names of the categories should make it obvious to anyone what this axis represents – salespeople (owner), so the title is also pretty unnecessary. There is no way to actually remove those elements, but you can make them transparent so they disappear, and you can make the title font smaller to reduce the blank space it takes up. 3 pixels seems to be the smallest font size you can specify here.

<AxisX IsMarginVisible="False" TitleForeColor="Transparent" TitleFont="{0}, 3px" ...>
<MajorTickMark LineColor="Transparent" />

Sales ranked by owner - reformatted axes

Adding some final touches

We have a pretty good chart now, certainly a step up from the original one or out-of-the-box Sales Leaderboard chart, but there are still some things we can do to make this even better.

Firstly, we don’t really need that legend. To be honest, I only put it there so you could see what was going on for this article. So let’s hide that first. The odd thing is that you can’t hide the legend directly, what you do is configure each series to not be visible in the legend, and CRM very sensibly hides the legend completely if you do this for all series, since there is nothing left to show.

<Series ChartType="StackedBar" IsVisibleInLegend="False" ...>
<Series ChartType="StackedBar" IsVisibleInLegend="False" ...>

I also wanted to emphasise the idea of rising to the top of the leaderboard, by putting the best performer at the top, not the bottom. As the CRM Chart Guy points out, if you reverse the sort order, this also means you will get a bottom 10 (or 50, or whatever) instead of top 10. So rather than reverse the sort, you need to configure the X axis to be reversed.

<AxisX IsReversed="True" ...>

This also moves the Y axis to the top of the chart. If you prefer the axis to remain at the bottom, simply add back in those references to YAxisType=”Secondary” in both series, and copy and paste the Y axis section, add in a 2 to make it and republish. Personally I like it there in this case, so I left it alone.

I have also added a value label to the ActualMine series by adding IsValueShownAsLabel=”True” and made the font for this white and fairly large.

The number format for this data label is similar to the Y axis, but you will need to make a couple of small adjustments. Firstly, you need to suppress the zero format, otherwise all those “invisible” zero bars will show up these labels. Unlike Excel, you can’t just leave it blank after a final semicolon, you actually need to add a space to be displayed. Of course, you could use various different formats, to show more precision for example, since it will be just for the current user, so not very cluttered.

The position of the label is controlled by adding BarLabelStyle to the comma-separated  CustomProperties I found I needed to add a couple of spaces in front of the number format to push the label into the bar a little so it did not run up against the axis.

I’ve removed the legend by adding IsVisibleInLegend=”False” to both series, but I have left in the LegendText property. It has no effect on the chart but makes it easier for anyone else to figure out which series is which for any later troubleshooting, and means that if I enable the legend again later, it already has a useful label. I have increased the PointWidth property to 0.8 from 0.75, to close the gaps between bars slightly, and increased the MaxPixelPointWidth to 100. You won’t see any change from this second property except when viewing the chart in the chart pane or with plenty of vertical space on a dashboard.

With all these changes, each series should look something like this:

<Series ChartType="StackedBar" IsVisibleInLegend="False" LegendText="Mine"
IsValueShownAsLabel="True" LabelFormat="  # K,; -# K,; " Font="{0}, 24px" LabelForeColor="255, 255, 255"
CustomProperties="BarLabelStyle=Left, PointWidth=0.8, MaxPixelPointWidth=100"></Series>

So this is what my final version looks like, with the original single series chart shown below for comparison.

Sales ranked by owner - reversed order and added label

Sales-ranked-by-owner-single-series-stacked-bar-chart.png

The xml for my final version is below, for reference.

<visualization>
<visualizationid>{817D8B1D-B7E9-E411-80FB-FC15B4263E1C}</visualizationid>
<name>Sales Leaderboard Final</name>
<primaryentitytypecode>opportunity</primaryentitytypecode>
<datadescription>
<datadefinition>
<fetchcollection>
<fetch mapping="logical" aggregate="true" count="5">
<entity name="opportunity">
<attribute groupby="true" alias="Owner" name="ownerid" />
<attribute alias="ActualSales" name="actualvalue" aggregate="sum" />
<order alias="ActualSales" descending="true" />
<link-entity name="opportunity" from="opportunityid" to="opportunityid" link-type="outer">
<attribute name="actualvalue" aggregate="sum" alias="ActualMine" />
<filter type="and">
<condition attribute="ownerid" operator="eq-userid" />
</filter>
</link-entity>
<link-entity name="opportunity" from="opportunityid" to="opportunityid" link-type="outer">
<attribute name="actualvalue" aggregate="sum" alias="ActualNotMine" />
<filter type="and">
<condition attribute="ownerid" operator="ne-userid" />
</filter>
</link-entity>
</entity>
</fetch>
</fetchcollection>
<categorycollection>
<category alias="Owner">
<measurecollection><measure alias="ActualMine" /></measurecollection>
<measurecollection><measure alias="ActualNotMine" /></measurecollection>
</category>
</categorycollection>
</datadefinition>
</datadescription>
<presentationdescription>
<Chart Palette="None" PaletteCustomColors="45, 126, 45; 102, 204, 102;">
<Series>
<Series ChartType="StackedBar" IsVisibleInLegend="False" LegendText="Mine" IsValueShownAsLabel="True" LabelFormat="  # K,; -# K,; " Font="{0}, 24px" LabelForeColor="255, 255, 255" CustomProperties="BarLabelStyle=Left, PointWidth=0.8, MaxPixelPointWidth=100"></Series>
<Series ChartType="StackedBar" IsVisibleInLegend="False" Font="{0}, 9.5px" LabelForeColor="59, 59, 59" CustomProperties="PointWidth=0.8, MaxPixelPointWidth=100" LegendText="Not Mine"></Series>
</Series>
<ChartAreas>
<ChartArea BorderColor="White" BorderDashStyle="Solid">
<AxisY Title="Actual Revenue ('000)" TitleAlignment="Far" LabelAutoFitMinFontSize="10" TitleForeColor="59, 59, 59" TitleFont="{0}, 12px" LineColor="165, 172, 181" IntervalAutoMode="VariableCount">
<MajorGrid LineColor="239, 242, 246" />
<MajorTickMark LineColor="165, 172, 181" />
<LabelStyle Format="#,;-#,;0 K" Font="{0}, 10.5px" ForeColor="59, 59, 59" />
</AxisY>
<AxisX IsMarginVisible="False" IsReversed="True" LabelAutoFitMinFontSize="8" TitleForeColor="Transparent" TitleFont="{0}, 3px" LineColor="165, 172, 181" IntervalAutoMode="VariableCount">
<MajorTickMark LineColor="Transparent" />
<MajorGrid LineColor="Transparent" />
<LabelStyle Font="{0}, 10.5px" ForeColor="59, 59, 59" />
</AxisX>
</ChartArea>
</ChartAreas>
<Titles>
<Title Alignment="TopLeft" DockingOffset="-3" Font="{0}, 13px" ForeColor="59, 59, 59"></Title>
</Titles>
<Legends>
<Legend Alignment="Center" LegendStyle="Table" Docking="right" IsEquallySpacedItems="True" Font="{0}, 11px" ShadowColor="0, 0, 0, 0" ForeColor="59, 59, 59" />
</Legends>
</Chart>
</presentationdescription>
<isdefault>false</isdefault>
</visualization>

CRM Masters Spring Special Offer

CRM Masters logo small

 

We have a limited time special offer discount on our Dynamics CRM training at CRM Masters.

Book on one of our June or July courses now and get £45 off

Register for any of our scheduled Dynamics CRM training courses before the end of May for the special early bird price of only £350 per person per course.

You can book as many people on as many courses as you want, and get the discount for each person.

In order to give you the best possible training, seats on our custom CRM training courses are strictly limited, so hurry to book your place while they are still available.

This offer applies to four of our courses: Update Your Skills to Microsoft Dynamics CRM 2013, Managing Business Processes with Microsoft Dynamics CRM 2013, Visualizing Microsoft Dynamics CRM Data and What’s New in the Leo Release of Microsoft Dynamics CRM 2013

Security Roles and Teams in CRM – An Inconvenient Half-Truth

Over the course of the last two years or so reading everything I can about Dynamics CRM, as well as teaching many classes of people how to get the most out of their CRM systems, one thing which comes up again and again is how to best structure Business Units, Users and Security Roles, and sometimes Teams as well to get the exact model you want to match your business requirements for who has access to which records and when.

Users inherit Security Roles from Teams – right?

One concept I have seen repeated many times is that “Users inherit security roles from all the Teams they are in”. And generally this seems to be a reasonable way to describe how it works, but occasionally odd behaviours seem to show up which make this appear to be less than 100% accurate.

I also had a gut feeling for a while that this was not the best way to describe the way this works. I prefer to say that “when a User is in a Team, they can act as if they are the Team, with the rights that the Team has through its Security Roles, but only while considering records in the same Business Unit as that Team”.

More on this later, and the one part of the model that this description does not do justice to.

Overall this means Security Roles use a kind of “impersonation” when Teams are involved and that the rights the User has are not only ‘borrowed’ very temporarily from the Team but they are relative to where the Team is – so access levels / depths such as “Business Unit” or “Parent / Child Business Unit” operate from the Business Unit where the Team is.

So how does this really work?

If you really want to read how security roles work in terms of determining access to a whole bunch of records (to display the results of a view) or a single record, then you need to read the white paper Scalable Security Modelling with Microsoft Dynamics CRM 2011.

42 pages later you will probably know exactly how the queries are built to actually enforce the security model, but that may not have made it much clearer from a practical, day-to-day design point of view. To be fair, the point of that white paper is to explain the underlying architecture and query methods properly so you can figure out the performance impact of different security approaches, rather than demonstrating how this informs your design from an end-result “who can see what” point of view. One thing that is never mentioned is any idea of inheritance or merging of privileges from Teams to Users. Every kind of access request is checked against User and Team permissions separately (exactly what is checked depends on things like whether the User has Global access level privileges to that entity at all, and whether the record is owned by the User or any of their Teams. These can help shortcut the otherwise brute force querying that would be necessary, especially to return all records in a view).

“You can’t handle the TRUTH!”

By now, I bet some of you are ready to shout at the screen – “we know Users don’t actually inherit the roles and keep them for themselves, but it works just as if they did, so it’s just a kind of shorthand and we all understand what we really mean, so don’t be pedantic”.

Tom Cruise in A Few Good Men - I Want the TRUTH!I always argue that I am not pedantic, I just like things to be exactly correct – “I want the TRUTH!”

In this case, it is CRM which is pedantic, and does not always behave as expected if you believe that a User can act as if they have all the Roles that their Teams have, all of the time. If you are betting your security model on it working this way then either you will end up with Users who can’t do their job, or possibly a gaping hole in your security. Neither sounds good to me.

Read more of this post

CRMguru is born – a new chapter and a chance for review

How did I get here?

When I started this blog I wanted to share information on a whole range of technology topics under the banner of “getting IT right” – helping people to figure out the best ways to use information technology to get things done. As a self-confessed geek who loves to dig into the detail of things, I also wrote about various neat tools (see, only a geek could call tools “neat”!) and techniques to wrestle software into doing what people really wanted out of it. I tried to get to the “why” as well as the “how” as I firmly believe (to paraphrase) that with great [IT] skill comes great responsibility [to follow best practices].

I made a conscious decision early on not to join those who seem to only produce “echoes in the blogosphere”. Writing a post of less than 20 words, saying “Someone else just wrote a great post over here <link>” is not what blogs are for, in my not so humble opinion; that’s what twitter is great for (up to a point). Worse still, “quoting” the whole of an article written by someone else is not so far different from blatantly stealing content with no attribution so I wanted to stay clear of that too, with the occasional exception of quoting parts of articles written expressly to be widely publicised such as press releases and hotfix release information.

If you don’t have something to add to the conversation to at least give it some context and explain why the linked post/article/information is important, why bother joining in?

I also did not see much point in writing “how to” articles for things which were well documented in books, online sources or simply accepted as common knowledge (sometimes of course it can be hard to judge what is really known by everyone).

So did it work? What do people read most?

Many of my most popular articles are things which are not well documented elsewhere, such as these top three of the most-read posts of the last six and a half years:

How to add national holidays in Outlook 2010 – the basic feature to add holidays for your country is well understood, but this article dug a bit deeper on topics such as removing holidays added by mistake (especially duplicates) and adding custom holiday dates to your outlook.hol file to share with others. The related post Outlook 2010 has incorrect holidays for UK and many other countries has had far fewer total readers, but this makes sense since the issue mainly affected English-speaking countries outside North America, and much of “continental” Europe. Both posts still see big peaks around Christmas / New Year and just before Easter – I guess people in 23 countries look at their calendars and realise Easter Monday is clearly in the wrong place and want to find out how to get it moved to the right date.

Using DSMod to update Active Directory – this was my very first post  and a perfect example of the sort of thing I wanted to write when I set out on my blogging ‘journey’, and I am really pleased that it is still enduringly popular now, and the second most read of all time (which I know is to some extent is self-proving, as it had the most time to be read). This was a real geeks’ article about how to use some simple command line tools to update user information stored in Active Directory. Is it still relevant? Possibly even more so since that directory information is even more ‘visible’ now as it surfaces in Outlook through “contact cards” (the summary of a correspondent’s information you see when you hover over their email address or name on the to / from line of an email) and is of course copied to Dynamics CRM user records too. I have some notes on my “blog ideas” list for an article about which AD fields are copied to CRM, and therefore what DSMod commands would be helpful to get those fields populated with correct information.

Excel 2007 calculation bug displays apparently wrong numbers – still getting loads of hits despite being about a bug which was fixed a long time ago, in a six-year-old version of a product. Judging by recent comments on this post and in forums more generally, some people seem to think that every time their numbers don’t add up as expected (due to rounding of displayed numbers in many cases), it must be the multi-million dollar, multi-million user software that is not able to figure out high school maths, although no-one else seems to have noticed.

Moving towards Dynamics CRM

Over time, I have become slowly more focussed on Dynamics CRM rather than being a total IT generalist. I still retain an interest in Office, particularly Outlook and Excel, and often use knowledge gained in my days as a system administrator to deal with network infrastructure questions relating to on-premise CRM deployments. As my work balance has changed, so has the content of my blog, so in the last year some of the most-read posts include an article outlining options for training and certification in MS Dynamics CRM 2011, how to Configure CRM 2011 and ADFS 2.0 on a single server on port 443 and When and How to use Child Workflows in Dynamics CRM.

I thought the time had come to change the name of the site to reflect the sort of information being posted here lately, so people have a better expectation of what they will find here, rather than it looking like another company blog. The new colour scheme and logo seemed appropriate to support this change of theme and direction.

Why CRM “guru”?

There are various definitions of the term”guru” which I hope to aspire towards in the posts that I write here.

The common themes are that a guru should be a teacher, one who imparts wisdom and knowledge to others, in some cases a leader as well. One possible etymology is that a guru “dispels the darkness of ignorance”. Through the articles in this blog I certainly hope to share the experiences I have gained as a Dynamics CRM consultant and trainer to shed some light on features which are not necessarily well understood or clearly documented and showcase some best practices of using the software to get the most out of it, from a technical or operational and business perspective.

I certainly do not use the term “guru” to claim that I am the greatest expert on the subject (that is for others to judge), merely to explain that I intend to use my knowledge to help others avoid common pitfalls and use features in ways they had not thought of, just as I have learned so much from those who have done things before me – too many to mention individually but some of whom are linked through the “blogroll” at the bottom of the screen.

I hope to be able to enlighten you for another few years yet.

Adam

Outlook does not show new CRM 2011 Custom Entity icons

This is a further follow up post to my recent article on How to add icons to custom entities in CRM 2011.

I have occasionally found that updated custom entity icons did not appear in the Outlook client as expected. This may or may not have been fixed in more recent rollups; I have not noticed it for a while but then I have not customised many of my own live CRM instance icons for a while either (I don’t tend to connect my Outlook client to customer’s systems when working on them and that’s where I am more likely to create new entities).

The cause and the fix are relatively simple – for obvious performance reasons, the icons are cached locally so you just need to clear them out.
Read on to find out how to clear the icon cache »

Changing custom entity icons already published in CRM 2011

This is a follow-up from my previous article about how to add your own new icons for custom entities in CRM 2011.

Once you have published your web resources and linked to them from your custom entity maybe you want to change your mind and use a different icon instead. Some people use the same “placeholder” for all their custom entities (such as a plain brightly coloured square) to remind them to fix them later, in other cases maybe you think of a better metaphor for the icon, or users simply don’t take to it during testing. Note that you can’t change the icons for a built-in system entity at all.

Whatever the reason for wanting to change your icons, you have two options:
Read on to find out swap your custom icons for new ones»

Creating icons for Custom Entities for CRM 2011

As described in my article about how to add your own new icons for custom entities in CRM, for each custom entity you will need two icons at 16 and 32 pixels square. These should be png, gif or jpg files, and I would strongly recommend png for preference, gif as second choice (as they at least support transparency) and jpg as last resort (areas of uniform colour often end up no longer being uniform but “noisy”).

Buy or find free icons online

There are various libraries of general-purpose icons you can buy such as the V-Collection from Icon Experience (they also do a more “modern” posterised style M-Collection which complements them well for different scenarios). I have also found others which you can download and use for free individually or as a collection. These often come with a requirement to cite the source if used commercially, which is easy enough to do by including some text and a URL in the description field of the web resource. The free collection of icons at FatCows has some good quality icons and useful ideas (downloadable individually or as a big zip file) amongst lots which seem far too “fun” for a serious application like CRM.

Another good source of icons is the CRM 2011 SDK which contains all the icons used in the application in the folders \resources\images\formentity and \resources\images\imagestrips n particular. Very often you can repurpose an icon from an entity you are not using, with a bit of lateral thinking. Modifying and reusing for commercial projects is probably not strictly allowed since these icons are Microsoft’s.

Draw your own or customise from a close starting point

Occasionally I get creative enough to draw simple icons from scratch, or at least to modify other icons to suit my needs more closely (if the original allows for derivative works, of course). Sometimes you find a great icon at 32 pixels and need to do a resize down to 16 (or vice versa) and then hand-retouch it to get the best effect – a resize alone is almost never a good finish.
Read on to find out more about resizing and editing icons for CRM »

How to add icons to custom entities in CRM 2011

I discovered a couple of weeks ago that one of the things Microsoft did get right in the recent Polaris release was to finally fix the dialogue box for adding your own icons to custom entities in CRM. This prompted me to finally get round to writing a proper article about how to do this.

Why use custom entities which need new icons?

As you develop your CRM system there will very likely come a point where you decide to create your own custom entities (record types) to store business data which is specific to your needs. You might also choose to create a custom entity to store data which you need to control access to, separately from other records. A new entity allows you to control through security roles which users can do what with these records independently of their security privileges relating to other entities.

In fact this kind of customisation is very often a fundamental part of the original design plans for many new CRM systems. This extensibility and versatility of systems such as Microsoft Dynamics CRM is arguably the whole point of a so-called xRM platform rather than a locked-down application which only works in the way the original developer thought up.

In order to make your system as easy as possible to use, it is very helpful to use your own custom icons for these entities so that users learn to recognise them rather than having to read loads of text labels. I have seen CRM systems with several custom entities all just left with the original sad little picture of a gear wheel (or a notebook and gear wheel for custom activities). In CRM 4.0 this may have been because the people who had the rights to customise the system did not have direct access to the server to publish their own icons, in CRM 2011 On-Premise or Online the only reason is not having the know-how to do so.

Read on to find out how to add new icons for your custom entities in a few simple steps »

CRM User Group Social Evening May 15th in Reading

There’s so much buzz about “social CRM” I felt it was about time we made the CRM User Group more social too. So, the evening before the next CRM UG UK meeting (which is in 9 weeks time on 16th May at TVP) we’ll be getting together for a less formal gathering, a few drinks, maybe a bite to eat (especially for those of you staying overnight in Reading), some networking, chit-chat and generally getting to know one another a bit better.

Where: Pitcher and Piano, 18 Friar Street, Reading, RG1 1DB

When: Wednesday 15th May, 18:30 onwards – get there early on if you want some free nibbles, and definitely try to get there before 8pm to take advantage of various 2 for 1 offers on cocktails and selected bottled beers, or glasses of house wine and pints of beer or cider for £2.50

Who: Anyone with an interest in Microsoft Dynamics CRM, users, administrators, techies, experts, trainers, partners – especially those attending the CRM UG Meeting, but of course also people who can’t actually make the main event for some reason.

How many will be there?

Great question! I need to give the venue a reasonable idea of numbers before the night so they can make sure to accommodate us comfortably. Please add a comment below if you think you will be there, or tweet me directly if you prefer (@AdamVero). Help us to get the word out to as many folk as possible by emailing your colleagues, tweeting about it (click for ready-to-tweet message), mentioning it to your LinkedIn groups and so on. Use hashtag #CRMUGUKSocial if you want to join the conversation.

Choosing a browser for CRM 2011

Anyone using CRM 2011 on-premises or Online can upgrade to Update Rollup 12 and get all the cross-browser goodness we waited for so long to get. Any new CRM Online organisation you start will have this already “baked in”. That means you can start using:

  • Firefox on Windows XP, Vista, 7 or 8
  • Chrome on  Windows XP, Vista, 7 or 8
  • Safari on Mac OSX 10.7 / 10.8
  • IE 8, 9 or 10

But! This comes at a small price – the deprecation of IE7. IE7 is no longer a supported browser for CRM 2011 going forward with the minor exception of IE7 on XP for CRM On-Premises only, and even that will be taken away at the Orion release (by which time support for XP will be at an end so I guess MS feel it is OK to start ignoring this not-insubstantial userbase at that point).

Why upgrade if I am happy with IE7?

Internet Explorer 8 is four years old today. If IE7 is what you are using four years after it was superceded, it’s time to upgrade and get a much smoother experience since the JavaScript engine in IE has improved dramatically over the last few versions, to compete well alongside Chrome which had fast JavaScript performance as one of the key reasons to switch when it first came out (better partitioning of security between sites / tabs in separate threads was another, and still is, but if your primary use of IE would be for CRM only, using another browser alongside for your ‘net surfing, then this is not a big deal really).

IPad seems to be missing from the list

iPad support at the moment is only for CRM Online, only for the “COLA” entities (Contact, Opportunity, Lead, Account), intended for using iPad for a sales lead to deal platform only at the stage. Other entities are rendered in the read-only forms, or you can use Mobile Express (as always) for editing.

Control supported browser list

You can also decide which browser environments you want your users to use, and warn them if they try to connect to CRM with something else – see this MSDN article on how to Control which browsers your organisation supports for details.

Countdown to CRMUG UK Meeting in Reading on 16th May 2013

It’s now just 10 weeks to go until the next UK CRM User Group meeting. We have another great agenda full of shared experiences and tips from your fellow Dynamics CRM users across a range of different sectors.

Thursday 16th May 2013, Microsoft TVP, Reading

Join us for the next UK CRM User Group Meeting at the Microsoft headquarters in Reading. Coffee and Reception start at 9:30 am. Don’t miss this opportunity to experience what the CRMUG has to offer you and other Dynamics CRM users!
Registration is now open! Click here to register for this event for FREE

Agenda

    • Registration & Coffee
    • Welcome & Introduction
    • Microsoft Dynamics CRM Roadmap & Demonstration
    • Member Showcase: Capita
    • Coffee Break
    • Best Practice Session:  Reporting/Workflow
    • Member Showcase:  NCFE
    • Networking Lunch
    • Discussion Topic:  Dynamics CRM – 20 Top Tips from an MCT
    • Q & A Session
    • Close at approximately 4:00 pm
    Who should attend?

All Dynamics CRM users are welcome. We also encourage you to invite your colleagues and other users – email to colleagues, tweet about it, mention it in your LinkedIn groups and other sites..

Partners are welcome to attend provided they are accompanied by a customer. Partners please bear in mind that the objective of regional events such as this is to exchange knowledge and Dynamics CRM experience. Partner personnel should possess deep CRM expertise and refrain from sales activities.

Hope to see you there!

Social Evening

We are talking about getting together for an informal social and networking event on the evening of 15th May before the main event . This would be at a venue in central Reading within walking distance from railway station, TVP shuttle routes and plenty of hotels. Plans are coming together so we should be able to announce more details soon. Whatever we do it will definitely be free to come and join in, and we’ll be trying to get a deal wherever we go to try and keep your food and drinks bills as low as possible.

I’ll post an update once we get a plan together. <edit – see this post about the CRM User Group Social Evening May 15th in Reading />

CRM User Group Event Rome January 2013

Special Early Bird Pricing for the CRMUG Event in Rome 2013 ends on December 15th, so complete registration now for a great 20% discount.

The CRMUG Event in Rome on January 31st to February 1st is a great opportunity for Dynamics CRM users from loads of different countries to come together and share experiences and ideas that they can take back and use to get even more out of their own CRM projects.

There will be plenty of opportunity to mingle with your peers and discuss how you are getting value out of your system, share tips, suggestions, good practices and maybe recommendations for third party add-ons which have filled a gap you could not have built in-house.

The main sessions will be split into tracks to suit end users / business managers, system customisers and administrators, and developers. Formats will vary between sessions to use the most appropriate way to cover different topics, from workshops to round-tables to deep-dive presentations.

All for only €199 + VAT before December 15th, €249 thereafter.

Bonus – FREE CRMUG Premium Membership for 6 months

As an added bonus, your registration for the CRMUG Event also includes a free 6-month Premium CRMUG membership!
Not only will you get to take part in this great learning and networking event, but you’ll also have access to CRMUG’s full range of benefits, including webinars, CRMUG Collaborate (our online community), special interest groups, CRMUG Academy training courses, Global Branch meetings, and more!

What are you waiting for? Find out more and register now:

rome2013.crmug.com

When and How to use Child Workflows in Dynamics CRM

Girl on Dads shoulders_smallWhen is the right time to have your first child?

A difficult question with a whole range of possible answers, I’m sure you will agree, and there are other websites and forums much better placed to answer it. So instead I’ll answer something slightly easier and with more definitive answers which often comes up when I am delivering training for CRM customisers and super-users who build their own workflows:

When should I have my first child workflow?

There are simple answers to this and some more esoteric and more complex answers to this. Generally I would say there are six main use cases for child workflows, which I will discuss in this post in approximate order of obviousness (most to least).

1: “Let me get on with my job”

A very simple scenario for CRM 2011 – you want the user to work through a Dialog process and provide some details or make some decisions, at the end of which they should get on with other things while a workflow runs to do some other steps which can run on their own with no further intervention (such as creating related records, updating links or sending an automated email).

You don’t make your users stay in the dialog a second longer than necessary once their useful participation is over (“leave, puny human!”), and this also means you can call a child workflow which involves waiting for a while before doing something (like sending a reminder) – you can’t do a wait step in a dialog.

2: Wash, rinse, repeat

Shampoo BottleOften in a workflow you have several points at which you want to do one or more identical steps. Maybe you have to set up several conditions which set various fields to different values, then inside some of the conditions you do a step such as creating an activity which is essentially the same but takes lots of fiddling to get right? It can be pretty tedious to do all of this. And you can’t move or copy the tricky step if you later need to change the flow of the logic.

For example you might run a workflow against a service Case which checks the customer type and service level, or maybe the related product or contract line, sets fields on the case such as the expected completion date and assigns it to an appropriate user or team. For important customers you want to send an email to the account manager to let them know the Case has been logged and including details of who is dealing with it, and for high priority Cases you want to create a Task to get things moving, with a due date related to the SLA type and time the Case was logged.

The actual steps of creating the activities are not especially complex but to do all those dynamic fields and get them right several times over takes a while. And then takes even longer when your user acceptance testing asks you to change some of the detail – several times over.

Build the activities in a child workflow (or possibly two separate ones). Then each time you want to do the same step, call the child workflow (running against the same Case record). Now you only have to build it once and only have one place to make changes.

A nearly identical use case would be when you have several similar workflows which are triggered by different things such as record creation, fields being updated or status changes. In each of the workflows you can call the same child to do some of the work. Read 4 more scenarios where child workflows will help you out »

Exam tips for MB2-867 CRM 2011 Installation and Deployment

Earlier this week I passed the exam MB2-867 Microsoft Dynamics CRM 2011 Installation and Deployment and scored my highest ever marks on a technical exam (as opposed to Microsoft Office Specialist exams). I thought I should share some tips about how you can best prepare yourself for this exam, and thoughts about techniques for taking the exam itself. (Aside: yes, I know I signed an NDA so there is nothing in this article to tell you anything too specific about the exam or the questions I was asked on the day).

Read more of this post

CRM 2011 Update rollup 7 and Read-optimised Forms

The latest hotfixes and updates to Microsoft Dynamics CRM 2011 are now available as update rollup 7. Knowledgebase article is here:
http://support.microsoft.com/kb/2600643

and downloads for all the software components are here:
http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=29221 

Read-Optimised Forms

The KB article above refers to a feature update in UR7 to provide “Read Optimized Forms”, which sounds very much like one of the minor features which was announced for the Q2 2012 service update, or release R8. This got a little bit buried in all the excitement about multi-browser and mobile capabilities, but essentially means you can deliver a faster experience to your users by providing them with a rapid-loading, reduced functionality, read-only form for entities which are often read and rarely updated. The Release Preview Guide published in February said this:

RAPID VIEW FORMS
In many organizations there are groups of users who typically use a CRM system to look up key information about their contacts, accounts, opportunities and cases but have no immediate need to modify that information.

For example, many contact center employees or managers primarily use Microsoft Dynamics CRM to review business information before deciding whether any action is required. For these users the optimal experience is to load this information very quickly so they can immediately assess a situation and determine the correct course of action.

In order to provide this type of user experience, we’re introducing rapid view forms. The rapid view form is a read-only form that can be configured like any other form in Microsoft Dynamics CRM to display any record in the system.

When viewing information in these forms, users can switch to an editing experience with the click of a button. Administrators of Microsoft Dynamics CRM will have the option to set all forms to load in rapid view mode; if appropriate for business needs. Individual users will have the personal option to choose the form mode they prefer (Rapid View or Standard Edit).

At the moment (just after midnight UTC 22nd March) the links in the UR7 article which should point to more information about this new feature seem to redirect only to a generic page in the Resource Center and an MSDN SDK article about editing forms. From the latter article there is a link to another subsection “Design Considerations for Read-Only forms” which provides more details.

Read more of this post

Help get better and more helpful tooltips on forms in CRM 2011

One of my frustrations in CRM has long been that there is no easy way to get useful tooltips to appear to help end users when they are filling in forms.

Loads of discussions take place during planning meeting about what fields will be included, what their purpose is, what should or should not go into a particular field and what will happen when a user fills it in (eg scripts or workflows, or how the data surfaces in a report). Most of that detailed consideration gets buried in project documents, some of it may be covered in user training, and even less may actually make it into end-user support articles and training hand-outs.

Some of these are common misunderstandings, such as what should you use “Address Name” for? (hint – it’s not the building name nor part of the address, it’s the name of the address, i.e. what do you call this place? answer might be “Head Office” or “North West Distribution centre” for example).

The most obvious place to put this stuff is on the form, and the most logical place is right next to where it is needed, by adding tooltips to the field labels. Yes, I know they do have tooltips, but these simply repeat the text of the field label! Zero value is added by having them there, they don’t even go as far as using the “normal” display name or the description.

There are ways to create tooltips by adding an “onmouseover” event to the field, but since this is a direct DOM hack, this won’t be supported. It is also yet another bunch of scripts being delivered over the wire, which also need to be written, maintained and updated, usually by system admins with at least a basic level of Jscript coding skills.

There must be a better way…

For me the ideal answer would be a property of a field on a form where a system customiser (i.e. not admin, no coding skills required) can easily add text they want to use as a tooltip. Either directly as custom text or perhaps simply ticking a couple of boxes to include the field display name and/or description and/or schema name and/or custom text as well.

So I went over to the Microsoft Connect site where you can give feedback about CRM and other products. This is intended for product suggestions and definite bugs, rather than support for things that don’t work in your particular implementation. Other site users can vote up or down the importance of your suggestion, and can comment or provide information about workarounds.

I posted a new suggestion to provide useful “tooltips” on rollover/mouseover of form labels and/or allow supported customisation of them and within two weeks it had already reached the all-time top ten most upvotes. It is continuing to rise and I really hope this is given serious consideration for the next version (either a quarterly release, or more likely the next “full version” given that it might require changes to xml schema for exporting and importing customisations).

You can help get this idea implemented

If you like the idea go and vote it up and if have useful input add a comment so that if and when it gets implemented they can make it fit people’s real-world needs as closely as possible.

There are loads more great suggestions in the Dynamics CRM section – have a look round and vote for those you would most like to see built first.

Copy2Contact gets contact information into Outlook and CRM

I discovered a really handy utility a while ago called Copy2Contact but have only just got around to writing this article about how I use it to take unformatted information and create CRM Contact data from it. Copy2Contact sits in the system tray and allows you to select a chunk of text in pretty much any application, hit a shortcut key and it will create a new Outlook contact using that information (I use Ctrl+C, C, so this is just a “double tap” on a normal Ctrl+C for copy). Typically this might be text in an e-mail but it does not have to be – it could be from a web page, Word document, pdf file or anywhere else really.

Better still, it uses some pretty clever algorithms to figure out which bit of the text is the name, job title, company, address, telephone, mobile, email and so on. Any data it can’t interpret it adds to the notes section so you can a) see what it was and b) copy and paste it somewhere else if needed.

It’s not perfect, and sometimes gets bits of the information in the wrong places but it is a heck of a lot quicker than creating a new contact by hand then copy and pasting information across by hand, which is usually very painful. While the new contact is still open you can use the program’s “Utils” menu to swap some things round which may be commonly mistaken, such as name<>company or job title<>company, which is easier than copy / pasting these via notes to get them in the right places.

A very common use for this is with someone’s email signature as the source text. Select, hit your shortcut and you have a new contact record pretty much ready and waiting to be saved.

Copy2Contact is not free, but I have easily earned back the $40 cost of the personal edition through the time I have saved by using this. There is a Pro version as well which has additional features to help do things like consistent (US style) formatting of phone numbers, capitalizing city names and so on which I don’t really feel the need for.

To be absolutely clear: I have no affiliation with Copy2Contact and have my own paid-for copy of their software, I have not received any freebies or review copy or anything else in order to write this article.

You can try the software for free for 14 days from the trial download page to see if it suits you. There are versions for Outlook, salesforce.com, Google apps and more PC-based tools, as well as Blackberry  and iPhone/iPod/iPad.

Read on to find to more about using Copy2Contact for capturing data for CRM»