N:N Relationships, or Many-to-Many Relationships, can be a little tricky to get information out of.
As an example competitors out-of-the-box have an N:N relationship with opportunities. Let’s say we wanted to look at a list of competitors and see how many active opportunities they are currently engaged in. With the chart editor and views, the best bet is to open each competitor record and count how many active opportunities it is related to. We can make that much easier with a chart like this.
Before I get started on how to build the chart, let’s first have a look at how N:N relationships are structured in MS Dynamics CRM.
I will use the competitor opportunity relationship as an example, but this applies to all system and custom N:N relationships.
While it is not apparent in the solution designer, the relationship is controlled by an intersect table, in this case called “opportunitycompetitors”.
We will need this exact name of the intersect table for the fetchcollection in our chart xml.
To find the name of the intersect table, open up competitors for customization in the solution editor.
Click N:N Relationships and open the relationship to opportunity.
Here, find the “Relationship Entity Name” towards the bottom of the form and make a note of the exact name for later.
Now that we have the name of the intersect table, on to building the chart. A full sample of the chart xml can be downloaded at the bottom of this post.
Build The Base Chart
As always, I start by creating a base chart I can use for editing the chart xml. I am starting on the competitor entity.
A simple bar chart counting competitors, grouped by competitor. Not very useful yet.
Simple – Count Opportunities Per Competitor
Export the xml and open it in your xml editor (Notepad++ perhaps).
Here’s the fecthcollection. I have renamed the obscure aliases to something more sensible. This is where we will do most of the work. If you change the aliases too, remember to also change them in the categorycollection.
Now I want to change the chart xml, so I get a link to the intersect table and can count the number of relationships the competitor has to opportunities.
I have now created a link to the intersect table and placed the count aggregate inside of it. The groupby is still directly on the competitor entity. I also changed the name of the count attribute to “competitorid”. This is because the intersect table only holds the id fields.
Import to MS Dynamics CRM and look at the result.
Now we have a list of competitors including a count of how many opportunities they are competing on.
On import you may run into this error message.
If that happens, just change the width of the chart or refresh the page and it will work.
Advanced – Count and Sum of Estimated Revenue from Opportunities
That was charting on N:N relationships in its simplest form. However, as always we would like to do more. How about including the sum of the estimated revenue of those opportunities, and also filter it to only include active opportunities.
In order to achieve that, we need to add an extra link-entity to get all the way to the opportunity entity, so we can access fields there directly. In the first example we stopped on the intersect table.
Sample of fetchcollection which links from competitor, via the intersect table, to the opportunity entity.
We now have two sets of <link-entity>, linking through the intersect table to the opportunity entity.
Notice the pattern in the links are name=”intersectable” from=”field with id from intersect table” to=”field with id from starting entity” and in the next line it is name=”the other entity” from=”field with id on other entity” to=”field with id on intersect table”. Since the id fields are mostly the same, once you have the name of the intersect table, these are fairly straight forward. Marketing lists are an exception to this.
Inside the <link-entity> to the opportunity entity, I have added a filter so we only include active opportunities. As usual, I just created a view in Advanced Find, downloaded the fetchxml, and copied the part with the filter.
I also added an extra attribute to include the sum of the estimated revenue for the opportunities.
Here’s what the final chart looks like.
I also made these optimizations to the chart, just to touch it up a little.
- In the Series
- LabelFormat=”C0″ – so values in the chart have no decimals – that’s the letter “C” followed by a zero
- DrawingStyle=Cylinder – in the custom properties just add some shading
- In the Axes
- Format=”C0″ – so dollar values on axis have no decimals
- YAxisType=”Secondary” – on the series containing the sum to get count and sum on different axes
- IsReversed=”True” – on the X axis so it is alphabetical from the top, not the bottom
A full sample can be found below with these changes included.
As a note, charting on N:N relationships also works on Marketing Lists (static only). That means you can create a list of users with a chart of how many marketing lists they are associated with. However, you will need to use a metadata browser to get the names of the intersect table (listmember) and its id field (entityid), which is different in this case.
Thank you for reading. Please sign up for the newsletter to stay up to date on new blog posts and follow me on Twitter Follow @crmchartguy
Sample chart xml for count and sum of opportunities per competitor
Here’s a sample chart xml ready for import to the competitor entity. It is made in an environment with no customizations so it should be easy to import. As always, samples are provided for fun only. Do not use in a production environment without proper testing.
If you made it this far. You’re awesome! Seriously. Tweet about it!