<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.adatis.co.uk/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Adatis Community</title><link>http://blogs.adatis.co.uk/blogs/</link><description>Welcome to Adatis blogs</description><dc:language>en-US</dc:language><generator>CommunityServer 2007 SP2 (Build: 20611.960)</generator><item><title>PerformancePoint Server 2007 PPSCMD GUI</title><link>http://blogs.adatis.co.uk/blogs/sachatomey/archive/2008/08/27/performancepoint-server-2007-ppscmd-gui.aspx</link><pubDate>Wed, 27 Aug 2008 21:21:38 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7394</guid><dc:creator>sachatomey</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I&amp;#39;ve built a really simple GUI for a couple of commands of the PPSCMD utility.&amp;#160; I always take far too long to work out the syntax and navigate to the appropriate directory (Yes, I ought to update the PATH environment variable) that I felt I could justify building a simple front end to help speed up the usage.&lt;/p&gt;  &lt;p&gt;So far I&amp;#39;ve only implemented the MIGRATE and REPROCESS commands - I use these quite a lot outside of any automated SSIS package so they seemed the most sensible to implement in the GUI first.&amp;#160; I do intend on extending it to encompass some of the other commands and I would welcome any feedback towards prioritisation, usage, features and the inevitable bugs.&amp;#160; It&amp;#39;s currently version 0.1 and more or less ready for &amp;#39;Community Preview&amp;#39; - there are some omissions such as full error handling and validation that I do intend on implementing over time along with the other commands.&lt;/p&gt;  &lt;p&gt;It&amp;#39;s a .NET 3.5 application so you will need to deploy it to a client where you are happy to install .NET 3.5 if it&amp;#39;s not already present.&lt;/p&gt;  &lt;p&gt;You can download version 0.1 from &lt;a href="http://blogs.adatis.co.uk/files/" target="_blank"&gt;here&lt;/a&gt; - (You will need to create a login first)&lt;/p&gt;  &lt;p&gt;Below are the screen shots:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Migrate&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The migrate command: both import and export variations can be set and executed directly from the GUI.&amp;#160; In addition, the command line is generated so you can cut and paste into a command window, batch file or SSIS package.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointServer2007PPSCMDGUI_13935/image_8.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="453" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointServer2007PPSCMDGUI_13935/image_thumb_3.png" width="502" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Reprocess&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Need to reprocess a model quickly?&amp;#160; Rather than wait for PBM/SSMS to open you can reprocess a model directly from the GUI.&amp;#160; Just like Migrate, the command is generated for cut and paste.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointServer2007PPSCMDGUI_13935/image_10.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="453" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointServer2007PPSCMDGUI_13935/image_thumb_4.png" width="502" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Console&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Any output you would normally see in the command window is reported in the console as the command is being executed.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointServer2007PPSCMDGUI_13935/image_14.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="453" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointServer2007PPSCMDGUI_13935/image_thumb_6.png" width="502" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Log&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;You can enable logging to a log file of your choice to record all commands processed through the GUI.&amp;#160; Useful for additional auditing and for creating batch files of multiple PPSCMD operations.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointServer2007PPSCMDGUI_13935/image_16.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="453" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointServer2007PPSCMDGUI_13935/image_thumb_7.png" width="502" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Preferences&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Preferences and options are set on the preferences dialog.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointServer2007PPSCMDGUI_13935/image_18.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="300" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointServer2007PPSCMDGUI_13935/image_thumb_8.png" width="564" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7394" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/Utilities/default.aspx">Utilities</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/PerformancePoint/default.aspx">PerformancePoint</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/.Net+3.5/default.aspx">.Net 3.5</category></item><item><title>Slow report in Reporting Services, even though the stored procedure runs so quickly?</title><link>http://blogs.adatis.co.uk/blogs/martynbullerwell/archive/2008/08/27/slow-report-in-reporting-services-even-though-the-stored-procedure-runs-so-quickly.aspx</link><pubDate>Wed, 27 Aug 2008 16:52:03 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7392</guid><dc:creator>Martyn Bullerwell</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Apologies for the long title, however it had to be said.&amp;#160; I have been working with Reporting Services recently, with very complex reports, not from a reporting services point of view, but from a T-SQL stored procedure aspect.&amp;#160; The query in question is over 1500 lines long, and needs to perform well when the report is run.&amp;#160; So with a little bit of performance tuning we managed to get said stored procedure to run in under 4 seconds (on a fairly powerful box).&amp;#160; However as soon as this was run through Reporting Services, the performance ground to a halt.&amp;#160; We are talking about 1 minute 30 seconds to run this report. So after a little help from my friends (thanks to Tim for finding &lt;a href="http://www.lockergnome.com/sqlsquirrel/2007/12/14/victim-of-parameter-sniffing/" target="_blank"&gt;this&lt;/a&gt; blog) we found that this was the exact problem.&amp;#160; &lt;/p&gt;  &lt;p&gt;So - its all down to &amp;quot;Parameter Sniffing&amp;quot; !!&amp;#160; But what on earth is parameter sniffing, and how does it help/hinder us? &lt;/p&gt;  &lt;p&gt;As taken from a Microsoft white paper:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;quot;Parameter sniffing&amp;quot; refers to a process whereby SQL Server&amp;#39;s execution environment &amp;quot;sniffs&amp;quot; the current parameter values during compilation or recompilation, and passes it along to the query optimizer so that they can be used to generate potentially faster query execution plans. The word &amp;quot;current&amp;quot; refers to the parameter values present in the statement call that caused a compilation or a recompilation.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Just a bit of &amp;quot;Googling&amp;quot; will get you many more resources on the subject, and well worth reading. &lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7392" width="1" height="1"&gt;</description></item><item><title>SQL Server 2008 Intellisense</title><link>http://blogs.adatis.co.uk/blogs/martynbullerwell/archive/2008/08/26/sql-server-2008-intellisense.aspx</link><pubDate>Tue, 26 Aug 2008 20:44:32 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7391</guid><dc:creator>Martyn Bullerwell</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;One of the under mentioned, but long awaited feature of SQL Server 2008 is intellisense.&amp;#160; Up to now it has always been add on available from companies like RedGate, called &lt;a href="http://www.red-gate.com/products/SQL_Prompt/index.htm?gclid=CMienPKnrJUCFQpYQgod7ld-jw"&gt;SQL Prompt&lt;/a&gt;, or &lt;a href="http://roundpolygons.com/"&gt;SQL Assist&lt;/a&gt;.&amp;#160; To get it working is SQL 2008; you pretty much have to do nothing, however sometimes it doesn&amp;#39;t come up without pressing Ctrl + Space.&amp;#160; So it works well with T-SQL, however does it work with MDX?&amp;#160; In short - not really, when writing an MDX query in SSMS, you do get some intellisense prompts, however none of which are representations of the data within the cube.&amp;#160; However you do get keyword prompts, which could be useful.&amp;#160; So next stop, full intellisense for MDX queries - hopefully. &lt;/p&gt;  &lt;p&gt;For those of you who haven&amp;#39;t yet used SQL 2008, here are some screen shot of intellisense in action. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/martynbullerwell/WindowsLiveWriter/SQLServer2008Intellisense_11C72/image_2.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="146" alt="image" src="http://blogs.adatis.co.uk/blogs/martynbullerwell/WindowsLiveWriter/SQLServer2008Intellisense_11C72/image_thumb.png" width="313" border="0" /&gt;&lt;/a&gt; &lt;a href="http://blogs.adatis.co.uk/blogs/martynbullerwell/WindowsLiveWriter/SQLServer2008Intellisense_11C72/image_4.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="145" alt="image" src="http://blogs.adatis.co.uk/blogs/martynbullerwell/WindowsLiveWriter/SQLServer2008Intellisense_11C72/image_thumb_1.png" width="421" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:97c060f9-ae03-4cfc-b32a-86deec161671" 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/SQL%20Server%202008" rel="tag"&gt;SQL Server 2008&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Intellisense" rel="tag"&gt;Intellisense&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7391" width="1" height="1"&gt;</description></item><item><title>Exploring the PerformancePoint Planning Web Service Part 2</title><link>http://blogs.adatis.co.uk/blogs/martynbullerwell/archive/2008/08/23/exploring-the-performancepoint-planning-web-service-part-2.aspx</link><pubDate>Sat, 23 Aug 2008 13:38:02 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7389</guid><dc:creator>Martyn Bullerwell</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Sorry for those who have been waiting for this, but here it finally is, Part 2 of using the planning web service.&amp;#160; In &lt;a href="http://blogs.adatis.co.uk/blogs/martynbullerwell/archive/2008/06/30/exploring-the-performancepoint-planning-webservice.aspx" target="_blank"&gt;Part 1&lt;/a&gt; we looked at the Web services exposed by PerformancePoint Planning. We also looked at the difficulties of de-serializing the XML, into the the object that are generated from the WSDL.&amp;#160; Today we will look into how to get the BizSystem information from the web service. &lt;/p&gt;  &lt;p&gt;Firstly lets remind ourselves what we are looking to get from the web service. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/martynbullerwell/WindowsLiveWriter/ExploringthePerformancePointPlanningWebS_AB49/GetSystem_2.jpg"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="307" alt="GetSystem" src="http://blogs.adatis.co.uk/blogs/martynbullerwell/WindowsLiveWriter/ExploringthePerformancePointPlanningWebS_AB49/GetSystem_thumb.jpg" width="709" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;As we can see form XML document we have a node called Applications which contains an ArrayOfBizApplications, which contains, in this case 2 BizApplications.&amp;#160; In turn if we try and use the object created from the WSDL in code, we find that we have an object called BizSystem.&amp;#160; Lets have a look at this object.&amp;#160; &lt;/p&gt;  &lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;   &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;public partial class BizSystem : MetadataObjectBase {
     
     private System.Data.DataSet applicationsField;
     
     /// &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;remarks&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
     public System.Data.DataSet Applications {
         get {
             return this.applicationsField;
         }
         set {
             this.applicationsField = value;
         }
     }
 }

