<?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>Jeremy Kashel&amp;#39;s Blog : PerformancePoint</title><link>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/PerformancePoint/default.aspx</link><description>Tags: PerformancePoint</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP2 (Build: 20611.960)</generator><item><title>Audit Trail in PerformancePoint Planning</title><link>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/12/15/audit-trail-in-performancepoint-planning.aspx</link><pubDate>Mon, 15 Dec 2008 15:49:05 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7485</guid><dc:creator>Jeremy Kashel</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.adatis.co.uk/blogs/jeremykashel/rsscomments.aspx?PostID=7485</wfw:commentRss><comments>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/12/15/audit-trail-in-performancepoint-planning.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;ve noticed that the PPS Technet documentation has been updated recently to include an official Microsoft method to carry out auditing in PPS Planning.&lt;/p&gt;  &lt;p&gt;PPS will do some basic auditing out of the box, namely to the audit.log file on the server. This will automatically capture key events that occur on the server, e.g. creation of a model, updating of a dimension etc. The audit file does not, however, track changes to the model fact data. There has been a custom solution around for this for a while now - &lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/default.aspx" target="_blank"&gt;Sacha&lt;/a&gt; has written an excellent post &lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/default.aspx?PageIndex=2" target="_blank"&gt;here&lt;/a&gt; that details what you need to do in order to implement your own PPS audit trail.&lt;/p&gt;  &lt;p&gt;Like Sacha&amp;#39;s method, the Microsoft approach involves creating auditing tables, which should then be populated by running a custom stored procedure. The stored procedure should then be scheduled on a periodic basis (e.g. hourly) to capture any new activity. This is a bit different to Sacha&amp;#39;s method, where triggers are used to capture changes in real-time as they occur. In both cases the idea is to use something like Reporting Services to to view detailed auditing reports on your PPS data.&lt;/p&gt;  &lt;p&gt;One thing that did catch my eye on in the Technet documentation is a method to decode the binary &amp;#39;change list&amp;#39; column that&amp;#39;s held in the dbo.Submissions table. Whereas you can manually export the change list to a CSV file, there has historically been no way to take what&amp;#39;s in the change list column and automatically decode it into a useful format. The following C# code will read the change list, and then insert it into your newly created auditing table:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:teal;"&gt;DataSet &lt;/span&gt;ds = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:teal;"&gt;DataSet&lt;/span&gt;();
DataLayer dl = &lt;span style="color:blue;"&gt;new &lt;/span&gt;DataLayer(&lt;span style="color:maroon;"&gt;&amp;quot;PPSConnection&amp;quot;&lt;/span&gt;);
ds = dl.ExecuteDataSetFromSQL(&lt;span style="color:maroon;"&gt;&amp;quot;SELECT [SubmissionID]FROM [_AppDB].[dbo].[Submissions] s1 where &lt;br /&gt;s1.SubmissionID not in (select SubmissionID from [_StagingDB].[dbo].[SubmissionsAudited]) &lt;br /&gt;and s1.[Status] = 0&amp;quot;&lt;/span&gt;);
&lt;span style="color:blue;"&gt;string &lt;/span&gt;sSQL = &lt;span style="color:maroon;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;;

&lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="color:teal;"&gt;DataRow &lt;/span&gt;r &lt;span style="color:blue;"&gt;in &lt;/span&gt;ds.Tables[0].Rows)
{
    sSQL = &lt;span style="color:maroon;"&gt;@&amp;quot;INSERT INTO SubmissionsAudited(&amp;#8230; ) VALUES(&amp;quot;&lt;/span&gt;;

    &lt;span style="color:green;"&gt;// RETRIEVE THE CHANGELIST FOR THIS SUBMISSION 
    &lt;/span&gt;DataSetWrapper dsw = &lt;span style="color:blue;"&gt;new &lt;/span&gt;DataSetWrapper((&lt;span style="color:teal;"&gt;Byte&lt;/span&gt;[])r[&lt;span style="color:maroon;"&gt;&amp;quot;ChangeList&amp;quot;&lt;/span&gt;]);
    &lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="color:teal;"&gt;DataRow &lt;/span&gt;cldr &lt;span style="color:blue;"&gt;in &lt;/span&gt;dsw.DataSet.Tables[0].Rows)
    {
        &lt;span style="color:green;"&gt;// SUBMISSION ROW DATA
        &lt;/span&gt;sSQL += r[0].ToString() + &lt;span style="color:maroon;"&gt;&amp;quot;, &amp;quot;
        &lt;/span&gt;+ r[1].ToString() + &lt;span style="color:maroon;"&gt;&amp;quot;, &amp;quot;
        &lt;/span&gt;+ r[2].ToString() + &lt;span style="color:maroon;"&gt;&amp;quot;, &amp;quot;
        &lt;/span&gt;+ r[3].ToString() + &lt;span style="color:maroon;"&gt;&amp;quot;, &amp;#39;&amp;quot;
        &lt;/span&gt;+ r[4].ToString() + &lt;span style="color:maroon;"&gt;&amp;quot;&amp;#39;, &amp;quot;&lt;/span&gt;;

        &lt;span style="color:green;"&gt;// CHANGELIST ROW DATA
        &lt;/span&gt;&lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="color:blue;"&gt;object &lt;/span&gt;o &lt;span style="color:blue;"&gt;in &lt;/span&gt;cldr.ItemArray)
        {
            sSQL += &lt;span style="color:maroon;"&gt;&amp;quot;,&amp;quot; &lt;/span&gt;+ o.ToString();
        }
        sSQL += &lt;span style="color:maroon;"&gt;&amp;quot;)&amp;quot;&lt;/span&gt;;
    }
    &lt;span style="color:green;"&gt;// STORE EACH CHANGE TO THE AUDIT TABLE
    &lt;/span&gt;dl.ExecuteNonQuery(sSQL);&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Click &lt;a href="http://technet.microsoft.com/en-us/library/dd309567.aspx" target="_blank"&gt;here&lt;/a&gt; to view the Technet documentation.&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:ab05c10d-b3ae-4d58-9e82-bde06bc7b995" 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/PerformancePoint" rel="tag"&gt;PerformancePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SQL" rel="tag"&gt;SQL&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C#" rel="tag"&gt;C#&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7485" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/PerformancePoint/default.aspx">PerformancePoint</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/SQL/default.aspx">SQL</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Entering Dates in PPS Planning Assignments</title><link>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/11/27/entering-dates-in-pps-planning-assignments.aspx</link><pubDate>Thu, 27 Nov 2008 09:14:57 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7472</guid><dc:creator>Jeremy Kashel</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.adatis.co.uk/blogs/jeremykashel/rsscomments.aspx?PostID=7472</wfw:commentRss><comments>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/11/27/entering-dates-in-pps-planning-assignments.aspx#comments</comments><description>&lt;p&gt;In the recent PPS Planning projects that I&amp;#39;ve been involved in, the challenges have often been around subjects such as business rules, hence the often recurring theme of this blog. Recently the tables were turned though, as I was told by a user that they wanted to enter dates into a PPS assignment. &lt;/p&gt;  &lt;p&gt;I was initially a bit concerned that the Excel add-in may not be able to deliver here - after all its great at capturing numbers, but knowing the rigid structure of the fact tables, I couldn&amp;#39;t see how it would manage to store a date. Then I remembered something from my VBA days many years ago - that is that Excel stores dates as a number from 30/12/1899, meaning in theory it should be possible to get dates working in PPS. Thankfully it is possible, as this post explains.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Excel Setup&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The first step to get this working when designing your form template is to set the matrix to have a matrix style of &amp;#39;none&amp;#39;. If you don&amp;#39;t do this, then the built-in matrix styles will over-ride your formatting changes to the required cells. Speaking of formatting, the next step is to format the data entry cells that will contain dates, just using the standard Excel formatting window:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/EnteringDatesinPPSPlanningAssignments_12FBC/image_2.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="373" alt="image" src="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/EnteringDatesinPPSPlanningAssignments_12FBC/image_thumb.png" width="519" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Once these few simple steps are done, then the assignment will behave just like any other. As the date is stored as a number, the numeric representation of the date will end up in the fact table just as any other piece of data.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Dates in Business Rules&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Once the numbers are in the fact table, we need to convert them to dates to use them in business rules in some way. We can&amp;#39;t do much in PEL unfortunately, so the options are either NativeMDX or NativeSQL.&lt;/p&gt;  &lt;p&gt;As Analysis Services can pickup some of the VBA functions, it&amp;#39;s possible to use the &lt;a href="http://www.techonthenet.com/excel/formulas/dateadd.php" target="_blank"&gt;VBA DateAdd() function&lt;/a&gt; to convert the stored number back into a date. So in the example below, I&amp;#39;m using the DateAdd() function to convert the number to a date, before comparing the resulting date against another date using the VBA DateDiff() function:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;WITH 
MEMBER    &lt;/span&gt;[Measures].[DateExample] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;VBA!DateAdd(&amp;quot;d&amp;quot;, [Measures].[Value], &amp;quot;30/12/1899&amp;quot;)
&lt;span style="color:blue;"&gt;MEMBER    &lt;/span&gt;[Measures].[DateDiff] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;VBA!DateDiff(&amp;quot;d&amp;quot;, [Measures].[DateExample], &amp;quot;01/07/1987&amp;quot;)
&lt;span style="color:blue;"&gt;SELECT    Descendants&lt;/span&gt;([Time].[Monthly].[Year].&amp;amp;[2008],,&lt;span style="color:blue;"&gt;leaves&lt;/span&gt;) &lt;span style="color:blue;"&gt;ON &lt;/span&gt;0
&lt;span style="color:blue;"&gt;FROM      &lt;/span&gt;[Strategic Planning]
&lt;span style="color:blue;"&gt;WHERE     &lt;/span&gt;([Account].[Profit and Loss].&amp;amp;[5010], [Measures].[DateDiff], [Entity].[Divisions].&amp;amp;[5003])&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Although the above is just a simple example, it should give you the idea of the kind of calculations that can be performed in Analysis Services. It&amp;#39;s possible to use these functions via a NativeMDXScript or a NativeMDXQuery.&lt;/p&gt;

