<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.adatis.co.uk/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Adatis BI Blogs</title><link>http://blogs.adatis.co.uk/blogs/</link><description>Welcome to Adatis blogs</description><dc:language>en-US</dc:language><generator>CommunityServer 2007 SP2 (Build: 20611.960)</generator><item><title>New e-Learning MS Business Intelligence Course</title><link>http://blogs.adatis.co.uk/blogs/timkent/archive/2010/03/11/new-e-learning-ms-business-intelligence-course.aspx</link><pubDate>Thu, 11 Mar 2010 11:12:14 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7571</guid><dc:creator>Tim Kent</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I’m sure a number of you know of UK SQL Server MVP &lt;a href="http://sqlblogcasts.com/blogs/testas/" target="_blank"&gt;Chris Testa-O’Neill&lt;/a&gt; from his many presentations at user groups and conferences.&amp;#160; Chris has just authored a new e-learning course for Microsoft which covers the BI stack.&amp;#160; From Chris:&lt;/p&gt;  &lt;p&gt;&amp;quot;I am pleased to announce the release of the Author Model eCourseCollection 6233 AE: Implementing and Maintaining Business Intelligence in Microsoft® SQL Server® 2008: Integration Services, Reporting Services and Analysis Services&lt;/p&gt;  &lt;p&gt;This 24-hour collection provides you with the skills and knowledge required for implementing and maintaining business intelligence solutions on SQL Server 2008. You will learn about the SQL Server technologies, such as Integration Services, Analysis Services, and Reporting Services&lt;/p&gt;  &lt;p&gt;This collection also helps to prepare for Exam 70-448 and can be accessed from: &lt;a href="http://sqlblogcasts.com/r.ashx?M" target="_blank"&gt;http://www.microsoft.com/learning/elearning/course/6233.mspx&lt;/a&gt; “&lt;/p&gt;  &lt;p&gt;Well worth a look I reckon!&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7571" width="1" height="1"&gt;</description></item><item><title>Allocations in PowerPivot Using DAX</title><link>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2010/02/27/allocations-in-powerpivot-using-dax.aspx</link><pubDate>Sat, 27 Feb 2010 14:56:56 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7569</guid><dc:creator>Jeremy Kashel</dc:creator><slash:comments>0</slash:comments><description>&lt;p align="justify"&gt;Although I didn&amp;#39;t mention it, the inspiration for my &lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2010/02/11/dax-closing-balances.aspx"&gt;last post&lt;/a&gt; was the excellent &lt;a href="http://eu.wiley.com/WileyCDA/WileyTitle/productCd-0471748080.html" target="_blank"&gt;MDX Solutions 2nd Edition&lt;/a&gt;. Whilst flicking through the book a while back, I though it would be interesting to see how DAX and PowerPivot could handle the so called &amp;#39;Common Calculations and Selections in MDX&amp;#39;.&lt;/p&gt;  &lt;p align="justify"&gt;This post continues that theme, focusing on one calculation in particular that&amp;#39;s in the aforementioned MDX book, namely &amp;#39;Unweighted Allocations down the Hierarchy&amp;#39;. Essentially this business problem is dealing with allocating data that is entered at a higher level (e.g. Quarter) down to a lower level (e.g. Day). It varies from business to business what the users actually want to see at the day level in this situation. Some expect to see the Quarter amount, some want to see a blank value and then some users want the amount in the quarters allocated down to the day level.&lt;/p&gt;  &lt;p align="justify"&gt;If the expectation is that data should be allocated, then one way of doing the allocation is to use a ratio. In the MDX book, this is achieved by the following MDX:&lt;/p&gt;  &lt;pre class="code"&gt;1.0 / 
&lt;span style="color:blue;"&gt;Descendants&lt;/span&gt;(
            &lt;span style="color:maroon;"&gt;Ancestor&lt;/span&gt;(
                    [Date].[Calendar].&lt;span style="color:maroon;"&gt;CurrentMember&lt;/span&gt;,
                    [Date].[Calendar].[Calendar Quarter]
                    ),
            [Date].[Calendar].&lt;span style="color:maroon;"&gt;CurrentMember&lt;/span&gt;.&lt;span style="color:blue;"&gt;Level&lt;/span&gt;,
            &lt;span style="color:blue;"&gt;SELF
            &lt;/span&gt;).&lt;span style="color:blue;"&gt;Count&lt;/span&gt;&lt;/pre&gt;

&lt;p align="justify"&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;If we put this into a query and run it against the Calendar hierarchy in AdventureWorksDW we get the following results:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/AllocationsinPowerPivotUsingDAX_10A07/image_8.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="184" alt="image" src="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/AllocationsinPowerPivotUsingDAX_10A07/image_thumb_3.png" width="295" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p align="justify"&gt;Therefore our quarter-entered value can simply be multiplied by this ratio to get the correct value at each level in the Calendar hierarchy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PowerPivot&lt;/strong&gt;&lt;/p&gt;

&lt;p align="justify"&gt;So the challenge is how to be able to do this in PowerPivot. I started off by looking for some data in AdventureWorksDW that would fit the bill. A good candidate seems to be the FactSalesQuota table, which I imported into PowerPivot along with its related dimensions:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/AllocationsinPowerPivotUsingDAX_10A07/image_4.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="267" alt="image" src="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/AllocationsinPowerPivotUsingDAX_10A07/image_thumb_1.png" width="686" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p align="justify"&gt;Once in the pivot table, I wanted to be able to calculate the correct ratio at the daily and monthly levels. For the daily level this is 1 / 90, as there are 90 days in the Q1 that year, and for the month level it is 1/3 as there are 3 months in the quarter.&lt;/p&gt;

&lt;p align="justify"&gt;Given that there&amp;#39;s no MDX style Ancestor() function in DAX, I ended up having to have a different calculation at different levels. Something that I learnt from &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/sqlkjpowerpivotforexcel/thread/99a73152-bbd5-41f3-88c7-054e8988f395" target="_blank"&gt;this forum post&lt;/a&gt; is that you need to use IF() in order to isolate a calculation at a different level. Therefore the DAX that I came up with was:&lt;/p&gt;

