Depending on the design of your dashboard, you may want to
set a default selection on a PerformancePoint Scorecard that is used as a
filter for other web parts on a dashboard page.
As an example, consider a dashboard that contains a PerformancePoint
Filter, Scorecard and an Analytic Report (Grid or Chart). The filter is used to
filter the scorecard and the report. Additionally, the scorecard is used to
filter the report based on a row member connection. The filter contains a list
of manufacturers, the scorecard provides KPI for a list of products a
manufacturer carries and the report displays the count of a selected
manufacturer’s product sold by state. “Manufacturer 1” sells products A, B and
C and “Manufacturer 2” sells products B, C and D.
One approach is to set the default of the Analytic Report to
something that could make sense without a Scorecard filter being applied. By selecting
default Members for the Analytic Report in Dashboard Designer, the dashboard defaults to displaying
information, even without a scorecard selection. Depending on the complexity of
your dashboard, the data, etc. maybe this is acceptable (this approach did not
make sense for my particular dashboards).
Another approach is to select a Member (e.g. “Unknown”
product that no manufacturer carries) that won’t produce any data in the
Analytic Report. The resulting chart would look something like the following (note,
I’m using a PerformancePoint Stack Selector, hence the web part title within a
dropdown box):
Not great, but at least we aren’t misleading the dashboard
user. I initially took this approach and went so far as to add a message in any
PerformancePoint Reporting Services (i.e. SSRS report) web parts that were connected to the scorecard telling the user that they had to
select a product (i.e. row) in the scorecard, if one wasn’t selected.
In the end, I wasn’t satisfied with this
approach either, so I went Googling and stumbled across this question and response (http://stackoverflow.com/questions/3372565/performancepoint-sharepoint-2010-and-jquery)
which turned up the NotifyBrowserOfAsyncUpdate event. This event is triggered for every PerformancePoint
web part that is updated on a page. By using some jQuery and by identifying
some PerformancePoint CSS classes, we can determine when the scorecard has been
updated and whether or not we need to select a default row member by triggering
a cell click event. I use the function below in an external script for use with
multiple dashboards (I’ll leave it to you to streamline the jQuery as I have attempted
to make it more understandable by adding comments and removing additional
functionality).function NotifyBrowserOfAsyncUpdate(elem) { var elemId, selector, rows, row; // id of web part being updated elemId = $(elem).prop('id'); // .sctb is a PerformancePoint Scorecard class selector = '#' + elemId + " table.sctb"; if ($(selector).length != 0) { // scorecard web part found! get rows that have a class that begins with "r-" (i.e. class|="r") rows = $(selector).find('tr[class|="r"]'); // .scs is a PerformancePoint Scorecard’s selected row class if ($(rows).find('.scs').size() == 0) { row = $(rows)[0]; // find head cell in first row and click if ($(row).children('th').size() != 0 && $(row).children('th')[0].length != 0) { $(row).children('th')[0].click(); } } } }
Because the cell click event is only triggered when a
scorecard row is not selected, this will usually only happen when the page
loads for the first time. This event would also be triggered when changing, for
example, the manufacturer filter from “Manufacturer 1” with “Product A”
selected in the scorecard to “Manufacturer 2”. As “Manufacturer 2” does not
produce “Product A”, the click event is triggered and “Product B” would be the
default scorecard selection.
Edit: June 14, 2014
When drilling up on a Scorecard from a root item that is not the first item, the "elem" element will be undefined and therefore a default row member will not get selected. In this case, which is likely to be infrequent, you can just use "table.sctb" as the selector. The revised function is provided below:
Edit: June 14, 2014
When drilling up on a Scorecard from a root item that is not the first item, the "elem" element will be undefined and therefore a default row member will not get selected. In this case, which is likely to be infrequent, you can just use "table.sctb" as the selector. The revised function is provided below:
function NotifyBrowserOfAsyncUpdate(elem) { var elemId, selector, rows, row; if (typeof elem === 'undefined') { // occurs when drilling up to All in scorecard selector = "table.sctb"; } else { elemId = $(elem).prop('id'); selector = '#' + elemId + " table.sctb"; } if ($(selector).length != 0) { // scorecard element found! get rows that have class that begin with "r-" (i.e. class|="r") rows = $(selector).find('tr[class|="r"]'); if ($(rows).find('.scs').size() == 0) { row = $(rows)[0]; // find head cell in first row and click if ($(row).children('th').size() != 0 && $(row).children('th')[0].length != 0) { $(row).children('th')[0].click(); } } } }