&lt;p&gt;It&amp;#39;s a similar story with SQL, as it also has its own &lt;a href="http://msdn.microsoft.com/en-us/library/ms186819.aspx" target="_blank"&gt;DateAdd() function&lt;/a&gt;, as shown in the simple select statement below:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;SELECT    &lt;/span&gt;&lt;span style="color:magenta;"&gt;DateAdd&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;d&lt;span style="color:gray;"&gt;, &lt;/span&gt;[Value]&lt;span style="color:gray;"&gt;, &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;30/12/1899&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;)
&lt;/span&gt;&lt;span style="color:blue;"&gt;FROM      &lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MG_Strategic Planning_MeasureGroup_default_partition]
&lt;span style="color:blue;"&gt;WHERE     &lt;/span&gt;Scenario_memberid &lt;span style="color:gray;"&gt;= &lt;/span&gt;4 &lt;span style="color:gray;"&gt;AND &lt;/span&gt;Account_MemberId &lt;span style="color:gray;"&gt;= &lt;/span&gt;5010&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;So it&amp;#39;s a shame that PEL can&amp;#39;t work with dates, but the fact that both the database engine and Analysis Services have a DateAdd function means that it&amp;#39;s possible to use dates for logic in both definition and procedural business rules.&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f88f1694-887d-4e61-bc4f-fa717d954896" 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/PerformancePoint" rel="tag"&gt;PerformancePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MDX" rel="tag"&gt;MDX&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SQL" rel="tag"&gt;SQL&lt;/a&gt;,&lt;a href="http://technorati.com/tags/VBA" rel="tag"&gt;VBA&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=7472" 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/PerformancePoint/default.aspx">PerformancePoint</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/SQL/default.aspx">SQL</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/VBA/default.aspx">VBA</category></item><item><title>NativeMDXQuery Business Rules in PerformancePoint Planning</title><link>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/10/24/nativemdxquery-business-rules-in-performancepoint-planning.aspx</link><pubDate>Fri, 24 Oct 2008 10:25:53 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7440</guid><dc:creator>Jeremy Kashel</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.adatis.co.uk/blogs/jeremykashel/rsscomments.aspx?PostID=7440</wfw:commentRss><comments>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/10/24/nativemdxquery-business-rules-in-performancepoint-planning.aspx#comments</comments><description>&lt;p&gt;Having &lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/08/05/using-nativesql-business-rules-for-seeding-or-what-ifs.aspx" target="_blank"&gt;posted about NativeSql business rules a while back&lt;/a&gt;, I though that I might as well cover NativeMdxQuery business rules also, especially as there isn&amp;#39;t too much documentation available on the web for this subject.&lt;/p&gt;  &lt;p&gt;NativeMdxQuery is a rule implementation type that can be used with assignment rules in PPS Planning. Rather than writing PEL and having the compiler convert your PEL into SQL or MDX, the idea is that you write the raw MDX directly if you pick NativeMdxQuery.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Why Native Rules?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;When when I posted about NativeSql, I mentioned a scenario or two where using NativeSql was very useful. The advantages to writing a NativeMdxQuery, however, are less obvious. This is especially the case when you consider that a)standard MDX rules in PPS Planning are less restrictive that the SQL rules, and b) that PEL is very efficient - you can write a very concise MDX PEL rule vs writing the equivalent in MDX itself.&lt;/p&gt;  &lt;p&gt;So what advantages are there? Although a fair amount of MDX functions are included in PEL, it&amp;#39;s not possible to use all MDX functions/statements/operators, e.g. Case(), Item(). This is one situation where you might want to write a NativeMdxQuery.&lt;/p&gt;  &lt;p&gt;Also, the ability to filter and restrict data in a raw MDX statement is far more powerful than the options available in PEL. For example, you can use the Filter()/IIF functions in PEL, but they&amp;#39;re quite slow and you&amp;#39;re restricted as to where you can put them. If you use MDX, you can use both a WHERE clause to slice the query and/or a HAVING clause for filtering.&lt;/p&gt;  &lt;p&gt;Finally, when just writing queries from an SSAS cube, a technique that&amp;#39;s sometimes used is to create &lt;a href="http://msdn.microsoft.com/en-us/library/ms146017.aspx" target="_blank"&gt;query-scoped calculated members&lt;/a&gt;, by using the MDX statement WITH MEMBER. This allows you to have calculation steps in your MDX query, and can effectively be used in one sense as a temporary variable store for calculations. If you&amp;#39;re trying to do complex calculations in PEL, you have to assign everything to the &amp;#39;this&amp;#39; keyword. It&amp;#39;s much cleaner to have a block of code where you can define any calculations that the main query depends on. This is what WITH MEMBER will let you do.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;How to Write a NativeMdxQuery&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The requirements for a business rule using NativeMdxQuery are that you need to write an MDX select statement, which specifies the target cells that will be written to. Unlike NativeSql statements, you do not need to handle how the data gets inserted - PerformancePoint handles all that for you, as long as you produce the MDX select statement.&lt;/p&gt;  &lt;p&gt;An example select statement that makes up the entire content of a NativeMdxQuery assignment rule is shown below. The comments show what the query is doing:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:green;"&gt;--[Measures].[Last Year] just makes the rule a bit more readable
&lt;/span&gt;&lt;span style="color:blue;"&gt;WITH MEMBER &lt;/span&gt;[Measures].[Last Year] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;([Measures].[Value], [Time].[Monthly].&lt;span style="color:maroon;"&gt;CurrentMember&lt;/span&gt;.&lt;span style="color:blue;"&gt;Lag&lt;/span&gt;(12))
&lt;span style="color:blue;"&gt;CELL CALCULATION &lt;/span&gt;queryCalc 
&lt;span style="color:blue;"&gt;FOR 
 &lt;/span&gt;&lt;span style="color:green;"&gt;--This specifices the cells that we are overwriting with an expression or value
 &lt;/span&gt;&amp;#39;([Measures].[Value],
 [Scenario].[All Members].[Scenario].&amp;amp;[1],
 {[Time].[Monthly].[Month].&amp;amp;[200901],[Time].[Monthly].[Month].&amp;amp;[200902]},
 {[Account].[Profit and Loss].[Level 07].&amp;amp;[5010],[Account].[Profit and Loss].[Level 07].&amp;amp;[5009]},
 [BusinessProcess].[Standard].[Level 06].&amp;amp;[8],
 [TimeDataView].[All Members].[TimeDataView].&amp;amp;[1],
 Descendants([Entity].[Divisions].[(All)].&amp;amp;[0], ,leaves),
 Descendants([Currency].[All Members].[(All)].&amp;amp;[0], ,leaves),
 Descendants([Product].[Product Category].[(All)].&amp;amp;[0], ,leaves))&amp;#39; 
&lt;span style="color:blue;"&gt;AS
 &lt;/span&gt;&lt;span style="color:green;"&gt;--The 100 is the value that we are giving the cells above
 &lt;/span&gt;100
&lt;span style="color:green;"&gt;--This is the select statement which cells will receive the value above
&lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT NON EMPTY 
 &lt;/span&gt;([Measures].[Value], 
 ({[Scenario].[All Members].[Scenario].&amp;amp;[1]},
 {{[Time].[Monthly].[Month].&amp;amp;[200901],[Time].[Monthly].[Month].&amp;amp;[200902]}},
 {{[Account].[Profit and Loss].[Level 07].&amp;amp;[5010],[Account].[Profit and Loss].[Level 07].&amp;amp;[5009]}},
 {[BusinessProcess].[Standard].[Level 06].&amp;amp;[8]},
 {[TimeDataView].[All Members].[TimeDataView].&amp;amp;[1]},
 {&lt;span style="color:blue;"&gt;Descendants&lt;/span&gt;([Entity].[Divisions].[(All)].&amp;amp;[0], ,&lt;span style="color:blue;"&gt;leaves&lt;/span&gt;)},
 {&lt;span style="color:blue;"&gt;Descendants&lt;/span&gt;([Currency].[All Members].[(All)].&amp;amp;[0], ,&lt;span style="color:blue;"&gt;leaves&lt;/span&gt;)},
 {&lt;span style="color:blue;"&gt;Descendants&lt;/span&gt;([Product].[Product Category].[(All)].&amp;amp;[0], ,&lt;span style="color:blue;"&gt;leaves&lt;/span&gt;)}))
 &lt;span style="color:green;"&gt;--Ensure we only write to cells with a certain value by using HAVING
 &lt;/span&gt;&lt;span style="color:blue;"&gt;HAVING &lt;/span&gt;([Measures].[Last Year] &amp;gt; 100000)
 &lt;span style="color:blue;"&gt;properties &lt;/span&gt;[Scenario].[All Members].&lt;span style="color:blue;"&gt;Key &lt;/span&gt;,
 [Time].[Monthly].&lt;span style="color:blue;"&gt;Key &lt;/span&gt;,
 [Account].[Profit and Loss].&lt;span style="color:blue;"&gt;Key &lt;/span&gt;,
 [BusinessProcess].[Standard].&lt;span style="color:blue;"&gt;Key &lt;/span&gt;,
 [Entity].[Divisions].&lt;span style="color:blue;"&gt;Key &lt;/span&gt;,
 [TimeDataView].[All Members].&lt;span style="color:blue;"&gt;Key &lt;/span&gt;,
 [Currency].[All Members].&lt;span style="color:blue;"&gt;Key &lt;/span&gt;,
 [Product].[Product Category].&lt;span style="color:blue;"&gt;Key 
 ON COLUMNS 