&lt;p&gt;=IF( COUNTROWS(VALUES(&amp;#39;DimDate&amp;#39;[FullDateAlternateKey])) = 1, &lt;/p&gt;

&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; 1 / CALCULATE( COUNTROWS(&amp;#39;DimDate&amp;#39;), ALL(&amp;#39;DimDate&amp;#39;[FullDateAlternateKey], &amp;#39;DimDate&amp;#39;[EnglishMonthName]) ), 
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; 1 / CALCULATE( COUNTROWS( DISTINCT( &amp;#39;DimDate&amp;#39;[EnglishMonthName]) ), ALL(&amp;#39;DimDate&amp;#39;[EnglishMonthName]) ) 

  &lt;br /&gt;&amp;#160;&amp;#160; )&lt;/p&gt;

&lt;p&gt;The COUNTROWS(VALUES(&amp;#39;DimDate&amp;#39;[FullDateAlternateKey])) = 1 allows me to check that we&amp;#39;re at the day level, and if we are at the day level, then count the number of days in the quarter. Otherwise, if we&amp;#39;re at the month level we calculate the number of months in the current quarter. When this DAX is put into a new measure we get the following results:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/AllocationsinPowerPivotUsingDAX_10A07/image_6.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="206" alt="image" src="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/AllocationsinPowerPivotUsingDAX_10A07/image_thumb_2.png" width="402" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p align="justify"&gt;This produces the same results as the MDX statement. The next step was then to apply this ratio to the Sales Amount Quota for the current quarter. This was achieved using the following DAX:&lt;/p&gt;

&lt;p&gt;=IF(
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; COUNTROWS( VALUES(&amp;#39;DimDate&amp;#39;[FullDateAlternateKey]) ) &amp;lt; 90,

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CALCULATE( Sum(&amp;#39;FactSalesQuota&amp;#39;[SalesAmountQuota]),&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; All(&amp;#39;DimDate&amp;#39;[FullDateAlternateKey], &amp;#39;DimDate&amp;#39;[EnglishMonthName]) ) * &amp;#39;FactSalesQuota&amp;#39;[Ratio],

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Sum(&amp;#39;FactSalesQuota&amp;#39;[SalesAmountQuota])

  &lt;br /&gt;&amp;#160;&amp;#160; )&lt;/p&gt;

&lt;p align="justify"&gt;The &amp;lt; 90 at the start of the statement allows me to check if we&amp;#39;re at the day level or the month level. If we&amp;#39;re at either of these levels, then we want to pick up the Quarter-level SalesAmountQuota and multiply by the ratio. Otherwise, at the Quarter and Year levels, we just apply the original SalesAmountQuota value. This produces the following results:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/AllocationsinPowerPivotUsingDAX_10A07/image_10.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="203" alt="image" src="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/AllocationsinPowerPivotUsingDAX_10A07/image_thumb_4.png" width="542" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p align="left"&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p align="justify"&gt;The use of the &lt;a href="http://msdn.microsoft.com/en-us/library/ms145989.aspx" target="_blank"&gt;MDX Scope statement&lt;/a&gt; would have been nice to pinpoint exactly where I wanted the calculation to occur, but then again, the use of IF() keeps it quite simple, which is better for an Excel power user. Whilst MDX is very very powerful, can you imagine a business user getting to grips with MDX statements such as Scope or Freeze?&lt;/p&gt;

&lt;p align="justify"&gt;The bottom line is that the DAX calculation produces exactly what I want - the new AllocatedSalesQuota measure is correct at all levels in the Calendar hierarchy. Even with an IF() statement, like everything else in PowerPivot, the calculation performs very quickly.&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7569" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/MDX/default.aspx">MDX</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/Analysis+Services/default.aspx">Analysis Services</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/Excel/default.aspx">Excel</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/PowerPivot/default.aspx">PowerPivot</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/Gemini/default.aspx">Gemini</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/DAX/default.aspx">DAX</category></item><item><title>SQLBits VI comes to London</title><link>http://blogs.adatis.co.uk/blogs/timkent/archive/2010/02/22/sqlbits-vi-comes-to-london.aspx</link><pubDate>Mon, 22 Feb 2010 10:59:55 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7568</guid><dc:creator>Tim Kent</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Just in case you hadn’t already heard from &lt;a href="http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!6240.entry" target="_blank"&gt;Chris&lt;/a&gt; or &lt;a href="http://sqlblogcasts.com/blogs/simons/archive/2010/02/12/SQLBits-VI---Date-and-Location-announced.aspx" target="_blank"&gt;Simon&lt;/a&gt; the next &lt;a href="http://www.sqlbits.com" target="_blank"&gt;SQLBits&lt;/a&gt; has been confirmed for 16th April at &lt;a href="http://www.churchhouseconf.co.uk/" target="_blank"&gt;Church House Conference Centre&lt;/a&gt; in Westminster.&amp;#160; Simon &lt;a href="http://sqlblogcasts.com/blogs/simons/archive/2010/02/13/SQLBits---Why-only-the-Friday-.aspx" target="_blank"&gt;also explains&lt;/a&gt; why the tight timescales and only single day event this time.&lt;/p&gt;  &lt;p&gt;If you need to find a reason to convince your boss why he should give you a day off to attend just look at the &lt;a href="http://www.sqlbits.com/information/event5/PublicSessions.aspx" target="_blank"&gt;session list&lt;/a&gt; from the last SQLBits!&lt;/p&gt;  &lt;p&gt;And if you fancy presenting yourself, session submission is open now.&amp;#160; You&amp;#39;ll need to &lt;a href="http://www.sqlbits.com/login.aspx" target="_blank"&gt;Login/Join&lt;/a&gt; first then complete your &lt;a href="http://www.sqlbits.com/Profile/SpeakerProfile.aspx"&gt;Speaker Profile&lt;/a&gt; before submitting a &lt;a href="http://www.sqlbits.com/Profile/MySessions.aspx"&gt;Session&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;See you on the 16th!&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7568" width="1" height="1"&gt;</description></item><item><title>DAX Closing Balances</title><link>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2010/02/11/dax-closing-balances.aspx</link><pubDate>Thu, 11 Feb 2010 08:03:03 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7565</guid><dc:creator>Jeremy Kashel</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;One of the often required calculations for users in reports is to be able to calculate a point-in-time closing balance, which is especially relevant when dealing with stock levels or financial data.&lt;/p&gt;  &lt;p&gt;In the Analysis Services world, at least in the Enterprise Edition, we&amp;#39;re lucky that we have a variety of &lt;a href="http://msdn.microsoft.com/en-us/library/ms365396.aspx" target="_blank"&gt;Aggregation Functions&lt;/a&gt; that can deal with semi-additive measures such as a closing balance. Or we can always turn to MDX if we need to which will achieve the same thing.&lt;/p&gt;  &lt;p&gt;In PowerPivot, we don&amp;#39;t have Aggregation Functions, but there is DAX, which has a variety of time intelligence functions up its sleeve. The idea behind this post is to see how PowerPivot would deal with the requirement of reporting a closing balance measure.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;DAX Time Intelligence Functions&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;One of the DAX functions that we can use for our closing balance is called &lt;a href="http://msdn.microsoft.com/en-us/library/ee634215(SQL.105).aspx" target="_blank"&gt;ClosingBalanceMonth()&lt;/a&gt;, which will simply evaluate an expression at the end of a given month. There&amp;#39;s also the similar &lt;a href="http://msdn.microsoft.com/en-us/library/ee634876(SQL.105).aspx" target="_blank"&gt;ClosingBalanceQuarter()&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/ee634562(SQL.105).aspx" target="_blank"&gt;ClosingBalanceYear().&lt;/a&gt;&lt;/p&gt;  &lt;p align="left"&gt;Having noticed these functions within PowerPivot, my first port of call was to set up a simple PowerPivot model by taking data from the FactInternetSales table in AdventureWorksDW, plus all it&amp;#39;s related dimensions of course. What I ended up with was the following simple pivot table in Excel 2010:&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/DAXClosingBalances_E850/image_4.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="234" alt="image" src="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/DAXClosingBalances_E850/image_thumb_1.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="left"&gt;Sales Amount obviously isn&amp;#39;t a semi-additive measure, but I&amp;#39;m treating it as one in this example. My first port of call was to use ClosingBalanceMonth() to try and get the value for the month to be equal to the value for last day in the month. I managed to come up with the following formula:&lt;/p&gt;  &lt;p&gt;=CLOSINGBALANCEMONTH(Sum([SalesAmount]), &amp;#39;DimDate&amp;#39;[FullDateAlternateKey], ALL(&amp;#39;DimDate&amp;#39;[FullDateAlternateKey]))&lt;/p&gt;  &lt;p align="left"&gt;This produces the results that are shown below, in the measure called ClosingBalanceFormula:&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/DAXClosingBalances_E850/image_6.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="469" alt="image" src="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/DAXClosingBalances_E850/image_thumb_2.png" width="344" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="left"&gt;It does a good job of calculating a closing balance for each month, but it presents that closing monthly balance on each day. Therefore, I started looking for an alternative approach and found the &lt;a href="http://msdn.microsoft.com/en-us/library/ee634380(SQL.105).aspx" target="_blank"&gt;LastDate()&lt;/a&gt; function. It returns the last date that&amp;#39;s in context for the passed date column. The last date that&amp;#39;s in context at the month level will be the last date in the month, but thankfully the last date that&amp;#39;s in context at the day level will be the current day. Therefore I came up with the following formula:&lt;/p&gt;  &lt;p&gt;=&amp;#39;FactInternetSales&amp;#39;[Sum of SalesAmount](LASTDATE(&amp;#39;DimDate&amp;#39;[FullDateAlternateKey]))&lt;/p&gt;  &lt;p align="left"&gt;This produced the results that I wanted - the daily closing balance at the day level and the monthly closing balance at the month level:&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/DAXClosingBalances_E850/image_8.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="326" alt="image" src="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/DAXClosingBalances_E850/image_thumb_3.png" width="500" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p align="left"&gt;A bit more digging lead me to find out that a combination of the Calculate() and LastDate() functions gets to the same result, as an alternative. That formula is:&lt;/p&gt;  &lt;p&gt;=CALCULATE(Sum(&amp;#39;FactInternetSales&amp;#39;[SalesAmount]), LASTDATE(&amp;#39;DimDate&amp;#39;[FullDateAlternateKey]))&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;It&amp;#39;s a shame that the ClosingBalanceMonth() formula didn&amp;#39;t quite work, but perhaps getting that approach to work will come out in the wash with more DAX experience. However, as with MDX or any kind of expression language, there&amp;#39;s always going to be a load of different ways to get to the same result. It&amp;#39;s much more efficient to work knowing that you&amp;#39;ve got several ways around a particular problem, rather than being forced down a particular path, and in fact, I think the range of calculation functions available shows the richness of the DAX language.&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:ee5c5cde-dce9-4dee-91e0-948dabcbe160" style="padding-right:0px;display:inline;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/PowerPivot" rel="tag"&gt;PowerPivot&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Gemini" rel="tag"&gt;Gemini&lt;/a&gt;,&lt;a href="http://technorati.com/tags/DAX" rel="tag"&gt;DAX&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7565" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/Analysis+Services/default.aspx">Analysis Services</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/Excel/default.aspx">Excel</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/PowerPivot/default.aspx">PowerPivot</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/Gemini/default.aspx">Gemini</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/DAX/default.aspx">DAX</category></item><item><title>PowerPivot and Data Warehousing</title><link>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2010/02/05/powerpivot-and-data-warehousing.aspx</link><pubDate>Fri, 05 Feb 2010 09:57:58 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7562</guid><dc:creator>Jeremy Kashel</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;A consultant that I know has recently been through the process of reviewing his company&amp;#39;s management information requirements, and also the process of evaluating what technology platform can deliver those requirements.&lt;/p&gt;  &lt;p&gt;Naturally, a data warehouse was one of the options. A data warehouse, in my opinion, will provide the enterprise-level platform for any organisation to deliver their management information.&lt;/p&gt;  &lt;p&gt;In this case though, due diligence flagged up some alternative approaches to a data warehouse, namely the raft of self service BI tools that are out there, including &lt;a href="http://www.powerpivot.com/" target="_blank"&gt;PowerPivot&lt;/a&gt;. Other tools that can take data in from a variety of data sources are &lt;a href="http://www.tableausoftware.com/" target="_blank"&gt;Tableau&lt;/a&gt; (which is also a good front end for Analysis Services) and &lt;a href="http://spotfire.tibco.com/" target="_blank"&gt;Spotfire&lt;/a&gt; for example.&lt;/p&gt;  &lt;p&gt;I think that all of these tools have their merits. PowerPivot is incredibly fast and easy to use, whereas Tableau and Spotfire for example have some handy data visualisation capabilities. Some vendors actually claim that self service tools can replace a data warehouse. Can this &lt;em&gt;really&lt;/em&gt; be the case? Whereas these tools do a good job of presenting data in a dimensional model, my personal view is that a data warehouse of course also carries this out, but in addition delivers the following benefits to name a few:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Data Cleansing&lt;/strong&gt; - The power of SQL in the backend and also features like Fuzzy Matching in SSIS mean that you can address the huge problem of data quality. The bonus here is that all data quality issues could be logged, meaning that you can go back to the owners of source systems and let them know that their data is in a mess. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Control &lt;/strong&gt;- If you do encounter data quality issues, you may decide that they are actually too bad to load into the data warehouse and present to your users. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Transparency &lt;/strong&gt;- if you want, you can choose to expose the data quality level of your facts to users, via the Kimball-style audit dimension. E.g. we may have noticed that within our retail data, one store has abnormally low sales. Therefore, we can assign this fact a lower data quality score than the other sales by store for the day, which lets the users know that the data quality steward is aware of the issue, and is looking into it. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Slowly Changing Dimensions&lt;/strong&gt; - A lot of source systems don&amp;#39;t behave. E.g. if we&amp;#39;re tracking a customer&amp;#39;s Marital Status of &amp;#39;single&amp;#39; or &amp;#39;married&amp;#39;, you often find that source systems only record the latest change to a given field. Without addressing slowly changing dimension issues in a data warehouse, we may never know that Customer X is now single, but once was married. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Conformed Dimensions&lt;/strong&gt; - When we have multiple data sources for a single dimension, the goal is to ensure that each dimension available to end users represents a single, consistent view of that dimension. Due to the often complex matching and de-duplication that&amp;#39;s required, it&amp;#39;s difficult to see how this would be possible without a data warehouse.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Late Arriving Dimension Rows&lt;/strong&gt; - Going back to the &amp;#39;Marital Status&amp;#39; attribute, we can get the situation where a source system only updates a particular field a long time after the event actually occurred. E.g, if we think that a customer called John Doe is single, but then today we&amp;#39;re told he&amp;#39;s married, but has actually been married for the last two years. If Marital Status is an important piece of management information to the business, then we need to update all data associated with John Doe over the last two years, in order to reflect his correct Marital Status over the last two years. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Complex Transformations&lt;/strong&gt; - I recently encountered a source system where one of the columns in a SQL table held data in a varying length format of &amp;#8216;#Product Type#Currency#Value, #Product Type#Currency#Value&amp;#8217;. So what you basically have here is potentially say 25 records held in one row in a SQL table, whereas another table might have just 7 records within one row. Rows could also be badly formed! We ended up using a bit of C# within SSIS to split this data out so that the sub-elements could be analysed correctly. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I could go on, but I think as a few simple examples the above will do.&lt;/p&gt;  &lt;p&gt;Whilst I&amp;#39;m an advocate of data warehousing, I also think that the self service tools, such as PowerPivot, can be complementary to a data warehouse. You&amp;#39;ll often find, for example, that there&amp;#39;s some data that&amp;#39;s not in the data warehouse yet - after all some organisations have &lt;em&gt;a lot&lt;/em&gt; of data, and it will take time before all the business analysis etc can be carried out to get this data into the warehouse. Another example is proto-typing, analysts can very quickly build a proto-type model, which can then be production-ised at a later stage. I think &lt;a href="http://www.microsoft.com/belux/MSDN/nl/chopsticks/default.aspx?id=1503" target="_blank"&gt;this video from Chris Webb&lt;/a&gt; is really worth watching - it covers these examples and a few more.&lt;/p&gt;  &lt;p&gt;In summary there&amp;#39;s always going to be a need for users to go digging for data and producing their own reports - the data warehouse can&amp;#39;t always deliver everything immediately. PowerPivot is going to be great in this situation, but it will work best when it&amp;#39;s used alongside cleaned and conformed data, which is exactly what a data warehouse provides.&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:b7fa2a22-96be-4ebb-bbd1-71ef5d97c6ce" style="padding-right:0px;display:inline;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Data%20Warehousing" rel="tag"&gt;Data Warehousing&lt;/a&gt;,&lt;a href="http://technorati.com/tags/PowerPivot" rel="tag"&gt;PowerPivot&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Gemini" rel="tag"&gt;Gemini&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Kimball" rel="tag"&gt;Kimball&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Self%20Service%20BI" rel="tag"&gt;Self Service BI&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7562" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/PowerPivot/default.aspx">PowerPivot</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/Gemini/default.aspx">Gemini</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/Data+Warehousing/default.aspx">Data Warehousing</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/Kimball/default.aspx">Kimball</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/Self+Service+BI/default.aspx">Self Service BI</category></item><item><title>Master Data Services - Reversing Transactions</title><link>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2009/12/15/master-data-services-reversing-transactions.aspx</link><pubDate>Tue, 15 Dec 2009 22:17:41 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7559</guid><dc:creator>Jeremy Kashel</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;MDM tools give the control of the enterprise master data over to the data stewards and power users, rather than relying on automated data integration alone.&lt;/p&gt;  &lt;p&gt;Master Data Services is no exception to the above. One of the ways that this is true for MDS is that it allows users to inspect the transactions that have occurred (either internal to MDS or from a source system) and choose if they want to reverse them.&lt;/p&gt;  &lt;p&gt;In order to achieve this MDS has a useful log of all transactions that&amp;#39;s viewable by users. Here&amp;#39;s an example of some transactions that have occurred in my test system - some are from data that I&amp;#39;ve loaded up via the staging tables, some are from manual member additions that I&amp;#39;ve carried out in the front end, and some are from business rules that have automatically run:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/MasterDataServicesReversingTransactions_DF9A/image_4.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="207" alt="image" src="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/MasterDataServicesReversingTransactions_DF9A/image_thumb_1.png" width="732" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;In the model that this example is taken from, I&amp;#39;ve got some business rules that look to address data quality issues. Taking the Kimball view on data quality issues in a data warehousing context - many can, and should, be addressed in the source system, then re-loaded. That isn&amp;#39;t always possible, which is one of the reasons why we have business rules in MDS. However, as good any sort of automated rule is - there are always exceptions.&lt;/p&gt;  &lt;p&gt;In the transactions shown above, an automatic business rule has run that checks a Customer&amp;#39;s overdraft limit, then sets it to 10,000 if its over 10,000. Therefore, when a value of 50,000 was encountered for Member Code 10311, the MDS business rules kicked in and quite correctly did their job. This was not what I wanted in this particular case.&lt;/p&gt;  &lt;p&gt;Thankfully we can click on the undo button that&amp;#39;s shown above the grid, and reverse a chosen transaction, whether its come from a source system, a business rule or a manual edit. It doesn&amp;#39;t seem possible to reverse many transactions at once, but that may be just due to the CTP. In my example, by selecting the first transaction in the list, then clicking the undo button, I&amp;#39;ve reversed my automatic business rule. Therefore, the user Kaylee Adams (10311) shown below now has her original overdraft limit: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/MasterDataServicesReversingTransactions_DF9A/image_8.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="241" alt="image" src="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/MasterDataServicesReversingTransactions_DF9A/image_thumb_3.png" width="750" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;In conclusion, when some sort of manual intervention is needed to successfully manage master data, MDM tools allow that intervention to come from the power users, rather than having to wait for someone technical to address the issue.&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:ee7c53db-2095-4f6a-b98c-b131eb5b7027" style="padding-right:0px;display:inline;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/MDM" rel="tag"&gt;MDM&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Master%20Data%20Services" rel="tag"&gt;Master Data Services&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Kimball" rel="tag"&gt;Kimball&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Data%20Warehousing" rel="tag"&gt;Data Warehousing&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7559" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/MDM/default.aspx">MDM</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/Master+Data+Services/default.aspx">Master Data Services</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/Data+Warehousing/default.aspx">Data Warehousing</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/Kimball/default.aspx">Kimball</category></item><item><title>Shapefiles for SSRS 2008 R2 Maps</title><link>http://blogs.adatis.co.uk/blogs/timkent/archive/2009/12/09/free-shapefiles-for-ssrs-2008-r2-maps.aspx</link><pubDate>Wed, 09 Dec 2009 15:22:51 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7557</guid><dc:creator>Tim Kent</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Great free resource for pretty much every shapefile map you’ll need :)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cdc.gov/epiinfo/shape.htm" target="_blank"&gt;Shapefiles for Epi Info&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Plug them into your SSRS Map and off you go.&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7557" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/timkent/archive/tags/Reporting+Services/default.aspx">Reporting Services</category><category domain="http://blogs.adatis.co.uk/blogs/timkent/archive/tags/SQL+2008+R2/default.aspx">SQL 2008 R2</category><category domain="http://blogs.adatis.co.uk/blogs/timkent/archive/tags/Mapping/default.aspx">Mapping</category></item><item><title>SSRS 2008 – Icon Charts</title><link>http://blogs.adatis.co.uk/blogs/timkent/archive/2009/11/24/ssrs-2008-icon-charts.aspx</link><pubDate>Tue, 24 Nov 2009 19:29:41 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7553</guid><dc:creator>Tim Kent</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;In my &lt;a href="http://blogs.adatis.co.uk/blogs/timkent/archive/2009/11/05/performancepoint-services-2010-first-impressions.aspx" target="_blank"&gt;last post&lt;/a&gt; I had a bit of a moan about the lack of new data visualisation features in PerformancePoint Services but to be fair MSFT have really turned up the dial on the data visualisation functionality with the release of Excel 2007 and SSRS 2008.&amp;#160; SQL 2008 R2 sees further advances with features such as Sparklines, Data Bars and indicators being far easier to create in SSRS.&amp;#160; There’s still a few things missing from the stack though when compared against some of the pureplay visualisation vendors such as &lt;a href="http://www.tableausoftware.com/" target="_blank"&gt;Tableau&lt;/a&gt; and &lt;a href="http://spotfire.tibco.com/" target="_blank"&gt;Spotfire&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Icon Charts (I’m not actually sure that’s their real name!) are another form of Tufte’s “small multiple” that combines the concepts of &lt;a href="http://blogs.adatis.co.uk/blogs/timkent/archive/2009/10/14/ssrs-2008-lattice-charts.aspx" target="_blank"&gt;lattice/trellis charts&lt;/a&gt; and heatmaps.&amp;#160; This type of visualisation utilises the user’s perception of colour (hue) and form (size) to allow analysis of multiple categories with multiple quantitative measures.&lt;/p&gt;  &lt;p&gt;I was hoping that it might be possible to do something with the new indicators in R2 and though you can use custom images there’s no simple way to hook them up to the data in terms of size and colour.&lt;/p&gt;  &lt;p&gt;In this solution (workaround/hack?) I’m using the matrix object again but rather than using an inline chart I’m simply using a square symbol (letter &lt;em&gt;n&lt;/em&gt;) from the wingdings font and then setting the colour (with a &lt;a href="http://www.perceptualedge.com/articles/visual_business_intelligence/rules_for_using_color.pdf" target="_blank"&gt;sequential palette&lt;/a&gt;) and size according to the data.&amp;#160; My example uses hard-coded values in a switch statement in the expression but you could be cleverer than this and make the values percentages of the maximum in your dataset for example.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/timkent/image_64048848.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="185" alt="image" src="http://blogs.adatis.co.uk/blogs/timkent/image_thumb_31A0B4C9.png" width="377" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Add a couple of legends so that the viewer can clearly see what they are looking at.&amp;#160; It’s easy to pick out that SouthWest in Q3 had good revenue but low profit.&amp;#160; Is there a Problem? Add a drillthrough to detail report to allow the user to find out. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/timkent/image_23623BD9.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="676" alt="image" src="http://blogs.adatis.co.uk/blogs/timkent/image_thumb_507728A7.png" width="344" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As always the sample report can be &lt;a href="http://blogs.adatis.co.uk/files/folders/sample_report_projects/entry7552.aspx"&gt;downloaded from here&lt;/a&gt;.&amp;#160; Alternatively, e-mail devteam(at)adatis(dot)co(dot)uk for a copy.&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7553" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/timkent/archive/tags/Reporting+Services/default.aspx">Reporting Services</category><category domain="http://blogs.adatis.co.uk/blogs/timkent/archive/tags/visualisation/default.aspx">visualisation</category></item><item><title>PowerPivot CTP3 Released</title><link>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2009/11/18/powerpivot-ctp3-released.aspx</link><pubDate>Wed, 18 Nov 2009 22:08:56 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7551</guid><dc:creator>Jeremy Kashel</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Following last week&amp;#39;s release of the November CTP for SQL Server 2008 R2, the latest CTP for PowerPivot is now also released!&lt;/p&gt;  &lt;p&gt;The links for the downloads are:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=168583&amp;amp;clcid=0x409" target="_blank"&gt;32 Bit PowerPivot Download&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=168584&amp;amp;clcid=0x409" target="_blank"&gt;64 Bit PowerPivot Download&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=48a5b47b-8c9c-450f-ab6e-178600a733ca&amp;amp;displaylang=en" target="_blank"&gt;PowerPivot Main Download Page&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Included in the new CTP3 features are several new DAX functions, especially quite a few around time intelligence. Some look quite comparable to MDX, whereas others possibly give even more functionality than MDX. This is something I hope to blog about soon.....&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c6c42134-6233-4ffa-90b7-638dc74a5006" style="padding-right:0px;display:inline;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/PowerPivot" rel="tag"&gt;PowerPivot&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Gemini" rel="tag"&gt;Gemini&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Excel" rel="tag"&gt;Excel&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7551" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/Excel/default.aspx">Excel</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/PowerPivot/default.aspx">PowerPivot</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/Gemini/default.aspx">Gemini</category></item><item><title>Stop Reporting Services (SSRS) 2008 from overwriting custom Parameter Datasets</title><link>http://blogs.adatis.co.uk/blogs/sachatomey/archive/2009/11/16/stop-reporting-services-ssrs-2008-from-overwriting-custom-parameter-datasets.aspx</link><pubDate>Mon, 16 Nov 2009 21:29:59 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7550</guid><dc:creator>sachatomey</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Frustrating little quirk when building reports in SSRS 2008 using Visual Studio 2008.&amp;#160; If you write a custom query against a parameter dataset, and then change a query that references the parameter, the custom query used by the parameter is overwritten and reset to the default.&lt;/p&gt;  &lt;p&gt;Now, you could keep a copy somewhere and replace it after every update, or, alternatively, use the &lt;strong&gt;&amp;lt;rd:SuppressAutoUpdate&amp;gt; &lt;/strong&gt;tag by editing the rdl file directly.&lt;/p&gt;  &lt;p&gt;&amp;lt;Query&amp;gt;   &lt;br /&gt;...    &lt;br /&gt;&amp;lt;rd:SuppressAutoUpdate&amp;gt;true&amp;lt;/rd:SuppressAutoUpdate&amp;gt;    &lt;br /&gt;&amp;lt;/Query&amp;gt;&lt;/p&gt;  &lt;p&gt;I was close to raising this as a bug, when I found someone had beaten me to it:   &lt;br /&gt;&lt;a title="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=417209" href="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=417209"&gt;https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=417209&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7550" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/SQL+Server+2008/default.aspx">SQL Server 2008</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/SSRS+2008/default.aspx">SSRS 2008</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/RDL/default.aspx">RDL</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/Reporting+Services+2008/default.aspx">Reporting Services 2008</category></item><item><title>Master Data Services - Business Rules</title><link>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2009/11/15/master-data-services-business-rules.aspx</link><pubDate>Sun, 15 Nov 2009 20:28:13 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7549</guid><dc:creator>Jeremy Kashel</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I&amp;#39;ve been keeping an eye on the SQL Server 2008 R2 CTPs over the past few months, but have been compelled to start blogging again following the release of Master Data Services (MDS) in the November CTP.&lt;/p&gt;  &lt;p&gt;The idea of a Microsoft MDM tool first caught my attention with the acquisition of &lt;a href="http://www.stratature.com/" target="_blank"&gt;Stratature&lt;/a&gt;, and since then I&amp;#39;ve seen a few talks on the subject, such as &lt;a href="http://sqlblog.com/blogs/knightreign/" target="_blank"&gt;Kirk Haselden&amp;#39;s&lt;/a&gt; talk on the subject back at the BI Conference last year.&lt;/p&gt;  &lt;p&gt;Now that I&amp;#39;ve got my hands on it, I&amp;#39;ve decided to cover the set up of business rules in MDS. Business rules are key to an MDM solution. If we want to use MDM to load data from disparate source systems, we will definitely have to carry out a lot of cleansing and confirming in order to ensure that the end users only consume clean and accurate data.&lt;/p&gt;  &lt;p&gt;To set the scene a bit, I&amp;#39;ve created several entities in my MDM model, namely Customer, Country and City. These could form a Customer Geography hierarchy for example, but for the moment I&amp;#39;m going to focus on Customer. The following shows the Customers that I&amp;#39;ve entered manually:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/MasterDataServicesBusinessRules_1107A/image_4.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="185" alt="image" src="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/MasterDataServicesBusinessRules_1107A/image_thumb_1.png" width="740" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;When I add a Customer (via the button that is circled) or when I edit a customer, the third column of the grid for the relevant member will change from a tick to a question mark, indicating that data validation has not taken place.&lt;/p&gt;  &lt;p&gt;For this example, what I want to happen is for the Overdraft Limit attribute to validate that it is within normal boundaries that have been set by the business, e.g. a bank. To do this, I&amp;#39;m going to set up a simple business rule.&lt;/p&gt;  &lt;p&gt;Selecting Manage-&amp;gt;Business Rules will take you to the Business Rules Maintenance screen, where the &amp;#39;plus&amp;#39; icon will create you a new business rule. Editing the new blank rule will give a screen with a basic IF....THEN GUI to produce a basic business rule. On the IF part you pick conditions such as greater than, less than etc, alongside an all important dimension attribute. You do this by dragging and dropping conditions, in the screen below:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/MasterDataServicesBusinessRules_1107A/image_6.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="198" alt="image" src="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/MasterDataServicesBusinessRules_1107A/image_thumb_2.png" width="563" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;In my case I&amp;#39;ve picked that the overdraft limit can&amp;#39;t be greater than &amp;#163;10,000, and if it is greater, then set it back to &amp;#163;10,000. This will do for now, but I could have prevented validation from succeeding, or caused MDM workflow to start. Clicking the MDS back button will take us back to the business rules maintenance screen, where the rule is not active until we publish it:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/MasterDataServicesBusinessRules_1107A/image_8.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="75" alt="image" src="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/MasterDataServicesBusinessRules_1107A/image_thumb_3.png" width="730" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Once we do publish the rule, it will kick in whenever validation runs or when you manually run the business rules. In my grid of Customers above, I have an overdraft which is a mistake. When I validate the Customer entity, the 5555555 for the second customer automatically reverts to &amp;#163;10,000, as shown below:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/MasterDataServicesBusinessRules_1107A/image_12.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="183" alt="image" src="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/MasterDataServicesBusinessRules_1107A/image_thumb_5.png" width="731" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This is quite a simple example of course, and via manual editing. The real power of these business rules will come when loading masses of data from source systems, with the added power of workflow to prompt business users to deal with the validation issues that may occur. I&amp;#39;ll aim to post about integrating from other systems via my next post in due course....&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:3946bf8a-54e6-409d-bf6b-34991c682e63" style="padding-right:0px;display:inline;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/MDM" rel="tag"&gt;MDM&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MDS" rel="tag"&gt;MDS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Master%20Data%20Services" rel="tag"&gt;Master Data Services&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SQL%20Server" rel="tag"&gt;SQL Server&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7549" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/MDM/default.aspx">MDM</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/Master+Data+Services/default.aspx">Master Data Services</category></item><item><title>PerformancePoint Services 2010 – First impressions</title><link>http://blogs.adatis.co.uk/blogs/timkent/archive/2009/11/05/performancepoint-services-2010-first-impressions.aspx</link><pubDate>Thu, 05 Nov 2009 18:01:07 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7545</guid><dc:creator>Tim Kent</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;We’ve been lucky enough (or we rather hassled enough people in MSFT for long enough!) to have been participating in the Office 2010 technical preview for the last couple of months but as it’s all been under NDA haven’t been able to blog about it.&amp;#160; This also means that we’ve had a chance to look round SharePoint 2010 and, in particular for me, PerformancePoint Services.&amp;#160; Nick Barclay has just done a &lt;a href="http://nickbarclay.blogspot.com/search/label/PerformancePoint" target="_blank"&gt;series of posts&lt;/a&gt; about what’s new/improved/different in the new version so go there for the full list.&amp;#160; Here’s a quick round up of our first impressions:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;What looks good so far:&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;SharePoint integration – Whilst Dashboard designer is still pretty much the same product for doing your, errr, dashboard design it’s no longer the admin and security tool as well.&amp;#160; This is all carried in SharePoint and in fact you have to set up a specific PPS site to do this.&amp;#160; A great deal of effort has obviously gone into this and which looks to have paid off. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/timkent/image_1362A036.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="384" alt="image" src="http://blogs.adatis.co.uk/blogs/timkent/image_thumb_73479378.png" width="924" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Security is all through SharePoint – no need to set up permissions twice! &lt;/li&gt;    &lt;li&gt;AS Conditional formatting now works. &lt;/li&gt;    &lt;li&gt;Decomp tree is back!! &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/timkent/image_253F3403.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="477" alt="image" src="http://blogs.adatis.co.uk/blogs/timkent/image_thumb_532C86BB.png" width="544" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Measures can now be formatted independently. &lt;/li&gt;    &lt;li&gt;Workspace browser is now much more intelligently organised. &lt;/li&gt;    &lt;li&gt;Filter by value – you can now restrict rows\columns by value &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/timkent/image_6C285700.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="238" alt="image" src="http://blogs.adatis.co.uk/blogs/timkent/image_thumb_1A15A9B9.png" width="491" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Dynamic dimension measures on scorecards- this was a bit of a workaround in 2007 as I’ve &lt;a href="http://blogs.adatis.co.uk/blogs/timkent/archive/2009/03/05/dynamic-dimension-members-on-a-performancepoint-kpi.aspx" target="_blank"&gt;posted about previously&lt;/a&gt;. This now works properly &lt;/li&gt;    &lt;li&gt;Re-usable filters – Filters can now be shared and re-used across dashboards &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Disappointments:&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Lack of improvements for data visualisation – Very disappointing - other than the decomp tree, the visualisation side of PPS has changed little.&amp;#160; Still no real control over how your graphs look. The only other new item to be introduced is the &lt;a href="http://www.perceptualedge.com/articles/08-21-07.pdf" target="_blank"&gt;Pie Chart!!!!&lt;/a&gt; oh dear.&amp;#160; Still no bar charts (and I mean Bars not Columns), no chart formatting options or (controllable) second y axis options that I can see :( &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/timkent/image_05242746.png"&gt;&lt;img title="oh look it&amp;#39;s 3d!! " style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="431" alt="oh look it&amp;#39;s 3d!! " src="http://blogs.adatis.co.uk/blogs/timkent/image_thumb_60FECCB6.png" width="448" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Decomp tree is not a chart type but a right click option from a deployed report.&amp;#160; i Like the option to do this from any point in a report but would be nice to have both options. &lt;/li&gt;    &lt;li&gt;It’s still called PerformancePoint! – I have to admit I when I read &lt;a href="http://nickbarclay.blogspot.com/2009/06/if-you-build-it-just-dont-call-it.html" target="_blank"&gt;another blog of Nick’s&lt;/a&gt; following the demise of Planning I didn’t entirely agree with him that it should be renamed.&amp;#160; Having spent the last ten months trying to explain to various IT departments that PerformancePoint is not the devil and that the Monitoring side has not been affected (usually to no avail) has changed my opinion completely.&amp;#160; &lt;/li&gt;    &lt;li&gt;As per &lt;a href="http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!5100.entry" target="_blank"&gt;Chris’s blog&lt;/a&gt; – ProClarity just seems to have disappeared – I know that was never what Monitoring was supposed to be but the lack of an ad-hoc cube browser is a huge oversight. &lt;/li&gt;    &lt;li&gt;Did I mention the lack of data visualisation improvements???? &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;There’s lots more to discuss and there will be more to come over the next few weeks time allowing.&amp;#160; SharePoint 2010 looks pretty impressive…&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7545" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/timkent/archive/tags/PerformancePoint/default.aspx">PerformancePoint</category><category domain="http://blogs.adatis.co.uk/blogs/timkent/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://blogs.adatis.co.uk/blogs/timkent/archive/tags/PerformancePoint+Services/default.aspx">PerformancePoint Services</category><category domain="http://blogs.adatis.co.uk/blogs/timkent/archive/tags/Office+2010/default.aspx">Office 2010</category></item><item><title>Creating a Custom Gemini/PowerPivot Data Feed – Method 1 – ADO.NET Data Services</title><link>http://blogs.adatis.co.uk/blogs/sachatomey/archive/2009/10/20/creating-a-custom-gemini-powerpivot-data-feed-method-1-ado-net-data-services.aspx</link><pubDate>Tue, 20 Oct 2009 15:43:31 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7543</guid><dc:creator>sachatomey</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;There are already a few good Gemini/PowerPivot blogs that provide an introduction into what it is and does so there is no need for repetition.&amp;#160; What I haven’t seen are examples of how existing investments can be harnessed for Gemini/PowerPivot based self-service analytics.&lt;/p&gt;  &lt;p&gt;This series of posts focuses on various ways of creating Custom Data Feeds that can be used by Gemini/PowerPivot natively – Providing a direct feed from otherwise closed systems opens up new channels of analytics to the end user.&lt;/p&gt;  &lt;p&gt;Gemini/PowerPivot supports reading data from Atom-based data feeds, this post looks at a quick way of creating an Atom-based feed that can be consumed by Gemini/PowerPivot.&amp;#160; By far the simplest way to develop an Atom-based data feed is to employ &lt;a href="http://msdn.microsoft.com/en-us/data/bb931106.aspx" target="_blank"&gt;ADO.NET Data Services&lt;/a&gt; in conjunction with &lt;a href="http://msdn.microsoft.com/en-us/library/bb399572.aspx" target="_blank"&gt;ADO.NET Entity Framework&lt;/a&gt;.&amp;#160; With very few (in fact one and a bit!) lines of code, a data source can be exposed as a feed that Gemini/PowerPivot can read natively.&amp;#160; &lt;/p&gt;  &lt;p&gt;I am going to use the AdventureWorksDW sample hosted by a SQL Server 2008 R2 instance for this – obviously Gemini/PowerPivot natively reads SQL Server databases, so creating a custom feed over the top may seems a little pointless.&amp;#160; However, this technique may be useful for quick wins in several scenarios, including:&lt;/p&gt;  &lt;p&gt;- Preventing the need for users to connect directly to the underlying data source.    &lt;br /&gt;- Restricting access to various elements of the data source (tables/columns etc)     &lt;br /&gt;- Applying simple business logic to raw data.&lt;/p&gt;  &lt;p&gt;ADO.NET Data Services are a form of Windows Communication Foundation (WCF) services, and therefore can be hosted in various environments.&amp;#160; Here, I will simply host the ADO.NET Data Service inside an ASP.NET site.&lt;/p&gt;  &lt;p&gt;To create a Native Gemini/PowerPivot feed, you take seven steps:&lt;/p&gt;  &lt;p&gt;1 - Create ASP.NET Web Application    &lt;br /&gt;2 - Create Entity Data Model     &lt;br /&gt;3 - Create the Schema     &lt;br /&gt;4 - Create the Data Service     &lt;br /&gt;5 - Load From Data Feed     &lt;br /&gt;6 - Create Relationships     &lt;br /&gt;7 - Test&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step 1) Create ASP.NET Web Application&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I’m using Visual Studio 2008 here to create an &lt;strong&gt;ASP.NET Web Application&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/image_0ACF3FCE.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/image_thumb_319D560E.png" width="504" height="359" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step 2) Create Entity Data Model&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Add an &lt;strong&gt;ADO.NET Entity Data Model&lt;/strong&gt; item to the project, these files have a .edmx extension and allow us to create a schema that maps to the underlying database objects.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/image_4A992653.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/image_thumb_2A7E1996.png" width="504" height="304" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step 3) Create the Schema&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;We simply require a 1:1 mapping so will ‘&lt;strong&gt;Generate from Database&lt;/strong&gt;’.&amp;#160; Incidentally, the ‘Empty Model’ option allows you to build a conceptual model of the database resulting in custom classes that can be optionally mapped to the database objects later. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/image_71673C93.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/image_thumb_0A630CD9.png" width="504" height="448" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Create a &lt;strong&gt;Microsoft SQL Server&lt;/strong&gt; connection to AdventureWorksDW2008.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/image_235EDD1E.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/image_thumb_6A48001B.png" width="504" height="448" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Select the appropriate database objects, I’ve selected the following tables:&lt;/p&gt;  &lt;p&gt;- DimCurrency    &lt;br /&gt;- DimCustomer     &lt;br /&gt;- DimDate     &lt;br /&gt;- DimProduct     &lt;br /&gt;- DimPromotion     &lt;br /&gt;- DimSalesTerritory     &lt;br /&gt;- FactInternetSales&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/image_353B70EB.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/image_thumb_1116165C.png" width="504" height="448" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Once the wizard has completed, a new .edmx and associated cs file is created that respectively contain an Entity Relationship Diagram and a set of Auto Generated Classes that represent the database objects.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Due to the way the Entity Framework handles Foreign Key Constraints we have to apply a workaround to ensure the Foreign Keys on the FactInternetSales table are exposed and brought into Gemini/PowerPivot.&amp;#160; A previous post &lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/archive/2009/10/16/hack-exposing-foreign-keys-as-properties-through-the-ado-net-entity-framework.aspx" target="_blank"&gt;Exposing Foreign Keys as Properties through ADO.NET Entity Framework&lt;/a&gt; walks through the workaround.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/image31_67E515EB.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;margin-left:0px;border-top:0px;margin-right:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/image31_thumb_156635AF.png" width="504" height="454" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/image21_3C344BEF.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;margin-left:0px;border-top:0px;margin-right:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/image21_thumb_2742C97C.png" width="238" height="43" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step 4) Create the Data Service&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Add an &lt;strong&gt;ADO.NET Data Service&lt;/strong&gt; item to the project.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/image_1BD36DB1.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/image_thumb_62BC90AE.png" width="504" height="304" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The service class inherits from a generic version of the System.Data.Services.DataService object, so we need to inform the compiler what class to base the generic object on.&amp;#160; We essentially want to base our Data Service on the class representing our newly created Entity Data Model.&amp;#160; The class name is derived from the database name, unless changed when the Entity Data Model was created, so in our case the class name is AdventureWorksDW2008Entities.&lt;/p&gt;  &lt;p&gt;The auto generated service class contains a ‘TODO’ comment that asks you to ‘put your data source class name here’.&amp;#160; The comment needs replacing with AdventureWorksDW2008Entities.&lt;/p&gt;  &lt;p&gt;The final step is to expose the resources in the Entity Data Model.&amp;#160; For security reasons, a data service does not expose any resources by default.&amp;#160; Resources need to be explicitly enabled.&lt;/p&gt;  &lt;p&gt;To allow read only access to the resources in the Entity Data Model the InitializeService method needs updating with a single line of code.&amp;#160; The code snippet below details the final class implementation, notice the AdventureWorksDW2008Entities reference at line 1 and the the explicit resource enablement at line 6. &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:0faa6294-0c75-484d-b329-40b8a7e39245" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Code Snippet&lt;/div&gt; &lt;div style="background:#ddd;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2em;padding:0 0 0 5px;"&gt; &lt;li&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;GeminiDataService&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;DataService&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;AdventureWorksDW2008Entities&lt;/span&gt;&amp;gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#008000;"&gt;// This method is called only once to initialize service-wide policies.&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; InitializeService(&lt;span style="color:#2b91af;"&gt;IDataServiceConfiguration&lt;/span&gt; config)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;config.SetEntitySetAccessRule(&lt;span style="color:#a31515;"&gt;&amp;quot;*&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;EntitySetRights&lt;/span&gt;.AllRead);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;That’s all that’s needed, by default, ADO.NET Data Services conform to the Atom standard, so in theory the Service is ready to be consumed by Gemini/PowerPivot.&lt;/p&gt;  &lt;p&gt;Before we try, it’s worth giving the service a quick test, building and running the solution (F5) launches Internet Explorer navigating to the Service hosted by the ASP.NET Development Server.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/image_7BB860F3.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/image_thumb_14B43139.png" width="504" height="377" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;You are first presented with an XML document containing elements that represent database objects, you can further drill into the objects by amending the URL.&amp;#160; For example, if you want to see the contents of the DimPromotion table then append DimPromotion to the end of the URL: &lt;strong&gt;http://localhost:56867/GeminiDataService.svc/DimPromotion&lt;/strong&gt; (Case sensitive)&lt;/p&gt;  &lt;p&gt;Note:&amp;#160; You may need to turn off Feed Reader View in Internet Explorer to see the raw XML (Tools-&amp;gt;Internet Options–&amp;gt;Content-&amp;gt;Settings–&amp;gt;Turn On Feed Reader View – make sure this is unchecked)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/image_708ED6A9.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/image_thumb_5073C9EC.png" width="504" height="450" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;As a slight aside, the URL can be further enhanced to, filter, top n rows, extract certain properties etc etc. Here are a couple of examples:&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2"&gt;     &lt;tr&gt;       &lt;td&gt;&lt;strong&gt;URL&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;&lt;strong&gt;Effect&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;http://localhost:56867/GeminiDataService.svc/DimCustomer?$top=5&lt;/td&gt;        &lt;td&gt;Return the top 5 Customers&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;http://localhost:56867/GeminiDataService.svc/DimCustomer(11002)&lt;/td&gt;        &lt;td&gt;Return Customer with id 11002&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;http://localhost:56867/GeminiDataService.svc/DimCustomer(11002)/FirstName&lt;/td&gt;        &lt;td&gt;Return the First Name of Customer 11002&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;http://localhost:56867/GeminiDataService.svc/DimProduct(310)?$exapnd=FactInternetSales&lt;/td&gt;        &lt;td&gt;Returns Product with id 310 and all related Internet Sales Records&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;Confident that the feed is working, we can now deploy the service, and start using the feed in Gemini/PowerPivot.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step 5) Load From Data Feed&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Open up Excel 2010, launch the Gemini/PowerPivot Client (by selecting ‘Load &amp;amp; Prepare Data’)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/image_3058BD2F.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/image_thumb_49548D74.png" width="332" height="151" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Select ‘From Data Feed’ from the ‘Get External Data’ section of the Gemini/PowerPivot Home Ribbon to launch the Table Import Wizard.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/image_34630B01.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/image_thumb_103DB072.png" width="504" height="500" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Specify the Url from the ADO.NET Data Services feed created earlier, in my case: &lt;a href="http://localhost:56867/GeminiDataService.svc"&gt;http://localhost:56867/GeminiDataService.svc&lt;/a&gt; as the &amp;#39;Data Feed Url’ and click Next.&lt;/p&gt;  &lt;p&gt;Incidentally, you can use the majority of the enhanced Urls to, for example only select the DimProduct table should you so wish, however by specifying the root Url for the service you have access to all objects exposed by the service.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/image_1447FE44.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/image_thumb_5B312141.png" width="504" height="500" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;From the Table Import Wizard Select the required tables, in my case I’ll select them all.&amp;#160; (You can optionally rename and filter the feed objects here too).&lt;/p&gt;  &lt;p&gt;Following the summary screen, the Gemini/PowerPivot Client then gets to work importing the data from the ADO.NET Data Service:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/image_742CF186.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/image_thumb_6903673C.png" width="504" height="500" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Once completed, Gemini/PowerPivot displays all the data from all of the feed objects as if it came directly from the underlying database.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/image_2FEC8A3A.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/image_thumb_61E42AC4.png" width="504" height="479" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step 6) Create Relationships&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;There is one final step before we can test our model using an Excel Pivot Table.&amp;#160; We need to create the relationships between the tables we have imported.&amp;#160; The Gemini/PowerPivot Client provides a simple, if a little onerous way of creating relationships, the ‘Create Relationship’ action on the Relationships section of the Home Ribbon launches the Create Relationship wizard:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/image_41C91E07.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/image_thumb_5AC4EE4C.png" width="504" height="192" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Each table needs relating back to the primary Fact table which results in the following relationships:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/image_73C0BE91.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/image_thumb_21AE114A.png" width="504" height="329" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step 7) Test&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;We are now ready to start our analysis, selecting PivotTable from the View section of the Gemini/PowerPivot Client Home ribbon creates a pivot table in the underlying Excel workbook attached to your custom fed Gemini/PowerPivot data model.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/image_53A5B1D4.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;margin-left:0px;border-left-width:0px;margin-right:0px;" title="image" border="0" alt="image" align="left" src="http://blogs.adatis.co.uk/blogs/sachatomey/image_thumb_0193048D.png" width="154" height="91" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/image_2F805745.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/image_thumb_487C278A.png" width="944" height="205" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;So, to allow fast access to, for example, potentially sensitive data, through Gemini/PowerPivot you can quickly build a custom data feed that can be consumed natively by the Gemini/PowerPivot Client data feed functionality.&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7543" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/Business+Intelligence/default.aspx">Business Intelligence</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/Excel/default.aspx">Excel</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/.Net+3.5/default.aspx">.Net 3.5</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/SQL+Server+2008/default.aspx">SQL Server 2008</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/Entity+Framework/default.aspx">Entity Framework</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/Gemini/default.aspx">Gemini</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/ADO.NET/default.aspx">ADO.NET</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/Data+Service/default.aspx">Data Service</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/PowerPivot/default.aspx">PowerPivot</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/Atom/default.aspx">Atom</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/Feed/default.aspx">Feed</category></item><item><title>HACK: Exposing Foreign Keys as Properties through the ADO.NET Entity Framework</title><link>http://blogs.adatis.co.uk/blogs/sachatomey/archive/2009/10/16/hack-exposing-foreign-keys-as-properties-through-the-ado-net-entity-framework.aspx</link><pubDate>Fri, 16 Oct 2009 15:39:20 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7541</guid><dc:creator>sachatomey</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;First post for months; the &lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/archive/2009/01/29/rip-performancepoint-planning.aspx" target="_blank"&gt;PerformancePoint Planning&lt;/a&gt; announcement forced some redirection and rebuilding.&amp;#160; We’ve grieved, we’ve moaned, but at some point, you just have to move on.&lt;/p&gt;  &lt;p&gt;-----------------&lt;/p&gt;  &lt;p&gt;I’m not a fan of hacks – it normally means you are doing something wrong, but in this case, where I’m after a quick win, I’ve had to work out and resort to a bit of a hack.&amp;#160; It actually looks like the issue I’m facing maybe addressed in Entity Framework v2 (Microsoft .NET 4.0) – so maybe it’s more of a workaround than a hack after all ;o)&lt;/p&gt;  &lt;p&gt;I’m using the ADO.NET Entity Framework and ADO.NET Data Services to expose a subsection of a database for consumption by Gemini.&amp;#160; In order to relate the exposed database objects together in Gemini, I need to apply this hack to ensure I have Foreign Keys available in my Gemini models to support creating the relationships.&amp;#160; By default, the Entity Framework exposes Foreign Keys as Navigation Properties rather than Scalar Properties.&amp;#160; Gemini does not consume Navigation Properties.&lt;/p&gt;  &lt;p&gt;Lets take the scenario where I want to create an Entity Framework Model based on the following tables from the AdventureWorksDW2008 sample database:&lt;/p&gt;  &lt;p&gt;-FactInternetSales    &lt;br /&gt;-DimCustomer     &lt;br /&gt;-DimProduct     &lt;br /&gt;-DimSalesTerritory&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step 1)&amp;#160; Identify the table(s) that contain Foreign Keys.&lt;/strong&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;In this case FactInternetSales.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step 2)&amp;#160; Load those table(s) into the Entity Framework Model on their own.&lt;/strong&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;This ensures the Foreign Keys are set as Scalar Properties.&amp;#160; If you load in all the tables at once, the Foreign Keys are not exposed as Scalar Properties.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step 3)&amp;#160; Load in the related tables. (DimCustomer, DimProduct, DimSalesTerritory)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;At this point a bunch of Navigation Properties would have been set up, along with relationships between the related tables but the trouble now is the project will no longer build.&amp;#160; If you try you receive the following error for each relationship:&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;Error 3007: Problem in Mapping Fragments starting at lines 322, 428: Non-Primary-Key column(s) [CustomerKey] are being mapped in both fragments to different conceptual side properties - data inconsistency is possible because the corresponding conceptual side properties can be independently modified.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step 4) Manually remove the relationships between tables.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Clicking on the relationship line on the diagram and hitting delete, removes the relationship.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step 5) Remove all Association Sets&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;By editing the edmx file manually in a text or XML editor you need to remove all &amp;lt;AssociationSet&amp;gt;…&amp;lt;/AssociationSet&amp;gt; occurrences from the &amp;lt;EntityContainer&amp;gt; section: &lt;/p&gt;  &lt;p&gt;&lt;font size="1"&gt;&amp;lt;EntityContainer Name=&amp;quot;AdventureWorksDW2008Model1StoreContainer&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;EntitySet Name=&amp;quot;DimCustomer&amp;quot; EntityType=&amp;quot;AdventureWorksDW2008Model1.Store.DimCustomer&amp;quot; … /&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;EntitySet Name=&amp;quot;DimProduct&amp;quot; EntityType=&amp;quot;AdventureWorksDW2008Model1.Store.DimProduct&amp;quot; … /&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;EntitySet Name=&amp;quot;DimSalesTerritory&amp;quot; EntityType=&amp;quot;AdventureWorksDW2008Model1.Store.DimSalesTerritory&amp;quot; … /&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;EntitySet Name=&amp;quot;FactInternetSales&amp;quot; EntityType=&amp;quot;AdventureWorksDW2008Model1.Store.FactInternetSales&amp;quot; … /&amp;gt;       &lt;br /&gt;&lt;font color="#ff0000"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;AssociationSet Name=&amp;quot;FK_FactInternetSales_DimCustomer&amp;quot; Association=&amp;quot;AWDW08.FK_FactInternetSales_DimCustomer&amp;quot;&amp;gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;End Role=&amp;quot;DimCustomer&amp;quot; EntitySet=&amp;quot;DimCustomer&amp;quot; /&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;End Role=&amp;quot;FactInternetSales&amp;quot; EntitySet=&amp;quot;FactInternetSales&amp;quot; /&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/AssociationSet&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;AssociationSet Name=&amp;quot;FK_FactInternetSales_DimProduct&amp;quot; Association=&amp;quot;AWDW08.FK_FactInternetSales_DimProduct&amp;quot;&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;End Role=&amp;quot;DimProduct&amp;quot; EntitySet=&amp;quot;DimProduct&amp;quot; /&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;End Role=&amp;quot;FactInternetSales&amp;quot; EntitySet=&amp;quot;FactInternetSales&amp;quot; /&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/AssociationSet&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;AssociationSet Name=&amp;quot;FK_FactInternetSales_DimSalesTerritory&amp;quot; Association=&amp;quot;ADW08.FK_FactInternetSales_DimSalesTerritory&amp;quot;&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;End Role=&amp;quot;DimSalesTerritory&amp;quot; EntitySet=&amp;quot;DimSalesTerritory&amp;quot; /&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;End Role=&amp;quot;FactInternetSales&amp;quot; EntitySet=&amp;quot;FactInternetSales&amp;quot; /&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/AssociationSet&amp;gt;&lt;/font&gt;       &lt;br /&gt;&amp;lt;/EntityContainer&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The project should now build, with the foreign keys exposed as Scalar Properties.&amp;#160; Obviously no inherent relationships exist, so this could be dangerous in certain applications.&amp;#160; For Gemini however, providing you setup the relationships manually, it works a treat.&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7541" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/Business+Intelligence/default.aspx">Business Intelligence</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/.Net+3.5/default.aspx">.Net 3.5</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/SQL+Server+2008/default.aspx">SQL Server 2008</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/Entity+Framework/default.aspx">Entity Framework</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/Gemini/default.aspx">Gemini</category></item><item><title>Boyan Penev – Data Mystification</title><link>http://blogs.adatis.co.uk/blogs/timkent/archive/2009/10/16/boyan-penev-data-mystification.aspx</link><pubDate>Fri, 16 Oct 2009 13:51:53 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7540</guid><dc:creator>Tim Kent</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;This is &lt;a href="http://bp-msbi.blogspot.com/2009/10/data-mystification-for-business.html" target="_blank"&gt;a great post&lt;/a&gt; from Boyan Penev which I’m sure will be familiar to many of you who design reports for customers.&amp;#160; Sometimes you just have to give them what they want even when it goes against what you believe :(&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7540" width="1" height="1"&gt;</description></item><item><title>SSRS 2008 – Lattice Charts</title><link>http://blogs.adatis.co.uk/blogs/timkent/archive/2009/10/14/ssrs-2008-lattice-charts.aspx</link><pubDate>Wed, 14 Oct 2009 14:43:09 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7536</guid><dc:creator>Tim Kent</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;Update: Nick Barclay has made some nice tweaks to the sample &lt;/strong&gt;&lt;/font&gt;&lt;a href="http://nickbarclay.blogspot.com/2009/10/conditionally-hiding-axes-for-trellis.html" target="_blank"&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;here&lt;/strong&gt;&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As &lt;a href="http://blogs.adatis.co.uk/blogs/timkent/archive/2008/04/22/great-dashboard-design.aspx"&gt;I’ve mentioned before&lt;/a&gt;, we always try and design reports, dashboards and charts for our customers taking into consideration data visualisation best practices as promoted by &lt;a href="http://www.perceptualedge.com/" target="_blank"&gt;Stephen Few&lt;/a&gt;, &lt;a href="http://www.edwardtufte.com/tufte/" target="_blank"&gt;Edward Tufte&lt;/a&gt; et al.&amp;#160; &lt;/p&gt;  &lt;p&gt;Whenever I’m reading Visualisation books and in particular the best practice examples, I always find myself wondering whether:&lt;/p&gt;  &lt;p&gt;a) it’s possible with Reporting Services? and&lt;/p&gt;  &lt;p&gt;b) it can look as good with Reporting Services?&lt;/p&gt;  &lt;p&gt;and this was the case whilst I finally got round to starting to read Few’s new book &lt;a href="http://www.amazon.co.uk/Now-You-See-Visualization-Techniques/dp/0970601980" target="_blank"&gt;Now You See It&lt;/a&gt; (which I&amp;#160; hope to do a review of soon).&amp;#160; One of the key principles of data visualisation is “Compared to What?”.&amp;#160; It’s all very well presenting the information in a clear fashion but without context it’s hard to argue it’s worth.&lt;/p&gt;  &lt;p&gt;The use of a matrix of charts (lattice charts, trellis charts) allows the eye to very easily compare data both horizontally and vertically.&amp;#160; This method of display is also known as “Small Multiples” – a term coined by Tufte in his book - &lt;a href="http://www.amazon.co.uk/Envisioning-Information-Edward-R-Tufte/dp/0961392118/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1255525568&amp;amp;sr=1-1" target="_blank"&gt;Envisioning Information&lt;/a&gt;.&amp;#160; These charts also allow you to easily add additional dimensions to a two-dimensional display.&lt;/p&gt;  &lt;p&gt;I’m sure many of you will have used SSRS inline-charts before in a table (my &lt;a href="http://blogs.adatis.co.uk/blogs/timkent/archive/2009/01/21/how-to-bullet-charts-in-reporting-services-2008.aspx"&gt;bullet chart examples&lt;/a&gt; use this method) but it’s also possible to do this with the matrix object as well.&amp;#160; I’m not going to explain in detail the method to produce in-line charts in SSRS as it’s well documented already in this &lt;a href="http://msdn.microsoft.com/en-us/library/aa964128(SQL.90).aspx" target="_blank"&gt;msdn article&lt;/a&gt; but in summary you simply set up your matrix with the appropriate row and column groupings, design your chart outside of the matrix then when it’s ready simply drop it in the data cell.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/timkent/image_622889A2.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="372" alt="image" src="http://blogs.adatis.co.uk/blogs/timkent/image_thumb_56FEFF58.png" width="503" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;One thing to make sure you do is to change the maximum setting for your value axis to be the maximum value from your entire dataset using a scoped field expression &lt;font face="Courier New"&gt;(=MAX(Fields!Sales_Amount.Value, &amp;quot;DataSet1&amp;quot;)).&amp;#160; &lt;/font&gt;&lt;font face="v"&gt;Without this change you will be visually comparing apples with oranges!&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;With a bit of work on the formatting, the result looks pretty reasonable (though the spread of AdventureWorks data isn’t that great).&amp;#160; You can easily see which region is performing best and which category has the best sales.&lt;/p&gt;  &lt;p&gt;As usual you can download &lt;a href="http://blogs.adatis.co.uk/files/folders/sample_report_projects/entry7535.aspx"&gt;the sample&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/timkent/image_420D7CE5.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="971" alt="image" src="http://blogs.adatis.co.uk/blogs/timkent/image_thumb_5B094D2A.png" width="847" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/files/folders/sample_report_projects/entry7513.aspx"&gt;&amp;#160;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7536" width="1" height="1"&gt;</description></item><item><title>Installing SharePoint 2007 on Windows Server 2008 R2</title><link>http://blogs.adatis.co.uk/blogs/martynbullerwell/archive/2009/10/10/installing-sharepoint-2007-on-windows-server-2008-r2.aspx</link><pubDate>Sat, 10 Oct 2009 22:07:42 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7532</guid><dc:creator>Martyn Bullerwell</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Obviously when we get a new development machine, we install the latest Microsoft software in order to test the latest applications.&amp;#160; All in all Windows Server 2008 R2, is basically the server version on Windows 7, therefore it shares many drivers, and many common issues with its counterpart.&amp;#160; Therefore its no surprise that SharePoint 2007 does not install from disk to a Windows 7, or Windows Server 2008 R2 installation.&amp;#160; &lt;/p&gt;  &lt;p&gt;In order to install SharePoint, you need to create what is called a “Slipstream” version, which in essence means rolling up all the latest service packs into the installation.&amp;#160; Something that Microsoft I&amp;#39;m sure will get round to releasing in due course.&amp;#160; However in the meantime you can follow these simple instructions.&amp;#160; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Download the following Service packs: &lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;&lt;a title="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=79bada82-c13f-44c1-bdc1-d0447337051b" href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=79bada82-c13f-44c1-bdc1-d0447337051b"&gt;http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=79bada82-c13f-44c1-bdc1-d0447337051b&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a title="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=b7816d90-5fc6-4347-89b0-a80deb27a082" href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=b7816d90-5fc6-4347-89b0-a80deb27a082"&gt;http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=b7816d90-5fc6-4347-89b0-a80deb27a082&lt;/a&gt;&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Copy all installation files from the installation disc to your local hard disk. &lt;/li&gt;    &lt;li&gt;Remove &lt;strong&gt;EVERYTHING&lt;/strong&gt; from the Updates Folder, from within the following directory:&amp;#160; [&lt;strong&gt;ExtractedPath&lt;/strong&gt;]\X64 or [&lt;strong&gt;ExtractedPath&lt;/strong&gt;]\X32&lt;/li&gt;    &lt;li&gt;Run the following from a command prompt:&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;wssv3sp2-kb953338-x64-fullfile-en-us.exe /extract:&lt;b&gt;[ExtractedPath]&lt;/b&gt;\Updates /quiet&lt;/li&gt;      &lt;li&gt;officeserver2007sp2-kb953334-x64-fullfile-en-us.exe /extract:&lt;b&gt;[ExtractedPath]&lt;/b&gt;\Updates /quiet&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Now Install SharePoint 2007 as you would have done before. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I would advise burning that back to a disk, so you don&amp;#39;t have to do it in the future.&amp;#160;&amp;#160; You may still get a few compatibility issues, but it seems to install and run as expected. &lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7532" width="1" height="1"&gt;</description></item><item><title>Please support a good cause</title><link>http://blogs.adatis.co.uk/blogs/timkent/archive/2009/03/23/please-support-a-good-cause.aspx</link><pubDate>Mon, 23 Mar 2009 15:37:00 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7523</guid><dc:creator>Tim Kent</dc:creator><slash:comments>0</slash:comments><description>&lt;span style="font-family:&amp;#39;Calibri&amp;#39;,&amp;#39;sans-serif&amp;#39;;mso-ascii-theme-font:minor-latin;mso-hansi-theme-font:minor-latin;"&gt;&lt;font size="2"&gt;As &lt;/font&gt;&lt;a class="class" href="http://markhill.org/blog/?p=22"&gt;&lt;font size="2"&gt;Mark mentions&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt;, the one and only Sutha Thiru is climbing Kilimanjaro later this year to raise money for a very good cause - &lt;/font&gt;&lt;a class="class" href="http://www.irhh.org/sitehome/index.html"&gt;&lt;font size="2"&gt;The Iain Rennie Hospice&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; looked after our colleague Jim Wright who sadly died after on Xmas eve last year. &lt;/font&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Calibri&amp;#39;,&amp;#39;sans-serif&amp;#39;;mso-ascii-theme-font:minor-latin;mso-hansi-theme-font:minor-latin;"&gt;&lt;font size="2"&gt;     &lt;p&gt;&lt;/p&gt;   &lt;/font&gt;&lt;font size="2"&gt;&lt;span style="font-family:&amp;#39;Calibri&amp;#39;,&amp;#39;sans-serif&amp;#39;;mso-ascii-theme-font:minor-latin;mso-hansi-theme-font:minor-latin;"&gt;Sutha is also paying for the trip himself rather than using the sponsorship to subsidise, so please dig deep and give what you can. &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="font-family:&amp;#39;Calibri&amp;#39;,&amp;#39;sans-serif&amp;#39;;mso-ascii-theme-font:minor-latin;mso-hansi-theme-font:minor-latin;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="font-family:&amp;#39;Calibri&amp;#39;,&amp;#39;sans-serif&amp;#39;;mso-ascii-theme-font:minor-latin;mso-hansi-theme-font:minor-latin;"&gt;&lt;a class="class" href="http://www.justgiving.com/sutha" target="_blank"&gt;&lt;font color="#800080"&gt;http://www.justgiving.com/sutha&lt;/font&gt;&lt;/a&gt;       &lt;p&gt;&amp;#160;&lt;/p&gt;   &lt;/span&gt;&lt;/span&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7523" width="1" height="1"&gt;</description></item><item><title>XLCubed Version 5 Released</title><link>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2009/03/13/xlcubed-version-5-released.aspx</link><pubDate>Fri, 13 Mar 2009 12:18:32 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7521</guid><dc:creator>Jeremy Kashel</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Interesting to see yesterday that XLCubed have released version 5 of their popular OLAP reporting tool. As I&amp;#39;ve mentioned &lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/06/11/xlcubed-version-4-released.aspx" target="_blank"&gt;before&lt;/a&gt;, I&amp;#39;ve always found XLCubed to be very powerful and easy to use, and therefore, in my opinion, it&amp;#39;s definitely one of the best Excel OLAP reporting tools out there.&lt;/p&gt;  &lt;p&gt;Version 5 sees the introduction of some new features in the Excel/web editions, namely:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Enhanced Excel integration with &amp;#39;MicroCharts&amp;#39;;&lt;/li&gt;    &lt;li&gt;An improved user interface in the Web Edition;&lt;/li&gt;    &lt;li&gt;Print to PDF and enhanced save to Excel options in the Web Edition; &lt;/li&gt;    &lt;li&gt;Fine grain control over publishing Excel reports to the web.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Personally, I&amp;#39;m used to using the Excel Edition to slice and dice cubes to get what I want quite easily. Although it&amp;#39;s not entirely new to V5, you can carry out the same kind of ad-hoc analysis in the Web Edition, as shown in the following &lt;a href="http://www.xlcubed.com/en/web_youtube2.html" target="_blank"&gt;video&lt;/a&gt;. The end result is that you are able to build the kind of dashboards as shown below, whether in the web or the Excel edition:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/XLCubedVersion5Released_8979/Excel_2.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="360" alt="Excel" src="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/XLCubedVersion5Released_8979/Excel_thumb.jpg" width="484" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;As usual, the evaluation editions for the Excel and Web versions can be downloaded &lt;a href="http://www.xlcubed.com/en/download.html" target="_blank"&gt;here&lt;/a&gt;&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:04c46cbb-9077-499d-a400-2aa3ada083c0" style="padding-right:0px;display:inline;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Excel" rel="tag"&gt;Excel&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Dashboards" rel="tag"&gt;Dashboards&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Analysis%20Services" rel="tag"&gt;Analysis Services&lt;/a&gt;,&lt;a href="http://technorati.com/tags/XLCubed" rel="tag"&gt;XLCubed&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7521" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/Analysis+Services/default.aspx">Analysis Services</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/Dashboards/default.aspx">Dashboards</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/Excel/default.aspx">Excel</category></item><item><title>Dynamic Dimension members on a PerformancePoint KPI</title><link>http://blogs.adatis.co.uk/blogs/timkent/archive/2009/03/05/dynamic-dimension-members-on-a-performancepoint-kpi.aspx</link><pubDate>Thu, 05 Mar 2009 15:46:51 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7517</guid><dc:creator>Tim Kent</dc:creator><slash:comments>4</slash:comments><description>&lt;p&gt;One of our customers had read Nick Barclay&amp;#39;s post on &lt;a href="http://nickbarclay.blogspot.com/2008/12/ssas-2008-dynamic-sets-in-analytic.html" target="_blank"&gt;dynamic sets in SSAS 2008&lt;/a&gt; and was hoping that this would mean that you could create KPI&amp;#39;s with dynamic dimension members.&amp;#160; Well the answer is yes and no.&amp;#160; It&amp;#39;s already possible to do this in Monitoring (or should I say PerformancePoint Services) using custom sets in the scorecard designer (more on this below).&amp;#160; However in PPSM these sets are resolved at the point the Scorecard is rendered in the browser.&lt;/p&gt;  &lt;p&gt;This is fine as long as the members of your sets are not affected by the filters applied to your scorecard (&lt;em&gt;member.children&lt;/em&gt; for example) - unfortunately the set does not get re-queried when you change a filter.&amp;#160;&amp;#160; For instance if you were to create a set of your top 10 customers and drag that onto the rows of your scorecard, changing a time filter will not cause the KPI dimension members to change even if you&amp;#39;ve used time.currentmember in your set definition.&amp;#160; So you may end up displaying the Top 10 customers for the current month which may be different to&amp;#160; the Top 10 for the selected time period. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Update: Please see Nick Barclay&amp;#39;s comment below for a very neat solution to this issue using filter link formulas.&amp;#160; (Wish I&amp;#39;d thought of that!)&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Custom sets in the scorecard designer aren&amp;#39;t the most obvious thing to use nor are they very user-friendly.&amp;#160; Your best bet is to use a tool like SQL Management Studio/Mosha MDX Studio to design a query that you know works then paste out the MDX for the set into the custom set formula editor.&amp;#160; You access this by dragging the &lt;strong&gt;Custom&lt;/strong&gt; item in the Details pane onto the relevant position on your scorecard:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/timkent/WindowsLiveWriter/DynamicDimensionmembersonaPerformancePoi_AD56/image_2.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="323" alt="image" src="http://blogs.adatis.co.uk/blogs/timkent/WindowsLiveWriter/DynamicDimensionmembersonaPerformancePoi_AD56/image_thumb.png" width="245" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Paste your set query in to the pop-up dialog.&amp;#160; For Example:&lt;/p&gt;  &lt;div&gt;   &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;TOPCOUNT(
    [Product].[Product Model Categories].[Subcategory].members,
    10,
    [Measures].[Internet Sales Amount]
    )&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;You can then use the update button on the edit tab of the ribbon to see the results.&amp;#160; Unfortunately there&amp;#39;s no way to edit the custom set once you&amp;#39;ve added it.&amp;#160; You have to delete the dimension members and then add a new custom set.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/timkent/WindowsLiveWriter/DynamicDimensionmembersonaPerformancePoi_AD56/image_4.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="333" alt="image" src="http://blogs.adatis.co.uk/blogs/timkent/WindowsLiveWriter/DynamicDimensionmembersonaPerformancePoi_AD56/image_thumb_1.png" width="262" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7517" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/timkent/archive/tags/PerformancePoint/default.aspx">PerformancePoint</category><category domain="http://blogs.adatis.co.uk/blogs/timkent/archive/tags/PerformancePoint+Monitoring/default.aspx">PerformancePoint Monitoring</category><category domain="http://blogs.adatis.co.uk/blogs/timkent/archive/tags/kpi/default.aspx">kpi</category></item><item><title>Win\Loss Graphs in Reporting Services 2008</title><link>http://blogs.adatis.co.uk/blogs/timkent/archive/2009/02/11/win-loss-graphs-in-reporting-services-2008.aspx</link><pubDate>Wed, 11 Feb 2009 21:31:27 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7514</guid><dc:creator>Tim Kent</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;As I mentioned &lt;a href="http://blogs.adatis.co.uk/blogs/timkent/archive/2009/01/21/how-to-bullet-charts-in-reporting-services-2008.aspx" target="_blank"&gt;previously&lt;/a&gt;, SSRS 2008 allows us to use some nice visualisation techniques in our reports.&amp;#160; Win\Loss graphs are used to show (wait for it......) the trend of wins and losses over time.&amp;#160; The usual example is the performance of a sports team during a season, but they are also useful for showing trends over time such as the performance of a KPI.&amp;#160; Here&amp;#39;s another quick how-to on building this type of chart in SSRS 2008.&lt;/p&gt;  &lt;p&gt;So first we need a dataset with three fields: Series, Time and Value.&amp;#160; The first two are fairly self-explanatory, for the third you need to transform your value so it appears as either a 1, -1 or 0 (&lt;em&gt;win, lose, no result/tie&lt;/em&gt;).&amp;#160; The AdventureWorks built-in cube KPI&amp;#39;s work well here so I&amp;#39;m going to shortcut slightly and use these.&amp;#160; If you&amp;#39;re going to use a relational source you may need to do something a little cleverer.&amp;#160; For example:&lt;/p&gt;  &lt;div&gt;   &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt;
    [&lt;span style="color:#0000ff;"&gt;Month&lt;/span&gt;]
    ,[Country]
    ,&lt;span style="color:#0000ff;"&gt;CASE&lt;/span&gt; 
        &lt;span style="color:#0000ff;"&gt;WHEN&lt;/span&gt; [SalesAmount] &amp;gt; 10000
        &lt;span style="color:#0000ff;"&gt;THEN&lt;/span&gt; 1
        &lt;span style="color:#0000ff;"&gt;WHEN&lt;/span&gt; [SalesAmount] &amp;lt; 10000
        &lt;span style="color:#0000ff;"&gt;THEN&lt;/span&gt; -1
        &lt;span style="color:#0000ff;"&gt;WHEN&lt;/span&gt; [SalesAmount] &lt;span style="color:#0000ff;"&gt;IS&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;NULL&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;THEN&lt;/span&gt; 0
    &lt;span style="color:#0000ff;"&gt;END&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; Winlose
&lt;span style="color:#0000ff;"&gt;FROM&lt;/span&gt; 
    [AdventureWorksDW].[dbo].[FactInternetSales]&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;We&amp;#39;ll be using AdventureWorks (SSAS) &amp;quot;Internet Revenue&amp;quot; KPI.&amp;#160; Don&amp;#39;t forget that when using an AS data source in SSRS you basically have to trick it into thinking it&amp;#39;s relational and make sure you have your measures on Columns (&lt;a href="http://cwebbbi.spaces.live.com/blog/cns!7B84B0F2C239489A!412.entry" target="_blank"&gt;as Chris Webb discusses here&lt;/a&gt;).&amp;#160; Here&amp;#39;s our very simple MDX statement:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt; 
    KPITrend(&amp;quot;Internet Revenue&amp;quot;)
&lt;span style="color:#0000ff;"&gt;ON&lt;/span&gt; COLUMNS, 
    [&lt;span style="color:#0000ff;"&gt;Date&lt;/span&gt;].[Calendar].[&lt;span style="color:#0000ff;"&gt;Month&lt;/span&gt;].members 
    * 
    [Customer].[Customer Geography].[Country].members
&lt;span style="color:#0000ff;"&gt;ON&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;ROWS&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;FROM&lt;/span&gt; 
    [Adventure Works] &lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Now lets add a chart - pick the standard column chart and format as follows:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Right click and delete the chart title and legend;&lt;/li&gt;

  &lt;li&gt;Right click on both the axis titles uncheck &lt;strong&gt;Show Axis Title&lt;/strong&gt;;&amp;#160; &lt;/li&gt;

  &lt;li&gt;Right click on the Y (vertical) axis and select &lt;strong&gt;Axis Properties&lt;/strong&gt;.&amp;#160; Under &lt;strong&gt;Axis Options&lt;/strong&gt; set &lt;strong&gt;Minimum&lt;/strong&gt; to &lt;strong&gt;-1&lt;/strong&gt;, &lt;strong&gt;Maximum&lt;/strong&gt; to &lt;strong&gt;1&lt;/strong&gt; and &lt;strong&gt;Cross At&lt;/strong&gt; property to &lt;strong&gt;0 &lt;/strong&gt;(this makes sure our baseline runs between the &amp;quot;wins&amp;quot; and &amp;quot;losses&amp;quot;).&amp;#160; Click OK;&lt;/li&gt;

  &lt;li&gt;Right click again on the Y axis and uncheck &lt;strong&gt;Show Axis&lt;/strong&gt;;&lt;/li&gt;

  &lt;li&gt;Right click on the X axis and select &lt;strong&gt;Axis Properties&lt;/strong&gt;.&amp;#160; Under &lt;strong&gt;Labels&lt;/strong&gt;&amp;#160; check &lt;strong&gt;Hide Axis Labels &lt;/strong&gt;and do the same for &lt;strong&gt;Major and Minor Tick Marks&lt;/strong&gt;. Under &lt;strong&gt;Line&lt;/strong&gt; set the width to &lt;strong&gt;0.5&lt;/strong&gt; and the colour to light grey or similar.&amp;#160; Click OK.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You should now have something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/timkent/WindowsLiveWriter/WinLoseChartsinSSRS2008_13B73/image_6.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="349" alt="image" src="http://blogs.adatis.co.uk/blogs/timkent/WindowsLiveWriter/WinLoseChartsinSSRS2008_13B73/image_thumb_2.png" width="484" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Now lets add some data:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Drag your &lt;strong&gt;Time&lt;/strong&gt; field from the Report Data pane into the category area;&lt;/li&gt;

  &lt;li&gt;Drag your &lt;strong&gt;Value&lt;/strong&gt;&amp;#160; field into the Data Field area;&lt;/li&gt;

  &lt;li&gt;Right click on your series and select &lt;strong&gt;Series Properties&lt;/strong&gt;.&amp;#160; Under &lt;strong&gt;Fill&lt;/strong&gt; set the colour suitably.&amp;#160; In our example we&amp;#39;re going to show wins as black and losses as red using a switch statement in an expression:&lt;/li&gt;

  &lt;div&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;=Switch
(
    Fields!Internet_Revenue_Trend.Value = 1, &lt;span style="color:#006080;"&gt;&amp;quot;Black&amp;quot;&lt;/span&gt;,
    Fields!Internet_Revenue_Trend.Value = -1, &lt;span style="color:#006080;"&gt;&amp;quot;Red&amp;quot;&lt;/span&gt;
)&lt;/pre&gt;
  &lt;/div&gt;
&lt;/ol&gt;

&lt;p&gt;If you preview the chart now it should look something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/timkent/WindowsLiveWriter/WinLoseChartsinSSRS2008_13B73/image_8.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="297" alt="image" src="http://blogs.adatis.co.uk/blogs/timkent/WindowsLiveWriter/WinLoseChartsinSSRS2008_13B73/image_thumb_3.png" width="369" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;To finish off we need to add the chart inline to a table:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Add a table and delete the third column;&lt;/li&gt;

  &lt;li&gt;Set the DataSetName property to the same as your chart;&lt;/li&gt;

  &lt;li&gt;Right click on the second row and add a group (using the adjacent above option).&amp;#160; Select your Series value (in our case: Country) from the drop down;&lt;/li&gt;

  &lt;li&gt;Delete the bottom row;&lt;/li&gt;

  &lt;li&gt;Drag your Series field into the First column, second cell;&lt;/li&gt;

  &lt;li&gt;Drag your chart into the second column, second cell.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Finally add a bit of formatting to your table and you&amp;#39;re done!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/timkent/WindowsLiveWriter/WinLoseChartsinSSRS2008_13B73/image_10.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="224" alt="image" src="http://blogs.adatis.co.uk/blogs/timkent/WindowsLiveWriter/WinLoseChartsinSSRS2008_13B73/image_thumb_4.png" width="497" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;As usual the sample report can be downloaded from the &lt;a href="http://blogs.adatis.co.uk/files/folders/sample_report_projects/entry7513.aspx" target="_blank"&gt;downloads section&lt;/a&gt; (don&amp;#39;t forget to login).&lt;/p&gt;

&lt;p&gt;This also works in SSRS 2005 - though doesn&amp;#39;t render quite a cleanly.&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7514" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/timkent/archive/tags/Reporting+Services/default.aspx">Reporting Services</category><category domain="http://blogs.adatis.co.uk/blogs/timkent/archive/tags/SQL+Server+2008/default.aspx">SQL Server 2008</category><category domain="http://blogs.adatis.co.uk/blogs/timkent/archive/tags/visualisation/default.aspx">visualisation</category></item><item><title>PerformancePoint Monitoring - Hide empty rows in a grid or chart by design</title><link>http://blogs.adatis.co.uk/blogs/timkent/archive/2009/02/09/performancepoint-monitoring-hide-empty-rows-in-a-grid-or-chart-by-design.aspx</link><pubDate>Mon, 09 Feb 2009 23:16:00 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7511</guid><dc:creator>Tim Kent</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&lt;font size="2"&gt;So as the dust settles and everyone calms down, it&amp;#39;s time to move on and get back to what we&amp;#39;re good at! Just in case anyone was worried, we&amp;#39;ll continue to be at the cutting edge of PerformancePoint Services and the MS BI stack as well as looking at SharePoint in more detail.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;I thought I&amp;#39;d post this one as it&amp;#39;s come up with a couple of our customers recently and isn&amp;#39;t entirely clear at first glance.&amp;nbsp; When you design an Analytic Chart or Grid in Dashboard Designer by default empty rows/columns (or series on a chart) are shown.&amp;nbsp; If you want them to be hidden when the user first opens the chart/grid then click the &lt;strong&gt;browse &lt;/strong&gt;button at the bottom right of the design pane:&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/timkent/WindowsLiveWriter/PerformancePointMonitoringHideemptyrowsi_14793/image_2.png"&gt;&lt;img style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-RIGHT-WIDTH:0px;" height="220" alt="image" src="http://blogs.adatis.co.uk/blogs/timkent/WindowsLiveWriter/PerformancePointMonitoringHideemptyrowsi_14793/image_thumb.png" width="371" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;The preview window will appear.&amp;nbsp; Now click either of the two end icons on the toolbar (marked by the red rectangle below) to hide the empty rows/columns (or both)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/timkent/WindowsLiveWriter/PerformancePointMonitoringHideemptyrowsi_14793/image_4.png"&gt;&lt;img style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-RIGHT-WIDTH:0px;" height="256" alt="image" src="http://blogs.adatis.co.uk/blogs/timkent/WindowsLiveWriter/PerformancePointMonitoringHideemptyrowsi_14793/image_thumb_1.png" width="318" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;When you click OK the setting will be saved into your design - you can verify this by going into the MDX view of the query and checking that &amp;quot;Non Empty&amp;quot; now appears in your MDX.&amp;nbsp; &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;You can use the same method to apply sorting by right-clicking on a column in the browse window and selecting the relevant sort function.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/timkent/WindowsLiveWriter/PerformancePointMonitoringHideemptyrowsi_14793/image_6.png"&gt;&lt;img style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-RIGHT-WIDTH:0px;" height="364" alt="image" src="http://blogs.adatis.co.uk/blogs/timkent/WindowsLiveWriter/PerformancePointMonitoringHideemptyrowsi_14793/image_thumb_2.png" width="490" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;Of course if you are using an MDX query then use the NonEmpty/Non Empty functions directly.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;As I&amp;#39;ve pointed out before, don&amp;#39;t forget the built-in Dashboard Designer help which is pretty comprehensive&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&lt;font face="Trebuchet MS" size="2"&gt;&lt;/font&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7511" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/timkent/archive/tags/PerformancePoint+Monitoring/default.aspx">PerformancePoint Monitoring</category></item><item><title>RIP PerformancePoint Planning</title><link>http://blogs.adatis.co.uk/blogs/sachatomey/archive/2009/01/29/rip-performancepoint-planning.aspx</link><pubDate>Thu, 29 Jan 2009 10:55:03 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7506</guid><dc:creator>sachatomey</dc:creator><slash:comments>3</slash:comments><description>&lt;p&gt;It&amp;#39;s nearly a week since the announcement that shook the (PPS) world !&amp;#160; It&amp;#39;s been a bit difficult to report on; generally the Adatis blogs try and offer solutions to problems we have encountered out in the real-world.&amp;#160; Now I could say something crass here about the real-world and the decision makers involved...but that would be childish right?&lt;/p&gt;  &lt;p&gt;If I was to offer up my feelings, they wouldn&amp;#39;t be that far from &lt;a href="http://alanwhitehouse.wordpress.com/2009/01/26/pps-planning-being-discontinued/#more-526"&gt;Alan Whitehouse&amp;#39;s excellent post on the subject&lt;/a&gt;.&amp;#160; If I had an ounce of class about me, it would be much more aligned with &lt;a href="http://adriandownes.blogspot.com/2009/01/on-2009-goto-2006.html"&gt;Adrian&amp;#39;s poignant discussion opener&lt;/a&gt;, the one with the sharp-witted title, but alas....&lt;/p&gt;  &lt;p&gt;We&amp;#39;ve spent the best part of the week speaking to customers, partners and Microsoft about what to do next.&amp;#160; The timing was choice - would you believe, we actually had three new PerformancePoint Planning phases kicking off this week, according to my project plan - I should be setting up Kerberos as we speak..&amp;#160; [There is always a positive right?]&lt;/p&gt;  &lt;p&gt;Some customers are carrying on regardless, they... &lt;/p&gt;  &lt;p&gt;...already have planning deployments and are too far invested and dependent to back out at this stage or,&amp;#160; &lt;/p&gt;  &lt;p&gt;...have a short-term view (That&amp;#39;s not a criticism) and need a &amp;quot;quick&amp;quot; fix with a low TCO to get them through some initial grief.&amp;#160; (Typically these customers are going through rapid organisational change, or form part of a recent acquisition and, to help them see the wood from the trees during the transition, require short/sharp solutions)&lt;/p&gt;  &lt;p&gt;Other customers, with longer-term views, feel the product, or more importantly, the suitably skilled resource pool, will drain away far quicker than the life-span of the much touted Microsoft product support.&amp;#160; I have to agree - Fact - Adatis will not be employing or training anymore PerformancePoint Planning Consultants.&amp;#160; I doubt many other consulting firms will either.&lt;/p&gt;  &lt;p&gt;It&amp;#39;s those customers with the longer-term view that are the ones currently in limbo - they are experiencing pain, they need pain relief, what should they do - wait and see what Office 14/15 offers? (There is talk of some planning functionality appearing in future Office versions - what truth there is in that..?).&lt;/p&gt;  &lt;p&gt;The Dynamics customers could wait for the resurrection of Forecaster - I do have information on good authority that they will be developing Forecaster to be closer, in terms of flexibility, to PPS Planning.&amp;#160; I had originally heard the opposite view in that Forecaster will be replaced with a cut down version of PPS Planning.&amp;#160; Either way, I&amp;#39;m sure some of the PPS Planning code-base will be utilised, which could end rumours of PPS Planning being &amp;#39;given&amp;#39; to the community as some form of community/open-source arrangement.&amp;#160; An arrangement that is, in my opinion, a non-starter anyway, &amp;quot;Hey, Mr FD, We&amp;#39;ve got this great open-source budgeting and forecasting product we think you should implement!&amp;quot; - yeah right !&lt;/p&gt;  &lt;p&gt;Another rumour (and mixed message) is that Service Pack 3 will contain some of the requested features that were earmarked for version 2 (After all, the code has already been written, right?) this rumour was actually started by Guy Weismantel in his &lt;a href="http://download.microsoft.com/download/A/E/E/AEEE26CB-1536-4EC9-809E-536F6E49A1BB/Guy_Weismantel_BI_Announcement_MBR.wmv" target="_blank"&gt;Announcement Video&lt;/a&gt;.&amp;#160; However, the information I have since received, clearly states that Service Pack 3 will contain stability and bug fixes only - so which is it to be?&amp;#160; It&amp;#39;s unlikely for a service pack to contain new features, but it&amp;#39;s not unheard of; anyone remember the original release of Reporting Services?&amp;#160; That arrived as part of a service pack for SQL Server 2000.&lt;/p&gt;  &lt;p&gt;The burning question I cannot get answered is, have Microsoft actually stepped out of the BPM market for good?&amp;#160; We are told that Excel, Sharepoint and SQL Server provide BPM - I can&amp;#39;t see, without Planning, how they can.&amp;#160; Short of hard-coded values, renewed Sharepoint/Excel hell, another vendor or bespoke planning solution, businesses can&amp;#39;t set plans which have further reaching implications; effectively Planning&amp;#39;s demise is also, effectively, shelving the Scorecard/KPI functionality from the M&amp;amp;A toolset too !&amp;#160; It will be interesting to see the new Monitoring &amp;amp; Analytics Marketing, will they still demo Strategy Maps and Scorecards, or will they now focus on Decomposition trees and Heat maps? Monitoring &amp;amp; Analytics may, in practice, just become Analytics..&lt;/p&gt;  &lt;p&gt;I would have thought the cost of continuing to develop the product (even if it were a lemon, which Planning certainly wasn&amp;#39;t)&amp;#160; is far less than the potential loss of revenue that Microsoft will face due not only to the loss of confidence by its customers (who are going to think twice about investing in any Microsoft product now, let alone a V1) but perhaps more significantly, the doors it opens to it&amp;#39;s competitors who can offer a complete BI\BPM stack.&amp;#160; &lt;/p&gt;  &lt;p&gt;Planning was foot in the customer&amp;#39;s door for BI - once you put planning in, the customer had already bought the full BI stack, and in most cases, our customers were wowed by what they could now achieve.&amp;#160; &lt;/p&gt;  &lt;p&gt;I suspect Cognos and SAP are still partying now!&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7506" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/News/default.aspx">News</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/PerformancePoint/default.aspx">PerformancePoint</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/Business+Intelligence/default.aspx">Business Intelligence</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/Excel/default.aspx">Excel</category></item><item><title>How to: Bullet Charts in Reporting Services 2008</title><link>http://blogs.adatis.co.uk/blogs/timkent/archive/2009/01/21/how-to-bullet-charts-in-reporting-services-2008.aspx</link><pubDate>Wed, 21 Jan 2009 23:51:32 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7503</guid><dc:creator>Tim Kent</dc:creator><slash:comments>5</slash:comments><description>&lt;p&gt;Unlike SSRS 2005 where creating bullet graph takes a bit of &lt;a href="http://blogs.adatis.co.uk/blogs/timkent/archive/2008/11/09/howto-bullet-charts-in-reporting-services-2005.aspx"&gt;jiggery-pokery&lt;/a&gt;, Reporting Services 2008 almost has them built-in (thanks the the acquisition of Dundas technology).&amp;#160; I say almost as it&amp;#39;s actually using a linear gauge object which in the wrong hands allows you to put the likes of a thermometer on your reports to show just how &amp;quot;hot&amp;quot; your business is!&amp;#160; Luckily, there is a built-in bullet graph template for the gauge but it still requires a bit of customisation to make it look like a bullet graph as per &lt;a href="http://www.perceptualedge.com/articles/misc/Bullet_Graph_Design_Spec.pdf" target="_blank"&gt;Stephen Few&amp;#39;s specifications&lt;/a&gt;.&amp;#160; However it&amp;#39;s almost all formatting/setup.&amp;#160; Here follows a quick(-ish) &lt;em&gt;how-to&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;In most cases you&amp;#39;ll be using this type of chart inline in a table, however it&amp;#39;s easier to develop the graph object outside of the table then drop it in once you&amp;#39;ve got the formatting right.&amp;#160; To start with create yourself a datasource and build a dataset that has the following fields and one row for each bullet graph you want to display:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Category Name &lt;/li&gt;    &lt;li&gt;Actual Value &lt;/li&gt;    &lt;li&gt;Target Value &lt;/li&gt;    &lt;li&gt;Bad Zone Max &lt;/li&gt;    &lt;li&gt;Satisfactory Zone Max &lt;/li&gt;    &lt;li&gt;Good Zone max &lt;/li&gt;    &lt;li&gt;Optionally you may need a bad zone min if you have negative values &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Next drop a gauge object onto your report and select the bullet graph template.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/timkent/WindowsLiveWriter/BulletChartsinReportingServices2008_FAC8/image_2.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="113" alt="image" src="http://blogs.adatis.co.uk/blogs/timkent/WindowsLiveWriter/BulletChartsinReportingServices2008_FAC8/image_thumb.png" width="369" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;You&amp;#39;ll notice that the default is lots of jazzy shading and spangly borders.&amp;#160; We particularly need to get rid of these if we are using the graph inline as they will make the graph very hard to read when scaled down (and of course add no value in terms of visualising the key information anyway).&amp;#160; We&amp;#39;ll also want to remove the scale if we are using inline - we can add it back into our column header later.&lt;/p&gt;  &lt;p&gt;Right click on the graph and select gauge properties.&amp;#160; Select the Back fill section and set Gradient to &lt;strong&gt;solid&lt;/strong&gt; and the colour to &lt;strong&gt;no colour&lt;/strong&gt;.&amp;#160; Then select the Frame section and set the style to &lt;strong&gt;none&lt;/strong&gt;.&amp;#160; Close the properties pane. Looking better already:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/timkent/WindowsLiveWriter/BulletChartsinReportingServices2008_FAC8/image_4.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="89" alt="image" src="http://blogs.adatis.co.uk/blogs/timkent/WindowsLiveWriter/BulletChartsinReportingServices2008_FAC8/image_thumb_1.png" width="347" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Next lets remove the scale - right click on the graph again, this time selecting Gauge and then Scale Properties.&amp;#160; Select the Labels section then check the &lt;strong&gt;Hide Scale Labels&lt;/strong&gt; checkbox.&amp;#160; Then select the Major Checkmarks section and check the &lt;strong&gt;Hide Major checkmarks&lt;/strong&gt; checkbox.&amp;#160; At this point also set the start and end margins to 1 in the Layout section and set the Maximum value of the scale to your &lt;strong&gt;good zone max&lt;/strong&gt; field.&amp;#160; Close the properties panel again.&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;Now lets deal with each component of the graph.&amp;#160; You&amp;#39;ll notice that the orange bar is actually made up of two objects known as linear pointers.&amp;#160;&amp;#160; Lets tidy them up and assign our Actual and Target values to those pointers.&amp;#160; First make sure you&amp;#39;ve set the relevant datasetname property for the graph.&amp;#160; Then right click on your graph again, gauge sub-menu and Pointer(LinearPointer1) properties.&amp;#160;&amp;#160; Set the value to be your &lt;strong&gt;actual&lt;/strong&gt; field from your dataset.&amp;#160; The go to the Pointer Fill section, set the fill style to &lt;strong&gt;solid&lt;/strong&gt; and pick a suitable colour for your &amp;quot;bullet&amp;quot;.&amp;#160; Set the Pointer width to &lt;strong&gt;30&lt;/strong&gt; and finally select the shadow section and set the shadow offset to &lt;strong&gt;0&lt;/strong&gt;.&amp;#160; Do the same for your target pointer (LinearPointer2) but this time setting a width of &lt;strong&gt;8&lt;/strong&gt; and an length of &lt;strong&gt;80&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/timkent/WindowsLiveWriter/BulletChartsinReportingServices2008_FAC8/image_6.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="81" alt="image" src="http://blogs.adatis.co.uk/blogs/timkent/WindowsLiveWriter/BulletChartsinReportingServices2008_FAC8/image_thumb_2.png" width="338" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Now set the relevant properties for each of the zones.&amp;#160; This time select Range(LinearRange1) properties from your Gauge sub-menu.&amp;#160; Set the Start Range to 0 and the End range to your &lt;strong&gt;Bad Zone Max&lt;/strong&gt; field.&amp;#160; Whilst you have the properties pane open, get rid of the range borders by setting the border style to &lt;strong&gt;None &lt;/strong&gt;and the start and end widths to &lt;strong&gt;60&lt;/strong&gt;.&amp;#160; Repeat for range two but this time setting the Start Range to &lt;strong&gt;Bad Zone Max&lt;/strong&gt; and the End Range to your &lt;strong&gt;Satisfactory Zone Max. &lt;/strong&gt;The same for zone three but this time with &lt;strong&gt;Satisfactory Zone Max &lt;/strong&gt;and &lt;strong&gt;Good Zone Max.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Now add a table to your report, set the datasetname to the same dataset as your graph.&amp;#160; Delete the third column and drop your Category field into the second row, first column and then add a grouping on the Category Field (right click on second row, group properties, add).&amp;#160; Then drop your chart into the second column, second cell.&amp;#160; You should have something that looks like this in design view:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/timkent/WindowsLiveWriter/BulletChartsinReportingServices2008_FAC8/image_8.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="115" alt="image" src="http://blogs.adatis.co.uk/blogs/timkent/WindowsLiveWriter/BulletChartsinReportingServices2008_FAC8/image_thumb_3.png" width="546" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Almost there.&amp;#160; One of the quirks of any inline chart is that it overrides the border of the cell it&amp;#39;s placed in so you need to set the border for the GaugePanel to the same as your cell borders.&amp;#160; Finally lets add a scale to the header of column two.&amp;#160; Copy your chart from the cell and then paste it the header.&amp;#160; Remove all the components except the scale from the gauge panel by carefully highlighting and deleting.&amp;#160; Right click the Gauge in your header and select scale properties from the sub-menu.&amp;#160; Uncheck the &lt;strong&gt;Hide Scale Labels&lt;/strong&gt; checkbox and the &lt;strong&gt;Hide Major checkmarks&lt;/strong&gt; checkbox.&amp;#160; For the max value of the scale you need to make sure you use the max grouping for you good zone max rather than the default sum (=Max(Fields!Zone3.Value)).&amp;#160; In the layout section, set the position in gauge to &lt;strong&gt;90&lt;/strong&gt;, in the labels section set the placement to &lt;strong&gt;inside&lt;/strong&gt; and distance from scale to 30.&amp;#160; Set the major tick mark placement to inside.&amp;#160; Phew!&lt;/p&gt;  &lt;p&gt;Tidy up your fonts and general layout and you&amp;#39;re good to go:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/timkent/WindowsLiveWriter/BulletChartsinReportingServices2008_FAC8/image_12.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="149" alt="image" src="http://blogs.adatis.co.uk/blogs/timkent/WindowsLiveWriter/BulletChartsinReportingServices2008_FAC8/image_thumb_5.png" width="578" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;That&amp;#39;s about it - if all that seems like a lot of work download the &lt;a href="http://blogs.adatis.co.uk/files/folders/sample_report_projects/entry7502.aspx"&gt;sample report&lt;/a&gt; and use that instead :)&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7503" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/timkent/archive/tags/Reporting+Services/default.aspx">Reporting Services</category><category domain="http://blogs.adatis.co.uk/blogs/timkent/archive/tags/SQL+Server+2008/default.aspx">SQL Server 2008</category><category domain="http://blogs.adatis.co.uk/blogs/timkent/archive/tags/visualisation/default.aspx">visualisation</category></item><item><title>PerformancePoint 2007 SP2 and SQL 2008 (Continued)</title><link>http://blogs.adatis.co.uk/blogs/martynbullerwell/archive/2009/01/19/performancepoint-2007-sp2-and-sql-2008-continued.aspx</link><pubDate>Mon, 19 Jan 2009 23:36:04 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7499</guid><dc:creator>Martyn Bullerwell</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Following on from my previous &lt;a href="http://blogs.adatis.co.uk/blogs/martynbullerwell/archive/2008/12/31/performance-point-sp2-and-sql-server-2008.aspx" target="_blank"&gt;post&lt;/a&gt; prior to Christmas – it looks like I have been beaten to it.&amp;#160; For a pure installation of SQL 2008 and PPS have a look &lt;a href="http://hmorgenstern.spaces.live.com/blog/cns!28A6BE83102A0EB3!461.entry?wa=wsignin1.0&amp;amp;sa=552690013" target="_blank"&gt;here&lt;/a&gt;, it details the installation process to ensure a smooth installation.&amp;#160;&amp;#160;&amp;#160; I have now tried this and it seems that installation works seamlessly, and all set up on SQL 2008.&amp;#160; Hopefully I will get chance to continue testing.&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7499" width="1" height="1"&gt;</description></item></channel></rss>