A customer question this week regarding filtering a chart. They have a report with a bunch of criteria with monetary values but, rather than show all of the criteria in a pie chart, they just want to show a few. For example:
| This ... || rather than this |
There are a couple of ways to tackle this:
1. Filter the chart data in the chart definition. Using an XPATH expression you can filter out all of the criteria you do not want to see. Open the chart definition and update the definition. You will need to update the RowCount, RowLabels and DataValues attributes in the chart definition. Adding in the following XPATH expression:
[DEPARTMENT_NAME='Accounting' or DEPARTMENT_NAME='Marketing' or DEPARTMENT_NAME='Executive']
so the DataValues value becomes:
<DataValues><xsl:for-each-group select=".//G_1[DEPARTMENT_NAME='Accounting' or
2. Create a variable in the template to hold just the values you want to chart.
<?variable: filterDepts; /DATA_DS/LIST_G_1/G_1[DEPARTMENT_NAME='Accounting' or
Then update the chart definition with the variable for the same three attributes above, the RowCount, RowLabels and DataValues. For example:
<DataValues><xsl:for-each-group select="$filterDepts" ...
These both work admirably, but they both require some manual updating of the chart definition which can get fiddly and a pain to maintain. I'm also just filtering for three departments, when you get up to 5 or 6 then the XPATH starts to become a pain to maintain. Option 2 alleviates this somewhat because you only need to define the filter once to create the filtered variable.
A better option may be ...
3. Force the effort down into the data layer. Create another query in the report that just pulls the data for the chart.
LIST_G2/G_2 holds the data for the chart. Then all you need do is create a vanilla chart on that particular section of the data.
Yes, there is some overhead to re-fetch the data but this is going to be about the same if not less than the extra processing required in the template with options 1 and 2. This has another advantage, you can parametrize the criteria for the user. You can create a parameter to allow the user to select, in my case, the department(s) they want to chart.
Its simple enough to create the multi-select parameter and modify the query to filter based on the values chosen by the user.