FROM &lt;/span&gt;[Strategic Planning]
&lt;span style="color:green;"&gt;--Filter on a dimension member property by using a WHERE CLAUSE
&lt;/span&gt;&lt;span style="color:blue;"&gt;WHERE &lt;/span&gt;([Entity].[Region].&amp;amp;[North])&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The points to note about the above statement are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;You must connect to the correct cube for the current model;&lt;/li&gt;

  &lt;li&gt;You don&amp;#39;t need to include a &lt;a href="http://msdn.microsoft.com/en-us/library/ms144865(SQL.90).aspx" target="_blank"&gt;cell calculation&lt;/a&gt; - but it&amp;#39;s the way that Microsoft implement business rules that use MDX, and it&amp;#39;s hard to see how you would get a rule to be of any use without it;&lt;/li&gt;

  &lt;li&gt;You must include the member keys as properties, otherwise the rule will error.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Writing MDX is clearly not for all users of PerformancePoint, but does provide the ultimate in flexibility when compared to PEL. Most MDX queries written in PPS will use cell calculations. If you&amp;#39;re not used to how these work, or you just want to save some time, remember that an easy way to get started is to use the debug button on an MDX PEL rule in PBM - this will output a query that is similar to the one shown above.&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:4a2485c2-9a5c-4423-9b9e-c99e71038deb" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/PerformancePoint" rel="tag"&gt;PerformancePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/PPS" rel="tag"&gt;PPS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MDX" rel="tag"&gt;MDX&lt;/a&gt;,&lt;a href="http://technorati.com/tags/NativeMdxQuery" rel="tag"&gt;NativeMdxQuery&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7440" 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/PerformancePoint/default.aspx">PerformancePoint</category></item><item><title>BI for IT Professionals using PerformancePoint</title><link>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/09/30/bi-for-it-professionals-using-performancepoint.aspx</link><pubDate>Tue, 30 Sep 2008 21:07:18 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7417</guid><dc:creator>Jeremy Kashel</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.adatis.co.uk/blogs/jeremykashel/rsscomments.aspx?PostID=7417</wfw:commentRss><comments>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/09/30/bi-for-it-professionals-using-performancepoint.aspx#comments</comments><description>&lt;p&gt;The &lt;a href="http://www.microsoft.com/business/performancepoint/downloads/default.aspx" target="_blank"&gt;PerformancePoint downloads page&lt;/a&gt; has been recently updated to include a framework on how BI can provided to the IT Department.&lt;/p&gt;  &lt;p&gt;Normally the IT Department would be helping out with supporting BI solutions, not actually being end users themselves - but it makes sense when you consider the kind of information that &lt;a href="http://www.microsoft.com/systemcenter/operationsmanager/en/us/default.aspx" target="_blank"&gt;Operations Manager&lt;/a&gt; captures.&lt;/p&gt;  &lt;p align="left"&gt;As &lt;a href="http://edge.technet.com/Media/Business-Intelligence-for-the-IT-Pro/" target="_blank"&gt;this video&lt;/a&gt; explains, the end goal is to create solutions that will allow effective monitoring the IT infrastructure. An example of the kind of the kind of dashboards that can be produced is shown below:&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/BIfortheITProfessionalsusingPerformanceP_12619/image_4.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="390" alt="Dashboard" src="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/BIfortheITProfessionalsusingPerformanceP_12619/image_thumb_1.png" width="644" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;There is &lt;a href="http://download.microsoft.com/download/0/a/3/0a3988d3-a847-4e72-ad17-0381bc5eda41/IT_Operations_Scorecards_and_Dashboards.doc" target="_blank"&gt;white paper&lt;/a&gt; and also a &lt;a href="http://download.microsoft.com/download/4/e/2/4e26e51d-e9ef-4dd5-8194-fe95e228335e/new%20IT%20Operations%20Scorecards%20and%20Dashboards%20Sample.zip" target="_blank"&gt;sample solution&lt;/a&gt; available for download to learn more.&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:7c9e135e-1089-4363-976d-ee284abbcaf9" 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/PerformancePoint" rel="tag"&gt;PerformancePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/System%20Center" rel="tag"&gt;System Center&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Dashboards" rel="tag"&gt;Dashboards&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7417" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/PerformancePoint/default.aspx">PerformancePoint</category><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/Operations+Manager/default.aspx">Operations Manager</category></item><item><title>Tracking PerformancePoint Planning Submissions Using Reporting Services</title><link>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/09/26/tracking-performancepoint-planning-submissions-using-reporting-services.aspx</link><pubDate>Fri, 26 Sep 2008 16:29:29 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7411</guid><dc:creator>Jeremy Kashel</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.adatis.co.uk/blogs/jeremykashel/rsscomments.aspx?PostID=7411</wfw:commentRss><comments>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/09/26/tracking-performancepoint-planning-submissions-using-reporting-services.aspx#comments</comments><description>&lt;p&gt;The standard &lt;a href="http://technet.microsoft.com/en-us/library/bb838765.aspx" target="_blank"&gt;operational reports&lt;/a&gt; that come with PerformancePoint will allow you to report on a variety of PerformancePoint admin related activities, such as cycles, assignments, forms, jobs and associations.&lt;/p&gt;  &lt;p&gt;I find that the assignments report is particularly useful - after all, finding out who has/hasn&amp;#39;t submitted is an important part of any data-gathering exercise. Whilst it is useful, I do find that the assignments report is the one that admin users want changed, especially when a model site exists containing many cycles and assignments.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Extra Functionality&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;With a large PPS Planning implementation you can easily end up with many assignment instances, cycles and users. I&amp;#39;ve been involved in such an implementation recently, and, due to the large number of assignments, the admin user requested a bit more filtering capability than the out of the box assignments report provides.&lt;/p&gt;  &lt;p&gt;Also, the existing assignments report tells will tell you that user A has submitted their assignment, but it won&amp;#39;t go into any detail about what the submission actually contained. E.g. did the user submit all their entities? For some users it is quite key to know what other users have been submitting - for one thing it makes navigation easier if as an approver you know exactly which department/entity to pick in the assignment filters.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Examples&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;By knowing which tables to use, you can write an SSRS report that provides the additional functionality mentioned above.&lt;/p&gt;  &lt;p&gt;The starting point is to get the base report query right. In my case, as I&amp;#39;m in a separate auditing database, the query goes inside a custom stored procedure, and is as follows:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;SELECT              &lt;/span&gt;A&lt;span style="color:gray;"&gt;.&lt;/span&gt;AssignmentId&lt;span style="color:gray;"&gt;,    &lt;/span&gt;C&lt;span style="color:gray;"&gt;.&lt;/span&gt;CycleInstanceName&lt;span style="color:gray;"&gt;, &lt;/span&gt;AD&lt;span style="color:gray;"&gt;.&lt;/span&gt;AssignmentDefName&lt;span style="color:gray;"&gt;, &lt;/span&gt;A&lt;span style="color:gray;"&gt;.&lt;/span&gt;AssignmentName&lt;span style="color:gray;"&gt;,
                    &lt;/span&gt;U&lt;span style="color:gray;"&gt;.&lt;/span&gt;UserId&lt;span style="color:gray;"&gt;, &lt;/span&gt;U&lt;span style="color:gray;"&gt;.&lt;/span&gt;UserName&lt;span style="color:gray;"&gt;, &lt;/span&gt;ENT&lt;span style="color:gray;"&gt;.&lt;/span&gt;Name &lt;span style="color:blue;"&gt;AS &lt;/span&gt;EntityName&lt;span style="color:gray;"&gt;, &lt;/span&gt;CUST&lt;span style="color:gray;"&gt;.&lt;/span&gt;Name &lt;span style="color:blue;"&gt;As &lt;/span&gt;CustomerName&lt;span style="color:gray;"&gt;,
                    &lt;/span&gt;&lt;span style="color:blue;"&gt;CASE
                        WHEN &lt;/span&gt;A&lt;span style="color:gray;"&gt;.&lt;/span&gt;Status &lt;span style="color:gray;"&gt;= &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;partial&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;OR &lt;/span&gt;A&lt;span style="color:gray;"&gt;.&lt;/span&gt;Status &lt;span style="color:gray;"&gt;= &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;Approved&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;OR &lt;/span&gt;A&lt;span style="color:gray;"&gt;.&lt;/span&gt;Status &lt;span style="color:gray;"&gt;= &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;Submitted&amp;#39; &lt;/span&gt;&lt;span style="color:blue;"&gt;THEN &lt;/span&gt;1
                        &lt;span style="color:blue;"&gt;ELSE &lt;/span&gt;0
                    &lt;span style="color:blue;"&gt;END AS &lt;/span&gt;Draft_Submitted&lt;span style="color:gray;"&gt;,
                    &lt;/span&gt;&lt;span style="color:blue;"&gt;CASE 
                        WHEN &lt;/span&gt;A&lt;span style="color:gray;"&gt;.&lt;/span&gt;Status &lt;span style="color:gray;"&gt;= &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;Approved&amp;#39; &lt;/span&gt;&lt;span style="color:gray;"&gt;OR &lt;/span&gt;A&lt;span style="color:gray;"&gt;.&lt;/span&gt;Status &lt;span style="color:gray;"&gt;= &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;Submitted&amp;#39; &lt;/span&gt;&lt;span style="color:blue;"&gt;THEN &lt;/span&gt;1
                        &lt;span style="color:blue;"&gt;ELSE &lt;/span&gt;0
                    &lt;span style="color:blue;"&gt;END As &lt;/span&gt;Final_Submitted&lt;span style="color:gray;"&gt;,
                    &lt;/span&gt;&lt;span style="color:blue;"&gt;CASE
                        WHEN &lt;/span&gt;A&lt;span style="color:gray;"&gt;.&lt;/span&gt;Status &lt;span style="color:gray;"&gt;=  &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;Approved&amp;#39; &lt;/span&gt;&lt;span style="color:blue;"&gt;THEN &lt;/span&gt;1
                        &lt;span style="color:blue;"&gt;ELSE &lt;/span&gt;0
                    &lt;span style="color:blue;"&gt;END AS &lt;/span&gt;Approved&lt;span style="color:gray;"&gt;, &lt;/span&gt;Approve&lt;span style="color:gray;"&gt;.&lt;/span&gt;UserName &lt;span style="color:blue;"&gt;As &lt;/span&gt;Approver
&lt;span style="color:blue;"&gt;FROM                &lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;Assignments A 
&lt;span style="color:gray;"&gt;LEFT OUTER JOIN     &lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MG_Planning_MeasureGroup_default_partition] Fact
                    &lt;span style="color:blue;"&gt;ON &lt;/span&gt;A&lt;span style="color:gray;"&gt;.&lt;/span&gt;AssignmentID &lt;span style="color:gray;"&gt;= &lt;/span&gt;Fact&lt;span style="color:gray;"&gt;.&lt;/span&gt;AssignmentID
&lt;span style="color:gray;"&gt;LEFT OUTER JOIN     &lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;AssignmentDefinitions AD &lt;span style="color:blue;"&gt;ON &lt;/span&gt;AD&lt;span style="color:gray;"&gt;.&lt;/span&gt;AssignmentDefID &lt;span style="color:gray;"&gt;= &lt;/span&gt;A&lt;span style="color:gray;"&gt;.&lt;/span&gt;AssignmentDefID
&lt;span style="color:gray;"&gt;LEFT OUTER JOIN     &lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;CycleInstances C &lt;span style="color:blue;"&gt;ON &lt;/span&gt;C&lt;span style="color:gray;"&gt;.&lt;/span&gt;CycleInstanceID &lt;span style="color:gray;"&gt;= &lt;/span&gt;A&lt;span style="color:gray;"&gt;.&lt;/span&gt;CycleInstanceID
&lt;span style="color:gray;"&gt;LEFT OUTER JOIN     &lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;D_Entity ENT &lt;span style="color:blue;"&gt;ON &lt;/span&gt;ENT&lt;span style="color:gray;"&gt;.&lt;/span&gt;MemberId &lt;span style="color:gray;"&gt;= &lt;/span&gt;Fact&lt;span style="color:gray;"&gt;.&lt;/span&gt;Entity_MemberId
&lt;span style="color:gray;"&gt;LEFT OUTER JOIN     &lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;D_Customer CUST &lt;span style="color:blue;"&gt;ON &lt;/span&gt;CUST&lt;span style="color:gray;"&gt;.&lt;/span&gt;MemberId &lt;span style="color:gray;"&gt;= &lt;/span&gt;Fact&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Customer_MemberId]
&lt;span style="color:gray;"&gt;LEFT OUTER JOIN     &lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;BizUsers U &lt;span style="color:blue;"&gt;ON &lt;/span&gt;U&lt;span style="color:gray;"&gt;.&lt;/span&gt;UserID &lt;span style="color:gray;"&gt;= &lt;/span&gt;A&lt;span style="color:gray;"&gt;.&lt;/span&gt;ContributorUserId
&lt;span style="color:gray;"&gt;LEFT OUTER JOIN     &lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;ApproverList AL &lt;span style="color:blue;"&gt;ON &lt;/span&gt;AL&lt;span style="color:gray;"&gt;.&lt;/span&gt;AssignmentID &lt;span style="color:gray;"&gt;= &lt;/span&gt;A&lt;span style="color:gray;"&gt;.&lt;/span&gt;AssignmentId
&lt;span style="color:gray;"&gt;LEFT OUTER JOIN     &lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;BizUsers Approve &lt;span style="color:blue;"&gt;ON &lt;/span&gt;Approve&lt;span style="color:gray;"&gt;.&lt;/span&gt;UserID &lt;span style="color:gray;"&gt;= &lt;/span&gt;AL&lt;span style="color:gray;"&gt;.&lt;/span&gt;ApproverUserID&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;You can figure out most of the tables to use by looking at a view called AssignmentsView within the application database.&lt;/p&gt;

&lt;p align="left"&gt;One thing that I have taken into account is assignment definitions. If you have large number of users completing an assignment, then the chances are that you will have set up an assignment definition that points at a business role or a submission hierarchy. You ideally want to be able to filter on the assignment definition to return all assignment instances that belong to that assignment definition. Therefore, in my case I have three filters for the report, but you could easily add more:&lt;/p&gt;

&lt;p align="center"&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/TrackingPerformancePointPlanningSubmissi_108A4/image_4.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="62" alt="image" src="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/TrackingPerformancePointPlanningSubmissi_108A4/image_thumb_1.png" width="683" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p align="left"&gt;The final view is a report that shows the status of the assignments returned by the filter, but also, when expanded, shows the the entities and customers that the contributor has submitted:&lt;/p&gt;