public abstract partial class MetadataObjectBase {
       
       private string nameField;
       
       private string descriptionField;
       
       private IdRef bizTypeIdRefField;
       
       private System.Guid idField;
       
       private string labelField;
       
       private System.Guid parentIdField;
       
       /// &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;remarks&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
       public string Name {
           get {
               return this.nameField;
           }
           set {
               this.nameField = value;
           }
       }
       
       /// &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;remarks&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
       public string Description {
           get {
               return this.descriptionField;
           }
           set {
               this.descriptionField = value;
           }
       }
       
       /// &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;remarks&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
       public IdRef BizTypeIdRef {
           get {
               return this.bizTypeIdRefField;
           }
           set {
               this.bizTypeIdRefField = value;
           }
       }
       
       /// &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;remarks&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
       [System.Xml.Serialization.XmlAttributeAttribute()]
       public System.Guid Id {
           get {
               return this.idField;
           }
           set {
               this.idField = value;
           }
       }
       
       /// &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;remarks&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
       [System.Xml.Serialization.XmlAttributeAttribute()]
       public string Label {
           get {
               return this.labelField;
           }
           set {
               this.labelField = value;
           }
       }
       
       /// &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;remarks&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
       [System.Xml.Serialization.XmlAttributeAttribute()]
       public System.Guid ParentId {
           get {
               return this.parentIdField;
           }
           set {
               this.parentIdField = value;
           }
       }
   }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;As we can see, the BizSystem contains one property, that is BizApplication, which is quite simply a DataSet.&amp;#160; We can see from the XML that the Biz Application is unlikely to be able to be de-serialized into a dataset, and when we do try and access the dataset, we do not get any data tables contained within the dataset, nor any data from the XML.&lt;/p&gt;

&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;private void LoadBizSystem()
      {
          MetaDataManager.MetadataManagerWebService ppsMDM = new MetaDataManager.MetadataManagerWebService();

          System.Net.CredentialCache myCredentials = new System.Net.CredentialCache();
          NetworkCredential netCred = new NetworkCredential(&amp;quot;Administrator&amp;quot;, &amp;quot;LetMeIn&amp;quot;, &amp;quot;AServer&amp;quot;);
          myCredentials.Add(new Uri(ppsMDM.Url), &amp;quot;Basic&amp;quot;, netCred);
          ppsMDM.Credentials = myCredentials;

          MetaDataManager.BizSystem bizSystem = ppsMDM.GetSystem(false);

          DataSet ds = bizSystem.Applications;
          DataTable dt = ds.Tables[0];
      }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Although not necessarily the best way, what we can do is write a custom class that the XML can be de-serialized to, thus giving us the data from the Biz System. To begin with we need to create an object that will allow us to de-serialize the BizSystem into it, and therefore allowing us to access the properties of the BizSystem.&amp;#160; From the XML we can work out that there are a number of attributes, and to keep this simple we will just prove that we can get the data from the BizSystem; these are: &lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Name &lt;/li&gt;

  &lt;li&gt;Id &lt;/li&gt;

  &lt;li&gt;Label &lt;/li&gt;

  &lt;li&gt;ParentId &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Creating this object will allow us to retrieve the the attributes of a BizApplication. The object can be created as follows: &lt;/p&gt;

&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;[XmlRoot(&amp;quot;BizApplication&amp;quot;)]
    [Serializable]
    public class BizApplication
    {
        private string element_Name;
        private string attribute_id;
        private string attribute_Label;
        private string attribute_ParentId;

        [XmlElement(&amp;quot;Name&amp;quot;)]
        public string Name
        {
            get { return element_Name; }
            set { element_Name = value; }
        }

        [XmlAttribute(&amp;quot;Id&amp;quot;)]
        public string Id
        {
            get { return attribute_id; }
            set { attribute_id = value; }
        }

        [XmlAttribute(&amp;quot;Label&amp;quot;)]
        public string Label
        {
            get { return attribute_Label; }
            set { attribute_Label = value; }
        }

        [XmlAttribute(&amp;quot;ParentId&amp;quot;)]
        public string ParentId
        {
            get { return attribute_ParentId; }
            set { attribute_ParentId = value; }
        }

    }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;This object will allow us to gain access the the 4 attributes named above, however, the BizApplication are is contained in an array of applications, so we need to create another object that contains an array of BizApplications. Also in this object we can embed the de-serialization routine, and create a method that takes an XML Document of BizSystem, to de-serialize.&amp;#160; So we need to get the XML returned from the web service, as opposed to the attempted de-serialized version.&amp;#160; So we need to alter what the call to biz system returns.&amp;#160; Now this is a bit of a hack, however I can assure you that it does work.&amp;#160; We need to change the object that is returned from the web service, so if we go to the definition of Biz System, and alter the reference so it returns an XmlNode[].&amp;#160; &lt;/p&gt;

