PerformancePointy: Wade Dorrell's MSDN Blog

  • Thanks for a great SharePoint Conference!

    Thanks for attending SharePoint Conference 2009 & talking with us about your scenarios, troubles, what you’d like to see us turn the ratchet on, and what you love. I talked with a slice of you about PerformancePoint Services, but also the whole insights ecosystem for SharePoint 2010… Excel Services, Reporting Services, Visio Services, and more.

    Packed house at our “Creating dashboard as easy as 1, 2, 3” PerformancePoint Services session 
    Above: Packed house at our “Creating dashboard as easy as 1, 2, 3” PerformancePoint Services session. Sorry about the room acoustics… we got a late room upgrade… you can get the video recording here sometime next week.

    I love conferences because they get me so fired up. Jason said I took on the attributes of a certain CEO for a few moments when talking about PowerPivot. Yeah, I think I might have. What fires me up is that you love it, you came to a conference to fill your brain with it, and we’re putting the bits in your hands soon (November.) I think that’s worth a dance or two.

    Want to know more about features of PerformancePoint Services for SharePoint 2010? Keep your eyes on the PerformancePoint Services product team blog for a series of posts about each feature.

  • More to come…

    I’ve left this blog mostly untouched for the past 6 months. Here’s what I’ve been up to:

    • Tightening rivets on Office 2010 wave products. The ship’s looking good!
    • Going through real world scenarios using the latest bits. You probably know Microsoft calls this ‘dogfooding’. I dogfood daily. I do PerformancePoint Services, and SharePoint of course, but also Outlook, Excel, Word, and PowerPoint. I’ve also hit InfoPath, SharePoint Designer, and Access in the last few months. By the way, Excel 2010 is looking really great. (Have you seen slicers?)
    • We’re getting ready for Microsoft SharePoint Conference in October. Here’s a sneak peak of a few of the sessions; PerformancePoint Services is in the mix.
    • We’re working with TAP customers on deployment of early bits.
    • We’re getting people aligned for the next wave.

    There hasn’t been much that’s PerformancePointy I can blog about… but I’ll be back soon!

    In the meantime, some ideas:

  • Free Software Development & Tech Event in Boise

    Boise Code Camp 2009 is a free, popular (400+ registrants last year) and educational conference on a Saturday (March 28) down at Boise State University. Speakers from our community, and a few respected north-westerners, cover software development, IT, business, and a few very geeky topics.

    Application development in the cloud, lots of jQuery, Mindstorms & Wiimotes, software & copyright law, agile methodologies…

    Code Camp’s looking for speakers! If you’ve an idea, and an hour to present on the 28th, you’ve got a month to prepare… but first please look at current sessions and consider submitting now. My SharePoint BI colleague, Greg, is going to talk about iPhone application development, “from idea to $” as I pitched it to him.

    For more information, head to http://www.boisecodecamp.org/.

  • PerformancePoint just got sharper

    We announced an update to the Microsoft BI roadmap today.

    The video by Guy Weismantel, Director of Microsoft BI is the authoritative source on the change at the moment, and I expect there will be press release/FAQ at Microsoft PressPass (I don’t see it as of 2:20 Mountain Time). The mother load of discussion sources, if you can step carefully, are on FriendFeed:

    http://friendfeed.com/search?q=performancepoint&who=everyone

    Basically you’ll hear we’re moving the scorecard, dashboard, and analytics capabilities we ship today into SharePoint. If you know that product, you probably saw that one coming. You’ll also hear that the planning product is done. Maybe you saw that one coming, maybe you didn’t. There are some good investments that team’s made that I think you’ll see soon enough.

    Where you think there is badness, there is goodness. And little dash of that ProClarity spirit, perhaps. I have a new name for this blog, but I can’t use it yet, so it’s staying “PerformancePointy” for now.

  • Dashboard Deployment Without Folders

    When deploying a dashboard to a document library from PerformancePoint 2007 Dashboard Designer, Dashboard Designer creates each dashboard page .aspx file in a folder named the same as the dashboard:

    Picture of document library showing folder holding pages 

    But what if we don’t want folders?

    The “Create View” Way

    I created a view for “Insurance Dashboards” with the “Show all items without folders” setting turned on, and set it as the default:

     image

    The folders still exist, but users visiting the document library get a flattened list of all pages by default.

    The “SharePoint Workflow” Way

    With SharePoint workflow we can remove folders as dashboards are deployed.

    First, I create a document library for the purpose of deployment. I called it “Insurance Dashboards - Deploy”.

    Next, I create a new workflow in SharePoint Designer that copies any item created in “Insurance Dashboards – Deploy” to “Insurance Dashboards”. (Serendipitously, the folder structure won’t be maintained by the copy… )

     image  

    When deploying a dashboard in Dashboard Designer I target “Insurance Dashboards – Deploy” instead of “Insurance Dashboards”:

    image 

    The workflow makes a copy of each page to “Insurance Dashboards”, leaving the folder structure behind.

    Thoughts on The “SharePoint Workflow” Way

    • We might add a step that deletes the deployed after the copy occurs.
    • How might we handle page collisions? (We might rename, do a forced overwrite, or go into a holding pattern when this happens. I haven’t tried any of these things yet.)
    • This pattern might be useful for other things, such as altering the content of some dashboard pages, particularly to add a custom web part. This is also something I haven’t tried, but if anyone has, please let me know!

    Any other thoughts? Please leave comments here on the blog.

  • Treemap + Silverlight => Gasp!

    From http://blogs.msdn.com/gpde/

    Microsoft’s Global Product Development team in Europe recently completed its Treemap control for visualizing hierarchical data, seen below.  You can read more about it here and leave your feedback.

    If you are excited by what you see us doing, check us out at www.joinmicrosofteurope.com/.

    You can skip a few steps straight to the demo here: http://www.joinmicrosofteurope.com/TreemapDemo/

    Wow!

    Putting this in the context of PerformancePoint, remember that you can get a similar visualization in PerformancePoint dashboards by using ProClarity Analytics Server’s “Performance Map” visualization.

  • PerformancePoint Monitoring + Silverlight: KPIs and Scorecards

    PerformancePoint Monitoring doesn't have as robust a prescription as Silverlight Blueprint for SharePoint, but yes, PerformancePoint Monitoring & Silverlight can be used together.

    PerformancePoint dashboards are SharePoint web part pages, so web parts or master pages using Silverlight for menus, visualization, charting, or any other thing, are right at home in (or surrounding) a PerformancePoint dashboard.

    Another integration point is the web service PmService.asmx. You can learn more about this service through PerformancePoint SDK documentation of its client proxy. In this article we’ll call the GenerateView method of this service to retrieve and work with a scorecard/KPI data set, and visualize that data in Silverlight 2.

    The Objective

    Here’s a simple scorecard containing everyone’s favorite KPI, “Freight Cost Below 29”.

     image

    We’ll render this same data lovingly within a Silverlight 2 application that looks like:

    image

    If a scorecard contained additional cells, we could obviously do a lot more… a value trend sparkline, or multiple KPI slices in a ticker-style UI… but we’ll start with a simple <Button/>.

    Step 1: PmService.asmx & Cross-Domain Callers

    Here’s an essential development/security tip: If our Silverlight application isn’t hosted at the same host/port as PmService.asmx, we’ll need to deal with cross-domain calling issues. Learn more at MSDN: Make a Service Available Across Domain Boundaries or Tim Heuer's excellent Silverlight blog.

    Step 2: Creating/Configuring The Service Reference

    Configuring a service reference for a Silverlight 2 project is familiar for those who've built .NET client/service applications, but perhaps not for PerformancePoint Monitoring developers… we can't use the previously mentioned client proxy because its assembly references the .NET client runtime, not the Silverlight runtime.

    So we generate new, Silverlight-specific, client proxy and associated classes from WSDL by using Visual Studio’s “Add Service Reference” against http://myperformancepointserver:40000/WebService/PmService.asmx?wsdl.

    The generated proxies contains references to “ArrayOfXElement”, which keeps them from compiling. For the purposes of this article, you can remove any code that references ArrayOfXElement until the proxy does compile.

    Step 3: Call GenerateView

    We create an instance of PmServiceSoapClient, the client proxy generated from WSDL, and call the service method GenerateView. The GUID parameters to GenerateView are Scorecard ID and ConfiguredView ID. (We find these in a.bswx file containing the scorecard.)

    PmServiceSoapClient client = new PmServiceSoapClient();            
    client.GenerateViewCompleted += new EventHandler<GenerateViewCompletedEventArgs>(client_GenerateViewCompleted);
    client.GenerateViewAsync(
    new Guid("3449fb9f-458b-44d4-8509-f75e1ad99e78"),
    new Guid("7bb670e0-2ad8-4ed9-a1e1-0e63003d4402"),
    null,
    null);

    Step 4: Get The Scorecard Data Set

    Silverlight forces the asynchronous calling pattern, and so the handler for GenerateViewCompleted’s called on a non-UI thread. It's important that changes to elements within the visual be made on the UI thread.  Our method UpdateVisualization updates the visual using data from e.Result, so we use Dispatcher.BeginInvoke to be sure it’s called on the UI thread:

    void client_GenerateViewCompleted(object sender, GenerateViewCompletedEventArgs e)
    {
    Dispatcher.BeginInvoke(() => UpdateVisualization(e.Result));
    }

    Step 5: Bind the GridViewData to the Visuals

    Here's UpdateVisualization, which grabs the (0,0) GridCell and binds a few values to a button through a data model class:

            public void UpdateVisualization(GridViewData gridViewData)
            {
                // This example works off the 1-row header, 1-column header
    //
    structure of our simple example scorecard. IEnumerable<GridHeaderItem> coordinates = new[] {
    gridViewData.RootRowHeader.Children[0],
    gridViewData.RootColumnHeader.Children[0] };







    // GetCell is an extension method, see Appendix GridCell cell = gridViewData.GetCell(coordinates);
    string text = cell.DisplayElements[0].Description; GridColor gridColor = cell.FormatInfo.BackColor; button.DataContext = new DataModel { Description = text, StatusColor = new SolidColorBrush(Color.FromArgb(gridColor.A, gridColor.R, gridColor.G, gridColor.B)) }; }

    Here’s the data model class:

            public class DataModel
            {
                public string Description { get; set; }
                public SolidColorBrush StatusColor { get; set; }
            }

    And the relevant XAML:

        <Button x:Name="button" Height="21" Width="90">
            <Button.Content>
                <StackPanel Orientation="Horizontal">
                    <Ellipse Width="12" Height="12" Fill="{Binding StatusColor}" VerticalAlignment="Center"/>
                    <TextBlock Text="{Binding Description}" VerticalAlignment="Center"/>                
                </StackPanel>
            </Button.Content>        
        </Button>

    And the result:

    image

    This isn’t fancy, but hopefully it gets you past the major hurdles, and on to a much more interesting dynamic visualization using Silverlight 2.

    Appendix: GetCell for GridViewData

    Here's an extension method for the WSDL-generated GridViewData, GetCell. This is used to look up a cell for a given combination of headers.

    The cell keying algorithm could change in future versions of PerformancePoint. Please let me know if you run into issues using this.

            /// <summary>
            /// Returns the GridCell for the coordinates defined by the GridHeaderItems. Returns
            /// null if the coordinates refer to an empty/out-of-range cell.
            /// </summary>
            public static GridCell GetCell(this GridViewData t, IEnumerable<GridHeaderItem> coordinates)
            {
                string key = generateKey(coordinates);
    
                DictionaryWrapperOfStringGridCell table = t.Cells.Table;
                for (int i = 0; i < table.Keys.Length; i++)
                {
                    if (table.Keys[i] == key)
                    {
                        return table.Values[i];
                    }
                }
    
                return null;            
            }
    
            private static string generateKey(IEnumerable<GridHeaderItem> coordinates)
            {
                return coordinates
                    .Where(coordinate => null != coordinate.DimensionName)
                    .OrderBy(coordinate => coordinate.DimensionName)
                    .Select(coordinate => string.Format("{0}:{1}{2}_", coordinate.DimensionName, coordinate.DimensionValue, coordinate.Id))
                    .Aggregate(new StringBuilder(), (stringBuilder, keyPart) => stringBuilder.Append(keyPart), sb => sb.ToString());
            }
  • Working with well-known properties and PmService

    Tim Kent at Adatis did a nice writeup on how to work with the "well-known properties" Name, Description, and Person Responsible of a PerformancePoint Monitoring first-class object (a KPI, a Scorecard, a Data Source, etc.) when calling the PmService web service.

    I've always wondered why they're "well-known" if you have to memorize a GUID to work with them... "well-known if you have a good memory", perhaps. It should be easier than that, and I've entered a usability bug against this for the next version.

  • Sparklines plugin for jQuery

    Ran into this on the tubes this morning:

    This jQuery plugin generates sparklines directly in the browser using data supplied either inline in the HTML, or via javascript.

    http://omnipotent.net/jquery.sparkline/

    In theory you'd be able to use this to sparkline-ize a PerformancePoint scorecard or analytic grid that returns CSV data in a cell, using this technique:

    <span class="sparklines">1,2,3,4,5,4,3,2,1</span>

    $('.sparklines').sparkline('html');

    I'm not familiar with how to follow non-jQuery DOM modifications (all PerformancePoint webpart content is dynamically injected into the DOM) with jQuery That seems like the tricky part. Thoughts?

  • Careers at Microsoft Boise

    Every month folks at NETDUG ask if we're hiring, whether they can give resumes to me, what it's like to work for Microsoft in Boise, are we moving to a larger/nicer building in Boise, etc.

    You can see all currently available openings on the Microsoft careers site by searching for USA, Boise, ID. This is also where you submit your resume. The hiring managers in Boise get a filtered list of applicants interested in the positions/location, and they'll get in touch with you. If you get an invite to interview in-person in Redmond, but were applying for a Boise position, please question it... the system isn't adapted to non-Redmond hiring yet, and one of our hires had an interview location snafu. (It turned out OK though.) We do most of the in-person interviewing here, and you'll probably talk to one or more Redmond folks on the phone.

    You can give resumes to me, and I can pass them along to hiring managers, although they can't really take action on them... you'll have to post it on the Microsoft careers site as well.

    As for what it's like: it rocks. With PerformancePoint team you're working in a consolidating, growing, market with plenty of room for differentiation. In Boise, you're working with a tight-knit, fun-loving group who's experience in the BI space (lots of ex-ProClarity development and test people around!)

    As for if, where, when, and how we are moving: if I could tell you, I would, and when I can, I will. (Update: We moved to the Idaho Independant Bank Building, we occupy a good part of the 4th floor, and the entire 5th and 6th floors.)

    (And what's NETDUG? I facilitate the .NET Developer User Group's use of our training room here at the Microsoft Boise office every month, 3rd Thursday, at 7PM. If you're C#-y, TDD-like, agile-ist, or interested in any way in .NET developer technologies (Microsoft's typically, but anything goes), this is a pretty sweet group, and we'd be happy to see you. It's free. There's sometimes pizza and swag. There's always plenty of geekery. And there are lots Boise employment opportunities discussed beyond Microsoft's. That's NETDUG.)

  • Changing the background color of ProClarity Performance Map (aka Heat Map)

    Customers often want to set the background color of analytic visualizations such as the ProClarity charts & grids, to match a corporate or dashboard theme. Unlike the ProClarity charts & grids, it's not possible to set the background color of the heat map visualization within ProClarity Professional... it's always a cream color... but it can be changed through a simple modification to the PAS server CSS files.

    Cream should be on the list of banned colors, along with sea foam green and salmon.

    The color is defined per-language in <PAS virtual directory>/<PAS language>/src/treeview.css:

    body {
        height: 100%;
        margin: 0px 0px 0px 0px;
        padding: 0px 0px 0px 0px;
        width: 100%;
        background-color: #ece9d8;
    }

    Feel free to change it for each language pack. Although it's unlikely a PAS service pack or hotfix would update this file, you may have to re-apply the changes after installing a SP or hotfix.

    The downside to all of this is it's a global change, affecting all heat maps rendered by the PAS server. I have visions of using URL-rewrite to make this dynamic per heat map instance, but unless someone wants to make my vision reality, that's all it is for the moment.

  • PerformancePoint Monitoring SDK content from TechEd

    Here's the sample code and slides I showed about the PerformancePoint SDK at TechEd.

    A couple notes:

    1. The build OutputDir and xcopy post-build steps assume default locations for PerformancePoint assemblies, the Monitoring Web Service, and SharePoint :80 web application, as discussed in the BIN08-TLC slides. Please take a look and make sure they're right for your environment.
    2. To get the samples working you'll need to alter the *.config files. See config-readme.txt for details. Let me know if you need help, I think this is the trickiest part.
    3. If you want to use the "Live Search"-based custom data source implementation, please apply for your own Live Search application ID and insert it in SearchDataSourceProvider.cs. (It'll take about 15 minutes for the application ID to become active; until then feel free to use mine.)
  • Thanks!

    To everyone who attended my sessions and whom I talked to at TechEd 08: thank you! I got some of the PerformancePoint Monitoring SDK feedback I was looking for, both during the sessions, and especially in follow-on talks. I hope they, and the other breakouts and other sessions you attended were valuable. I will personally guarantee (and in fact you win a Zune 4GB if you prove me wrong) that you now more about the PerformancePoint SDK than 98% of the attendees.

    I'll have the code samples for "KPI Detail Report" and "(Live) Search Data Source Provider" posted soon. I'm tweaking the path dependencies such that they work on any machine where PerformancePoint Monitoring is installed/configured, not just my VPC... with all the killer discussion, demoing, and learning going on, and the usual side conversations with Leif about Windows Media Center... I haven't gotten as far on that as I planned.

    Processing 74% Complete. Please wait...

  • PerformancePoint 2007 SDK at TechEd!

    I'll be facilitating 2 chalk-talks/Q&As in the TLC Interactive Theatre (small audience) at Tech·Ed 2008 Developers about PerformancePoint:

    BIN03-TLC  "Navigating the Microsoft Office PerformancePoint Server 2007 SDK"
    June 3 3:00PM-4:15PM
    Green Theater 2 

    BIN08-TLC  "Microsoft Office PerformancePoint Server 2007: Custom Data Connectors and Report Types"
    June 5 8:30AM-9:45AM
    Green Theater 2 

    The first is going to be very high level. We want to give you a feel for what's possible with the SDK and to give you time to get SDK-specific questions answered & to get your feedback. Please let us know what scenarios we should add/tune up for the next version! If time allows, I'll show you a few samples that might get you thinking, including a KPI detail report, and a search keyword data source, and a KPI syndication solution. I'd mostly like to talk with those of you who are using the SDK, so please plan attend the 2nd session instead/also if you want deeper dive demos.

    The second session will be a "show me the code"-type session, on the KPI detail report & keyword data source, tuned for those who have not already tried the SDK. It's at 8:30AM Eastern... so it'll also be a "show me the coffee"-type session.

    Please stop by!

  • Google charting

    I was toying around with FriendFeed and discovered Google's charting engine. Mmm, pie:

    The engine can render Google Analytics-esque sparklines too. The simplicity and accessibility of this API is impressive... it's all in the URL.

    Now, I'm a bit agitated by this discovery, as years ago at ProClarity Greg & I built very similar to this API for doing sparklines, bullet graphs, and other datawords. I haven't shared it with you yet, and I should have. While it was no complete charting engine, and neither is Google's, our implementation was all of 300 lines of C#... so you could probably build & modify the implementation for your own specific needs pretty easily. Please let me know if you want it, and I'll throw it up on Codeplex.

    The major downside of our & Google's architecture is your data is relayed in the GET URL. It's getting replicated in logs. In Google's case, it's sent naked across the Internet (invalid certificate/no HTTPS), and aggregated in Google's data centers. According to the TOS this service cannot be relied on for uptime or continued compatibility. It will break for FriendFeed someday. Of course, free isn't always free! There's definitely some reasons to figure out how to host your own implementation on LAN & with security if you're using this for sensitive data or critical applications, and I should have shared it long ago.

More Posts Next page »

© 2009 Microsoft Corporation. All rights reserved. Terms of Use  |  Trademarks  |  Privacy Statement
Microsoft
Page view tracker