&lt;p align="center"&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/TrackingPerformancePointPlanningSubmissi_108A4/image_9.png" target="_blank"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="349" alt="SSRS Report" src="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/TrackingPerformancePointPlanningSubmissi_108A4/image_thumb_3.png" width="719" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p align="left"&gt;The above is just a taster of what can be achieved. A couple of ways that it can be extended include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Integrating with &lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/archive/2008/06/30/performancepoint-planning-data-change-tracking-audit-trail.aspx"&gt;Sacha&amp;#39;s data auditing idea&lt;/a&gt; to provide detailed history on what values the contributor has changed; &lt;/li&gt;

  &lt;li&gt;Including comments, annotations and deadlines. &lt;/li&gt;
&lt;/ul&gt;

&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:6faa9f21-3a0a-492d-8182-5bee5fab2b0f" 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/PerformancePoint" rel="tag"&gt;PerformancePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Planning" rel="tag"&gt;Planning&lt;/a&gt;,&lt;a href="http://technorati.com/tags/PPS" rel="tag"&gt;PPS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SSRS" rel="tag"&gt;SSRS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Reporting%20Services" rel="tag"&gt;Reporting Services&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SQL%20Server%202005" rel="tag"&gt;SQL Server 2005&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7411" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/PerformancePoint/default.aspx">PerformancePoint</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/SQL/default.aspx">SQL</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/Reporting+Services/default.aspx">Reporting Services</category></item><item><title>Analysis Services Properties for PerformancePoint MDX Rules</title><link>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/09/07/analysis-services-properties-for-performancepoint-mdx-rules.aspx</link><pubDate>Sun, 07 Sep 2008 20:55:05 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7405</guid><dc:creator>Jeremy Kashel</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.adatis.co.uk/blogs/jeremykashel/rsscomments.aspx?PostID=7405</wfw:commentRss><comments>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/09/07/analysis-services-properties-for-performancepoint-mdx-rules.aspx#comments</comments><description>&lt;p&gt;One of the great features of PEL is that you can choose either a SQL or &lt;a href="http://msdn.microsoft.com/en-us/library/bb839261.aspx" target="_blank"&gt;MDX implementation&lt;/a&gt; for your rules, depending on what you want to achieve. Whilst the MDX rules are much less restrictive than the SQL rules, they can sometimes run slower, depending of course on how your environment is set up.&lt;/p&gt;  &lt;p align="left"&gt;When the MDX rules do take a long time to run, it&amp;#39;s possible that you might see this message:&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/AnalysisServicesPropertiesforPerformance_11E76/clip_image002_2.jpg"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="182" alt="clip_image002" src="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/AnalysisServicesPropertiesforPerformance_11E76/clip_image002_thumb.jpg" width="420" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;What has essentially happened within Analysis Services is that an object (e.g. a cube or dimension) has been processed and is waiting to commit. Unfortunately this is not possible whilst an existing query is running, so therefore AS waits for the query to complete. It will, however, only wait so long, which is defined by one of the &lt;a href="http://www.microsoft.com/technet/prodtechnol/sql/2005/ssasproperties.mspx" target="_blank"&gt;Analysis Services Properties&lt;/a&gt; called ForceCommitTimeout. Once this threshold has been reached, then the offending query is canceled, resulting in the error message above.&lt;/p&gt;  &lt;p&gt;Finding the right balance for the Analysis Services ForceCommitTimeout and the PerformancePoint PAC &amp;#39;OLAP Cube Refresh Interval&amp;#39; setting is key. If you have set PPS to re-process its cubes too often then you may well see the above message. On the other hand, if you set the ForceCommitTimeout too high, then queries executed whilst the cube is waiting to commit will be made to wait, meaning your big query will get though ok, but other users may see bad performance.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geekswithblogs.net/darrengosbell/Default.aspx" target="_blank"&gt;Darren Gosbell&lt;/a&gt; has written an excellent post &lt;a href="http://geekswithblogs.net/darrengosbell/archive/2007/04/24/SSAS-Processing-ForceCommitTimeout-and-quotthe-operation-has-been-cancelledquot.aspx" target="_blank"&gt;here&lt;/a&gt; that provides a thorough explanation of ForceCommitTimeout and other related properties.&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:93433136-881d-4785-93d0-9fce7e82b0f8" 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/Analysis%20Services" rel="tag"&gt;Analysis Services&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MDX" rel="tag"&gt;MDX&lt;/a&gt;,&lt;a href="http://technorati.com/tags/PerformancePoint" rel="tag"&gt;PerformancePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/PPS" rel="tag"&gt;PPS&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7405" 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/PerformancePoint/default.aspx">PerformancePoint</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/PEL/default.aspx">PEL</category></item><item><title>Renaming a PerformancePoint Planning Server</title><link>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/08/31/renaming-a-performancepoint-planning-server.aspx</link><pubDate>Sun, 31 Aug 2008 16:42:37 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7398</guid><dc:creator>Jeremy Kashel</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.adatis.co.uk/blogs/jeremykashel/rsscomments.aspx?PostID=7398</wfw:commentRss><comments>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/08/31/renaming-a-performancepoint-planning-server.aspx#comments</comments><description>&lt;p&gt;I had a strange situation to deal with a few weeks ago - the IT department at one of our clients wanted to rename the server that was running PerformancePoint Planning, and wanted to know if that would be ok! This was of course a bit of a worry - its not something that I&amp;#39;ve seen documented, so I wasn&amp;#39;t sure what impact it would have on models, form templates, etc.&lt;/p&gt;  &lt;p&gt;I was aware from the &lt;a href="http://technet.microsoft.com/en-us/library/bb838712.aspx" target="_blank"&gt;Planning Server Mirroring Technique&lt;/a&gt; that there are several references to the server name within the application, system and service database on a Planning Server. My first step was to follow the aforementioned mirroring technique, and to update all the necessary tables.&lt;/p&gt;  &lt;p&gt;The mirroring technique also instructs you to update the config file called PerformancePoint.config, which can be found in Program Files under \Microsoft Office PerformancePoint Server\3.0\Config\.&lt;/p&gt;  &lt;p&gt;After updating the tables/config files, everything seemed fine at first, but then I noticed a couple of problems. Although you can of course edit it, the server connection text box in PAC always defaulted to the old server name. In addition, and more of a concern, the auditing and tracing had stopped working.&lt;/p&gt;  &lt;p&gt;Getting the sever name to default correctly was taken care of quite easily by updating the following XML that&amp;#39;s found at \Program Files\Microsoft Office PerformancePoint Server\3.0\AdminConsole\Web.Config:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;add &lt;/span&gt;&lt;span style="color:red;"&gt;key&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;PerformancePointServer&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;http://SERVERNAME:46787/&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Getting the auditing/tracing to work again required a bit more digging, as you can&amp;#39;t change the &amp;#39;audit writer computer name&amp;#39; that&amp;#39;s found in the ManageAuditing.aspx page in PAC. These locked values for auditing are held in the dbo.Configuration table of PPSPlanningSystem, in an XML column, as follows:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;PerformancePoint.audit &lt;/span&gt;&lt;span style="color:red;"&gt;highLimit&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;1048576&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;pollInterval&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;60000&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;fileName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;D:\Microsoft
Office PerformancePoint Server\3.0\Audit Log\audit.log&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;writerMachineName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;font color="#0000ff"&gt;SERVERNAME&lt;/font&gt;&amp;quot; &lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;listener &lt;/span&gt;&lt;span style="color:red;"&gt;maxLength&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;10&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;maxBackup&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;9&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;writerMachineName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;SERVERNAME&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;fileName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;D:\Microsoft Office
PerformancePoint Server\3.0\Trace Log\server.log&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;format&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;single&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;FileLog&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;type&lt;/span&gt;&lt;span style="color:blue;"&gt;=
&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Microsoft.PerformancePoint.Planning.Common.Configuration.FileListenerElement, Microsoft.
PerformancePoint.Planning.Common, Version=3.0.0000.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;After updating the above values, everything returned to normal, and the auditing/tracing kicked in immediately.&lt;/p&gt;