&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;[System.CodeDom.Compiler.GeneratedCodeAttribute(&amp;quot;System.Xml&amp;quot;, &amp;quot;2.0.50727.3031&amp;quot;)]
   [System.SerializableAttribute()]
   [System.Diagnostics.DebuggerStepThroughAttribute()]
   [System.ComponentModel.DesignerCategoryAttribute(&amp;quot;code&amp;quot;)]
   [System.Xml.Serialization.XmlTypeAttribute(Namespace=&amp;quot;http://www.microsoft.com/PerformancePoint/MetadataManager&amp;quot;)]
   public partial class BizSystem : MetadataObjectBase {

       private System.Xml.XmlNode[] applicationsField;
       
       /// &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;remarks&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
       public System.Xml.XmlNode[] Applications
       {
           get {
               return this.applicationsField;
           }
           set {
               this.applicationsField = value;
           }
       }
   }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;So now we have the object returned as an XmlNode, so its time to write the ArrayOfBizApplications object, and the de-serialize method. &lt;/p&gt;

&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;[Serializable]
    [XmlRoot(&amp;quot;ArrayOfBizApplication&amp;quot;)]
    public class ArrayOfBizApplication
    {
        private BizApplication[] element_BizApplicationList;
        
        [XmlElement(&amp;quot;BizApplication&amp;quot;)]
        public BizApplication[] BizApplication
        {
            get { return element_BizApplicationList; }
            set { element_BizApplicationList = value; }
        }

        public static ArrayOfBizApplication LoadApplications(BizSystem bizSystem)
        {
            //Get the Applicaiotn list as an object. 
                Object bizApplication = null;
                ArrayOfBizApplication arrayOfBizApplicaion = null;
                try
                {
                    bizApplication = bizSystem.Applications;
                }
                catch (Exception err)
                {
                    //Log Exceltion here.. 
                    //Try and Cast it! (Untested)
                    bizApplication = (Object)bizSystem.Applications;
                }

                //We know this is an XML object - it has come back from the webservice
                XmlNode[] xmlNodes = (XmlNode[])bizApplication;

                StringBuilder sb = new StringBuilder();

                sb.Append(&amp;quot;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ArrayOfBizApplication&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&amp;quot;);
                //We Only want an array of BizApplicaiotoins
                foreach (XmlNode xmlNode in xmlNodes)
                {
                    if (xmlNode.Name.ToLower() == &amp;quot;arrayofbizapplication&amp;quot;)
                    {
                        sb.Append(xmlNode.InnerXml.ToString());
                    }
                }
                sb.Append(&amp;quot;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;ArrayOfBizApplication&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&amp;quot;);

                XmlSerializer serializer;

                System.IO.StringReader sr = new System.IO.StringReader(sb.ToString());
                XmlTextReader xmlTReader = new XmlTextReader(sr);

                try
                {
                    serializer = new XmlSerializer(typeof(ArrayOfBizApplication));
                    arrayOfBizApplicaion = (ArrayOfBizApplication)serializer.Deserialize(xmlTReader);
                }
                catch (Exception err)
                {
                    string test = err.Message;
                    throw err;
                }

                finally
                {
                    //Close the reader. 
                    xmlTReader.Close();
                }
                // return the list of BizApplication.
            return arrayOfBizApplicaion;
            }
    }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;We finally have some data from the Get System, we can browse our objects, which has some basic data within them. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/martynbullerwell/WindowsLiveWriter/ExploringthePerformancePointPlanningWebS_AB49/image_2.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="150" alt="image" src="http://blogs.adatis.co.uk/blogs/martynbullerwell/WindowsLiveWriter/ExploringthePerformancePointPlanningWebS_AB49/image_thumb.png" width="393" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Upon more investigation and examination of the XML that is returned you can easily extend these objects to return as much data as you require from Biz System.&amp;#160; If you have any questions, or have had more success with the Planning Web service please contact me.&amp;#160; For now, I hope to make more progress with the web service over the coming months. &lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7389" width="1" height="1"&gt;</description></item><item><title>PerformancePoint Monitoring Web Service - Part 3</title><link>http://blogs.adatis.co.uk/blogs/timkent/archive/2008/08/22/performancepoint-monitoring-web-service-part-3.aspx</link><pubDate>Fri, 22 Aug 2008 16:47:23 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7386</guid><dc:creator>Tim Kent</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;In &lt;a href="http://blogs.adatis.co.uk/blogs/timkent/archive/2008/05/29/performancepoint-monitoring-web-service-part-1.aspx"&gt;Part 1&lt;/a&gt; we looked at the basics of connecting to web service and retrieving the metadata.&amp;#160; &lt;a href="http://blogs.adatis.co.uk/blogs/timkent/archive/2008/07/24/performancepoint-monitoring-web-service-part-2.aspx"&gt;Part 2&lt;/a&gt; looked at how to create a datasource first class object (FCO) and the quirks of the &amp;quot;well known&amp;quot; properties (thanks to &lt;a href="http://blogs.msdn.com/wadedor/archive/2008/07/24/working-with-pmservice-s-wsdl-generated-classes.aspx" target="_blank"&gt;Wade Dorrell&lt;/a&gt; for the feedback and for raising a usability bug for the next version).&amp;#160; In this post we&amp;#39;ll look at how to create one of the other FCO&amp;#39;s - in this case a report though as you can imagine the process for creating a KPI (the other &amp;quot;singular&amp;quot; FCO) is similar.&lt;/p&gt;  &lt;p&gt;Once again, its not too hard to work out that we&amp;#39;ll need to use the &lt;strong&gt;CreateReportView&lt;/strong&gt; function and as before we&amp;#39;ll create a ReportView object in our code that will get passed to the function once we&amp;#39;ve set up all the properties.&amp;#160; &lt;/p&gt;  &lt;div&gt;   &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; PPSM.ReportView CreateReport(PPSM.PmService mon)
    {
        &lt;span style="color:#008000;"&gt;//declare our reportview object&lt;/span&gt;
        PPSM.ReportView rep = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PPSM.ReportView();
        &lt;span style="color:#008000;"&gt;//set the guid for our object - this gets used as the primary key in the db table&lt;/span&gt;
        rep.Guid = System.Guid.NewGuid();&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;We know how to set the &amp;quot;well known&amp;quot; properties from part 2 and it&amp;#39;s exactly the same process here (including the identifier) so it makes sense to create a re-usable function to do this for all our FCO&amp;#39;s&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; PPSM.BpmProperty[] SetWellKnownProperties(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; name, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; description, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; owner)
    {
        &lt;span style="color:#008000;"&gt;//declare the three individual property types for the property array&lt;/span&gt;
        PPSM.BpmPropertyText bpmName = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PPSM.BpmPropertyText();
        PPSM.BpmPropertyLongText bpmDesc = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PPSM.BpmPropertyLongText();
        PPSM.BpmPropertyUser bpmOwner = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PPSM.BpmPropertyUser();

        &lt;span style="color:#008000;"&gt;//set some details for the properties&lt;/span&gt;
        bpmName.Text = name;
        bpmDesc.Text = description;
        bpmOwner.Login = owner;

        &lt;span style="color:#008000;"&gt;//initialise the properties array&lt;/span&gt;
        PPSM.BpmProperty[] wkprop = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PPSM.BpmProperty[3];

        &lt;span style="color:#008000;"&gt;//set the properties array with the three elements&lt;/span&gt;
        wkprop[0] = bpmName;
        wkprop[1] = bpmDesc;
        wkprop[2] = bpmOwner;

        &lt;span style="color:#008000;"&gt;//declate a GUID and set the unique id of each property&lt;/span&gt;
        wkprop[0].UniqueName = &lt;span style="color:#006080;"&gt;&amp;quot;8dd07d4d87794510afdb1f07664359bc_Element_Name&amp;quot;&lt;/span&gt;;
        wkprop[1].UniqueName = &lt;span style="color:#006080;"&gt;&amp;quot;8dd07d4d87794510afdb1f07664359bc_Element_Description&amp;quot;&lt;/span&gt;;
        wkprop[2].UniqueName = &lt;span style="color:#006080;"&gt;&amp;quot;8dd07d4d87794510afdb1f07664359bc_Element_Owner&amp;quot;&lt;/span&gt;;

        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; wkprop;
    }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Lets call the function and also set the type of report (in our case an Olap Grid).&amp;#160; All good so far....&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        &lt;span style="color:#008000;"&gt;//set the well known properties&lt;/span&gt;
        rep.Properties = SetWellKnownProperties(&lt;span style="color:#006080;"&gt;&amp;quot;My Report&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;My Rep Desc&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;Me&amp;quot;&lt;/span&gt;);
        &lt;span style="color:#008000;"&gt;//set the type&lt;/span&gt;
        rep.TypeName = &lt;span style="color:#006080;"&gt;&amp;quot;OLAPGrid&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;There are a couple more obvious properties that can be set (e.g. begin points and end points) but from here things get more complicated.&amp;#160; The majority of the important properties are stored in a single XML property of the ReportView object called &lt;strong&gt;CustomData&lt;/strong&gt;.&amp;#160; This means that you&amp;#39;ll have create and manipulate an xml document in your code that matches exactly the format required.&lt;/p&gt;

&lt;p&gt;In practical use this may preclude using purely the web service to create FCOs completely from scratch.&amp;#160; As an alternative workaround you could start from a template report stored on the server and then use and update the custom data property from that template.&amp;#160; In reality of course you are unlikely to be automating the creation of reports completely from scratch - much more likely to just be updating the report datasource for example.&amp;#160; Just for the sake of proving the concept, this is what we&amp;#39;ll do in our case.&lt;/p&gt;

&lt;p&gt;The other workaround is to code against the object model in &lt;strong&gt;Microsoft.PerformancePoint.Scorecards.Client.dll &lt;/strong&gt;rather than the WSDL of the web service.&amp;#160; This exposes the properties more clearly and is, as I understand, what happens behind the scenes in Dashboard Designer. IMHO this slightly defeats the object of a web service but I&amp;#39;m sure this will be rectified going forward.&lt;/p&gt;

&lt;p&gt;As we&amp;#39;ve already gone through the process of creating a new reportview object we&amp;#39;ll carry on down that path for this example.&amp;#160; Of course it might be simpler in reality to grab an existing reportview object using &lt;strong&gt;GetReportView&lt;/strong&gt; and simply change the required properties and assign a new guid.&amp;#160; You use the &lt;strong&gt;CreateReportView&lt;/strong&gt; function regardless of whether you are creating or updating - the existence of the object&amp;#39;s guid in the underlying database table will define which happens.&amp;#160; &lt;/p&gt;

&lt;p&gt;This function returns the customdata for an object&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; GetCustomData(PPSM.PmService mon, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; ReportID)
    {
        Guid g = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Guid(ReportID);
        PPSM.ReportView rep = mon.GetReportView(g);
        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; rep.CustomData;
    }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Next we need to declare an XMLDocument to store the customdata and call our function passing in the Guid of a known report.&amp;#160; I&amp;#39;m sure there are much cleaner ways to work with XML objects but it&amp;#39;s Friday night!!&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        &lt;span style="color:#008000;"&gt;//declare an xmldoc to hold the customdata&lt;/span&gt;
        XmlDocument custData = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; XmlDocument();

        &lt;span style="color:#008000;"&gt;//you&amp;#39;ll need to find the id of a similar type report from your PPS Monitoring database&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;//load the custom data from ana existing report into an xmldocument&lt;/span&gt;
        custData.LoadXml(GetCustomData(mon, &lt;span style="color:#006080;"&gt;&amp;quot;d8c5ffbd-c01c-409f-ab1b-d0695227049b&amp;quot;&lt;/span&gt;));&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Now obviously using the GUI of Dashboard designer it&amp;#39;s easy too grab the data source by name.&amp;#160; In code you would need to come up with a clever way of doing this or just work with knowing the guid of the datasources you want to use for the report.&amp;#160; It&amp;#39;s possible that you may have just created or updated a datasource as part of your application. &lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        &lt;span style="color:#008000;"&gt;//update the datasource elements of the customdata - quick and dirty hack!&lt;/span&gt;
        custData.DocumentElement[&lt;span style="color:#006080;"&gt;&amp;quot;QueryData&amp;quot;&lt;/span&gt;].ChildNodes[1].InnerText = &lt;span style="color:#006080;"&gt;&amp;quot;3da20613-0a02-4e6f-ad17-6a42ec4d6b62&amp;quot;&lt;/span&gt;;
        custData.DocumentElement[&lt;span style="color:#006080;"&gt;&amp;quot;QueryState&amp;quot;&lt;/span&gt;].ChildNodes[2].InnerText = &lt;span style="color:#006080;"&gt;&amp;quot;3da20613-0a02-4e6f-ad17-6a42ec4d6b62&amp;quot;&lt;/span&gt;;

        &lt;span style="color:#008000;"&gt;//and now lets pass the edited customdata to our new reportview object&lt;/span&gt;
        rep.CustomData = custData.InnerXml.ToString();&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt; Finally pass to the web service&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        &lt;span style="color:#008000;"&gt;//finally lets pass our modified reportview object to the webservice&lt;/span&gt;
        mon.CreateReportView(rep);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Updated project is on the &lt;a href="http://blogs.adatis.co.uk/files/folders/net_projects/entry7359.aspx" target="_blank"&gt;download&lt;/a&gt; site as usual and includes an example of the customdata xml for a reportview object.&amp;#160; Thanks as usual to Wade, Alyson and Tim at MS for taking the time to answer my DFQs!&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7386" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/timkent/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://blogs.adatis.co.uk/blogs/timkent/archive/tags/PerformancePoint+Monitoring/default.aspx">PerformancePoint Monitoring</category><category domain="http://blogs.adatis.co.uk/blogs/timkent/archive/tags/Web+Service/default.aspx">Web Service</category></item><item><title>PerformancePoint Planning - Currency Conversion (Triangulation)</title><link>http://blogs.adatis.co.uk/blogs/sachatomey/archive/2008/08/18/performancepoint-planning-currency-conversion-triangulation.aspx</link><pubDate>Mon, 18 Aug 2008 19:59:44 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7385</guid><dc:creator>sachatomey</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I&amp;#39;ve blogged about some of the financial consolidation elements of PerformancePoint planning before.&amp;#160; Most of the elements related to financial consolidation e.g. Share calculations, intercompany transactions etc are specific to consolidation and only implemented when performing some form of statutory consolidation.&amp;#160; Currency conversion, on the other hand, can be common to any element of PerformancePoint Planning whether it&amp;#39;s a budgeting, forecasting, planning or, in fact statutory consolidation solution.&lt;/p&gt;  &lt;p&gt;In it&amp;#39;s simplest, out of the box, form, currency conversion is pretty straightforward.&amp;#160; You need an exchange rate assumption model to hold the exchange rates and you need a financial model without shares that contains a pre-defined currency conversion rule that utilses the exchange rate assumption model.&amp;#160; You run the pre-defined rule on a set of financial data and currency conversion is calculated for you.&amp;#160; There&amp;#39;s little more to it than that.&lt;/p&gt;  &lt;p&gt;This post looks a little (and I mean a little) deeper in to currency conversion and demonstrates the triangulation features contained within PPS-P.&lt;/p&gt;  &lt;p&gt;Consider this set of exchange rates, taken from &lt;a href="http://www.xe.com"&gt;www.xe.com&lt;/a&gt; today:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointPlanningCurrencyConversi_1165F/image_2.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="389" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointPlanningCurrencyConversi_1165F/image_thumb.png" width="419" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;On the face of it, we have a few rates that allow us to convert from British Pound to Japanese Yen, US Dollar to both British Pound and Euro, and finally a rate for converting Euro to Japanese Yen.&lt;/p&gt;  &lt;p&gt;When the in-built currency conversion rule is run against, for example, a set of US financial data we can determine the British Pound equivalent.&amp;#160; The Net Profit/Loss of 110,500 USD, converted to British Pound at a rate of 53.5 British pence per dollar converts to 59,117.50 GBP - As you would expect:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointPlanningCurrencyConversi_1165F/image_4.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="353" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointPlanningCurrencyConversi_1165F/image_thumb_1.png" width="603" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;What would happen if we were to run the currency conversion rule again but this time try and convert the US Dollar figures to Japanese Yen?&amp;#160; &lt;/p&gt;  &lt;p&gt;The astute among you would point out that we don&amp;#39;t have an exchange rate for converting US Dollar to Japanese Yen.&amp;#160; The more astute among you might say that we could determine the JPY figures by first converting to GBP and then converting the GBP figures to JPY.&amp;#160; The even more astute among you might suggest that you could calculate the Japanese Yen two ways, either by first converting to GBP and then to JPY or by first converting to EUR before converting to our desired JPY.&lt;/p&gt;  &lt;p&gt;Who&amp;#39;s right?&amp;#160; Well, all of you, kind of!&lt;/p&gt;  &lt;p&gt;If I run the currency conversion job again but instead of selecting GBP as the reporting currency, I select JPY, I get the following result:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointPlanningCurrencyConversi_1165F/image_8.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="353" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointPlanningCurrencyConversi_1165F/image_thumb_3.png" width="603" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;No conversion !&amp;#160; Why - well, we don&amp;#39;t have an exchange rate set for converting USD to JPY!&lt;/p&gt;  &lt;p&gt;This is where triangulation comes in.&amp;#160; With our current set of exchange rates there are two methods for converting USD to JPY.&amp;#160; Either through GBP or EUR.&amp;#160; You set which &amp;#39;route&amp;#39; the triangulation takes by setting the model property &amp;#39;Default Currency&amp;#39;.&amp;#160; By default this is not set, hence our failed conversion above.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointPlanningCurrencyConversi_1165F/image_10.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="182" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointPlanningCurrencyConversi_1165F/image_thumb_4.png" width="755" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;However, if you were to set it to either GBP or EUR you will get some results, but there is a catch - the &amp;#39;route&amp;#39; you take returns different results.&amp;#160; Incidentally, you don&amp;#39;t have to redeploy the model when you change the property you just need to save the model.&lt;/p&gt;  &lt;p&gt;Triangulate through GBP&lt;/p&gt;  &lt;p&gt;110,500 USD at a rate of 0.535 equals 59,117.50 GBP.&amp;#160; Convert the GBP to JPY at a rate of 205.524 and that equates to 12,150,065.07 JPY.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointPlanningCurrencyConversi_1165F/image_12.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="353" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointPlanningCurrencyConversi_1165F/image_thumb_5.png" width="603" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Triangulate through EUR&lt;/p&gt;  &lt;p&gt;110,500 USD at a rate of 0.535 equals 75,029.50 EUR.&amp;#160; Convert the EUR to JPY at a rate of 162.068 and that equates to 12,159,881.006 JPY.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointPlanningCurrencyConversi_1165F/image_14.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="353" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointPlanningCurrencyConversi_1165F/image_thumb_6.png" width="603" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The two &amp;#39;routes&amp;#39; highlight a variance of 9815.936 JPY (about 90 USD)!&amp;#160; A &lt;a href="http://en.wikipedia.org/wiki/Triangle_arbitrage"&gt;triangular arbitrage&lt;/a&gt; ! &lt;/p&gt;  &lt;p&gt;So, two questions:&lt;/p&gt;  &lt;p&gt;1) Which &amp;#39;route&amp;#39; should you use?    &lt;br /&gt;That&amp;#39;s a business decision and if it&amp;#39;s going to be a common conversion then direct rates ought to be favoured over triangulation.&lt;/p&gt;  &lt;p&gt;2) How do you exploit this model to work out guaranteed triangular arbitrage to make millions through currency trading?    &lt;br /&gt;I&amp;#39;m working on it !&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7385" width="1" height="1"&gt;</description></item><item><title>Type 2 SCDs - Calculating End Date when you only have Effective Date</title><link>http://blogs.adatis.co.uk/blogs/timkent/archive/2008/08/17/type-2-scds-calculating-end-date-when-you-only-have-effective-date.aspx</link><pubDate>Sun, 17 Aug 2008 20:40:04 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7384</guid><dc:creator>Tim Kent</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Here&amp;#39;s a quick one for creating an end date column when you only have an effective date column in your data source to work with.&amp;#160; The secret is to join the table to itself with a greater than join on the effective date.&amp;#160; You then use the effective date from your joined table to give you your end date.&lt;/p&gt;  &lt;div&gt;   &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;SELECT&lt;/span&gt;     
    DT1.AccountID 
    ,DT1.EffectiveDate
    &lt;font color="#008000"&gt;--Add a default end date for current record and subtract a day so the end date is one day before the next start date  &lt;/font&gt;
    ,ISNULL(DATEADD(d,-1, DT2.EffectiveDate), &lt;span style="color:#006080;"&gt;&amp;#39;31/12/2099&amp;#39;&lt;/span&gt;) &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; EndDate 
    ,DT1.Price
&lt;span style="color:#0000ff;"&gt;FROM&lt;/span&gt;         
    dbo.PriceTable &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; DT2 
    &lt;span style="color:#0000ff;"&gt;RIGHT&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;OUTER&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;JOIN&lt;/span&gt;
        dbo.PriceTable &lt;span style="color:#0000ff;"&gt;AS&lt;/span&gt; DT1 
        DT2.AccountID = DT1.AccountID 
        &lt;span style="color:#0000ff;"&gt;AND&lt;/span&gt;
        DT2.EffectiveDate &amp;gt; DT1.EffectiveDate&lt;/pre&gt;
&lt;/div&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7384" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/timkent/archive/tags/SSIS/default.aspx">SSIS</category><category domain="http://blogs.adatis.co.uk/blogs/timkent/archive/tags/SCD/default.aspx">SCD</category><category domain="http://blogs.adatis.co.uk/blogs/timkent/archive/tags/T-SQL/default.aspx">T-SQL</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>0</slash: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>0</slash: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>The Second Annual Microsoft BI Conference, 6th-8th October 2008 - Seattle</title><link>http://blogs.adatis.co.uk/blogs/sachatomey/archive/2008/07/31/the-second-annual-microsoft-bi-conference-6th-8th-october-2008-seattle.aspx</link><pubDate>Thu, 31 Jul 2008 20:56:50 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7379</guid><dc:creator>sachatomey</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I was unable to make the &lt;a href="http://www.microsoft.com/presspass/press/2007/jan07/01-12BIConference07PR.mspx" target="_blank"&gt;first Microsoft BI Conference&lt;/a&gt; in Seattle last year but &lt;a href="http://blogs.adatis.co.uk/blogs/timkent" target="_blank"&gt;Tim&lt;/a&gt; made it, and reported that it was a great &lt;strike&gt;excuse for an extended weekend of partying and snowboarding in Whistler&lt;/strike&gt; way to meet like minded people, learn the latest buzz and feel part of the BI Community.&lt;/p&gt;  &lt;p&gt;Well, this year I can make it and I will be joining Tim and Jeremy for the duration.&amp;#160; Bad luck for me though, it&amp;#39;s too early for snow ! ;o)&lt;/p&gt;  &lt;p&gt;I&amp;#39;ve checked out the &lt;a href="http://www.msbiconference.com/pages/tracksandsessions.aspx" target="_blank"&gt;Tracks and Sessions&lt;/a&gt; and there is quite a few I&amp;#39;m up for.&amp;#160; They haven&amp;#39;t published the schedules yet so whether I can jump tracks and still fit everything will remain to be seen but here are my picks:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Business Value      &lt;br /&gt;&lt;/strong&gt;- &lt;a href="http://www.msbiconference.com/pages/Sessiondetails.aspx?sid=450" target="_blank"&gt;Emerging Trends and Technologies in the Business Intelligence Market&lt;/a&gt;     &lt;br /&gt;- &lt;a href="http://www.msbiconference.com/pages/Sessiondetails.aspx?sid=452" target="_blank"&gt;The Path to Pervasive Performance Management&lt;/a&gt;     &lt;br /&gt;- &lt;a href="http://www.msbiconference.com/pages/Sessiondetails.aspx?sid=447" target="_blank"&gt;The ROI of Performance Management&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Clients and Applications Track      &lt;br /&gt;&lt;/strong&gt;- &lt;a href="http://www.msbiconference.com/pages/Sessiondetails.aspx?sid=459" target="_blank"&gt;Advanced Office PerformancePoint Server 2007 Planning Business Rules and Calculations&lt;/a&gt;     &lt;br /&gt;- &lt;a href="http://www.msbiconference.com/pages/Sessiondetails.aspx?sid=463" target="_blank"&gt;Integrating Microsoft Dynamics Data for Planning, Analysis and Reporting in Office PerformancePoint Server 2007&lt;/a&gt;&amp;#160; &lt;br /&gt;- &lt;a href="http://www.msbiconference.com/pages/Sessiondetails.aspx?sid=469" target="_blank"&gt;The 4th Annual BI Power Hour&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Customer Track&lt;/strong&gt;     &lt;br /&gt;- &lt;a href="http://www.msbiconference.com/pages/Sessiondetails.aspx?sid=432" target="_blank"&gt;Master Data Management (MDM) Customer Roundtable&lt;/a&gt;     &lt;br /&gt;- &lt;a href="http://www.msbiconference.com/pages/Sessiondetails.aspx?sid=424" target="_blank"&gt;Successfully Implementing the Complete Microsoft BI Stack&lt;/a&gt;     &lt;br /&gt;- &lt;a href="http://www.msbiconference.com/pages/Sessiondetails.aspx?sid=433" target="_blank"&gt;The Evolution of &amp;#8220;Difference Makers&amp;#8221; at Energizer Holdings, Inc. Using Microsoft Business Intelligence&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Deployment &amp;amp; Best Practices Track&lt;/strong&gt;     &lt;br /&gt;- &lt;a href="http://www.msbiconference.com/pages/Sessiondetails.aspx?sid=446" target="_blank"&gt;Designing High Performance Cubes in SQL Server 2008 Analysis Services&lt;/a&gt;     &lt;br /&gt;- &lt;a href="http://www.msbiconference.com/pages/Sessiondetails.aspx?sid=436" target="_blank"&gt;Mastering Master Data Management&lt;/a&gt;     &lt;br /&gt;- &lt;a href="http://www.msbiconference.com/pages/Sessiondetails.aspx?sid=444" target="_blank"&gt;Office PerformancePoint Server 2007 Planning - Implementation Tips And Tricks&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Partner Track&lt;/strong&gt;     &lt;br /&gt;- &lt;a href="http://www.msbiconference.com/pages/Sessiondetails.aspx?sid=421" target="_blank"&gt;BI Unplugged - a Panel Discussion&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Platforms and Infrastructure Track      &lt;br /&gt;&lt;/strong&gt;- &lt;a href="http://www.msbiconference.com/pages/Sessiondetails.aspx?sid=470" target="_blank"&gt;Optimizing Query Performance in Microsoft SQL Server 2008 Analysis Services&lt;/a&gt;     &lt;br /&gt;- &lt;a href="http://www.msbiconference.com/pages/Sessiondetails.aspx?sid=481" target="_blank"&gt;SQL Server 2008 &amp;amp; Beyond&lt;/a&gt;     &lt;br /&gt;- &lt;a href="http://www.msbiconference.com/pages/Sessiondetails.aspx?sid=472" target="_blank"&gt;SQL Server 2008 Integration Services New Features and Enhancements&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Phew!&amp;#160; Well, after that lot I&amp;#39;m definitely gonna need a drink, so if you fancy a bevvy, hunt me down, be great to hook up !&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7379" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/Business+Intelligence/default.aspx">Business Intelligence</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/Conference/default.aspx">Conference</category></item><item><title>Reporting Services 2008 - Connection Problems</title><link>http://blogs.adatis.co.uk/blogs/martynbullerwell/archive/2008/07/31/reporting-services-2008-connection-problems.aspx</link><pubDate>Wed, 30 Jul 2008 23:05:37 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7377</guid><dc:creator>Martyn Bullerwell</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Having recently rebuilt a server entirely with &amp;quot;2008&amp;quot; technology I have a small problem with reporting services.&amp;#160; When trying to look at the Reports, I received the error:&lt;/p&gt;  &lt;p&gt;&amp;quot;The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.&amp;quot;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/martynbullerwell/WindowsLiveWriter/ReportingServices2008ConnectionProblems_14DBE/image_2.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="179" alt="image" src="http://blogs.adatis.co.uk/blogs/martynbullerwell/WindowsLiveWriter/ReportingServices2008ConnectionProblems_14DBE/image_thumb.png" width="369" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I found, that even though we are not trying to look at the secure site, the certificate causes issues.&amp;#160; For development and testing purposes I found it easiest to remove the certificate.&amp;#160; To do this perform the following steps:&lt;/p&gt;  &lt;p&gt;1. Open Reporting Services Configuration Manager &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/martynbullerwell/WindowsLiveWriter/ReportingServices2008ConnectionProblems_14DBE/image_6.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="484" alt="image" src="http://blogs.adatis.co.uk/blogs/martynbullerwell/WindowsLiveWriter/ReportingServices2008ConnectionProblems_14DBE/image_thumb_2.png" width="640" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;2. Click Web Service URL and click &amp;quot;Advanced&amp;quot; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/martynbullerwell/WindowsLiveWriter/ReportingServices2008ConnectionProblems_14DBE/image_8.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="339" alt="image" src="http://blogs.adatis.co.uk/blogs/martynbullerwell/WindowsLiveWriter/ReportingServices2008ConnectionProblems_14DBE/image_thumb_3.png" width="362" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;3. Remove the SSL certificates, both for IPv4 and IPv6 and click ok, and then Apply.&amp;#160; This will remove the SSL certificates, you should now be able to use Reporting Services 2008.&amp;#160; &lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7377" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/martynbullerwell/archive/tags/SQL+Server+2008/default.aspx">SQL Server 2008</category><category domain="http://blogs.adatis.co.uk/blogs/martynbullerwell/archive/tags/Windows+Server+2008/default.aspx">Windows Server 2008</category><category domain="http://blogs.adatis.co.uk/blogs/martynbullerwell/archive/tags/Reporting+Services/default.aspx">Reporting Services</category></item><item><title>PerformancePoint Server Planning SP1 - Clear Changes After Workflow Action</title><link>http://blogs.adatis.co.uk/blogs/sachatomey/archive/2008/07/29/performancepoint-server-planning-sp1-clear-changes-after-workflow-action.aspx</link><pubDate>Tue, 29 Jul 2008 15:10:08 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7376</guid><dc:creator>sachatomey</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;There&amp;#39;s a new workbook property that was introduced in PPS Service Pack 1.&amp;#160; The &amp;#39;Clear Changes After Workflow Action&amp;#39; effectively splats the change list for the workbook once the assignment has been submitted (either draft or final).&lt;/p&gt;  &lt;p&gt;The property can only be reached through the Report Properties dialog, and is at the workbook level:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointServerPlanningSP1ClearCh_E3AC/image_2.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="327" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointServerPlanningSP1ClearCh_E3AC/image_thumb.png" width="476" align="left" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;This property defaults to false which, under certain circumstances can hinder performance.&amp;#160; &lt;/p&gt;  &lt;p&gt;Whenever you change data on a matrix, the slice that you affected is saved to a change list.&amp;#160; You can view what&amp;#39;s on the change list by choosing &amp;#39;View -&amp;gt; Show Current Changes&amp;#39; from the PPS Add-In for Excel.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointServerPlanningSP1ClearCh_E3AC/image_8.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="169" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointServerPlanningSP1ClearCh_E3AC/image_thumb_3.png" width="197" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Here&amp;#39;s an example change list; two budget accounts for the same time period and department have been updated to the included new values.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointServerPlanningSP1ClearCh_E3AC/image_6.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="86" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointServerPlanningSP1ClearCh_E3AC/image_thumb_2.png" width="488" align="left" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The default behaviour (and the behaviour prior to SP1) is that, for the life of the assignment, the change list is maintained for every cell that is updated&amp;#160; The change list is simply appended to, so you can imagine, on a large workbook with several matrices spanning several filter slices, the change list can become quite large.&lt;/p&gt;  &lt;p&gt;Submitting the assignment effectively submits the change list for processing by the server, first updating/inserting the appropriate records into the fact table and subsequently re-processing the Analysis Services partition.&amp;#160; It follows then, that the larger the change list, the slower the submission process.&lt;/p&gt;  &lt;p&gt;Before SP1, this forever growing change list issue was resolved with little user training.&amp;#160; As part of the submission process you would invite your users to manually clear the change list:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointServerPlanningSP1ClearCh_E3AC/image_10.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="146" alt="image" src="http://blogs.adatis.co.uk/blogs/sachatomey/WindowsLiveWriter/PerformancePointServerPlanningSP1ClearCh_E3AC/image_thumb_4.png" width="203" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;By &amp;#39;Clearing Current Changes&amp;#39; you throw away the changes to the cells and have to rely on the data being safe and sound on the server.&amp;#160; This process helped keep the change list to a more manageable size thus gaining on the submission performance.&lt;/p&gt;  &lt;p&gt;The new &amp;#39;Clear Changes After Workflow Action&amp;#39; property in SP1, if set to true, will perform the &amp;#39;Clear Current Changes&amp;#39; step for you automatically.&amp;#160; This helps keep the change list lightweight (providing of course, the user regularly submits).&amp;#160; However, as I have already implied, there is one issue to be wary of; with the property set to clear changes, if your submission fails, the change list is lost and there is a real danger of losing data.&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7376" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/PerformancePoint/default.aspx">PerformancePoint</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/Excel/default.aspx">Excel</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/SP1/default.aspx">SP1</category></item><item><title>AdventureWorks for SQL Server 2008</title><link>http://blogs.adatis.co.uk/blogs/martynbullerwell/archive/2008/07/28/adventureworks-for-sql-server-2008.aspx</link><pubDate>Mon, 28 Jul 2008 22:55:20 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7374</guid><dc:creator>Martyn Bullerwell</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;For those of you who wish to learn SQL Server 2008, The Adventure Works databases are available for download here for some of the same data we are familiar with: &lt;a href="http://www.codeplex.com/MSFTDBProdSamples/Release/ProjectReleases.aspx?ReleaseId=14274"&gt;http://www.codeplex.com/MSFTDBProdSamples/Release/ProjectReleases.aspx?ReleaseId=14274&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;There are a number of downloads available, so choose carefully.&amp;#160; There are 4 main versions, however I would recommend that you download the full Zipped version, which will give you all four of the AdventureWorks databases, it is around an 85mb download.&amp;#160;&amp;#160; If you download the MSI version, it does not install and configure the databases for you; however the files are placed here:&amp;#160; C:\Program Files\Microsoft SQL Server\100\Tools\Samples. Once downloaded, there are a few ways to load the samples, the easiest being restoring the .BAK file to SQL, remember to do this for both DW and the OLTP AdventureWorks Databases.&amp;#160;&amp;#160; For the Cube, you get a project that opens in SQL Server 2008, and from my experience simply deploys (as long as you have set up security correctly). &lt;/p&gt;  &lt;p&gt;&lt;b&gt;SQL2008.AdventureWorks_DB_Scripts_v [2005|2008].[ia64.msi|x64.msi|x86.msi|zip]:&lt;/b&gt; T-SQL scripts and CSV files for loading all four databases in the AdventureWorks family of databases and diagrams for one year-model, either v2005 or v2008. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;SQL2008.AdventureWorks_DW_BI_v[2005|2008].[ia64.msi|x64.msi|x86.msi|zip]:&lt;/b&gt; T-SQL scripts, CSV files and database backups for loading the AdventureWorks Data Warehouse database, diagrams and Visual Studio/BIDS projects for Analysis Services projects for business intelligence samples for one year-model, either v2005 or v2008. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;SQL2008.AdventureWorks_LT_DB_v[2005|2008].[ia64.msi|x64.msi|x86.msi|zip]:&lt;/b&gt; T-SQL scripts and diagrams for the AdventureWorks &amp;quot;Lite&amp;quot; database for one year-model, either v2005 or v2008. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;SQL2008.AdventureWorks_OLTP_DB_v[2005|2008].[ia64.msi|x64.msi|x86.msi|zip]:&lt;/b&gt; T-SQL scripts, CSV files and database backups for loading the AdventureWorks OLTP database and diagrams for one year-model, either v2005 or v2008.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:89aeafba-e388-4b4b-801d-6af55c08d8bc" 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/SQL%20Server%202008" rel="tag"&gt;SQL Server 2008&lt;/a&gt;,&lt;a href="http://technorati.com/tags/AdventureWorks" rel="tag"&gt;AdventureWorks&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7374" width="1" height="1"&gt;</description></item><item><title>Worth it's weight in....</title><link>http://blogs.adatis.co.uk/blogs/timkent/archive/2008/07/28/worth-it-s-weight-in.aspx</link><pubDate>Mon, 28 Jul 2008 21:29:50 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7372</guid><dc:creator>Tim Kent</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Following on from &lt;a href="http://blogs.adatis.co.uk/blogs/adatisnews/archive/2008/07/28/adatis-goes-gold.aspx" target="_blank"&gt;Sacha&amp;#39;s post&lt;/a&gt; re Adatis achieving MS Gold partnership I just wanted to:&lt;/p&gt;  &lt;p&gt;a) blow our own trumpet a little bit more ;-); and&lt;/p&gt;  &lt;p&gt;b) add my thanks to our customers, partners and especially the awesome Adatis team who have worked their a*ses off to make this possible!&lt;/p&gt;  &lt;p&gt;Whilst Gold partnership isn&amp;#39;t perhaps the rarest thing these days it&amp;#39;s still a big deal for a small company like ourselves to achieve it.&lt;/p&gt;  &lt;p&gt;I&amp;#39;ll go now before I do a Gwyneth....sniffle...&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7372" width="1" height="1"&gt;</description></item><item><title>Adatis Goes Gold!</title><link>http://blogs.adatis.co.uk/blogs/adatisnews/archive/2008/07/28/adatis-goes-gold.aspx</link><pubDate>Mon, 28 Jul 2008 12:33:00 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7371</guid><dc:creator>sachatomey</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;We are proud to announce that Adatis Consulting has been awarded Microsoft Gold Certified Partner Status.&amp;#160; This achievement reflects our continued investment in the latest Business Intelligence and Performance Management technologies from Microsoft and is, in no small part, thanks to our customers, partners, and the outstanding team at Adatis.&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7371" width="1" height="1"&gt;</description></item><item><title>PerformancePoint Monitoring Web Service - Part 2</title><link>http://blogs.adatis.co.uk/blogs/timkent/archive/2008/07/24/performancepoint-monitoring-web-service-part-2.aspx</link><pubDate>Thu, 24 Jul 2008 11:32:33 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7360</guid><dc:creator>Tim Kent</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;In my &lt;a href="http://blogs.adatis.co.uk/blogs/timkent/archive/2008/05/29/performancepoint-monitoring-web-service-part-1.aspx" target="_blank"&gt;last post&lt;/a&gt; we looked at the basics of connecting to the web service and using some simple functions to retrieve some metadata.&amp;#160; Those of you who downloaded the sample project would have spotted that I added some functionality to retrieve all the annotations for a given scorecard - something we&amp;#39;ve been asked for by a number of clients.&amp;#160; This time we&amp;#39;ll look a little deeper and look at how we could automate production of the FCOs (First Class Objects) within PPSM.&lt;/p&gt;  &lt;p&gt;The process of building a dashboard in code is in essence just as you would do it in Dashboard Designer.&amp;#160; Remember when you are using Dashboard Designer it&amp;#39;s actually making calls to the web service behind the scenes - no dll&amp;#39;s involved.&amp;#160; If you use a tool such as &lt;a href="http://www.fiddler2.com/" target="_blank"&gt;Fiddler2&lt;/a&gt; you can see exactly what is getting passed in the calls.&lt;/p&gt;  &lt;p&gt;So first we need to create a data source.&amp;#160; Once again our friendly PPSM dev team have named the functions just as you would expect so no prizes for guessing we need to use the &lt;strong&gt;CreateDataSource&lt;/strong&gt; function.&amp;#160; You then need to create a datasource object in your code which is passed to that function.&amp;#160; This is fairly straight-forward in that you set the attributes of the data source object you&amp;#39;ve created and give it a unique ID (GUID).&amp;#160; The usual apologies for the state of my code!&lt;/p&gt;  &lt;div&gt;   &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; CreatePPSDS(PPSM.PmService mon)
{
   &lt;span style="color:#008000;"&gt;//declare the datasource&lt;/span&gt;
    PPSM.DataSource ds = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PPSM.DataSource();

    &lt;span style="color:#008000;"&gt;//set the attributes of the data source&lt;/span&gt;
    ds.SourceName = &lt;span style="color:#006080;"&gt;&amp;quot;ADOMD.NET&amp;quot;&lt;/span&gt;;
    ds.ServerName = &lt;span style="color:#006080;"&gt;&amp;quot;Localhost&amp;quot;&lt;/span&gt;;
    ds.DatabaseName = &lt;span style="color:#006080;"&gt;&amp;quot;Adventure Works DW Standard Edition&amp;quot;&lt;/span&gt;;
    ds.CubeName = &lt;span style="color:#006080;"&gt;&amp;quot;Adventure Works&amp;quot;&lt;/span&gt;;
    ds.CubeDisplayName = &lt;span style="color:#006080;"&gt;&amp;quot;Adventure Works&amp;quot;&lt;/span&gt;;

    &lt;span style="color:#008000;"&gt;//give the data source a GUID&lt;/span&gt;
    ds.Guid = System.Guid.NewGuid();&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;The first quirk is that the data source name, owner and description aren&amp;#39;t directly exposed on the DataSource object but in a &lt;strong&gt;BpmProperty&lt;/strong&gt; array called Properties so first you need to declare each element individually so you can set it&amp;#39;s individual properties; Name is a &lt;strong&gt;BpmPropertyText&lt;/strong&gt;, Description is a &lt;strong&gt;BpmPropertyLongText&lt;/strong&gt; and Owner is a &lt;strong&gt;BpmPropertyUser&lt;/strong&gt;.&amp;#160; This properties array is common to all FCO&amp;#39;s (and in fact inherited from the base Element Object) so this will be the same method we use for Data Sources, Scorecards, Dashboards etc.&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        &lt;span style="color:#008000;"&gt;//declare the three individual property types for the property array&lt;/span&gt;
        PPSM.BpmPropertyText dsName = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PPSM.BpmPropertyText();
        PPSM.BpmPropertyLongText dsDesc = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PPSM.BpmPropertyLongText();
        PPSM.BpmPropertyUser dsOwner = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PPSM.BpmPropertyUser();
        
        &lt;span style="color:#008000;"&gt;//set some details for the properties&lt;/span&gt;
        dsName.DisplayName = &lt;span style="color:#006080;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;;
        dsName.Description = &lt;span style="color:#006080;"&gt;&amp;quot;Name Description&amp;quot;&lt;/span&gt;;
        dsName.Text = &lt;span style="color:#006080;"&gt;&amp;quot;A data source name&amp;quot;&lt;/span&gt;;
        dsName.Visible = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;
        dsDesc.Text = &lt;span style="color:#006080;"&gt;&amp;quot;MyDataSourceDescription&amp;quot;&lt;/span&gt;;
        dsOwner.Login = &lt;span style="color:#006080;"&gt;&amp;quot;TCK&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;/div&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Next we have to initialise the Properties array on the DataSource object itself so we can assign the individual properties we declared earlier to the elements within it.&amp;#160; And here comes the next quirk - and I&amp;#39;ll unashamedly admit that this one had me completely foxed! Each element of the DataSource properties array requires a uniquename, and not just any unique name but a very specific one - &lt;strong&gt;8dd07d4d87794510afdb1f07664359bc&lt;/strong&gt;.&amp;#160; Without this your data source will be created but won&amp;#39;t have a name, description or owner!&amp;#160; Thanks to Alyson Powell Erwin of the &lt;a href="http://blogs.msdn.com/performancepoint/default.aspx" target="_blank"&gt;PPSM Team&lt;/a&gt; for solving this one for me :)&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        &lt;span style="color:#008000;"&gt;//initialise the properties array of the data source&lt;/span&gt;
        ds.Properties = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PPSM.BpmProperty[3];

        &lt;span style="color:#008000;"&gt;//set the properties array with the three elements&lt;/span&gt;
        ds.Properties[0] = dsName;
        ds.Properties[1] = dsDesc;
        ds.Properties[2] = dsOwner;

        &lt;span style="color:#008000;"&gt;//declare a GUID and set the unique id of each property&lt;/span&gt;
        ds.Properties[0].UniqueName = &lt;span style="color:#006080;"&gt;&amp;quot;8dd07d4d87794510afdb1f07664359bc_Element_Name&amp;quot;&lt;/span&gt;;
        ds.Properties[1].UniqueName = &lt;span style="color:#006080;"&gt;&amp;quot;8dd07d4d87794510afdb1f07664359bc_Element_Description&amp;quot;&lt;/span&gt;;
        ds.Properties[2].UniqueName = &lt;span style="color:#006080;"&gt;&amp;quot;8dd07d4d87794510afdb1f07664359bc_Element_Owner&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Note the &amp;quot;_Element_...&amp;quot; on the end of the UniqueName - this is also mandatory.&amp;#160; That&amp;#39;s all the quirks now :)&lt;/p&gt;

&lt;p&gt;Next we can add members to our roles if required.&amp;#160; These are stored in the Memberships array of the DataSource&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        &lt;span style="color:#008000;"&gt;//initialise the Memberships array&lt;/span&gt;
        ds.Memberships = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PPSM.Membership[1];
        &lt;span style="color:#008000;"&gt;//for each membership you want to add you then need to initialise the element of the array&lt;/span&gt;
        ds.Memberships[0] = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PPSM.Membership();
        &lt;span style="color:#008000;"&gt;//then set the properties (note the control backslash in the login name)&lt;/span&gt;
        ds.Memberships[0].Login = &lt;span style="color:#006080;"&gt;&amp;quot;Domain\\login&amp;quot;&lt;/span&gt;;
        ds.Memberships[0].Role = &lt;span style="color:#006080;"&gt;&amp;quot;Editor&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Finally call the CreateDataSource method passing your DataSource object of the web service and your work here is done!&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        &lt;span style="color:#008000;"&gt;//finally pass to the web service call&lt;/span&gt;
        mon.CreateDataSource(ds);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;If you need to update the data source then you retrieve the data source using &lt;strong&gt;GetDataSource&lt;/strong&gt;, update the properties as before and then pass the object the&lt;strong&gt; CreateDataSource&lt;/strong&gt; function. This automatically deals with versioning.&lt;/p&gt;

&lt;p&gt;The sample project is &lt;a href="http://blogs.adatis.co.uk/files/folders/net_projects/entry7359.aspx" target="_blank"&gt;here&lt;/a&gt; (you&amp;#39;ll need to login and don&amp;#39;t forget to open as a web site rather than a project in VS)&lt;/p&gt;

&lt;p&gt;Next time we&amp;#39;ll look at how to create one of the other 1st class objects using our data source.&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7360" width="1" height="1"&gt;</description></item><item><title>PerformancePoint MCPs</title><link>http://blogs.adatis.co.uk/blogs/timkent/archive/2008/07/23/performancepoint-mcps.aspx</link><pubDate>Wed, 23 Jul 2008 13:48:00 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7307</guid><dc:creator>Tim Kent</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;I was a little surprised to see that (&lt;a class="" href="http://www.microsoft.com/learning/mcp/certified.mspx" target="_blank"&gt;as of June 2008&lt;/a&gt;) there are already 329 people certified in PerformancePoint (i.e. have passed the 70-556 exam) and whilst it&amp;#39;s not the hardest exam (IMO compared to 445 and 446)&amp;nbsp;it&amp;#39;s a good sign that PPS uptake is getting stronger and stronger.&lt;/p&gt;
&lt;p&gt;Mind you most of the 329 probably work for CapGemini who should have had &lt;a class="" href="http://performanceguys.blogspot.com/2007/11/3000-consultants-trained-on.html" target="_blank"&gt;3000 consultants trained in PPS&lt;/a&gt; by the end of 2007!! Amazing ;)&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7307" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/timkent/archive/tags/PerformancePoint/default.aspx">PerformancePoint</category><category domain="http://blogs.adatis.co.uk/blogs/timkent/archive/tags/MCP/default.aspx">MCP</category></item><item><title>PerformancePoint Planning Tuning</title><link>http://blogs.adatis.co.uk/blogs/martynbullerwell/archive/2008/07/22/performancepoint-planning-tuning.aspx</link><pubDate>Tue, 22 Jul 2008 20:51:16 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7306</guid><dc:creator>Martyn Bullerwell</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;There have been a few questions, surrounding the performance of PerformancePoint, especially with large data volumes. There are many things that can be done to improve PPS performance and Microsoft has released a very detailed white paper on large volume performance testing and detailed tuning.&amp;#160; It includes a number of tests that can be run, and the results across a number of different server configurations.&amp;#160; Well worth a read - can be found here:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=100209&amp;amp;clcid=0x409"&gt;http://go.microsoft.com/fwlink/?LinkID=100209&amp;amp;clcid=0x409&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7306" width="1" height="1"&gt;</description></item><item><title>BI Evening Slides for PEL Vs MDX</title><link>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/07/18/bi-evening-slides-for-pel-vs-mdx.aspx</link><pubDate>Fri, 18 Jul 2008 15:00:01 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7304</guid><dc:creator>Jeremy Kashel</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Many thanks to &lt;a href="http://cwebbbi.spaces.live.com/" target="_blank"&gt;Chris Webb&lt;/a&gt; for organising last night&amp;#39;s BI evening at TVP. I found the session very useful, it was great to meet people who are actively implementing MS BI solutions, as well as to see Jes Kirkup&amp;#39;s presentation on Excel Services.&lt;/p&gt;  &lt;p&gt;The slides from my own presentation, PEL Vs MDX, can be downloaded using the link below (you&amp;#39;ll need to register/log in)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/files/" target="_blank"&gt;PEL Vs MDX Presentation&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7304" width="1" height="1"&gt;</description></item><item><title>PerformancePoint Planning - Loading the account dimension members from CSV</title><link>http://blogs.adatis.co.uk/blogs/sachatomey/archive/2008/07/10/performancepoint-planning-loading-the-account-dimension-members-from-csv.aspx</link><pubDate>Thu, 10 Jul 2008 16:10:30 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7297</guid><dc:creator>sachatomey</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;More for my benefit this post; I can never remember the format for the CSV file to load the Account dimension.&amp;#160; &lt;/p&gt;  &lt;p&gt;Below is an example csv file in it&amp;#39;s simplest form that should help get me started faster the next time I need it !&lt;/p&gt;  &lt;p&gt;Label,Name,Description,AccountTypeMemberId   &lt;br /&gt;1000,Salaries Permanent Staff,,Expense    &lt;br /&gt;2000,Temporary Staff Workload,,Expense    &lt;br /&gt;4000,National Insurance Costs,,Expense    &lt;br /&gt;5000,Pension Costs,,Expense&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7297" width="1" height="1"&gt;</description><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/PerformancePoint/default.aspx">PerformancePoint</category><category domain="http://blogs.adatis.co.uk/blogs/sachatomey/archive/tags/Business+Intelligence/default.aspx">Business Intelligence</category></item><item><title>Comments on our blogs</title><link>http://blogs.adatis.co.uk/blogs/timkent/archive/2008/07/10/comments-on-our-blogs.aspx</link><pubDate>Thu, 10 Jul 2008 10:11:00 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:7296</guid><dc:creator>Tim Kent</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Thanks to all of you who take the time to leave comments on our blogs - it&amp;#39;s always good to know that people are actually reading :)&lt;/p&gt;
&lt;p&gt;Unfortunately for every one genuine comment we get hundreds of spam comments&amp;nbsp;so we&amp;#39;ve decided to make it a requirement to sign in to add a comment.&amp;nbsp; Please be assured that any information you provide will be used for nothing other than managing your logins.&amp;nbsp; The first time you leave a comment after &lt;a class="" href="http://blogs.adatis.co.uk/login.aspx"&gt;signing in&lt;/a&gt; we will need to approve your account but after that your comments should appear automatically.&amp;nbsp; Please drop us a mail (blogs (at) adatis.co.uk) if you have any issues.&lt;/p&gt;
&lt;p&gt;Thanks&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Tim&lt;/p&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=7296" width="1" height="1"&gt;</description></item><item><title>BI Evening, TVP, 17th July 2008</title><link>http://blogs.adatis.co.uk/blogs/jeremykashel/archive/2008/07/04/bi-evening-tvp-17th-july-2008.aspx</link><pubDate>Fri, 04 Jul 2008 09:06:01 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:6994</guid><dc:creator>Jeremy Kashel</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I&amp;#39;ll be giving a talk titled &lt;strong&gt;&amp;#39;PEL Vs MDX&amp;#39;&lt;/strong&gt; at the UK SQL Server Community&amp;#39;s BI Evening on the 17th July at Microsoft&amp;#39;s TVP offices in Reading.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;The content will be geared towards MS BI developers, and will highlight the differences between the two languages, with the aim that those with MDX experience will be able to make a fast start with PEL.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Also speaking is Jeremy Kirkup from TAH, on &lt;strong&gt;&amp;#39;Using Excel Services with Analysis Services and MOSS&amp;#39;&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;If you are just starting to explore delivering BI solutions with Excel Services and SharePoint then there are some issues that it is wise to be aware of in advance. This session will describe some real world lessons gained while creating BI solutions which expose Analysis Services data through the Excel Web Access web part.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;The Excel 2007 client has first class support for the some of the advanced features of Analysis services such as drill-through.&amp;#160; However, when exposing pivot tables to a browser through the Excel Web Access web part this feature is not available. The session will discuss a couple of approaches to implementing drill-through functionality for EWA based pivot tables using the MOSS SmartPart, AJAX and the Excel Web Services.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;You can register for the event &lt;a href="http://www.sqlserverfaq.com/" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:74e8e948-e9f8-448b-a4d0-b652f3f84af3" 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/PEL" rel="tag"&gt;PEL&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/BI%20Evening" rel="tag"&gt;BI Evening&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.adatis.co.uk/aggbug.aspx?PostID=6994" 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/PEL/default.aspx">PEL</category><category domain="http://blogs.adatis.co.uk/blogs/jeremykashel/archive/tags/Events/default.aspx">Events</category></item><item><title>Exploring the PerformancePoint Planning Webservice Part 1</title><link>http://blogs.adatis.co.uk/blogs/martynbullerwell/archive/2008/06/30/exploring-the-performancepoint-planning-webservice.aspx</link><pubDate>Mon, 30 Jun 2008 22:47:26 GMT</pubDate><guid isPermaLink="false">8d7d37f8-4a66-4c95-9fba-293fa87607dc:6739</guid><dc:creator>Martyn Bullerwell</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;In line with SOA architecture of many applications built today, PPS is no exception, both the Planning and Monitoring parts of PPS use a Web service&amp;#39;s to function.&amp;#160; For the moment we will explore using the planning web service with a web application in .NET 3.5.&lt;/p&gt;  &lt;p&gt;There are 2 separate web services that are exposed, these are MetaDataManager.asmx and DataManager.asmx&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/martynbullerwell/WindowsLiveWriter/ExploringthePerformancePointPlanningWebs_69A4/MetaDataManagerWebService_2.jpg"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="199" alt="MetaDataManagerWebService" src="http://blogs.adatis.co.uk/blogs/martynbullerwell/WindowsLiveWriter/ExploringthePerformancePointPlanningWebs_69A4/MetaDataManagerWebService_thumb.jpg" width="389" border="0" /&gt;&lt;/a&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/martynbullerwell/WindowsLiveWriter/ExploringthePerformancePointPlanningWebs_69A4/DataManagerWebService_4.jpg"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="199" alt="DataManagerWebService" src="http://blogs.adatis.co.uk/blogs/martynbullerwell/WindowsLiveWriter/ExploringthePerformancePointPlanningWebs_69A4/DataManagerWebService_thumb_1.jpg" width="329" border="0" /&gt;&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;So to begin we will create a web application in order to access the web services.&amp;#160; Most of the web methods cannot be invoked directly from a web browser as they do not accept primitive types.&amp;#160;&amp;#160; Those that do work are the following:&lt;/p&gt;  &lt;p&gt;MetadataManagerWebService: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Connect - Returns a Boolean result to test an active connection to the planning web service. &lt;/li&gt;    &lt;li&gt;Disconnect - Disconnects from the planning service. &lt;/li&gt;    &lt;li&gt;GetSystem (bool expandModelSitesContents) - Returns all information relating to the Server that the web service is called on, this contains a lot of information, and the relevant GUID&amp;#39;s for the applications and sites. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;DataManagerWebService: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;GetOverrideStatusChoices - returns the Work Unit Statuses that are available within the Planning system &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Retrieving Data from the Web Service: &lt;/p&gt;  &lt;p&gt;Let&amp;#8217;s start with a really simple retrieval of data from the Web Service, and use the method in MetaDataManager called GetSystem.&amp;#160; This will form the building blocks of an application that can identify, Sites, ad models in a PPS deployment. &lt;/p&gt;  &lt;p&gt;We need to add the web reference to the project, add both MetaDataManager.asmx and DataManager.asmx. &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.adatis.co.uk/blogs/martynbullerwell/WindowsLiveWriter/ExploringthePerformancePointPlanningWebs_69A4/image_2.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="346" alt="image" src="http://blogs.adatis.co.uk/blogs/martynbullerwell/WindowsLiveWriter/ExploringthePerformancePointPlanningWebs_69A4/image_thumb.png" width="484" border="0" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;Now to test the connection lets set up the connection to the web service and call GetSystem, this should return all the information from the PPS Planning System installed on the server we are calling the web service from. &lt;/p&gt;  &lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;   &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;MetaDataManager.MetadataManagerWebService ppsMDM = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; MetaDataManager.MetadataManagerWebService(); 
System.Net.CredentialCache myCredentials = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.Net.CredentialCache(); 
NetworkCredential netCred = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; NetworkCredential(&lt;span style="color:#006080;"&gt;&amp;quot;frfrfr&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;frfrr&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;frfrfr&amp;quot;&lt;/span&gt;); 
myCredentials.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Uri(ppsMDM.Url), &lt;span style="color:#006080;"&gt;&amp;quot;Basic&amp;quot;&lt;/span&gt;, netCred); 
ppsMDM.Credentials = myCredentials; 

MetaDataManager.BizSystem bizSystem = ppsMDM.GetSystem(&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;This should not return an error, however upon further inspection you will find that the BizSystem object has a Dataset called applications, of which has no DataTables, not what we expect, especially on inspection of the XML Output that is returned from the Web service when executed in a browser. On closer inspection of the XML, it is obvious that the xml could never de-serialise into a simple DataSet... So what&amp;#8217;s going on - how do we get the data?&lt;/p&gt;

&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#800000;"&gt;xml&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;version&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;1.0&a