&lt;p&gt;Finally, one thing to think about if you ever have to do this, check that no local administrators have objects checked out! As you are renaming the sever, your local admin account will belong to a different server name, meaning check outs to OldServerName\Username will be invalid.&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:36be8445-a491-4b01-b627-897fe3ba1a71" 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/PerformancePoint" rel="tag"&gt;PerformancePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/PPS" rel="tag"&gt;PPS&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7398" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/PerformancePoint/default.aspx">PerformancePoint</category></item><item><title>Troubleshooting the PEL Allocate Statement</title><link>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/08/13/troubleshooting-the-pel-allocate-statement.aspx</link><pubDate>Wed, 13 Aug 2008 22:01:15 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7383</guid><dc:creator>Jeremy Kashel</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.adatis.co.uk/blogs/jeremykashel/rsscomments.aspx?PostID=7383</wfw:commentRss><comments>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/08/13/troubleshooting-the-pel-allocate-statement.aspx#comments</comments><description>&lt;p&gt;The &lt;a href="http://msdn.microsoft.com/en-us/library/bb839191.aspx" target="_blank"&gt;PEL Allocate statement&lt;/a&gt; can sometimes throw unexpected error messages, especially when you&amp;#39;re setting up a pull or push cross model allocation rule.&lt;/p&gt;  &lt;p&gt;I&amp;#39;ve been keeping track of a few of the more obscure ones, which I&amp;#39;ve listed in the table below. Hopefully this will help anyone out there who&amp;#39;s struggling to get the cross model rules working.&lt;/p&gt;  &lt;p&gt;   &lt;table class="LightList-Accent1" style="border-right:medium none;border-top:medium none;border-left:medium none;border-bottom:medium none;border-collapse:collapse;mso-border-alt:solid windowtext .5pt;mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;mso-border-insideh:.5pt solid windowtext;mso-border-insidev:.5pt solid windowtext;" cellspacing="0" cellpadding="0" align="center"&gt;       &lt;tr style="mso-yfti-irow:-1;mso-yfti-firstrow:yes;"&gt;         &lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:windowtext 1pt solid;padding-left:5.4pt;background:#4f81bd;padding-bottom:0cm;border-left:windowtext 1pt solid;width:231.05pt;padding-top:0cm;border-bottom:windowtext 1pt solid;mso-border-alt:solid windowtext .5pt;mso-background-themecolor:accent1;"&gt;           &lt;p class="MsoNormal" style="margin-bottom:0pt;line-height:normal;mso-yfti-cnfc:5;"&gt;&lt;b&gt;&lt;span style="font-size:8pt;color:white;mso-themecolor:background1;"&gt;Error Message&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:8pt;color:white;mso-themecolor:background1;mso-bidi-font-weight:bold;"&gt; &lt;/span&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:windowtext 1pt solid;padding-left:5.4pt;background:#4f81bd;padding-bottom:0cm;border-left:medium none;width:231.05pt;padding-top:0cm;border-bottom:windowtext 1pt solid;mso-border-alt:solid windowtext .5pt;mso-background-themecolor:accent1;mso-border-left-alt:solid windowtext .5pt;"&gt;           &lt;p class="MsoNormal" style="margin-bottom:0pt;line-height:normal;mso-yfti-cnfc:1;"&gt;&lt;b&gt;&lt;span style="font-size:8pt;color:white;mso-themecolor:background1;"&gt;Solution/Explanation&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:8pt;color:white;mso-themecolor:background1;mso-bidi-font-weight:bold;"&gt; &lt;/span&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr style="mso-yfti-irow:0;"&gt;         &lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:medium none;padding-left:5.4pt;padding-bottom:0cm;border-left:windowtext 1pt solid;width:231.05pt;padding-top:0cm;border-bottom:windowtext 1pt solid;mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;           &lt;p class="MsoNormal" style="margin-bottom:0pt;line-height:normal;mso-yfti-cnfc:68;"&gt;&lt;span style="font-size:8pt;mso-bidi-font-weight:bold;"&gt;No hierarchy &amp;#8216;xyz&amp;#8217; exists in [dimension] &lt;/span&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:medium none;padding-left:5.4pt;padding-bottom:0cm;border-left:medium none;width:231.05pt;padding-top:0cm;border-bottom:windowtext 1pt solid;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;           &lt;p class="MsoNormal" style="margin-bottom:0pt;line-height:normal;mso-yfti-cnfc:64;"&gt;&lt;span style="font-size:8pt;"&gt;Check that you have specified the correct member set in the source, target and scope parts of the rule. &lt;/span&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr style="mso-yfti-irow:1;"&gt;         &lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:medium none;padding-left:5.4pt;padding-bottom:0cm;border-left:windowtext 1pt solid;width:231.05pt;padding-top:0cm;border-bottom:windowtext 1pt solid;mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;           &lt;p class="MsoNormal" style="margin-bottom:0pt;line-height:normal;mso-yfti-cnfc:4;"&gt;&lt;span style="font-size:8pt;mso-bidi-font-weight:bold;mso-ansi-language:en-us;"&gt;Member set is not defined correctly for cross model mapping. The number of members in source and target member sets in cross model mapping must match.&lt;/span&gt;&lt;span style="font-size:8pt;mso-bidi-font-weight:bold;"&gt; &lt;/span&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:medium none;padding-left:5.4pt;padding-bottom:0cm;border-left:medium none;width:231.05pt;padding-top:0cm;border-bottom:windowtext 1pt solid;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;           &lt;p class="MsoNormal" style="margin-bottom:0pt;line-height:normal;"&gt;&lt;span style="font-size:8pt;"&gt;This message can have 2 meanings. Firstly, as it suggests, it can be that the number of members in the source and target mapping arguments do not match. Or, prior to SP1, it can be this rather more serious problem - &lt;a href="http://support.microsoft.com/kb/942640"&gt;http://support.microsoft.com/kb/942640&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr style="mso-yfti-irow:2;"&gt;         &lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:medium none;padding-left:5.4pt;padding-bottom:0cm;border-left:windowtext 1pt solid;width:231.05pt;padding-top:0cm;border-bottom:windowtext 1pt solid;mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;           &lt;p class="MsoNormal" style="margin-bottom:0pt;line-height:normal;mso-yfti-cnfc:68;"&gt;&lt;span style="font-size:8pt;mso-bidi-font-weight:bold;mso-bidi-font-family:tahoma;"&gt;Execution of rule &amp;#8216;xyz&amp;#8217; failed.&lt;span style="mso-spacerun:yes;"&gt;&amp;#160; &lt;/span&gt;This may have occurred because changes have been made to the model structure without redeploying the model site. &lt;/span&gt;&lt;span style="font-size:8pt;mso-bidi-font-weight:bold;"&gt;&lt;/span&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:medium none;padding-left:5.4pt;padding-bottom:0cm;border-left:medium none;width:231.05pt;padding-top:0cm;border-bottom:windowtext 1pt solid;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;           &lt;p class="MsoNormal" style="margin-bottom:0pt;line-height:normal;mso-yfti-cnfc:64;"&gt;&lt;span style="font-size:8pt;"&gt;This can occur at execution time when you try and map two members twice. E.g. if your source is {2009, 2009} and your target is {Jan, Feb}. It doesn&amp;#8217;t like the 2009 in there twice. &lt;/span&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr style="mso-yfti-irow:3;"&gt;         &lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:medium none;padding-left:5.4pt;padding-bottom:0cm;border-left:windowtext 1pt solid;width:231.05pt;padding-top:0cm;border-bottom:windowtext 1pt solid;mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;           &lt;p class="MsoNormal" style="margin-bottom:0pt;line-height:normal;mso-yfti-cnfc:4;"&gt;&lt;span style="font-size:8pt;mso-bidi-font-weight:bold;"&gt;Each dimension scope in cross model mapping must be a list of concrete dimension members &lt;/span&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:medium none;padding-left:5.4pt;padding-bottom:0cm;border-left:medium none;width:231.05pt;padding-top:0cm;border-bottom:windowtext 1pt solid;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;           &lt;p class="MsoNormal" style="margin-bottom:0pt;line-height:normal;"&gt;&lt;span style="font-size:8pt;"&gt;Unfortunate but true &amp;#8211; you can&amp;#8217;t use relative member functions such as Descendants in the 4&lt;sup&gt;th&lt;/sup&gt; and 5&lt;sup&gt;th&lt;/sup&gt; arguments of an allocate statement. &lt;/span&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr style="mso-yfti-irow:4;"&gt;         &lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:medium none;padding-left:5.4pt;padding-bottom:0cm;border-left:windowtext 1pt solid;width:231.05pt;padding-top:0cm;border-bottom:windowtext 1pt solid;mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;           &lt;p class="MsoNormal" style="margin-bottom:0pt;line-height:normal;mso-yfti-cnfc:68;"&gt;&lt;span style="font-size:8pt;mso-bidi-font-weight:bold;"&gt;Some of the model&amp;#39;s dimension members are invalid or missing. The model may need to be redeployed. &lt;/span&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:medium none;padding-left:5.4pt;padding-bottom:0cm;border-left:medium none;width:231.05pt;padding-top:0cm;border-bottom:windowtext 1pt solid;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;           &lt;p class="MsoNormal" style="margin-bottom:0pt;line-height:normal;mso-yfti-cnfc:64;"&gt;&lt;span style="font-size:8pt;"&gt;This is a run time error that can occur when you are trying to write to non-leaf members. The first argument of the allocate statement will contain the problem, as this is where the cells to receive the allocation are specified. Often it&amp;#8217;s because &amp;#8216;this&amp;#8217; has been entered as the first argument, which could result in using non-leafs for the argument, as it will inherit any non-leafs specified in the rule&amp;#8217;s scope statement. &lt;/span&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr style="mso-yfti-irow:5;"&gt;         &lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:medium none;padding-left:5.4pt;padding-bottom:0cm;border-left:windowtext 1pt solid;width:231.05pt;padding-top:0cm;border-bottom:windowtext 1pt solid;mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;           &lt;p class="MsoNormal" style="margin-bottom:0pt;line-height:normal;mso-yfti-cnfc:4;"&gt;&lt;span style="font-size:8pt;mso-bidi-font-weight:bold;"&gt;Allocation statement must have 5 parameters when they appear in Cross Model Allocation Rule. &lt;/span&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:medium none;padding-left:5.4pt;padding-bottom:0cm;border-left:medium none;width:231.05pt;padding-top:0cm;border-bottom:windowtext 1pt solid;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;           &lt;p class="MsoNormal" style="margin-bottom:0pt;line-height:normal;"&gt;&lt;span style="font-size:8pt;"&gt;Cross model allocation rules expect 5 parameters, in the correct format. So if you don&amp;#8217;t have 5 parameters, then there&amp;#8217;s the problem. However, be careful how you specify the parameters. For example, if you specify 2 members in the source mappings, such as [Time].[Monthly].[2007], [Time].[Monthly].[2008], then be sure to enclose them in brackets, otherwise the 2&lt;sup&gt;nd&lt;/sup&gt; member will be interpreted as your 5&lt;sup&gt;th&lt;/sup&gt; argument. &lt;/span&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;        &lt;tr style="mso-yfti-irow:6;mso-yfti-lastrow:yes;"&gt;         &lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:medium none;padding-left:5.4pt;padding-bottom:0cm;border-left:windowtext 1pt solid;width:231.05pt;padding-top:0cm;border-bottom:windowtext 1pt solid;mso-border-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;           &lt;p class="MsoNormal" style="margin-bottom:0pt;line-height:normal;mso-yfti-cnfc:68;"&gt;&lt;span style="font-size:8pt;mso-bidi-font-weight:bold;"&gt;Unable to compile the cross model allocation rule. The target contains the dimension &amp;#8216;xyx&amp;#8217; but no explicit mapping has been provided. &lt;/span&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td style="border-right:windowtext 1pt solid;padding-right:5.4pt;border-top:medium none;padding-left:5.4pt;padding-bottom:0cm;border-left:medium none;width:231.05pt;padding-top:0cm;border-bottom:windowtext 1pt solid;mso-border-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;mso-border-top-alt:solid windowtext .5pt;"&gt;           &lt;p class="MsoNormal" style="margin-bottom:0pt;line-height:normal;mso-yfti-cnfc:64;"&gt;&lt;span style="font-size:8pt;"&gt;If an extra dimension(s) exists in the target model, the allocate statement requires you to specify what member you expect the data to be written to in that dimension. &lt;/span&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/table&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:0bc8b5b0-fff8-4077-9fbd-b7b3e690e62f" 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/PerformancePoint" rel="tag"&gt;PerformancePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/PPS" rel="tag"&gt;PPS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/PEL" rel="tag"&gt;PEL&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Cross%20Model%20Allocation" rel="tag"&gt;Cross Model Allocation&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7383" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/PerformancePoint/default.aspx">PerformancePoint</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/PEL/default.aspx">PEL</category></item><item><title>Using NativeSQL Business Rules for Seeding or What Ifs</title><link>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/08/05/using-nativesql-business-rules-for-seeding-or-what-ifs.aspx</link><pubDate>Tue, 05 Aug 2008 11:45:00 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7382</guid><dc:creator>Jeremy Kashel</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.adatis.co.uk/blogs/jeremykashel/rsscomments.aspx?PostID=7382</wfw:commentRss><comments>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/08/05/using-nativesql-business-rules-for-seeding-or-what-ifs.aspx#comments</comments><description>&lt;p&gt;You need to give really careful consideration to procedural business rules in PerformancePoint Planning. This is where multi-dimensional knowledge and experience helps, as you need to know whether its best to use a SQL or MDX implementation for your rules.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;User Requirements&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;One area where I&amp;#39;ve found that this is particularly relevant is user requests for procedural rules that accept parameters that are member(s) of a dimension. E.g. Lets run the rule for the selected member in the entity dimension, perhaps to carry out a what if on a particular entity. This is fine for a single member, but on occasion I&amp;#39;ve found that the users want to pick either a)a leaf level member (which is fine) or b)a non-leaf member, and for the rule to apply the logic to all descendants of that member.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Technical Problem&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;What technical problem? You can use the descendants function to achieve this right? You can with an MDX rule, but you can&amp;#39;t with a SQL rule. So, surely just use an MDX rule then?&lt;/p&gt;
&lt;p&gt;This is where you have to think relational world Vs OLAP world. Putting a statement such as &lt;span style="COLOR:black;"&gt;Descendants(&lt;/span&gt;&lt;span style="COLOR:teal;"&gt;$Entity$&lt;/span&gt;&lt;span style="COLOR:black;"&gt;, 10, &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;leaves&lt;/span&gt;&lt;span style="COLOR:black;"&gt;)&lt;/span&gt; in the scope of your rule will mean that when the rule is run, then it will always operate on the leaves of the dimension, regardless of whether you pick a leaf or non-leaf member. But the issue is that if your scope statement covers cells that have definition rules against them, then an MDX query will pick up the results of of those cells and and shove them into the fact table!&lt;/p&gt;
&lt;p&gt;So can you use the Except() function or something similar to filter out those cells that you don&amp;#39;t need? Yes you can, but not if the members start to span different levels, the compiler won&amp;#39;t let you do that. As I said, you can&amp;#39;t use a SQL implementation because using &lt;span style="COLOR:black;"&gt;Descendants(&lt;/span&gt;&lt;span style="COLOR:teal;"&gt;$Entity$&lt;/span&gt;&lt;span style="COLOR:black;"&gt;, 10, &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;leaves&lt;/span&gt;&lt;span style="COLOR:black;"&gt;)&lt;/span&gt; in the scope statement will tell you - &amp;quot;A SQL implementation is forbidden by a parameter or variable reference in a MemberSet expression unless the reference is the entire expression.&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Solution&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rules that operate on fact data should really use SQL, its quicker and avoids hitting calculated data. I&amp;#39;m sure that you&amp;#39;ve seen this coming a mile off (!), but one way to go about this is to use a NativeSQL rule.&lt;/p&gt;
&lt;p&gt;You can reference database objects in your NativeSQL rule, one of which will make it easier for you carry out descendant/hierarchy type functions in SQL itself. A function will get created in the Calc schema of your Planning application database in the format fnCalc_0_DimensionName_MemberSetName_IsAncestorOrSelf - this will occur when you deploy your model site. Using this function in conjunction with NativeSQL will allow you to get the leaves of a member quite easily.&lt;/p&gt;
&lt;p&gt;The following NativeSQL rule creates a copy of one scenario&amp;#39;s data into another scenario, which is referenced by a parameter:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:green;"&gt;--Although integers, the parameters are actually &amp;#39;members of a dimension&amp;#39; parameters
&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;create proc &lt;/span&gt;Calc&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;[sp$procedure] @scenario &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;, &lt;/span&gt;@entity &lt;span style="COLOR:blue;"&gt;int as
begin
begin transaction

    insert into &lt;/span&gt;dbo&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;[tbl$factTable] &lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;alldim$except&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;dim$Entity&lt;span style="COLOR:gray;"&gt;, &lt;/span&gt;dim$Scenario&lt;span style="COLOR:gray;"&gt;), &lt;/span&gt;dim$Entity&lt;span style="COLOR:gray;"&gt;, &lt;/span&gt;dim$Scenario&lt;span style="COLOR:gray;"&gt;,
    &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;column&lt;/span&gt;$ruleId&lt;span style="COLOR:gray;"&gt;, &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;Value&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;, &lt;/span&gt;LoadingControlID&lt;span style="COLOR:gray;"&gt;, &lt;/span&gt;bmo$CreateDateTime&lt;span style="COLOR:gray;"&gt;, &lt;/span&gt;bmo$ChangeDateTime&lt;span style="COLOR:gray;"&gt;, &lt;/span&gt;ContextID&lt;span style="COLOR:gray;"&gt;)
    &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;select &lt;/span&gt;alldim$except&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;dim$Entity&lt;span style="COLOR:gray;"&gt;, &lt;/span&gt;dim$Scenario&lt;span style="COLOR:gray;"&gt;), &lt;/span&gt;dim$Entity&lt;span style="COLOR:gray;"&gt;, &lt;/span&gt;@scenario&lt;span style="COLOR:gray;"&gt;, &lt;/span&gt;$ruleId&lt;span style="COLOR:gray;"&gt;, &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;Value&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;, -&lt;/span&gt;9&lt;span style="COLOR:gray;"&gt;, &lt;/span&gt;&lt;span style="COLOR:magenta;"&gt;getutcdate&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(),
    &lt;/span&gt;&lt;span style="COLOR:magenta;"&gt;getutcdate&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;(), -&lt;/span&gt;1
    &lt;span style="COLOR:green;"&gt;--No need to hard code the fact table name
    &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;from &lt;/span&gt;dbo&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;[tbl$factTable] t
    &lt;span style="COLOR:gray;"&gt;inner join 
    (
        &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;select &lt;/span&gt;e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;memberId &lt;span style="COLOR:blue;"&gt;from &lt;/span&gt;dbo&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;d_Entity e
        &lt;span style="COLOR:green;"&gt;--Get leaves of the member key that is in @entity
        &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;where &lt;/span&gt;Calc&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;fnCalc_0_Entity_Divisions_IsAncestorOrSelf&lt;span style="COLOR:gray;"&gt;(&lt;/span&gt;@entity&lt;span style="COLOR:gray;"&gt;, &lt;/span&gt;e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;memberid&lt;span style="COLOR:gray;"&gt;) = &lt;/span&gt;1 &lt;span style="COLOR:gray;"&gt;and 
        &lt;/span&gt;e&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;memberid &lt;span style="COLOR:gray;"&gt;not in (&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;select &lt;/span&gt;h&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;parentmemberid &lt;span style="COLOR:blue;"&gt;from &lt;/span&gt;dbo&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;H_Entity_Divisions h&lt;span style="COLOR:gray;"&gt;)
    )    &lt;/span&gt;lv &lt;span style="COLOR:blue;"&gt;on &lt;/span&gt;lv&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;memberid &lt;span style="COLOR:gray;"&gt;= &lt;/span&gt;dim$Entity
    &lt;span style="COLOR:blue;"&gt;where &lt;/span&gt;t&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;dim$Time &lt;span style="COLOR:gray;"&gt;&amp;gt;= &lt;/span&gt;200701 &lt;span style="COLOR:gray;"&gt;and &lt;/span&gt;t&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;dim$Time &lt;span style="COLOR:gray;"&gt;&amp;lt;= &lt;/span&gt;200712 &lt;span style="COLOR:gray;"&gt;and (&lt;/span&gt;dim$Scenario &lt;span style="COLOR:gray;"&gt;= &lt;/span&gt;1&lt;span style="COLOR:gray;"&gt;)

&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;if &lt;/span&gt;&lt;span style="COLOR:magenta;"&gt;@@error &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;&amp;lt;&amp;gt; &lt;/span&gt;0
&lt;span style="COLOR:blue;"&gt;rollback transaction
else
commit transaction

end&lt;/span&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;I suppose the above rule may look a little bit daunting, due to all the dollar signs everywhere. These are just the &lt;a href="http://msdn.microsoft.com/en-us/library/bb839341.aspx" target="_blank"&gt;preprocessor commands&lt;/a&gt;, which will get replaced when the stored procedure gets created. But other than that, its just an insert statement. In some cases the syntax is actually quite handy, as you can use statements such as alldim$except(), which is a short hand way of returning fact table dimension column names very easily. The idea behind the preprocessor commands is that you can protect the logic in your rule from minor structural database changes.&lt;/p&gt;
&lt;p align="left"&gt;The key is that when the rule gets run, it has normal parameters, meaning the user will see the following interface:&lt;/p&gt;
&lt;p align="center"&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/UsingNativeSQLBusinessRulesforSeedingorW_10AD1/image_2.png"&gt;&lt;img style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-RIGHT-WIDTH:0px;" height="320" alt="image" src="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/UsingNativeSQLBusinessRulesforSeedingorW_10AD1/image_thumb.png" width="234" border="0" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;In the case above, the member key of North America Operations will end up in the stored procedure, as I have a parameter in the stored procedure called @entity. Inside the stored procedure it is then used in combination with the IsAncestorOrSelf function to pick up the leaf level descendants.&lt;/p&gt;
&lt;p&gt;The only caveat that I will make is that this hasn&amp;#39;t come from a production environment, so I&amp;#39;ve skimped a bit on a few of the operational details such as deleting the existing data, decent error handling and returning the number of records affected. These are all things that you should add in if you use this kind of thing in a production environment!&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:1d4c9b0a-6844-4817-8d53-92dc2d0b86e0" 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/PerformancePoint" rel="tag"&gt;PerformancePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SQL" rel="tag"&gt;SQL&lt;/a&gt;,&lt;a href="http://technorati.com/tags/NativeSQL" rel="tag"&gt;NativeSQL&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Business%20Rules" rel="tag"&gt;Business Rules&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7382" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/PerformancePoint/default.aspx">PerformancePoint</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/SQL/default.aspx">SQL</category></item><item><title>Multiple Assumption Models in PerformancePoint</title><link>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/06/24/multiple-assumption-models-in-performancepoint.aspx</link><pubDate>Tue, 24 Jun 2008 22:02:16 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:6599</guid><dc:creator>Jeremy Kashel</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.adatis.co.uk/blogs/jeremykashel/rsscomments.aspx?PostID=6599</wfw:commentRss><comments>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/06/24/multiple-assumption-models-in-performancepoint.aspx#comments</comments><description>&lt;p&gt;PerformancePoint gives you the flexibility to have multiple assumption models to use as you please in your main models. Although this is great, I&amp;#39;ve found a problem when the two assumption models have different member sets for the same dimension, and so in an extension to my last &lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/05/08/assumption-model-design-techniques-and-business-rules.aspx" target="_blank"&gt;assumption model post&lt;/a&gt;, this post provides a workaround for the issue.&lt;/p&gt;  &lt;p&gt;Consider the following example. I&amp;#39;ve got a main model where I want to use 2 assumption models, namely:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;HR Assumptions - Uses the &lt;strong&gt;HR&lt;/strong&gt; member set from the BusinessDriver dimension; &lt;/li&gt;    &lt;li&gt;Strategic Assumptions - Uses the &lt;strong&gt;Strategic&lt;/strong&gt; member set from the BusinessDriver dimension. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;If you go and add the two assumption models to the main model at the same time, then everything looks normal, as shown in the screen shot below:&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/MultipleAssumptionsModelsinPerformancePo_9240/image_4.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="248" alt="image" src="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/MultipleAssumptionsModelsinPerformancePo_9240/image_thumb_1.png" width="356" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="left"&gt;Once you deploy successfully, you will of course want to write a business rule to pick up the assumption model data. However, when writing the rule and trying to pick from the BusinessDriver member selector, you will see that you can unfortunately only select from one member set, as shown below:&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/MultipleAssumptionsModelsinPerformancePo_9240/image_6.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="221" alt="image" src="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/MultipleAssumptionsModelsinPerformancePo_9240/image_thumb_2.png" width="478" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="left"&gt;If you need to write rules that reference specific members in both member sets, then you will be out of luck. It&amp;#39;s not even possible in any kind of native MDX rule, as the main model cube that gets created in Analysis Services only contains the dimension that has been created from the &amp;#39;HR&amp;#39; member set. It would seem that PerformancePoint just picks the member set that is first alphabetically.&lt;/p&gt;  &lt;p align="left"&gt;The workaround for this issue is simply to create a single member set that combines the two original member sets. Therefore, each assumption model will contain more members than required, but that&amp;#39;s far better than not being able to write the rules that you need.&lt;/p&gt;  &lt;p&gt;So just something to be aware of, and catch&lt;em&gt;,&lt;/em&gt; at design time - rather than in the middle of your build.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:d14c5140-c2cf-41d7-987b-5f907c3e54ad" 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/PerformancePoint" rel="tag"&gt;PerformancePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/PPS" rel="tag"&gt;PPS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Assumptions" rel="tag"&gt;Assumptions&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=6599" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/PerformancePoint/default.aspx">PerformancePoint</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/Assumptions/default.aspx">Assumptions</category></item><item><title>Executing Rule Sets in PerformancePoint to Move Data</title><link>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/05/16/executing-rule-sets-in-performancepoint-to-move-data.aspx</link><pubDate>Fri, 16 May 2008 09:15:59 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:5542</guid><dc:creator>Jeremy Kashel</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.adatis.co.uk/blogs/jeremykashel/rsscomments.aspx?PostID=5542</wfw:commentRss><comments>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/05/16/executing-rule-sets-in-performancepoint-to-move-data.aspx#comments</comments><description>&lt;p&gt;As I mentioned in my &lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/04/06/pel-allocate-statement-vs-associations.aspx" target="_blank"&gt;post&lt;/a&gt; a few weeks a ago, the PEL Allocate statement is a powerful method of moving data between PerformancePoint models.&lt;/p&gt;  &lt;p&gt;Although it&amp;#39;s powerful, the end result of an Allocate statement is simply that the destination model will contain data that has been queried from the source model. What if the destination model already contains data for the target scope? If this is the case, then you will have double counting. When creating the Allocate rule, there is unfortunately no option that lets you decide what you want to do with existing data. Ideally you need to have the &amp;#39;Existing Data&amp;#39; option that you get when running an association, which gives you the &amp;#39;Append&amp;#39;, &amp;#39;Scoped Replacement&amp;#39; and &amp;#39;Full Replacement&amp;#39; options.&lt;/p&gt;  &lt;p align="left"&gt;To get around this, I tend to place two rules inside a rule set. The first rule is a SQL implementation assignment rule with the same scope as the allocate rule, and deletes existing data by using the PEL statement this = NULL inside the rule. Then the second rule is the allocate statement, which appends the data. This is shown below:&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/ExecutingRuleSetsinPerformancePoint_76DD/image_4.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="158" alt="image" src="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/ExecutingRuleSetsinPerformancePoint_76DD/image_thumb_1.png" width="539" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="left"&gt;The idea is then to execute the rule set, which will execute each of its rules in order. The advantage to doing this is that your whole data movement process can be executed in one clean step (perhaps scheduled or via Excel), without the hassle of executing several individual rules.&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:14af93a3-f5ed-4bb5-a7d0-b7deeaa61a6e" 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/PerformancePoint" rel="tag"&gt;PerformancePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/PPS" rel="tag"&gt;PPS&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=5542" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/PerformancePoint/default.aspx">PerformancePoint</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/PEL/default.aspx">PEL</category></item><item><title>Assumption Model Design Techniques and Business Rules</title><link>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/05/08/assumption-model-design-techniques-and-business-rules.aspx</link><pubDate>Thu, 08 May 2008 13:57:05 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:5163</guid><dc:creator>Jeremy Kashel</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.adatis.co.uk/blogs/jeremykashel/rsscomments.aspx?PostID=5163</wfw:commentRss><comments>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/05/08/assumption-model-design-techniques-and-business-rules.aspx#comments</comments><description>&lt;p&gt;PerformancePoint assumption models are very useful if you want the data in one model to drive and affect another model. However, if you&amp;#8217;ve been using assumption models, then the chances are that you may have noticed that they can sometimes be a bit awkward to use. This post highlights a couple of issues that I&amp;#8217;ve experienced with assumption models, and provides a few workarounds.&lt;/p&gt;  &lt;p align="left"&gt;Firstly, when you initially link the assumption model to the main model, you may get the error message &amp;#8216;the assumption model uses different member sets for the following dimensions&amp;#8217;, as shown below:&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/PPSAssumptionModelDesignTechniques_143DC/image_2.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="132" alt="image" src="http://blogs.adatis.co.uk/blogs/jeremykashel/WindowsLiveWriter/PPSAssumptionModelDesignTechniques_143DC/image_thumb.png" width="382" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p align="left"&gt;Lets presume that you ignore this warning and continue to link to the assumption model. Further down the line, when you come to write your PEL rule to pick up the assumption model data, you may find that you get an error when validating the rule. This will occur if you want to populate a member in one member set by referencing a member in another member set, which resides in the assumption model.&lt;/p&gt;  &lt;p align="left"&gt;To illustrate this, if we want to populate an account called &amp;#8216;Total Sales&amp;#8217; in the &amp;#8216;Operational&amp;#8217; member set of the main model by using an account called &amp;#8216;Price&amp;#8217; in the &amp;#8216;Drivers&amp;#8217; member set in the assumption model, then we would have the following PEL rule:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="background:white;color:blue;"&gt;scope &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;(
&lt;/span&gt;&lt;span style="background:white;color:purple;"&gt;[Scenario].[All Members].[Forecast]&lt;/span&gt;&lt;span style="background:white;color:black;"&gt;,
&lt;/span&gt;&lt;span style="background:white;color:purple;"&gt;[Account].[Operational].[Sales]&lt;/span&gt;&lt;span style="background:white;color:black;"&gt;) ;
     
&lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;this &lt;/span&gt;&lt;span style="background:white;color:gray;"&gt;= &lt;/span&gt;&lt;span style="background:white;color:purple;"&gt;[Account].[Operational].[Volume] &lt;/span&gt;&lt;span style="background:white;color:gray;"&gt;* &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;(&lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;MODEL&lt;/span&gt;&lt;span style="background:white;color:black;"&gt;(&lt;/span&gt;&lt;span style="background:white;color:purple;"&gt;[Sales Assumptions]&lt;/span&gt;&lt;span style="background:white;color:black;"&gt;), &lt;/span&gt;&lt;span style="background:white;color:purple;"&gt;[Account].[Drivers].[Price]&lt;/span&gt;&lt;span style="background:white;color:black;"&gt;);

&lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;end scope&lt;/span&gt;&lt;span style="background:white;color:black;"&gt;;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;However, when validating this rule we get told &amp;#8220;No hierarchy Drivers exists in dimension Account&amp;#8221;. The only account member set that PerformancePoint will let you use in the above rule is &amp;#39;Operational&amp;#39;. Note: you&amp;#39;ll be ok if &amp;#39;Price&amp;#39; exists in the main model, but you will just need to refer to it as [Account].[Operational].[Price]. But if &amp;#39;Price&amp;#39; doesn&amp;#39;t exist in the main model, then a different approach is needed..... &lt;/p&gt;

&lt;p&gt;The simple way around it is to use an approach found in the Alpine Ski House sample application. Add the accounts (if that&amp;#8217;s the dimension causing you problems) into another dimension called Business Driver. You can then use the Business Driver dimension in your PEL rule, as PerformancePoint is more than happy for you to reference assumption model specific dimensions. This is shown below:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;scope &lt;/span&gt;&lt;span style="color:black;"&gt;(
&lt;/span&gt;&lt;span style="color:purple;"&gt;[Scenario].[All Members].[Forecast]&lt;/span&gt;&lt;span style="color:black;"&gt;,
&lt;/span&gt;&lt;span style="color:purple;"&gt;[Account].[Operational].[Sales]&lt;/span&gt;&lt;span style="color:black;"&gt;) ;

&lt;/span&gt;&lt;span style="color:green;"&gt;//The rule is almost identical, but validates ok as we&amp;#39;re using the BusinessDriver dimension.     
&lt;/span&gt;&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:gray;"&gt;= &lt;/span&gt;&lt;span style="color:purple;"&gt;[Account].[Operational].[Volume] &lt;/span&gt;&lt;span style="color:gray;"&gt;* &lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:blue;"&gt;MODEL&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:purple;"&gt;[Sales Assumptions]&lt;/span&gt;&lt;span style="color:black;"&gt;), &lt;/span&gt;&lt;span style="color:purple;"&gt;[BusinessDriver].[Drivers].[Price]&lt;/span&gt;&lt;span style="color:black;"&gt;);

&lt;/span&gt;&lt;span style="color:blue;"&gt;end scope&lt;/span&gt;&lt;span style="color:black;"&gt;;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Another problem that you may experience is when you have a difference in granularity between member sets used in the assumption model and the main model. For example, you may have an Entity member set called &amp;#8216;Regional&amp;#8217; used in the assumption model, but a more detailed member set used for the Entity dimension in the main model.&lt;/p&gt;

&lt;p&gt;So in the above example, we want to populate members in the more detailed &amp;#39;Company&amp;#39; member set by using a value from the member&amp;#39;s parent in the higher level &amp;#39;Regional&amp;#39; member set. In order to do this, we can just use the Parent function on the current member of the main model&amp;#39;s entity member set. Even though we&amp;#39;ve referenced the main model member set inside the MODEL function, if the current member&amp;#39;s parent exists in the assumption model, then it will pick it up without any problems:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;scope &lt;/span&gt;&lt;span style="color:black;"&gt;(
&lt;/span&gt;&lt;span style="color:purple;"&gt;[Scenario].[All Members].[Forecast]&lt;/span&gt;&lt;span style="color:black;"&gt;,
&lt;/span&gt;&lt;span style="color:purple;"&gt;[Account].[Operational].[Sales],
&lt;/span&gt;&lt;span style="color:black;"&gt;Descendants(&lt;/span&gt;&lt;span style="color:purple;"&gt;[Entity].[Company].[TOT]&lt;/span&gt;&lt;span style="color:black;"&gt;, 1073741823, &lt;/span&gt;&lt;span style="color:blue;"&gt;leaves&lt;/span&gt;&lt;span style="color:black;"&gt;)) ;
     
&lt;/span&gt;&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:gray;"&gt;= &lt;/span&gt;&lt;span style="color:purple;"&gt;[Account].[Operational].[Volume] &lt;/span&gt;&lt;span style="color:gray;"&gt;* 
      &lt;/span&gt;&lt;span style="color:green;"&gt;//Its ok here to use [Dimension].[Main Model Member Set].CurrentMember.Parent
      &lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:blue;"&gt;MODEL&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:purple;"&gt;[Sales Assumptions]&lt;/span&gt;&lt;span style="color:black;"&gt;), &lt;/span&gt;&lt;span style="color:purple;"&gt;[Entity].[Company]&lt;/span&gt;&lt;span style="color:gray;"&gt;.&lt;/span&gt;&lt;span style="color:black;"&gt;CurrentMember&lt;/span&gt;&lt;span style="color:gray;"&gt;.&lt;/span&gt;&lt;span style="color:black;"&gt;Parent,
      &lt;/span&gt;&lt;span style="color:purple;"&gt;[BusinessDriver].[Drivers].[Price]&lt;/span&gt;&lt;span style="color:black;"&gt;)

&lt;/span&gt;&lt;span style="color:blue;"&gt;end scope&lt;/span&gt;&lt;span style="color:black;"&gt;;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;So both very simple design techniques, but it&amp;#8217;s worth being aware of them before you actually start building your models.&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:6b6042cd-b333-49fa-8be1-119f76c5d75a" 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/Assumptions" rel="tag"&gt;Assumptions&lt;/a&gt;,&lt;a href="http://technorati.com/tags/PerformancePoint" rel="tag"&gt;PerformancePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/PPS" rel="tag"&gt;PPS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/PEL" rel="tag"&gt;PEL&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=5163" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/PerformancePoint/default.aspx">PerformancePoint</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/PEL/default.aspx">PEL</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/Assumptions/default.aspx">Assumptions</category></item><item><title>Intercompany Eliminations Video for PerformancePoint Planning</title><link>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/04/30/intercompany-eliminations-video-for-performancepoint-planning.aspx</link><pubDate>Wed, 30 Apr 2008 18:33:47 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:4769</guid><dc:creator>Jeremy Kashel</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.adatis.co.uk/blogs/jeremykashel/rsscomments.aspx?PostID=4769</wfw:commentRss><comments>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/04/30/intercompany-eliminations-video-for-performancepoint-planning.aspx#comments</comments><description>&lt;p&gt;Useful post on Norm&amp;#39;s PerformancePoint Server Blog showing a short video on how to do intercompany eliminations in PerformancePoint.&lt;/p&gt;  &lt;p&gt;The video is actually by Forrest Dermid, who sets the scene by explaining why you would actually want to do an intercompany elimination. He then goes on to show the relevant areas of Planning Business Modeler, demonstrating in detail the changes that you need to make to your account dimension and model properties, amongst others.&lt;/p&gt;  &lt;p&gt;Really worth watching in my opinion. You can find it &lt;a href="http://blogs.msdn.com/normbi/archive/2008/04/30/pps-planning-intercompany-eliminations-for-a-financial-model.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c1d48427-0602-4192-b9f5-c34280b1bfa5" 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/PerformancePoint" rel="tag"&gt;PerformancePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Intercompany" rel="tag"&gt;Intercompany&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=4769" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/PerformancePoint/default.aspx">PerformancePoint</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/Intercompany/default.aspx">Intercompany</category></item><item><title>PerformancePoint Planning Performance Tuning White Paper</title><link>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/04/15/performancepoint-planning-performance-tuning-white-paper.aspx</link><pubDate>Tue, 15 Apr 2008 15:38:00 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:3775</guid><dc:creator>Jeremy Kashel</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.adatis.co.uk/blogs/jeremykashel/rsscomments.aspx?PostID=3775</wfw:commentRss><comments>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/04/15/performancepoint-planning-performance-tuning-white-paper.aspx#comments</comments><description>&lt;p&gt;A PerformancePoint Planning white paper has recently been published that documents the performance and scalability of Planning Server.&lt;/p&gt;
&lt;p&gt;Included are some very interesting test results that will come in handy when planning the deployment of PPS for a large number of users. There are also a few tips for the Excel add-in and configuration of the Planning Server.&lt;/p&gt;
&lt;p&gt;The following page contains links to both&amp;nbsp;the new Planning white paper and also&amp;nbsp;to a&amp;nbsp;Monitoring white paper that was published a while ago:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://technet.microsoft.com/en-us/library/bb660521.aspx"&gt;http://technet.microsoft.com/en-us/library/bb660521.aspx&lt;/a&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:42b35534-f74e-4af7-9096-06baf50136b3" 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/PerformancePoint" rel="tag"&gt;PerformancePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Planning" rel="tag"&gt;Planning&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Scalability" rel="tag"&gt;Scalability&lt;/a&gt;,&lt;a href="http://technorati.com/tags/PPS" rel="tag"&gt;PPS&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=3775" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/PerformancePoint/default.aspx">PerformancePoint</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/White+Papers/default.aspx">White Papers</category></item><item><title>PEL Allocate Statement Vs Associations</title><link>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/04/06/pel-allocate-statement-vs-associations.aspx</link><pubDate>Sun, 06 Apr 2008 22:33:00 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:3382</guid><dc:creator>Jeremy Kashel</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.adatis.co.uk/blogs/jeremykashel/rsscomments.aspx?PostID=3382</wfw:commentRss><comments>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/04/06/pel-allocate-statement-vs-associations.aspx#comments</comments><description>&lt;p&gt;PerformancePoint provides you with a few options when you want to move data between models, the most obvious of which is Associations. However, there is also the powerful PEL Allocate statement....&lt;/p&gt;
&lt;p&gt;So which method should you use to move data? Associations are very easy to setup and will transfer your data for you - all out of the box. However, they do have a few limitations, namely:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can only apply a minimum, maximum or total aggregation to the source data; &lt;/li&gt;
&lt;li&gt;You can&amp;#39;t have parameters to dynamically select members;&lt;/li&gt;
&lt;li&gt;If you delete a dimension that&amp;#39;s used in an association, then you can&amp;#39;t view or edit the association. Although there should hopefully be no need to do this in production(!), it can be a bit annoying during development.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;By writing a PEL Data Movement rule of type PushCrossModelAllocation or PullCrossModelAllocation, we get bit more flexibility. With the PEL Allocate statement you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use PEL functions or operators to alter the source value that gets written to the target model; &lt;/li&gt;
&lt;li&gt;Similarly, apply a ratio to the source value so that we only transfer the relevant portion of the whole data value. E.g. we can transfer 20% of head office costs; &lt;/li&gt;
&lt;li&gt;Use rule parameters to dynamically select members. &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;So if you find that Associations don&amp;#39;t quite do what you need, then how do you use a PEL Allocate rule? The following is an example of a simple PushCrossModelAllocation PEL Allocate statement:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;scope 
&lt;/span&gt;&lt;span style="COLOR:black;"&gt;(
  &lt;/span&gt;&lt;span style="COLOR:teal;"&gt;$TransferScenario$&lt;/span&gt;&lt;span style="COLOR:black;"&gt;,
  &lt;/span&gt;&lt;span style="COLOR:purple;"&gt;[Time].[Monthly].[All]&lt;/span&gt;&lt;span style="COLOR:gray;"&gt;.&lt;/span&gt;&lt;span style="COLOR:black;"&gt;LeafMembers,
  &lt;/span&gt;&lt;span style="COLOR:purple;"&gt;[Organisation].[Europe].[France]&lt;/span&gt;&lt;span style="COLOR:black;"&gt;,
  &lt;/span&gt;&lt;span style="COLOR:purple;"&gt;[Account].[All Members].[Total Cost]&lt;/span&gt;&lt;span style="COLOR:black;"&gt;
&lt;/span&gt;&lt;span style="COLOR:black;"&gt;) ;
     
  &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;Allocate
  &lt;/span&gt;&lt;span style="COLOR:black;"&gt;(
    &lt;/span&gt;&lt;span style="COLOR:green;"&gt;//The scope of cells that will receive the data
    //The this keyword indicates the target is the same cells as defined in the scope
    &lt;/span&gt;&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;&lt;span style="COLOR:black;"&gt;,
    &lt;/span&gt;&lt;span style="COLOR:green;"&gt;//The source value. If its the same as the scope then we just use ()
    //Or we can apply a simple calculation
    &lt;/span&gt;&lt;span style="COLOR:purple;"&gt;[Account].[All Members].[Volume] &lt;/span&gt;&lt;span style="COLOR:gray;"&gt;* &lt;/span&gt;&lt;span style="COLOR:purple;"&gt;[Account].[All Members].[Cost Per Unit]&lt;/span&gt;&lt;span style="COLOR:black;"&gt;,
    &lt;/span&gt;&lt;span style="COLOR:green;"&gt;//The scaling ratio that gets applied to the source value
    //0.2 indicates that we only want to apply a fraction of the source value
    &lt;/span&gt;&lt;span style="COLOR:black;"&gt;0.2,
    &lt;/span&gt;&lt;span style="COLOR:green;"&gt;//The last two arguments are only relevant for Push and PullCrossModelAllocation
    //They specify the mappings between the source and target members
    //Here I want France (in the source) to be mapped to France (in the target)
    &lt;/span&gt;&lt;span style="COLOR:black;"&gt;(
      &lt;/span&gt;&lt;span style="COLOR:purple;"&gt;[Organisation].[Europe].[France]  
    &lt;/span&gt;&lt;span style="COLOR:black;"&gt;),
    (
      &lt;/span&gt;&lt;span style="COLOR:purple;"&gt;[Organisation].[Group].[France]
    &lt;/span&gt;&lt;span style="COLOR:black;"&gt;)
  ) ;

&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;end scope&lt;/span&gt;&lt;span style="COLOR:black;"&gt;;
&lt;/span&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;There are a fair few arguments to the Allocate statement, but I&amp;#39;ve found that a good way to learn what its doing is to debug the rule in order to see the MDX statement that gets generated. The MDX query that gets generated for the above PEL statement is as follows:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;WITH CELL CALCULATION &lt;/span&gt;queryCalc 
&lt;span style="COLOR:blue;"&gt;FOR
 &lt;/span&gt;&lt;span style="COLOR:green;"&gt;//This part of the MDX comes from the 1st argument in the PEL statement
 &lt;/span&gt;&amp;#39;([Account].[All Members].[Account].&amp;amp;[5005],
 [Measures].[Value],
 [Scenario].[All Members].[Scenario].&amp;amp;[1],
 Descendants([Time].[Monthly].[(All)].&amp;amp;[0], 1073741823, LEAVES),
 [Organisation].[Europe].[Level 02].&amp;amp;[11])&amp;#39; 
&lt;span style="COLOR:blue;"&gt;AS
 &lt;/span&gt;&lt;span style="COLOR:green;"&gt;//This is arguments 2 and 3 of the PEL Allocate statement
 //Namely the simple A*B calculation and then multiplying the value by the ratio
 &lt;/span&gt;((([Account].[All Members].[Account].&amp;amp;[5003],[Measures].[Value]) *
 ([Account].[All Members].[Account].&amp;amp;[5004],[Measures].[Value])) * 0.2)
&lt;span style="COLOR:blue;"&gt;SELECT NON EMPTY 
 &lt;/span&gt;([Account].[All Members].[Account].&amp;amp;[5005],
 [Measures].[Value], 
 &lt;span style="COLOR:maroon;"&gt;NonEmpty&lt;/span&gt;(({[Scenario].[All Members].[Scenario].&amp;amp;[1]},
 {&lt;span style="COLOR:blue;"&gt;Descendants&lt;/span&gt;([Time].[Monthly].[(All)].&amp;amp;[0], 1073741823, &lt;span style="COLOR:blue;"&gt;LEAVES&lt;/span&gt;)},
 {[Organisation].[Europe].[Level 02].&amp;amp;[11]}))) 
 &lt;span style="COLOR:blue;"&gt;properties &lt;/span&gt;[Scenario].[All Members].&lt;span style="COLOR:blue;"&gt;Key &lt;/span&gt;,
 [Time].[Monthly].&lt;span style="COLOR:blue;"&gt;Key &lt;/span&gt;,
 [Organisation].[Europe].&lt;span style="COLOR:blue;"&gt;Key &lt;/span&gt;,
 [Account].[All Members].&lt;span style="COLOR:blue;"&gt;Key 
ON COLUMNS 
FROM &lt;/span&gt;[Europe]&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;Here we can clearly tell (as marked in the above MDX code) how the first, second and third PEL arguments translate into MDX. If you find that the allocate statement is not quite doing what you want, then its quite useful to execute the MDX within SSMS to figure out exactly how the source model is being queried.&lt;/p&gt;
&lt;p&gt;Once you&amp;#39;re finished coding your business rule it can be executed via a scheduled job, manually, or via Excel.&lt;/p&gt;
&lt;p&gt;To be fair to Associations, you&amp;#39;re probably more likely to use them&amp;nbsp;for bulk transfer of data, perhaps to facilitate cross model&amp;nbsp;consolidation -&amp;nbsp;and they&amp;#39;re&amp;nbsp;extremely useful for this purpose.&amp;nbsp;The Allocate statement is perhaps more relevant for specific pieces of data that need to be adjusted in some way before being transferred to the destination. Despite this, the Allocate statement is the more flexible method and will allow you to support more&amp;nbsp;sophisticated cross model data transfer - if it’s needed.&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:71deb226-5f21-49c0-8576-2e6fd7f2ba57" 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/PerformancePoint" rel="tag"&gt;PerformancePoint&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Allocate" rel="tag"&gt;Allocate&lt;/a&gt;,&lt;a href="http://technorati.com/tags/PEL" rel="tag"&gt;PEL&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MDX" rel="tag"&gt;MDX&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=3382" 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/PerformancePoint/default.aspx">PerformancePoint</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/PEL/default.aspx">PEL</category></item></channel></rss>