<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://blog.jbheren.com/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Blog pro de Jean-Baptiste HEREN - Décisionnel</title>
  <link>http://blog.jbheren.com/</link>
  <atom:link href="http://blog.jbheren.com/feed/category/Decisionnel/rss2" rel="self" type="application/rss+xml"/>
  <description>Notes d'un consultant freelance en informatique</description>
  <language>fr</language>
  <pubDate>Fri, 11 May 2012 15:27:06 +0200</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Cognos Report : Display a different measure in row for the aggregated column</title>
    <link>http://blog.jbheren.com/post/2012/01/30/Cognos-Report-Display-a-different-measure-in-row-for-the-aggregated-column</link>
    <guid isPermaLink="false">urn:md5:b3bf4332c6abb39bec87ff0d14add78a</guid>
    <pubDate>Mon, 30 Jan 2012 19:43:00 +0100</pubDate>
    <dc:creator>Jean-Baptiste HEREN</dc:creator>
        <category>Décisionnel</category>
        <category>Business Intelligence</category><category>Cognos</category><category>Cognos Report Studio</category>    
    <description>    &lt;p&gt;Following tip is when you use a Relational Datamodel (DMR).&lt;/p&gt;


&lt;p&gt;In a Cognos Report crosstab, If You need to Display different measure in the aggregated column, you can do it using a simple if-then-else expression.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/conditional_measure/result_crosstab.png&quot; title=&quot;result_crosstab.png&quot;&gt;&lt;img src=&quot;http://blog.jbheren.com/public/Decisionnel/conditional_measure/.result_crosstab_m.jpg&quot; alt=&quot;result_crosstab.png&quot; title=&quot;result_crosstab.png, janv. 2012&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Explanation: You know if you are on a total column when the &lt;strong&gt;current context&lt;/strong&gt; gives you &lt;strong&gt;more than one value&lt;/strong&gt; for the &lt;strong&gt;year&lt;/strong&gt; Axis.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://blog.jbheren.com/public/Decisionnel/conditional_measure/query_items.png&quot; alt=&quot;query_items.png&quot; title=&quot;query_items.png, janv. 2012&quot; /&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;isTotalYear&lt;/strong&gt; Expression:&lt;/p&gt;
&lt;pre&gt;[script]
if(count(distinct [year]) &amp;gt; 1) then(1) else (0)
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;Conditional&lt;/strong&gt; Expression:&lt;/p&gt;
&lt;pre&gt;[script]
if(count(distinct [year]) &amp;gt; 1) then([PackName].[Measures].[M1]) else ([PackName].[Measures].[M2])
&lt;/pre&gt;</description>
    
    
    
          <comments>http://blog.jbheren.com/post/2012/01/30/Cognos-Report-Display-a-different-measure-in-row-for-the-aggregated-column#comment-form</comments>
      <wfw:comment>http://blog.jbheren.com/post/2012/01/30/Cognos-Report-Display-a-different-measure-in-row-for-the-aggregated-column#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.jbheren.com/feed/atom/comments/65</wfw:commentRss>
      </item>
    
  <item>
    <title>Cognos 8 - convert a member unique name from one hierarchy to another</title>
    <link>http://blog.jbheren.com/post/2011/04/06/cognos-8-convert-a-member-unique-name-from-one-hierarchy-to-another</link>
    <guid isPermaLink="false">urn:md5:b368dbd30c4e5920ea0a329413da0797</guid>
    <pubDate>Wed, 06 Apr 2011 15:45:00 +0200</pubDate>
    <dc:creator>Jean-Baptiste HEREN</dc:creator>
        <category>Décisionnel</category>
        <category>Cognos</category><category>Report Studio</category>    
    <description>&lt;p&gt;If you need to build any report or Event studio Query using the same data from different packages; and you want to prompt just once.&lt;/p&gt;


&lt;p&gt;You can convert the member unique name from one hierarchy to another, using the &lt;a href=&quot;http://blog.jbheren.com/post/2009/11/13/Cognos-8-Macro-functions-list&quot;&gt;cognos substitute macro&lt;/a&gt;.&lt;/p&gt;    &lt;h3&gt;Consider the following example :&lt;/h3&gt;

&lt;h4&gt;You prompt on level value using the following hierarchy :&lt;/h4&gt;
&lt;pre&gt;[SQL]
[First package].[First dimension].[First hierarchy].[First Level]
&lt;/pre&gt;


&lt;h4&gt;Then you want to filter one Query built on another package using the same prompt value :&lt;/h4&gt;
&lt;pre&gt;[SQL]
[Second package].[Second dimension].[Second hierarchy].[Second Level]
&lt;/pre&gt;


&lt;h4&gt;It means yo uwant to convert :&lt;/h4&gt;
&lt;pre&gt;[SQL]
 -- Source hierarchy
[First package].[First dimension].[First hierarchy].[First Level]-&amp;gt;:[YK].[[First dimension]].[First hierarchy]].[First Level]].&amp;amp;[00004]]]

-- to Destination Hierarchy
[Second package].[Second dimension].[Second hierarchy].[Second Level]-&amp;gt;:[YK].[[Second dimension]].[Second hierarchy]].[Second Level]].&amp;amp;[00004]]] 
&lt;/pre&gt;


&lt;p&gt;So you can use a Query element containing a &lt;a href=&quot;http://blog.jbheren.com/post/2009/11/13/Cognos-8-Macro-functions-list&quot;&gt;substitute macro&lt;/a&gt; :&lt;/p&gt;
&lt;pre&gt;[SQL]
-- Formula
# sq(substitute ('First package','Second package', 
 substitute ('First hierarchy','Second hierarchy',
 substitute ('First dimension','Second dimension',
 substitute ('First Level','Second Level',
 prompt('First Level Prompt Name', 'token')))))) #
&lt;/pre&gt;</description>
    
    
    
          <comments>http://blog.jbheren.com/post/2011/04/06/cognos-8-convert-a-member-unique-name-from-one-hierarchy-to-another#comment-form</comments>
      <wfw:comment>http://blog.jbheren.com/post/2011/04/06/cognos-8-convert-a-member-unique-name-from-one-hierarchy-to-another#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.jbheren.com/feed/atom/comments/60</wfw:commentRss>
      </item>
    
  <item>
    <title>model.xml documentation in cognos 8 with xslt</title>
    <link>http://blog.jbheren.com/post/2011/03/30/model.xml-documentation-in-cognos-8-with-xslt</link>
    <guid isPermaLink="false">urn:md5:06d363bd7882093cfe57b5ea5d6da2c2</guid>
    <pubDate>Wed, 30 Mar 2011 06:56:00 +0200</pubDate>
    <dc:creator>Jean-Baptiste HEREN</dc:creator>
        <category>Décisionnel</category>
        <category>cognos 8</category><category>xml</category><category>xslt</category>    
    <description>&lt;p&gt;In one of my recent projects, I had to build an automatic documentation builded on top of a database, using &lt;a href=&quot;http://blog.jbheren.com/tag/cognos%208&quot;&gt;cognos 8&lt;/a&gt; reporting itself.&lt;/p&gt;


&lt;p&gt;This article covers the way I could extract technical informations using the Cognos  Framework manager project model.xml file.&lt;/p&gt;    &lt;h3&gt;1- Build xsl files&lt;/h3&gt;

&lt;p&gt;The XSLT language is used to define the way an xml should be displayed. This means you can select any parts of teh xml, based on his structure and build the output you want.&lt;/p&gt;


&lt;h4&gt;Defining the stylesheet&lt;/h4&gt;

&lt;p&gt;Here is an example witch displays a list of Query Subjects extracted from your project :&lt;/p&gt;

&lt;pre&gt;[XML]
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;
 &amp;lt;xsl:stylesheet version=&amp;quot;1.0&amp;quot; xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&amp;gt;
 &amp;lt;xsl:template match=&amp;quot;/&amp;quot;&amp;gt;
  &amp;lt;html&amp;gt;
  &amp;lt;body&amp;gt;
	&amp;lt;h1&amp;gt;Query Subjects&amp;lt;/h1&amp;gt;
	&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;h2&amp;gt;refObj&amp;lt;/h2&amp;gt;&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;h2&amp;gt;Source Type&amp;lt;/h2&amp;gt;&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;h2&amp;gt;Namespace&amp;lt;/h2&amp;gt;&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;h2&amp;gt;Folder&amp;lt;/h2&amp;gt;&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;h2&amp;gt;Query Subject&amp;lt;/h2&amp;gt;&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;h2&amp;gt;dataSource&amp;lt;/h2&amp;gt;&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;h2&amp;gt;sql&amp;lt;/h2&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
		&amp;lt;xsl:for-each select=&amp;quot;//querySubject[@status = 'valid']&amp;quot;&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;p&amp;gt;[&amp;lt;xsl:value-of select=&amp;quot;../../name&amp;quot;/&amp;gt;].[&amp;lt;xsl:value-of select=&amp;quot;name&amp;quot;/&amp;gt;]&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;p&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;definition/dbQuery/tableType&amp;quot;/&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;p&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;../../name&amp;quot;/&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;p&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;../name&amp;quot;/&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;p&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;name&amp;quot;/&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;p&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;definition/dbQuery/sources/dataSourceRef&amp;quot;/&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;p&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;definition/dbQuery/sql&amp;quot;/&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
		&amp;lt;/xsl:for-each&amp;gt;
	&amp;lt;/table&amp;gt;
  &amp;lt;/body&amp;gt;
  &amp;lt;/html&amp;gt;
 &amp;lt;/xsl:template&amp;gt;&amp;lt;/xsl:stylesheet&amp;gt;
&lt;/pre&gt;


&lt;h4&gt;Applying the stylesheet&lt;/h4&gt;

&lt;p&gt;During the XSL development, we need to test the output of our xsl applyend to our model.xml &quot;live&quot;. To do this, we will :&lt;/p&gt;


&lt;p&gt;- Add the stylesheed definition to your &lt;strong&gt;local copy&lt;/strong&gt; of model.xml, like that :&lt;/p&gt;

&lt;pre&gt;[XML]
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;
&amp;lt;?xml-stylesheet type=&amp;quot;text/xsl&amp;quot; href=&amp;quot;modelspecs.xsl&amp;quot;?&amp;gt;
&amp;lt;project&amp;gt;
&lt;/pre&gt;



&lt;p&gt;- Open your xml in Internet Explorer or any other modern navigator and see the output.&lt;/p&gt;


&lt;h3&gt;2- Automatic processing&lt;/h3&gt;

&lt;p&gt;For my specific need, I wanted to generate automatic data files from different project's model.xml, to be used as source for some DTS.&lt;/p&gt;


&lt;p&gt;Here are four examples of XSL files extracting different informations. Of course, we can also build one single xml file containing all the informations :&lt;/p&gt;


&lt;p&gt;- cubes definitions : This example outputs pure text to be used as a CVS source in SSIS.&lt;/p&gt;

&lt;pre&gt;[XML]
&amp;lt;xsl:stylesheet version=&amp;quot;1.0&amp;quot; xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&amp;gt;&amp;lt;xsl:strip-space elements=&amp;quot;*&amp;quot;/&amp;gt;&amp;lt;xsl:output method=&amp;quot;text&amp;quot;/&amp;gt;&amp;lt;xsl:template match=&amp;quot;/&amp;quot;&amp;gt;refObj;Source type
 &amp;lt;xsl:for-each select=&amp;quot;//namespace&amp;quot;&amp;gt;
  &amp;lt;xsl:if test=&amp;quot;string-length(property[@name = 'dynamicContent']) != 0&amp;quot;&amp;gt;[&amp;lt;xsl:value-of select=&amp;quot;name&amp;quot;/&amp;gt;];Cube
  &amp;lt;/xsl:if&amp;gt;			
 &amp;lt;/xsl:for-each&amp;gt;
&amp;lt;/xsl:template&amp;gt;&amp;lt;/xsl:stylesheet&amp;gt;
&lt;/pre&gt;


&lt;p&gt;- Query Subjects &amp;amp; SQL : This example outputs simple xml file to be used as a XML source in SSIS.&lt;/p&gt;

&lt;pre&gt;[XML]
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;
 &amp;lt;xsl:stylesheet version=&amp;quot;1.0&amp;quot; xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&amp;gt;
 &amp;lt;xsl:output method=&amp;quot;xml&amp;quot; version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; indent=&amp;quot;yes&amp;quot; cdata-section-elements=&amp;quot;sql&amp;quot;/&amp;gt;
 &amp;lt;xsl:template match=&amp;quot;/&amp;quot;&amp;gt;
	&amp;lt;xsl:element name=&amp;quot;root&amp;quot;&amp;gt;
	&amp;lt;xsl:for-each select=&amp;quot;//querySubject[@status = 'valid']&amp;quot;&amp;gt;
		&amp;lt;xsl:element name=&amp;quot;querySubjects&amp;quot;&amp;gt;
			&amp;lt;xsl:element name=&amp;quot;refObj&amp;quot;&amp;gt;[&amp;lt;xsl:value-of select=&amp;quot;../../name&amp;quot;/&amp;gt;].[&amp;lt;xsl:value-of select=&amp;quot;name&amp;quot;/&amp;gt;]&amp;lt;/xsl:element&amp;gt;
			&amp;lt;xsl:element name=&amp;quot;sourceType&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;definition/dbQuery/tableType&amp;quot;/&amp;gt;&amp;lt;/xsl:element&amp;gt;
			&amp;lt;xsl:element name=&amp;quot;namespace&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;../../name&amp;quot;/&amp;gt;&amp;lt;/xsl:element&amp;gt;
			&amp;lt;xsl:element name=&amp;quot;folder&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;../name&amp;quot;/&amp;gt;&amp;lt;/xsl:element&amp;gt;
			&amp;lt;xsl:element name=&amp;quot;querySubject&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;name&amp;quot;/&amp;gt;&amp;lt;/xsl:element&amp;gt;
			&amp;lt;xsl:element name=&amp;quot;dataSource&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;definition/dbQuery/sources/dataSourceRef&amp;quot;/&amp;gt;&amp;lt;/xsl:element&amp;gt;
			&amp;lt;xsl:element name=&amp;quot;sql&amp;quot;&amp;gt;&amp;lt;xsl:value-of disable-output-escaping=&amp;quot;yes&amp;quot; select=&amp;quot;definition/dbQuery/sql&amp;quot;/&amp;gt;&amp;lt;/xsl:element&amp;gt;
		&amp;lt;/xsl:element&amp;gt;
	&amp;lt;/xsl:for-each&amp;gt;
	&amp;lt;/xsl:element&amp;gt;
 &amp;lt;/xsl:template&amp;gt;&amp;lt;/xsl:stylesheet&amp;gt;
&lt;/pre&gt;


&lt;p&gt;- Query Subjects &amp;amp; Query items detail : This example outputs simple xml file to be used as a XML source in SSIS.&lt;/p&gt;

&lt;pre&gt;[XML]
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;
 &amp;lt;xsl:stylesheet version=&amp;quot;1.0&amp;quot; xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&amp;gt;
 &amp;lt;xsl:output method=&amp;quot;xml&amp;quot; version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; indent=&amp;quot;yes&amp;quot; cdata-section-elements=&amp;quot;sql&amp;quot;/&amp;gt;
 &amp;lt;xsl:template match=&amp;quot;/&amp;quot;&amp;gt;
	&amp;lt;xsl:element name=&amp;quot;root&amp;quot;&amp;gt;
		&amp;lt;xsl:for-each select=&amp;quot;//querySubject[@status = 'valid']/queryItem&amp;quot;&amp;gt;
			&amp;lt;xsl:element name=&amp;quot;QueryItems&amp;quot;&amp;gt;
				&amp;lt;xsl:element name=&amp;quot;refObj&amp;quot;&amp;gt;[&amp;lt;xsl:value-of select=&amp;quot;../../../name&amp;quot;/&amp;gt;].[&amp;lt;xsl:value-of select=&amp;quot;../name&amp;quot;/&amp;gt;].[&amp;lt;xsl:value-of select=&amp;quot;name&amp;quot;/&amp;gt;]&amp;lt;/xsl:element&amp;gt;		
				&amp;lt;xsl:element name=&amp;quot;parentRefObj&amp;quot;&amp;gt;[&amp;lt;xsl:value-of select=&amp;quot;../../../name&amp;quot;/&amp;gt;].[&amp;lt;xsl:value-of select=&amp;quot;../name&amp;quot;/&amp;gt;]&amp;lt;/xsl:element&amp;gt;		
				&amp;lt;xsl:element name=&amp;quot;QueryItem&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;name&amp;quot;/&amp;gt;&amp;lt;/xsl:element&amp;gt;
			&amp;lt;/xsl:element&amp;gt;
		&amp;lt;/xsl:for-each&amp;gt;
	&amp;lt;/xsl:element&amp;gt;
 &amp;lt;/xsl:template&amp;gt;&amp;lt;/xsl:stylesheet&amp;gt;
&lt;/pre&gt;


&lt;p&gt;- Framework Packages Definition and contents : This example outputs simple xml file to be used as a XML source in SSIS.&lt;/p&gt;

&lt;pre&gt;[XML]
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;
 &amp;lt;xsl:stylesheet version=&amp;quot;1.0&amp;quot; xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&amp;gt;
 &amp;lt;xsl:output method=&amp;quot;xml&amp;quot; version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; indent=&amp;quot;yes&amp;quot; cdata-section-elements=&amp;quot;sql&amp;quot;/&amp;gt;
 &amp;lt;xsl:template match=&amp;quot;/&amp;quot;&amp;gt;
	&amp;lt;xsl:element name=&amp;quot;root&amp;quot;&amp;gt; 
		&amp;lt;xsl:for-each select=&amp;quot;//securityView/definition/set/refobj&amp;quot;&amp;gt;
			&amp;lt;xsl:element name=&amp;quot;packages&amp;quot;&amp;gt;	
				&amp;lt;xsl:element name=&amp;quot;packageName&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;../../../name&amp;quot;/&amp;gt;&amp;lt;/xsl:element&amp;gt;		
				&amp;lt;xsl:element name=&amp;quot;contentRefObj&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;.&amp;quot;/&amp;gt;&amp;lt;/xsl:element&amp;gt;		
			&amp;lt;/xsl:element&amp;gt;
		&amp;lt;/xsl:for-each&amp;gt;
	&amp;lt;/xsl:element&amp;gt;
 &amp;lt;/xsl:template&amp;gt;&amp;lt;/xsl:stylesheet&amp;gt;

&lt;/pre&gt;



&lt;p&gt;- Framework Dimensions Definitions and contents : This example outputs simple xml file to be used as a XML source in SSIS.&lt;/p&gt;

&lt;pre&gt;[XML]
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;
 &amp;lt;xsl:stylesheet version=&amp;quot;1.0&amp;quot; xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&amp;gt;
 &amp;lt;xsl:output method=&amp;quot;xml&amp;quot; version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; indent=&amp;quot;yes&amp;quot; cdata-section-elements=&amp;quot;sql&amp;quot;/&amp;gt;
 &amp;lt;xsl:template match=&amp;quot;/&amp;quot;&amp;gt;
	&amp;lt;xsl:element name=&amp;quot;root&amp;quot;&amp;gt; 
		&amp;lt;xsl:for-each select=&amp;quot;//dimension[@status = 'valid']&amp;quot;&amp;gt;
			&amp;lt;xsl:element name=&amp;quot;dimensions&amp;quot;&amp;gt;
				&amp;lt;xsl:element name=&amp;quot;namespace&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;../name&amp;quot;/&amp;gt;&amp;lt;/xsl:element&amp;gt;
				&amp;lt;xsl:element name=&amp;quot;dimension&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;name&amp;quot;/&amp;gt;&amp;lt;/xsl:element&amp;gt;
				&amp;lt;xsl:element name=&amp;quot;modelQuery&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;definition/modelQuery/sql&amp;quot;/&amp;gt;&amp;lt;/xsl:element&amp;gt;
				&amp;lt;xsl:for-each select=&amp;quot;hierarchy&amp;quot;&amp;gt;
					&amp;lt;xsl:element name=&amp;quot;hierarchy&amp;quot;&amp;gt;
						&amp;lt;xsl:element name=&amp;quot;name&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;name&amp;quot;/&amp;gt;&amp;lt;/xsl:element&amp;gt;
						&amp;lt;xsl:for-each select=&amp;quot;.//refobj&amp;quot;&amp;gt;
							&amp;lt;xsl:element name=&amp;quot;refobject&amp;quot;&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;.&amp;quot;/&amp;gt;&amp;lt;/xsl:element&amp;gt;
						&amp;lt;/xsl:for-each&amp;gt;
					&amp;lt;/xsl:element&amp;gt;
				&amp;lt;/xsl:for-each&amp;gt;
			&amp;lt;/xsl:element&amp;gt;
		&amp;lt;/xsl:for-each&amp;gt;
	&amp;lt;/xsl:element&amp;gt;
 &amp;lt;/xsl:template&amp;gt;&amp;lt;/xsl:stylesheet&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Command line xsl transformation is possible using the xslproc program :&lt;/p&gt;

&lt;pre&gt;[script]
xsltproc mysxmltocsv.xsl model.xml &amp;gt; doc.csv
or 
xsltproc mysxmltoxml.xsl model.xml &amp;gt; doc.xml
&lt;/pre&gt;


&lt;p&gt;the unix tool xmlproc is also available in the libxslt binary package for windows at following address : ftp://ftp.zlatkovic.com/libxml/&lt;/p&gt;


&lt;h3&gt;3- Conclusion&lt;/h3&gt;

&lt;p&gt;Hope it will help someone, it's quite hard to find informations on how to dicument Cognos. if anyone has anything to share, I am still interested ^^.&lt;/p&gt;</description>
    
          <enclosure url="http://blog.jbheren.com/public/Decisionnel/XSL/cognos_model_xlslt_examples.zip"
      length="2816" type="application/zip" />
    
    
          <comments>http://blog.jbheren.com/post/2011/03/30/model.xml-documentation-in-cognos-8-with-xslt#comment-form</comments>
      <wfw:comment>http://blog.jbheren.com/post/2011/03/30/model.xml-documentation-in-cognos-8-with-xslt#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.jbheren.com/feed/atom/comments/58</wfw:commentRss>
      </item>
    
  <item>
    <title>Generate Extended properties in MS Sql Server 2005+</title>
    <link>http://blog.jbheren.com/post/2011/03/29/Generate-Extended-properties-in-MS-Sql-Server-2005</link>
    <guid isPermaLink="false">urn:md5:fe344fdf65b0d2c7573dbf08e43ca471</guid>
    <pubDate>Mon, 28 Mar 2011 23:02:00 +0200</pubDate>
    <dc:creator>Jean-Baptiste HEREN</dc:creator>
        <category>Décisionnel</category>
        <category>Business Intelligence</category><category>Excel</category><category>SQL Server 2005</category>    
    <description>&lt;p&gt;When you work with databases, it's cool to Keep all the documentation in the system, so that it is available for reporting and all kind of analysis.&lt;/p&gt;


&lt;p&gt;Microsoft &lt;a href=&quot;http://blog.jbheren.com/tag/SQL%20Server%202005&quot;&gt;SQL Server 2005&lt;/a&gt;+ provides the ability to create Extended properties on tables (or even fields). Those properties are available using SQL management studio, on the tables properties panel.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://blog.jbheren.com/public/Decisionnel/sql_server/.extended_properties_panel_m.jpg&quot; alt=&quot;extended_properties_panel.jpg&quot; title=&quot;extended_properties_panel.jpg, mar. 2011&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Here I will explain how you can generate them fast using Excel and macro AND Extract them using SQL.&lt;/p&gt;    &lt;h2&gt;1- Generate SQL Script to insert properties and values from an &lt;a href=&quot;http://blog.jbheren.com/tag/Excel&quot;&gt;Excel&lt;/a&gt; sheet&lt;/h2&gt;

&lt;p&gt;Usually, for any initial documentation, it will be easyer to fill an excel sheet and generate allk the indidual properties automatically. You don't want to spend a week filling all the stuff manually(!).
You will find as an attachment to this post, an &lt;a href=&quot;http://blog.jbheren.com/tag/Excel&quot;&gt;Excel&lt;/a&gt; demonstration excel file containing a simple sheet template and a macro. The maco will gerenate SQL instructions like this :&lt;/p&gt;
&lt;pre&gt;[SQL]
EXEC sys.sp_addextendedproperty @name=N'MY_PROPERTY_NAME', @value=N'MY_PROPERTY_VALUE', @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'MY_TABLE_NAME';
&lt;/pre&gt;


&lt;p&gt;Here is the SQL macro code&lt;/p&gt;

&lt;pre&gt;[VB]
Sub generateSQLSpecialProperties()
  ' Author: Jean-Baptiste Heren - 2011-03-29 - http://blog.jbheren.com
  ' Loop on current scheet and generate sql sys.sp_addextendedproperty based on sheet contents
  ' First column contains the table name
  ' first line contains the Properties names ex: Table_name | prop_description | prop_rule ...
  
  Dim tableName As String 'tablename extracted from first row of each column
  Dim filePath As String
  Dim slashPosition As Integer
  Dim pathOnly As String
  
  Dim dataSQL As String    ' will contain the SQL Contents
  Dim separator As String
  
  Dim myRow As Integer 'Row counter
  Dim myCol As Integer 'Column counter
  
  ' get current excel file Path
  filePath = ThisWorkbook.FullName
  slashPosition = InStrRev(filePath, &amp;quot;\&amp;quot;)
  pathOnly = Left(filePath, slashPosition)
  
  MyFile = pathOnly + ActiveSheet.Name + &amp;quot;_macro_generated.sql&amp;quot;
  
  'get column values from second row
  myRow = 2
  myCol = 2
  
  'set and open file for output
  fnum = FreeFile()
  Open MyFile For Output As fnum
  
  
  Do Until ActiveSheet.Cells(myRow, myCol) = &amp;quot;&amp;quot; 'Loop on rows until blank.
        
      tableName = Trim(CStr(ActiveSheet.Cells(myRow, 1))) 'get Table name from first column
      
      Do Until ActiveSheet.Cells(myRow, myCol) = &amp;quot;&amp;quot; 'Loop on columns until blank.
        property_name = Trim(CStr(ActiveSheet.Cells(1, myCol))) 'get Property name from first column
        property_descr = Replace(Trim(CStr(ActiveSheet.Cells(myRow, myCol))), &amp;quot;'&amp;quot;, &amp;quot;''&amp;quot;)
        dataSQL = &amp;quot;EXEC sys.sp_addextendedproperty @name=N'&amp;quot; + property_name + &amp;quot;'&amp;quot;
        dataSQL = dataSQL + &amp;quot;, @value=N'&amp;quot; + property_descr + &amp;quot;'&amp;quot;
        dataSQL = dataSQL + &amp;quot;, @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE'&amp;quot;
        dataSQL = dataSQL + &amp;quot;,@level1name=N'&amp;quot; + tableName + &amp;quot;';&amp;quot;
        myCol = myCol + 1
      Loop
    
    myCol = 2 ' Return to specifiedcolumn
    myRow = myRow + 1 ' Move to next row
    
    Print #fnum, dataSQL
  Loop
  
  ' Close the file
  Close #fnum
  
End Sub
&lt;/pre&gt;



&lt;h2&gt;2- Extract table properties from SQL Sercer System tables&lt;/h2&gt;

&lt;pre&gt;[SQL]
/* get extended properties on Tables */
SELECT 
  A.NAME as table_name
 ,B.name as property_name
 ,B.value as property_value
FROM SYSOBJECTS A INNER JOIN sys.extended_properties B on A.id = B.major_id
WHERE A.type = 'U'
&lt;/pre&gt;</description>
    
          <enclosure url="http://blog.jbheren.com/public/Decisionnel/sql_server/JBH_table_properties_documentation_demo.xlsm"
      length="20618" type="text/plain" />
    
    
          <comments>http://blog.jbheren.com/post/2011/03/29/Generate-Extended-properties-in-MS-Sql-Server-2005#comment-form</comments>
      <wfw:comment>http://blog.jbheren.com/post/2011/03/29/Generate-Extended-properties-in-MS-Sql-Server-2005#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.jbheren.com/feed/atom/comments/57</wfw:commentRss>
      </item>
    
  <item>
    <title>Cognos Content store Tables Description</title>
    <link>http://blog.jbheren.com/post/2011/03/29/Cognos-Content-store-Tables-Description</link>
    <guid isPermaLink="false">urn:md5:23105361ae11e3578eeb6ad89eee1b77</guid>
    <pubDate>Mon, 28 Mar 2011 22:57:00 +0200</pubDate>
    <dc:creator>Jean-Baptiste HEREN</dc:creator>
        <category>Décisionnel</category>
        <category>Cognos Content Store</category>    
    <description>	&lt;p&gt;Here is the list of Cognos Content store tables with Description. Those informations come from an old document from Cognos so it may not be totally up to date.&lt;/p&gt;    	&lt;table&gt;
		&lt;tr&gt;
			&lt;th&gt;Table name &lt;/th&gt;
			&lt;th&gt;Descrition &lt;/th&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;CMSYSPROPS&lt;/span&gt;&lt;/span&gt;   &lt;/td&gt;
			&lt;td&gt; This table has the Content Store Version. &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;CMOBJNAMES&lt;/span&gt;&lt;/span&gt;   &lt;/td&gt;
			&lt;td&gt; This table has the names of all the objects in the content store. &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS1  &lt;/td&gt;
			&lt;td&gt; Users, Roles \ Group Distribution list and contact information such as Email, phone number, Fax Given name etc are stored in this table &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS2  &lt;/td&gt;
			&lt;td&gt; Report scheduling information is stored. This table has fields like hour, day week etc &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS3  &lt;/td&gt;
			&lt;td&gt; Stores Screen Tip and Object description provided while creating the objects are stored here &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS4  &lt;/td&gt;
			&lt;td&gt; Stores the printer paper setting details like height and width of A3 , A4 , letter and 11X17 paper orientations &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS6  &lt;/td&gt;
			&lt;td&gt; Has the details of the all packages which were published using the FM. &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS7  &lt;/td&gt;
			&lt;td&gt; This table stores the &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;XML&lt;/span&gt;&lt;/span&gt; of all reports and models. This is basically to maintain the metadata about the structure of the reports and models. &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS10 &lt;/td&gt;
			&lt;td&gt; Contact information is stored in this table. This table has columns like Contact Email and Contact. &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS11 &lt;/td&gt;
			&lt;td&gt; This table stores the data sources configuration details like connect string, the cube location etc. &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS13 &lt;/td&gt;
			&lt;td&gt; It stores the names of parameter passed to the range prompts &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS14 &lt;/td&gt;
			&lt;td&gt; Has details regarding the versions, creation time etc of the objects in the content store. &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS16 &lt;/td&gt;
			&lt;td&gt; This table provides the status of the multiple services of Cognos like LogService, MonitorService, ReportService, SystemService, JobService &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS17 &lt;/td&gt;
			&lt;td&gt; Stores performance details of each component like “query Studio, Analysis Studio, Event Studio” etc &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS18 &lt;/td&gt;
			&lt;td&gt; This table stores the drill path from the source to the final target report. &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS20 &lt;/td&gt;
			&lt;td&gt; Stores details regarding which are all the reports for which prompting has been enabled. And also has the details of which are the reports which has the default report options  overridden. &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS24 &lt;/td&gt;
			&lt;td&gt; Stores the printer configuration details &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS25 &lt;/td&gt;
			&lt;td&gt; Stores the data regarding the objects deployed, like the deployed folder, the reports, the number of folders present in the deployment archive, etc &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS26 &lt;/td&gt;
			&lt;td&gt; This table stores the data about all the packages imported / exported in C8, with the properties selected during the process. &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS27 &lt;/td&gt;
			&lt;td&gt; Has the details regarding the data source created in the content store using Cubes. &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS30 &lt;/td&gt;
			&lt;td&gt; Stores the registration , service description etc details about portlets in this table &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS31 &lt;/td&gt;
			&lt;td&gt; Has the custom logging level for each of the Cognos services, &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;CMID&lt;/span&gt;&lt;/span&gt; can be be linked to &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;CMOBJNAMES&lt;/span&gt;&lt;/span&gt; for the names of each of the services &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS32 &lt;/td&gt;
			&lt;td&gt; Has the details of the stored procedures used as the query items in the FM model. &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS33 &lt;/td&gt;
			&lt;td&gt; Detail related to users, user groups user roles. &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS34 &lt;/td&gt;
			&lt;td&gt; Has the details regarding the drill through parameters of the drill through reports. The parameter assign values are present in coded format &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS36 &lt;/td&gt;
			&lt;td&gt; Has the list of all the Models published using framework manager &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS37 &lt;/td&gt;
			&lt;td&gt; This table has the details of the routing sets configured for server / load balancing for each package published in the content store &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS38 &lt;/td&gt;
			&lt;td&gt; Configuration details about number of items to retrieve in studios, for a package are saved under this table. &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS39 &lt;/td&gt;
			&lt;td&gt; Has values for properties of reports and views. &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;PROPID&lt;/span&gt;&lt;/span&gt; can be linked to &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;CMPROPERTIES&lt;/span&gt;&lt;/span&gt; for property names &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS52 &lt;/td&gt;
			&lt;td&gt; Contains the properties for the connections &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; CMOBJPROPS55 &lt;/td&gt;
			&lt;td&gt; Has the &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;URI&lt;/span&gt;&lt;/span&gt; for icons for each entry in Cognos Connection &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;CMLOCALES&lt;/span&gt;&lt;/span&gt;    &lt;/td&gt;
			&lt;td&gt; Has the locale ids associated with each language supported by Cognos 8 &lt;/td&gt;
		&lt;/tr&gt;
	&lt;/table&gt;</description>
    
    
    
          <comments>http://blog.jbheren.com/post/2011/03/29/Cognos-Content-store-Tables-Description#comment-form</comments>
      <wfw:comment>http://blog.jbheren.com/post/2011/03/29/Cognos-Content-store-Tables-Description#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.jbheren.com/feed/atom/comments/56</wfw:commentRss>
      </item>
    
  <item>
    <title>Extract Cognos reports &amp; packages list with path</title>
    <link>http://blog.jbheren.com/post/2011/03/29/Extract-Cognos-reports-packages-list-with-path</link>
    <guid isPermaLink="false">urn:md5:434e7bb80f76f9960a069214ca692f5d</guid>
    <pubDate>Mon, 28 Mar 2011 22:33:00 +0200</pubDate>
    <dc:creator>Jean-Baptiste HEREN</dc:creator>
        <category>Décisionnel</category>
        <category>Cognos</category><category>Cognos Content Store</category><category>SQL</category>    
    <description>&lt;p&gt;When you want to make a documentation on &lt;a href=&quot;http://blog.jbheren.com/tag/Cognos&quot;&gt;Cognos&lt;/a&gt; (or anything), it's hard to keep it updated...&lt;/p&gt;


&lt;p&gt;One of my recent projects has been to buid an automatic documentation on Cognos, showing dependencies between packages, reports and even source tables or ETL packages.
Here I share with you, some &lt;a href=&quot;http://blog.jbheren.com/tag/SQL&quot;&gt;SQL&lt;/a&gt; scripts extracting information from the &lt;a href=&quot;http://blog.jbheren.com/tag/Cognos%20Content%20Store&quot;&gt;Cognos Content Store&lt;/a&gt;. Hope it will be helpful.&lt;/p&gt;    &lt;pre&gt;[SQL]
/* Author: Jean-Baptiste HEREN - 2010-07-06      */
/* Descr: extract Report model XML from database */
select names.name, specs.spec
from CMOBJNAMES names
     inner join CMOBJPROPS7 specs 
     on names.CMID = specs.CMID 
where names.name LIKE '%Audit%'

/* Author: Jean-Baptiste HEREN - 2010-07-06      */
/* Descr: extract packages list */
SELECT DISTINCT
       cmobjects.cmid,
       cmobjnames.name as package_name
FROM   cmrefnoord1
       INNER JOIN cmobjects
         ON cmrefnoord1.refcmid = cmobjects.cmid
       INNER JOIN cmobjnames
         ON cmobjects.cmid = cmobjnames.cmid
WHERE  cmrefnoord1.propid = 31
       AND cmobjnames.localeid IN ( '24', '100')

/* Author: Jean-Baptiste HEREN - 2011-03-15 */
/* Descr: - Report names, full Paths &amp;amp; related package name from cognoscs database */
/* CMOBJPROPS25 - Stores the data regarding the objects deployed, like the deployed folder, the reports, the number of folders present in the deployment archive, etc*/
SELECT DISTINCT rank() OVER(ORDER BY package_name,NAME,max(Path) ASC) as rank, NAME as report_name, package_name, RTRIM(max(Path)) as path, cast(storeID as nvarchar) as store_id
FROM (
SELECT A.CMID, L1.mapdlocaleid, L1.locale, L1.TYPE ,L1.NAME /*, L9.NAME, L8.NAME, L7.NAME, L6.NAME , L5.NAME, L4.NAME  , L3.NAME  , L2.NAME*/
, LTRIM(SUBSTRING(
  CASE WHEN isnull(L10.NAME,'') = '/' THEN ' ' ELSE isnull(L10.NAME,'') END + CASE WHEN L10.NAME = '/' THEN '' ELSE '/' END
+ CASE WHEN isnull(L9.NAME,'')  = '/' THEN ' ' ELSE isnull(L9.NAME,'')  END + CASE WHEN L9.NAME  = '/' THEN '' ELSE '/' END
+ CASE WHEN isnull(L8.NAME,'')  = '/' THEN ' ' ELSE isnull(L8.NAME,'')  END + CASE WHEN L8.NAME  = '/' THEN '' ELSE '/' END
+ CASE WHEN isnull(L7.NAME,'')  = '/' THEN ' ' ELSE isnull(L7.NAME,'')  END + CASE WHEN L7.NAME  = '/' THEN '' ELSE '/' END
+ CASE WHEN isnull(L6.NAME,'')  = '/' THEN ' ' ELSE isnull(L6.NAME,'')  END + CASE WHEN L6.NAME  = '/' THEN '' ELSE '/' END
+ CASE WHEN isnull(L5.NAME,'')  = '/' THEN ' ' ELSE isnull(L5.NAME,'')  END + CASE WHEN L5.NAME  = '/' THEN '' ELSE '/' END
+ CASE WHEN isnull(L4.NAME,'')  = '/' THEN ' ' ELSE isnull(L4.NAME,'')  END + CASE WHEN L4.NAME  = '/' THEN '' ELSE '/' END
+ CASE WHEN isnull(L3.NAME,'')  = '/' THEN ' ' ELSE isnull(L3.NAME,'')  END + CASE WHEN L3.NAME  = '/' THEN '' ELSE '/' END
+ isnull(L2.NAME ,'') + CASE WHEN L2.NAME  = '/' THEN '' ELSE '/' END
--+ isnull(L1.NAME ,'')
  , CHARINDEX('Public',
  isnull(L10.NAME,'') + CASE WHEN L10.NAME = '/' THEN '' ELSE '/' END
+ isnull(L9.NAME ,'') + CASE WHEN L9.NAME  = '/' THEN '' ELSE '/' END
+ isnull(L8.NAME ,'') + CASE WHEN L8.NAME  = '/' THEN '' ELSE '/' END
+ isnull(L7.NAME ,'') + CASE WHEN L7.NAME  = '/' THEN '' ELSE '/' END
+ isnull(L6.NAME ,'') + CASE WHEN L6.NAME  = '/' THEN '' ELSE '/' END
+ isnull(L5.NAME ,'') + CASE WHEN L5.NAME  = '/' THEN '' ELSE '/' END
+ isnull(L4.NAME ,'') + CASE WHEN L4.NAME  = '/' THEN '' ELSE '/' END
+ isnull(L3.NAME ,'') + CASE WHEN L3.NAME  = '/' THEN '' ELSE '/' END
+ isnull(L2.NAME ,'') + CASE WHEN L2.NAME  = '/' THEN '' ELSE '/' END
--+ isnull(L1.NAME ,'')
), LEN(
  isnull(L10.NAME,'') + CASE WHEN L10.NAME = '/' THEN '' ELSE '/' END
+ isnull(L9.NAME ,'') + CASE WHEN L9.NAME  = '/' THEN '' ELSE '/' END
+ isnull(L8.NAME ,'') + CASE WHEN L8.NAME  = '/' THEN '' ELSE '/' END
+ isnull(L7.NAME ,'') + CASE WHEN L7.NAME  = '/' THEN '' ELSE '/' END
+ isnull(L6.NAME ,'') + CASE WHEN L6.NAME  = '/' THEN '' ELSE '/' END
+ isnull(L5.NAME ,'') + CASE WHEN L5.NAME  = '/' THEN '' ELSE '/' END
+ isnull(L4.NAME ,'') + CASE WHEN L4.NAME  = '/' THEN '' ELSE '/' END
+ isnull(L3.NAME ,'') + CASE WHEN L3.NAME  = '/' THEN '' ELSE '/' END
+ isnull(L2.NAME ,'') + CASE WHEN L2.NAME  = '/' THEN '' ELSE '/' END
--+ isnull(L1.NAME ,'')
))
  ) as Path
FROM CMOBJECTS A
INNER JOIN (
	SELECT cmobjnames.cmid, 
	cmstoreids.storeid,
	cmobjects.pcmid, 
	cmobjnames.name, 	
    cmobjnames.mapdlocaleid,
    cmobjnames.localeid,
    cmlocales.locale,
	cmclasses.name as type
	     FROM cmobjects, cmobjnames, cmclasses, cmstoreids, cmlocales
	    WHERE
	     	 cmobjects.cmid = cmobjnames.cmid
	    AND cmobjects.classid = cmclasses.classid
	    AND cmobjects.cmid = cmstoreids.cmid
        AND cmclasses.name in('report')
        AND cmobjnames.localeid = cmlocales.localeid and cmlocales.locale in ('fr','en')
) L1 ON A.cmid = L1.cmid
INNER JOIN (
	SELECT cmobjnames.cmid, 
	cmstoreids.storeid,
	cmobjects.pcmid, 
	cmobjnames.name, 	
    cmobjnames.mapdlocaleid,
    cmobjnames.localeid,
    cmlocales.locale,
	cmclasses.name as type
	     FROM cmobjects, cmobjnames, cmclasses, cmstoreids, cmlocales
	    WHERE
	     	 cmobjects.cmid = cmobjnames.cmid
	    AND cmobjects.classid = cmclasses.classid
	    AND cmobjects.cmid = cmstoreids.cmid
        AND cmobjnames.localeid = cmlocales.localeid and cmlocales.locale in ('fr','en')
) L2 ON L1.pcmid = L2.cmid
INNER JOIN (
	SELECT cmobjnames.cmid, 
	cmstoreids.storeid,
	cmobjects.pcmid, 
	cmobjnames.name, 	
    cmobjnames.mapdlocaleid,
    cmobjnames.localeid,
    cmlocales.locale,
	cmclasses.name as type
	     FROM cmobjects, cmobjnames, cmclasses, cmstoreids, cmlocales
	    WHERE
	     	 cmobjects.cmid = cmobjnames.cmid
	    AND cmobjects.classid = cmclasses.classid
	    AND cmobjects.cmid = cmstoreids.cmid
        AND cmobjnames.localeid = cmlocales.localeid and cmlocales.locale in ('fr','en')
) L3 ON L2.pcmid = L3.cmid
INNER JOIN (
	SELECT cmobjnames.cmid, 
	cmstoreids.storeid,
	cmobjects.pcmid, 
	cmobjnames.name, 	
    cmobjnames.mapdlocaleid,
    cmobjnames.localeid,
    cmlocales.locale,
	cmclasses.name as type
	     FROM cmobjects, cmobjnames, cmclasses, cmstoreids, cmlocales
	    WHERE
	     	 cmobjects.cmid = cmobjnames.cmid
	    AND cmobjects.classid = cmclasses.classid
	    AND cmobjects.cmid = cmstoreids.cmid
        AND cmobjnames.localeid = cmlocales.localeid and cmlocales.locale in ('fr','en')
) L4 ON L3.pcmid = L4.cmid
INNER JOIN (
	SELECT cmobjnames.cmid, 
	cmstoreids.storeid,
	cmobjects.pcmid, 
	cmobjnames.name, 	
    cmobjnames.mapdlocaleid,
    cmobjnames.localeid,
    cmlocales.locale,
	cmclasses.name as type
	     FROM cmobjects, cmobjnames, cmclasses, cmstoreids, cmlocales
	    WHERE
	     	 cmobjects.cmid = cmobjnames.cmid
	    AND cmobjects.classid = cmclasses.classid
	    AND cmobjects.cmid = cmstoreids.cmid
        AND cmobjnames.localeid = cmlocales.localeid and cmlocales.locale in ('fr','en')
) L5 ON L4.pcmid = L5.cmid
INNER JOIN (
	SELECT cmobjnames.cmid, 
	cmstoreids.storeid,
	cmobjects.pcmid, 
	cmobjnames.name, 	
    cmobjnames.mapdlocaleid,
    cmobjnames.localeid,
    cmlocales.locale,
	cmclasses.name as type
	     FROM cmobjects, cmobjnames, cmclasses, cmstoreids, cmlocales
	    WHERE
        	 cmobjects.cmid = cmobjnames.cmid
	    AND cmobjects.classid = cmclasses.classid
	    AND cmobjects.cmid = cmstoreids.cmid
        AND cmobjnames.localeid = cmlocales.localeid and cmlocales.locale in ('fr','en')
) L6 ON L5.pcmid = L6.cmid
INNER JOIN (
	SELECT cmobjnames.cmid, 
	cmstoreids.storeid,
	cmobjects.pcmid, 
	cmobjnames.name, 	
    cmobjnames.mapdlocaleid,
    cmobjnames.localeid,
    cmlocales.locale,
	cmclasses.name as type
	     FROM cmobjects, cmobjnames, cmclasses, cmstoreids, cmlocales
	    WHERE
	     	 cmobjects.cmid = cmobjnames.cmid
	    AND cmobjects.classid = cmclasses.classid
	    AND cmobjects.cmid = cmstoreids.cmid
        AND cmobjnames.localeid = cmlocales.localeid and cmlocales.locale in ('fr','en')
) L7 ON L6.pcmid = L7.cmid
INNER JOIN (
	SELECT cmobjnames.cmid, 
	cmstoreids.storeid,
	cmobjects.pcmid, 
	cmobjnames.name, 	
    cmobjnames.mapdlocaleid,
    cmobjnames.localeid,
    cmlocales.locale,
	cmclasses.name as type
	     FROM cmobjects, cmobjnames, cmclasses, cmstoreids, cmlocales
	    WHERE
	     	 cmobjects.cmid = cmobjnames.cmid
	    AND cmobjects.classid = cmclasses.classid
	    AND cmobjects.cmid = cmstoreids.cmid
        AND cmobjnames.localeid = cmlocales.localeid and cmlocales.locale in ('fr','en')
) L8 ON L7.pcmid = L8.cmid
INNER JOIN (
	SELECT cmobjnames.cmid, 
	cmstoreids.storeid,
	cmobjects.pcmid, 
	cmobjnames.name, 	
    cmobjnames.mapdlocaleid,
    cmobjnames.localeid,
    cmlocales.locale,
	cmclasses.name as type
	     FROM cmobjects, cmobjnames, cmclasses, cmstoreids, cmlocales
	    WHERE
	     	 cmobjects.cmid = cmobjnames.cmid
	    AND cmobjects.classid = cmclasses.classid
	    AND cmobjects.cmid = cmstoreids.cmid
        AND cmobjnames.localeid = cmlocales.localeid and cmlocales.locale in ('fr','en')
) L9 ON L8.pcmid = L9.cmid
INNER JOIN (
	SELECT cmobjnames.cmid, 
	cmstoreids.storeid,
	cmobjects.pcmid, 
	cmobjnames.name, 	
    cmobjnames.mapdlocaleid,
    cmobjnames.localeid,
    cmlocales.locale,
	cmclasses.name as type
	     FROM cmobjects, cmobjnames, cmclasses, cmstoreids, cmlocales
	    WHERE
	     	 cmobjects.cmid = cmobjnames.cmid
	    AND cmobjects.classid = cmclasses.classid
	    AND cmobjects.cmid = cmstoreids.cmid
        AND cmobjnames.localeid = cmlocales.localeid and cmlocales.locale in ('fr','en')
) L10 ON L9.pcmid = L10.cmid
WHERE CLASSID IN (10,18) -- reports &amp;amp; packages
--  AND DISABLED is NULL
) Z INNER JOIN cmstoreids on Z.CMID = cmstoreids.CMID
    INNER JOIN (SELECT cmrefnoord1.cmid AS pid,
       cmobjnames.name as package_name
FROM   cmrefnoord1
       INNER JOIN cmobjects
         ON cmrefnoord1.refcmid = cmobjects.cmid
       INNER JOIN cmobjnames
         ON cmobjects.cmid = cmobjnames.cmid
WHERE  cmrefnoord1.propid = 31
       AND cmobjnames.localeid IN ( '24', '100')
     ) PKG on Z.CMID = PKG.PID
--WHERE Path like '%/REPORTING/%'
group by NAME, package_name, storeID
&lt;/pre&gt;</description>
    
          <enclosure url="http://blog.jbheren.com/public/Decisionnel/cognos_content_store/2010_07_06_Report___package_list_with_path.sql"
      length="9858" type="text/plain" />
    
    
          <comments>http://blog.jbheren.com/post/2011/03/29/Extract-Cognos-reports-packages-list-with-path#comment-form</comments>
      <wfw:comment>http://blog.jbheren.com/post/2011/03/29/Extract-Cognos-reports-packages-list-with-path#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.jbheren.com/feed/atom/comments/55</wfw:commentRss>
      </item>
    
  <item>
    <title>Analysis Services 2005 : L'erreur système suivante s'est produite : .</title>
    <link>http://blog.jbheren.com/post/2011/01/25/analysis-services-2005-erreur-systeme</link>
    <guid isPermaLink="false">urn:md5:133eaf0691bf1bc712a289cb5b1af379</guid>
    <pubDate>Mon, 24 Jan 2011 16:39:00 +0100</pubDate>
    <dc:creator>Jean-Baptiste HEREN</dc:creator>
        <category>Décisionnel</category>
        <category>Analysis Services</category><category>SQL Server</category><category>SQL Server 2005</category>    
    <description>    &lt;p&gt;Voici une astuce pour SSAS sous SQL Server 2005. Si vous rencontrez l'erreur&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;[script]
L'erreur système suivante s'est produite : . 
&lt;/pre&gt;


&lt;p&gt;Cette erreur est liée à la présence au niveau de l'onglet Membership des rôles Analysis Services, de membres n'existant plus dans Active Directory.&lt;/p&gt;


&lt;p&gt;Il suffit donc nettoyer vos rôles :)&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.jbheren.com/post/2011/01/25/analysis-services-2005-erreur-systeme#comment-form</comments>
      <wfw:comment>http://blog.jbheren.com/post/2011/01/25/analysis-services-2005-erreur-systeme#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.jbheren.com/feed/atom/comments/53</wfw:commentRss>
      </item>
    
  <item>
    <title>Installer JasperServer sur Linux Debian</title>
    <link>http://blog.jbheren.com/post/2011/01/15/Installer-JasperServer-sur-Linux-Debian</link>
    <guid isPermaLink="false">urn:md5:678dbf62f0acd60898165c35bc12ed21</guid>
    <pubDate>Sat, 15 Jan 2011 12:15:00 +0100</pubDate>
    <dc:creator>Jean-Baptiste HEREN</dc:creator>
        <category>Décisionnel</category>
        <category>Business Intelligence</category><category>Consultant décisionnel</category><category>debian</category><category>Jasper</category><category>linux</category>    
    <description>    &lt;p&gt;JasperServer est la solution open source de BI &amp;amp; reporting la plus aboutie à ce jour. Cette solution comprend l'ensemble des outils nécessaire à la mise en place d'une solution décisionnelle professionnelle.&lt;/p&gt;


&lt;p&gt;Nous allons voir ici quelles sont les étapes pour installer jasper server manuellement. Ceci est utile en particulier si vous disposez déjà d'un mysql et/ou d'un tomcat installés sur votre machine.&lt;/p&gt;


&lt;h2&gt;1- Téléchargement du paquet &quot;JasperServer WAR install&quot;&lt;/h2&gt;

&lt;p&gt;Ce paquet contient le portail Jasper, mysql et l'outil de développement de rapports.
rendez-vous chez &lt;a href=&quot;http://jasperforge.org/projects/jasperserver&quot; hreflang=&quot;en&quot;&gt;jasperForge&lt;/a&gt; ou directement sur &lt;a href=&quot;http://sourceforge.net/projects/jasperserver/files/JasperServer/&quot; hreflang=&quot;en&quot;&gt;sourceforge&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Connectez vous en tant qu'administrateur (root)&lt;/p&gt;
&lt;pre&gt;[script]
# unzip ./jasperserver-ce-3.7.1.bin.zip
# cd jasperserver-ce-3.7.1.bin/
# ls
apache-ant   jasperserver.war  samples
buildomatic  license.txt       scripts
docs	     releaseNotes.txt  Third-Party-Notices.pdf
&lt;/pre&gt;


&lt;h2&gt;2- Installation du serveur d'application Web&lt;/h2&gt;

&lt;p&gt;Ici nous installerons Tomcat5, il est également possible de réaliser l'installation avec JBoss, par exemple.&lt;/p&gt;
&lt;pre&gt;[script]
# apt-get install sun-java6-jdk tomcat5.5 tomcat5.5-admin tomcat5.5-webapps
&lt;/pre&gt;


&lt;p&gt;Si l'installation s'est bien déroulée, une connexion du navigateur web à l'adresse http://localhost:8180/ devrait vous afficher ceci&amp;nbsp;:
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/jasperserver/01_-_tomcat_home.png&quot; title=&quot;01_-_tomcat_home.png&quot;&gt;&lt;img src=&quot;http://blog.jbheren.com/public/Decisionnel/jasperserver/.01_-_tomcat_home_m.jpg&quot; alt=&quot;01_-_tomcat_home.png&quot; title=&quot;01_-_tomcat_home.png, janv. 2011&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Il nous faut maintenant configurer un compte admin pour tomcat&lt;/p&gt;
&lt;pre&gt;[script]
# vim /var/lib/tomcat5.5/conf/tomcat-users.xml
&lt;/pre&gt;


&lt;p&gt;Modifiez le mot de passe par défaut de tomcat et ajoutez les rôles admin &amp;amp; manager.&lt;/p&gt;
&lt;pre&gt;[xml]
&amp;lt;?xml version='1.0' encoding='utf-8'?&amp;gt;
&amp;lt;tomcat-users&amp;gt;
  &amp;lt;role rolename=&amp;quot;tomcat&amp;quot;/&amp;gt;
  &amp;lt;role rolename=&amp;quot;manager&amp;quot;/&amp;gt;
  &amp;lt;role rolename=&amp;quot;admin&amp;quot;/&amp;gt;
  &amp;lt;user username=&amp;quot;tomcat&amp;quot; password=&amp;quot;tomcat&amp;quot; roles=&amp;quot;tomcat,admin,manager&amp;quot;/&amp;gt;
&amp;lt;/tomcat-users&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Modifier les paramètres de la VM pour jasperserver. En effet, les paramètres par défaut ne sont pas suffisants...&lt;/p&gt;
&lt;pre&gt;[script]
# vim /usr/share/tomcat5.5/bin/setclasspath.sh 
&lt;/pre&gt;


&lt;p&gt;Puis on ajoute la variable JAVA_OPTS, juste aprés le JAVA_ENDORSED_DIRS.&lt;/p&gt;
&lt;pre&gt;[script]
# Set the default -Djava.endorsed.dirs argument
JAVA_ENDORSED_DIRS=&amp;quot;$BASEDIR&amp;quot;/common/endorsed

# JBH - Parameters for JasperServer to work fine
export JAVA_OPTS=&amp;quot;$JAVA_OPTS -Xms128m -Xmx512m -XX:PermSize=32m -XX:MaxPermSize=128m -Xss2m -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled&amp;quot;
&lt;/pre&gt;


&lt;p&gt;Copier le connecteur jdbc mysql depuis le dossier d'installation&lt;/p&gt;
&lt;pre&gt;[scripts]
 cp scripts/drivers/mysql/jdbc/mysql-connector-java-5.1.10.jar /usr/share/tomcat5.5/common/lib/
&lt;/pre&gt;


&lt;p&gt;Redémarrer le server afin de prendre en compte nos modifications&lt;/p&gt;
&lt;pre&gt;[script]
# /etc/init.d/tomcat5.5 restart
Stopping Tomcat servlet engine: tomcat5.5.
Starting Tomcat servlet engine: tomcat5.5.
&lt;/pre&gt;


&lt;p&gt;Nous pouvons maintenant nous connecter au manager Tomcat en utilisant les login/pass de l'utilisateur tomcat. Pour cela, rendez-vous à l'adresse http://localhost:8180/manager/html
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/jasperserver/02_-_tomcat_manager.png&quot; title=&quot;02_-_tomcat_manager.png&quot;&gt;&lt;img src=&quot;http://blog.jbheren.com/public/Decisionnel/jasperserver/.02_-_tomcat_manager_m.jpg&quot; alt=&quot;02_-_tomcat_manager.png&quot; title=&quot;02_-_tomcat_manager.png, janv. 2011&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;3- préparation de mysql avec buildomatic&lt;/h2&gt;
&lt;pre&gt;[script]
# cd buildomatic
# cp sample_conf/inst-mysql_master.properties default_master.properties
# /etc/init.d/tomcat stop
# vim default_master.properties
&lt;/pre&gt;


&lt;p&gt;Changes configuration values to&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;[script]
# application server type (default is tomcat6)
appServerType = tomcat5

# Tomcat app server root dir
appServerDir = /var/lib/tomcat5.5/

# database type
dbType=mysql

# database location and connection settings
dbHost=localhost
dbUsername=root
dbPassword=password #set your own password
&lt;/pre&gt;


&lt;p&gt;Nous allons maintenant regénérer les paramètres de buildomatic.&lt;/p&gt;
&lt;pre&gt;[script]
 ./js-ant clean-config
./js-ant gen-config
&lt;/pre&gt;


&lt;p&gt;Nous allons maintenant exécuter les tâches de création de la base jasperserver&lt;/p&gt;
&lt;pre&gt;[script]
debianlamp:/home/jb/jasper/jasperserver-ce-3.7.1-bin/buildomatic# ./js-ant create-js-db
Buildfile: build.xml

create-js-db:
     [echo] create database, js.dbName = jasperserver
      [sql] Executing commands
      [sql] 1 rows affected
      [sql] 1 of 1 SQL statements executed successfully

BUILD SUCCESSFUL
Total time: 3 seconds
&lt;/pre&gt;


&lt;p&gt;Les commandes suivantes créent le paramêtrage par défaut (users)&lt;/p&gt;
&lt;pre&gt;[script]
# ./js-ant init-js-db-ce 
# ./js-ant import-minimal-ce
&lt;/pre&gt;


&lt;p&gt;En option, la création et le chargement des bases de démonstration&lt;/p&gt;
&lt;pre&gt;[script]
# ./js-ant create-sugarcrm-db
# ./js-ant create-foodmart-db
# ./js-ant load-sugarcrm-db
# ./js-ant load-foodmart-db
# ./js-ant update-foodmart-db
# ./js-ant import-sample-data-ce
&lt;/pre&gt;


&lt;p&gt;Puis le déploiement vers tomcat (le serveur doit être inactif).&lt;/p&gt;
&lt;pre&gt;[script]
 # ./js-ant deploy-webapp-ce
Buildfile: build.xml

init-source-paths:
     [echo]  
     [echo] Property values (in dev.xml: init-source-paths): 
     [echo]   js-path = ${js-base-path}
     [echo]   js-pro-path = ${js-pro-base-path}
     [echo]   repo-path = ${repo-path}
     [echo]  

set-ce-webapp-name:
     [copy] Copying 1 file to /home/jb/jasper/jasperserver-ce-3.7.1-bin/buildomatic/build_conf/default
     [copy] Copying 1 file to /home/jb/jasper/jasperserver-ce-3.7.1-bin/buildomatic/build_conf/default/webapp/WEB-INF

deploy-jdbc-jar:
     [copy] Copying 1 file to /var/lib/tomcat5.5/common/lib

deploy-webapp:
     [echo]  
     [echo] Property values (in install.xml: deploy-webapp): 
     [echo]  jsEdition = ce
     [echo]  warFileDistSourceDir = /home/jb/jasper/jasperserver-ce-3.7.1-bin/buildomatic/../jasperserver.war
     [echo]  warTargetDir = /var/lib/tomcat5.5/webapps/jasperserver
     [echo]  webAppName = jasperserver
     [echo]  webAppNameCE = jasperserver
     [echo]  webAppNamePro = jasperserver-pro
     [echo]  webAppNameSrc = jasperserver 
     [echo]  webAppNameDel = jasperserver
     [echo]  warTargetDirDel = /var/lib/tomcat5.5/webapps/jasperserver
     [echo]  
     [copy] Copying 1013 resources to /var/lib/tomcat5.5/webapps/jasperserver
     [copy] Copying 4 files to /var/lib/tomcat5.5/webapps/jasperserver
   [delete] Deleting directory /var/lib/tomcat5.5/work/Catalina/localhost/jasperserver

deploy-webapp-ce:

BUILD SUCCESSFUL
Total time: 25 seconds
&lt;/pre&gt;


&lt;h3&gt;Réglages de Tomcat&lt;/h3&gt;


&lt;p&gt;Lien symbolique vers la config de jasperserver dans /etc&lt;/p&gt;
&lt;pre&gt;[script]
cd /etc/tomcat5.5/Catalina/localhost
ln -s /usr/share/tomcat5.5/webapps/jasperserver/META-INF/context.xml ./jasperserver.xml
&lt;/pre&gt;


&lt;p&gt;Ajout des policies pour jasperserver&lt;/p&gt;
&lt;pre&gt;[script]
# vi /etc/tomcat5.5/policy.d/04webapps.policy
&lt;/pre&gt;


&lt;p&gt;On ajoute la partie suivante dans la section &lt;em&gt;grant codeBase &quot;file:${catalina.home}/bin/tomcat-juli.jar&quot; {&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;[script]
   permission java.io.FilePermission &amp;quot;/usr/share/tomcat5.5/webapps/jasperserver/WEB-INF/classes/logging.properties&amp;quot;, &amp;quot;read&amp;quot;;
//

Il faut editer ensuite le fichier
///[script]
# vi /etc/tomcat5.5/policy.d/50user.policy
&lt;/pre&gt;


&lt;p&gt;Ajouter la définition suivante&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;[script]
grant codeBase &amp;quot;file:/usr/share/tomcat5.5/webapps/jasperserver/-&amp;quot; {
    permission java.security.AllPermission;
};
&lt;/pre&gt;


&lt;p&gt;Mise en place des logs dans le dossier /var/log/tomcat5.5/&lt;/p&gt;
&lt;pre&gt;[scripts]
 vim /var/lib/tomcat5.5/webapps/jasperserver/WEB-INF/log4j.properties
&lt;/pre&gt;

&lt;pre&gt;[sript]
...
log4j.appender.fileout.File=/var/log/tomcat5.5/jasperserver.log
...
log4j.appender.jasperanalysis.File=/var/log/tomcat5.5/jasperanalysis.log
&lt;/pre&gt;


&lt;h2&gt;4- Démarrage de JasperServer&lt;/h2&gt;


&lt;p&gt;Nous pouvons maintenant démarrer  tomcat&lt;/p&gt;
&lt;pre&gt;[script]
# /etc/init.d/tomcat5.5 start
&lt;/pre&gt;


&lt;p&gt;Puis nous connecter à jasperserver à l'adresse http://localhost:8180/jasperserver/, si tout s'est bien passé, vous devriez voir la fenêtre de connexion.
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/jasperserver/03_-_jasperserver_Home.png&quot; title=&quot;03_-_jasperserver_Home.png&quot;&gt;&lt;img src=&quot;http://blog.jbheren.com/public/Decisionnel/jasperserver/.03_-_jasperserver_Home_m.jpg&quot; alt=&quot;03_-_jasperserver_Home.png&quot; title=&quot;03_-_jasperserver_Home.png, janv. 2011&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;les login par défaut de l'administrateur  sont jasperadmin/jasperadmin.&lt;/p&gt;


&lt;h2&gt;Problèmes éventuels&lt;/h2&gt;


&lt;p&gt;Si l'application n'a pas démarré, vous pouvez consulter, en autres la log jasperserver configurée plus haut:&lt;/p&gt;
&lt;pre&gt;[script]
cat /var/log/tomcat5.5/jasperserver.log
&lt;/pre&gt;


&lt;h3&gt;Problèmes de sécurité dans les logs Cantala.&lt;/h3&gt;


&lt;p&gt;Sous Debian, TOMCAT peut poser un problème de sécurité, même aprés l'ajout des policies plus haut, il est possible qu'un problème subsiste.
Si c'est le cas, vous pouvez désactiver le JSM (Java Security Manager) en modifiant la valeur TOMCAT5_SECURITY dans le fichier suivant&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;[script]
# vim /etc/default/tomcat5.5 
&lt;/pre&gt;


&lt;p&gt;Modifiez la valeur du TOMCAT5_SECURITY comme suit&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;[script]
# Use the Java security manager? (yes/no, default: yes)
# WARNING: Do not disable the security manager unless you understand
# the consequences!
# NOTE: java-gcj-compat-dev currently doesn't support a security
# manager.
TOMCAT5_SECURITY=no
&lt;/pre&gt;</description>
    
    
    
          <comments>http://blog.jbheren.com/post/2011/01/15/Installer-JasperServer-sur-Linux-Debian#comment-form</comments>
      <wfw:comment>http://blog.jbheren.com/post/2011/01/15/Installer-JasperServer-sur-Linux-Debian#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.jbheren.com/feed/atom/comments/50</wfw:commentRss>
      </item>
    
  <item>
    <title>Cognos Report Studio : position d'un membre dans une hierarchie</title>
    <link>http://blog.jbheren.com/post/2010/11/03/Cognos-Report-Studio-position-d-un-membre-dans-une-hierarchie</link>
    <guid isPermaLink="false">urn:md5:6ab80d67e01d4d418534bdaaf36a3464</guid>
    <pubDate>Wed, 03 Nov 2010 18:02:00 +0100</pubDate>
    <dc:creator>Jean-Baptiste HEREN</dc:creator>
        <category>Décisionnel</category>
        <category>Cognos</category><category>cognos function</category><category>Report Studio</category>    
    <description>    &lt;p&gt;L'expression suivante renvoie niveau de profondeur du membre spécifié dans une hiérarchie.&lt;/p&gt;

&lt;pre&gt;[script]
ordinal (level(currentMember([My_Package].[My_Dimension].[My_Hierarchy])))
&lt;/pre&gt;</description>
    
    
    
          <comments>http://blog.jbheren.com/post/2010/11/03/Cognos-Report-Studio-position-d-un-membre-dans-une-hierarchie#comment-form</comments>
      <wfw:comment>http://blog.jbheren.com/post/2010/11/03/Cognos-Report-Studio-position-d-un-membre-dans-une-hierarchie#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.jbheren.com/feed/atom/comments/3</wfw:commentRss>
      </item>
    
  <item>
    <title>Formules MDX - Associer deux dimentions temporelles avec LINKMEMBER</title>
    <link>http://blog.jbheren.com/post/2010/09/09/Formules-MDX-Associer-deux-dimentions-temporelles-avec-LINKMEMBER</link>
    <guid isPermaLink="false">urn:md5:d9ef7685805a23793fc167ad39c5325a</guid>
    <pubDate>Wed, 08 Sep 2010 22:00:00 +0200</pubDate>
    <dc:creator>Jean-Baptiste HEREN</dc:creator>
        <category>Décisionnel</category>
        <category>Business Intelligence</category><category>MDX</category><category>SQL Server 2005</category><category>SSAS</category>    
    <description>&lt;p&gt;Voici un exemple d'utilisation de la fonction LINKMEMBER pour le calcul
d'une mesure dans un cube Miscosoft SSAS.&lt;/p&gt;
&lt;h2&gt;Présentation&lt;/h2&gt;
Cet exemple est extrait d'un travail sur le thème de la &amp;quot;validité des
prévisions&amp;quot;:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Des données de prévision commerciale sont extraites et stockées chaque
semaine. Chacune de ces extractions correspond à une valeur EXTRACT_DATE.&lt;/li&gt;
&lt;li&gt;Les données d'entrée nous donnent des quantités (QTY) par date de prévision
(SCHED_HIPT_DTTM)&lt;/li&gt;
&lt;li&gt;Dans le cas réel, plusieurs dimensions complémentaires sont présentes
(client, produit, etc.)&lt;/li&gt;
&lt;/ul&gt;    Notre table de faits présente donc au minimum, pour l'exemple, les éléments
suivants :&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;EXTRACT_DATE (KEY) &lt;/li&gt;
&lt;li&gt;SCHED_SHIP_DTTM ((KEY)&lt;/li&gt;
&lt;li&gt;QTY (MEASURE)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Besoin d'analyse&lt;/h2&gt;
Il s'agit d'observer au cours du temps (date de vision), l'évolution des
quantités prévues pour une date donnée (date de prévision).&lt;br /&gt;
Par exemple, nous voulons observer l'évolution des quantités prévues pour Mai
2010, durant les mois qui précèdent. Le but est d'évaluer la fiabilité des
prévisions de M-1 à M-6.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Modèle&lt;/h2&gt;
On a donc un modèle de base contenant une table de fait et deux dimensions
temporelles.&lt;br /&gt;
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/linkmember_dates/Cube_star_model.jpg&quot;&gt;&lt;img title=&quot;Cube_star_model.jpg, sept. 2010&quot; alt=&quot;&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/linkmember_dates/.Cube_star_model_m.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Dimensions&lt;/h2&gt;
Les dimensions que nous voulons lier ont une structure identique.&lt;br /&gt;
&lt;h3&gt;Extract Time (date de Vision)&lt;/h3&gt;
&lt;br /&gt;
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/linkmember_dates/Extract_time_dimension.jpg&quot;&gt;&lt;img title=&quot;Extract_time_dimension.jpg, sept. 2010&quot; alt=&quot;&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/linkmember_dates/.Extract_time_dimension_m.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;

&lt;h3&gt;Schedule Time (date de réalisation prévue de la mesure)&lt;/h3&gt;
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/linkmember_dates/Sched_time_dimension.jpg&quot;&gt;&lt;img title=&quot;Sched_time_dimension.jpg, sept. 2010&quot; alt=&quot;&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/linkmember_dates/.Sched_time_dimension_m.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;Formule&lt;/h2&gt;
Dans les formules suivantes, nous utilisons la fonction &lt;a hreflang=&quot;fr&quot; href=&quot;http://technet.microsoft.com/fr-fr/library/ms146058.aspx&quot;&gt;LINKMEMBER&lt;/a&gt;
(Retourne le membre équivalent à un membre spécifié dans une hiérarchie
spécifique).&lt;br /&gt;
&lt;pre&gt;
CREATE MEMBER CURRENTCUBE.[MEASURES].&lt;strong&gt;[Qty on Schedule]&lt;/strong&gt;&lt;br /&gt; AS SUM(&lt;br /&gt;&lt;strong&gt;LINKMEMBER(&lt;/strong&gt;[Schedule Time].[Schedule Time].currentmember,[Extract Time].[Extract Time])&lt;br /&gt;,[Measures].[QTY]&lt;strong&gt;)&lt;/strong&gt;, &lt;br /&gt;VISIBLE = 1;&lt;br /&gt;&lt;br /&gt;CREATE MEMBER CURRENTCUBE.[MEASURES].&lt;strong&gt;[QTY M-1]&lt;/strong&gt;&lt;br /&gt; AS SUM(parallelperiod([Extract Time].[Extract Time].[Month], 1, &lt;strong&gt;LINKMEMBER(&lt;/strong&gt;[Schedule Time].[Schedule Time].currentmember,[Extract Time].[Extract Time])),[Measures].[QTY]), &lt;br /&gt;VISIBLE = 1  ;&lt;br /&gt;&lt;br /&gt;CREATE MEMBER CURRENTCUBE.[MEASURES].&lt;strong&gt;[QTY M-2]&lt;/strong&gt;&lt;br /&gt; AS SUM(parallelperiod([Extract Time].[Extract Time].[Month], 2, &lt;strong&gt;LINKMEMBER(&lt;/strong&gt;[Schedule Time].[Schedule Time].currentmember,[Extract Time].[Extract Time]&lt;strong&gt;)&lt;/strong&gt;),[Measures].[QTY]), &lt;br /&gt;VISIBLE = 1;   &lt;br /&gt;&lt;br /&gt;CREATE MEMBER CURRENTCUBE.[MEASURES].&lt;strong&gt;[QTY M-3]&lt;/strong&gt;&lt;br /&gt; AS SUM(parallelperiod([Extract Time].[Extract Time].[Month], 3, &lt;strong&gt;LINKMEMBER(&lt;/strong&gt;[Schedule Time].[Schedule Time].currentmember,[Extract Time].[Extract Time]&lt;strong&gt;)&lt;/strong&gt;),[Measures].[QTY]), &lt;br /&gt;VISIBLE = 1;   &lt;br /&gt;&lt;br /&gt;CREATE MEMBER CURRENTCUBE.[MEASURES].&lt;strong&gt;[QTY M-4]&lt;/strong&gt;&lt;br /&gt; AS SUM(parallelperiod([Extract Time].[Extract Time].[Month], 4, &lt;strong&gt;LINKMEMBER(&lt;/strong&gt;[Schedule Time].[Schedule Time].currentmember,[Extract Time].[Extract Time]&lt;strong&gt;)&lt;/strong&gt;),[Measures].[QTY]), &lt;br /&gt;VISIBLE = 1;   &lt;br /&gt;&lt;br /&gt;CREATE MEMBER CURRENTCUBE.[MEASURES].&lt;strong&gt;[QTY M-5]&lt;/strong&gt;&lt;br /&gt; AS SUM(parallelperiod([Extract Time].[Extract Time].[Month], 5, &lt;strong&gt;LINKMEMBER(&lt;/strong&gt;[Schedule Time].[Schedule Time].currentmember,[Extract Time].[Extract Time]&lt;strong&gt;)&lt;/strong&gt;),[Measures].[QTY]), &lt;br /&gt;VISIBLE = 1;   &lt;br /&gt;&lt;br /&gt;CREATE MEMBER CURRENTCUBE.[MEASURES].&lt;strong&gt;[QTY M-6]&lt;/strong&gt;&lt;br /&gt; AS SUM(parallelperiod([Extract Time].[Extract Time].[Month], 6, &lt;strong&gt;LINKMEMBER(&lt;/strong&gt;[Schedule Time].[Schedule Time].currentmember,[Extract Time].[Extract Time]&lt;strong&gt;)&lt;/strong&gt;),[Measures].[QTY]), &lt;br /&gt;VISIBLE = 1;    
&lt;/pre&gt;
&lt;h2&gt;Résultat&lt;/h2&gt;
En ne précisant que la &amp;quot;Schedule Time&amp;quot;, on constate que l'&amp;quot;Extract Time&amp;quot; s'est
bien positionnée automatiquement.&lt;br /&gt;
&lt;br /&gt;
&lt;img title=&quot;cube_browing_test.jpg, sept. 2010&quot; alt=&quot;&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/linkmember_dates/.cube_browing_test_m.jpg&quot; /&gt;&lt;br /&gt;</description>
    
    
    
          <comments>http://blog.jbheren.com/post/2010/09/09/Formules-MDX-Associer-deux-dimentions-temporelles-avec-LINKMEMBER#comment-form</comments>
      <wfw:comment>http://blog.jbheren.com/post/2010/09/09/Formules-MDX-Associer-deux-dimentions-temporelles-avec-LINKMEMBER#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.jbheren.com/feed/atom/comments/6</wfw:commentRss>
      </item>
    
  <item>
    <title>Pivoter une table avec Sql Server 2005 &gt;</title>
    <link>http://blog.jbheren.com/post/2010/07/22/Pivoter-une-table-avec-Sql-Server-2005</link>
    <guid isPermaLink="false">urn:md5:ddf6665116eb19f593f0b088aa16e5a7</guid>
    <pubDate>Thu, 22 Jul 2010 23:08:00 +0200</pubDate>
    <dc:creator>Jean-Baptiste HEREN</dc:creator>
        <category>Décisionnel</category>
        <category>SQL</category><category>SQL Server 2005</category>    
    <description>&lt;p&gt;Pivoter une table peut avoir un interêt, notamment pour faire du reporting.
Voici un exemple simple d'utilisation ce cette commande SQL&lt;/p&gt;    &lt;h2&gt;Table initiale&lt;/h2&gt;


&lt;p&gt;On a au départ , des données stockées dans une table, selon le modèle code/valeur, les deux colonnes représentant une clé primaire.&lt;/p&gt;

&lt;pre&gt;
-------------
|TABLE_BASE |
-------------
|Code     k |
|value    k |
-------------
&lt;/pre&gt;


&lt;h3&gt;Table Finale&lt;/h3&gt;


&lt;p&gt;On souhaite obtenir l'ensemble des valeurs associées à un code, sur une seule ligne. Dans cet exemple, on sait qu'il n'existe au maximum, que 9 valeurs associées à un même code.&lt;/p&gt;

&lt;pre&gt;
-------------
|TABLE_PIVO |
-------------
|Code     k |
|value1     |
|value2     |
|value3     |
|value4     |
|value5     |
|value6     |
|value7     |
|value8     |
|value9     |
-------------
&lt;/pre&gt;



&lt;h2&gt;Commande SQL&lt;/h2&gt;



&lt;p&gt;Ici, on utilise un Rank pour générer la données sur laquelle sera faite le Pivot.&lt;/p&gt;

&lt;pre&gt;[SQL]
/* Code SQL pour gérérer les données Pivotées */
WITH Options
AS
(
SELECT code, value, rank() over(PARTITION BY code order by value) as POS
FROM TABLE_BASE
)
SELECT * FROM Options PIVOT (MAX(value) FOR POS IN ([1],[2],[3],[4],[5],[6],[7],[8],[9])
) AS pvt
&lt;/pre&gt;</description>
    
    
    
          <comments>http://blog.jbheren.com/post/2010/07/22/Pivoter-une-table-avec-Sql-Server-2005#comment-form</comments>
      <wfw:comment>http://blog.jbheren.com/post/2010/07/22/Pivoter-une-table-avec-Sql-Server-2005#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.jbheren.com/feed/atom/comments/8</wfw:commentRss>
      </item>
    
  <item>
    <title>Macro Excel : Générer les ordres SQL INSERT à partir d'une feuille Excel</title>
    <link>http://blog.jbheren.com/post/2010/06/29/Macro-Excel-%3A-G%C3%A9n%C3%A9rer-les-ordres-SQL-INSERT-%C3%A0-partir-d-une-feuille-Excel</link>
    <guid isPermaLink="false">urn:md5:79f74d95c6c25296ca4d9e0bce392f34</guid>
    <pubDate>Tue, 29 Jun 2010 16:57:00 +0200</pubDate>
    <dc:creator>Jean-Baptiste HEREN</dc:creator>
        <category>Décisionnel</category>
        <category>Excel</category><category>SQL</category>    
    <description>&lt;p&gt;Voici le code d'une macro permettant la génération automatique d'ordres SQL
INSERT à partir des données d'une feuille excel.&lt;/p&gt;
&lt;p&gt;prérequis :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La première ligne de données doit contenir le nom des colonnes.&lt;/li&gt;
&lt;li&gt;Le nom de la feuille doit correspondre au nom de la table&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Résultat:&lt;/p&gt;
&lt;p&gt;La macro génère un fichier .sql portant le nom de la table cible, contenant
les ordres SQL du type INSERT INTO mytable(col1,col2,...)
VALUES(val1,val2,...).&lt;/p&gt;    &lt;br /&gt;
&lt;br /&gt;
Sub generateSQLInsert()&lt;br /&gt;
  'Loop on current scheet and generate sql INSERT based on column names as
columns an sheet name as table&lt;br /&gt;
  ' Will create one statement per line aka  INSERT INTO
mytable(col1,col2,...) VALUES(val1,val2,...)&lt;br /&gt;
  ' Author: Jean-Baptiste Heren - 29-06-2010 -
http://blog.jbheren.com&lt;br /&gt;
 &lt;br /&gt;
  Dim tableName As String 'tablename extracted from first row of each
column&lt;br /&gt;
  Dim filePath As String&lt;br /&gt;
  Dim slashPosition As Integer&lt;br /&gt;
  Dim pathOnly As String&lt;br /&gt;
 &lt;br /&gt;
  Dim columnsSQL As String ' will contain the insert into table
(col1,col2,...) statement&lt;br /&gt;
  Dim dataSQL As String    ' will contain the values
(val1,val2,...) statement&lt;br /&gt;
  Dim separator As String&lt;br /&gt;
 &lt;br /&gt;
  Dim myRow As Integer 'Row counter&lt;br /&gt;
  Dim myCol As Integer 'Column counter&lt;br /&gt;
 &lt;br /&gt;
  'set Tablename from sheet name&lt;br /&gt;
  tableName = ActiveSheet.Name&lt;br /&gt;
 &lt;br /&gt;
  ' get current excel file Path&lt;br /&gt;
  filePath = ThisWorkbook.FullName&lt;br /&gt;
  slashPosition = InStrRev(filePath, &amp;quot;\&amp;quot;)&lt;br /&gt;
  pathOnly = Left(filePath, slashPosition)&lt;br /&gt;
 &lt;br /&gt;
  MyFile = pathOnly + tableName + &amp;quot;.sql&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
  'get column names from first row&lt;br /&gt;
  myColInput = InputBox(&amp;quot;What column to START on ?&amp;quot;)&lt;br /&gt;
  myCol = myColInput&lt;br /&gt;
  myRow = 1&lt;br /&gt;
  columnsSQL = &amp;quot;INSERT INTO &amp;quot; + tableName + &amp;quot; (&amp;quot;&lt;br /&gt;
  separator = &amp;quot; &amp;quot;&lt;br /&gt;
 &lt;br /&gt;
  Do Until ActiveSheet.Cells(myRow, myCol) = &amp;quot;&amp;quot; 'Loop until you find a
blank.&lt;br /&gt;
    &lt;br /&gt;
    columnsSQL = columnsSQL + separator +
Trim(ActiveSheet.Cells(myRow, myCol))&lt;br /&gt;
    separator = &amp;quot;, &amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    myCol = myCol + 1 ' Move to next column&lt;br /&gt;
  Loop&lt;br /&gt;
  columnsSQL = columnsSQL + &amp;quot;) &amp;quot;&lt;br /&gt;
 &lt;br /&gt;
  'get column values from second row&lt;br /&gt;
  myRow = 2&lt;br /&gt;
  myCol = myColInput&lt;br /&gt;
 &lt;br /&gt;
  'set and open file for output&lt;br /&gt;
  fnum = FreeFile()&lt;br /&gt;
  Open MyFile For Output As fnum&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  Do Until ActiveSheet.Cells(myRow, myCol) = &amp;quot;&amp;quot; 'Loop on rows until
blank.&lt;br /&gt;
    &lt;br /&gt;
    dataSQL = &amp;quot;VALUES (&amp;quot;&lt;br /&gt;
    separator = &amp;quot; &amp;quot;&lt;br /&gt;
    &lt;br /&gt;
      Do Until ActiveSheet.Cells(myRow, myCol) = &amp;quot;&amp;quot;
'Loop on columns until blank.&lt;br /&gt;
        dataSQL = dataSQL + separator + &amp;quot;'&amp;quot;
+ Trim(CStr(ActiveSheet.Cells(myRow, myCol))) + &amp;quot;'&amp;quot;&lt;br /&gt;
        separator = &amp;quot;, &amp;quot;&lt;br /&gt;
        myCol = myCol + 1&lt;br /&gt;
      Loop&lt;br /&gt;
    &lt;br /&gt;
    dataSQL = dataSQL + &amp;quot;);&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    myCol = myColInput ' Return to specifiedcolumn&lt;br /&gt;
    myRow = myRow + 1 ' Move to next row&lt;br /&gt;
    &lt;br /&gt;
    Print #fnum, columnsSQL + dataSQL&lt;br /&gt;
  Loop&lt;br /&gt;
 &lt;br /&gt;
  ' Close the file&lt;br /&gt;
  Close #fnum&lt;br /&gt;
 &lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description>
    
          <enclosure url="http://blog.jbheren.com/public/Decisionnel/cscript/Excel2SQLInsert.vbs"
      length="2316" type="text/plain" />
          <enclosure url="http://blog.jbheren.com/public/Decisionnel/cscript/excel2SQLInsert.xls"
      length="28672" type="application/msexcel" />
    
    
          <comments>http://blog.jbheren.com/post/2010/06/29/Macro-Excel-%3A-G%C3%A9n%C3%A9rer-les-ordres-SQL-INSERT-%C3%A0-partir-d-une-feuille-Excel#comment-form</comments>
      <wfw:comment>http://blog.jbheren.com/post/2010/06/29/Macro-Excel-%3A-G%C3%A9n%C3%A9rer-les-ordres-SQL-INSERT-%C3%A0-partir-d-une-feuille-Excel#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.jbheren.com/feed/atom/comments/12</wfw:commentRss>
      </item>
    
  <item>
    <title>Convertir un fichier csv en xls en ligne de commande : mycsv2xls.vbs</title>
    <link>http://blog.jbheren.com/post/2010/05/27/Convertir-un-fichier-csv-en-xls-en-ligne-de-commande</link>
    <guid isPermaLink="false">urn:md5:5b76d99c7ff83e95db0a56176eb45cdd</guid>
    <pubDate>Thu, 27 May 2010 16:01:00 +0200</pubDate>
    <dc:creator>Jean-Baptiste HEREN</dc:creator>
        <category>Décisionnel</category>
        <category>csv2xls</category><category>Excel</category><category>Microsoft SSIS</category>    
    <description>    &lt;p&gt;Suite à un besoin ponctuel d'intégration de données, j'ai développé un petit
script en VB, utilisant l'application Excel pour faire l'import automatique de
fichiers délimités par des points-virgule dans un fichier Excel.&lt;/p&gt;
&lt;p&gt;En effet, une source Excel dans Microsoft SSIS est beaucoup plus facile
d'emploi qu'un fichier plat, notamment lorsque le nombre de colonnes dans le
fichier n'est pas fixe.&lt;/p&gt;
&lt;p&gt;Le Script en question pourra être exécuté dans SSIS par l'utilisation d'un
'Execute Process Task'.&lt;/p&gt;
&lt;p&gt;le programme &lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/cscript/mycvs2xls.zip&quot;&gt;mycsv2xls&lt;/a&gt; pour Windows
fonctionne comme suit :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;mycvs2xls.vbs source_full_path target_directory&lt;/p&gt;
&lt;/blockquote&gt;</description>
    
          <enclosure url="http://blog.jbheren.com/public/Decisionnel/cscript/mycvs2xls.zip"
      length="1513" type="application/zip" />
    
    
          <comments>http://blog.jbheren.com/post/2010/05/27/Convertir-un-fichier-csv-en-xls-en-ligne-de-commande#comment-form</comments>
      <wfw:comment>http://blog.jbheren.com/post/2010/05/27/Convertir-un-fichier-csv-en-xls-en-ligne-de-commande#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.jbheren.com/feed/atom/comments/13</wfw:commentRss>
      </item>
    
  <item>
    <title>Analyse d'écarts dans le temps avec Analysis Services</title>
    <link>http://blog.jbheren.com/post/2010/03/23/Analyse-d-%C3%A9carts-dans-le-temps-avec-Analysis-Services</link>
    <guid isPermaLink="false">urn:md5:0a48e612a73d0673aae6dcda66936c06</guid>
    <pubDate>Tue, 23 Mar 2010 16:47:00 +0100</pubDate>
    <dc:creator>Jean-Baptiste HEREN</dc:creator>
        <category>Décisionnel</category>
        <category>Business Intelligence</category><category>MDX</category><category>SQL Server 2005</category><category>SSAS</category>    
    <description>L'exemple suivant illustre un cas courant d'analyse d'écarts d'une mesure dans
le temps, traité via des formules MDX dans un cube Microsoft Analysis
Services. &lt;br /&gt;
Cela pourrait s'appliquer à un &amp;quot;reporting&amp;quot; sur la qualité des prévisions de
vente par rapport aux ventes réalisé.    &lt;h2&gt;Présentation du cas&lt;/h2&gt;
Une table de faits contenant une &amp;quot;photo&amp;quot; mensuelle d'un calendrier de
prévisions&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;
|--------------------|
&lt;/pre&gt;
&lt;pre&gt;
| Fact Table         |
&lt;/pre&gt;
&lt;pre&gt;
|--------------------|
&lt;/pre&gt;
&lt;pre&gt;
|EXTRACT_DATE (key)  | Date d'extraction (Photo des données)
&lt;/pre&gt;
&lt;pre&gt;
|SCHEDULE_DATE (Key) | Date de la prévision
&lt;/pre&gt;
&lt;pre&gt;
|Item_Code (Key)     | Code article
&lt;/pre&gt;
&lt;pre&gt;
|...                 | Divers axes (client, Filiale, etc.)
&lt;/pre&gt;
&lt;pre&gt;
|QTY(measure)        | Quantité prévue
&lt;/pre&gt;
&lt;pre&gt;
|--------------------|
&lt;/pre&gt;
Notre but est de contrôler a posteriori, l'évolution de la quantité prévue, au
cours du temps (chargements mensuels). L'idée est d'évaluer la fiabilité des
prévisions au cours du temps, par rapport au réalisé.&lt;br /&gt;
Pour exemple :&lt;br /&gt;
- On choisit d'observer l'évolution de la quantité prévue en Juin 2010&lt;br /&gt;
- Nous souhaiterons donc afficher pour chaque date d'extraction précédent Juin
2010, la quantité enregistrée sur Juin 2010&lt;br /&gt;
- Cela revient à comparer Juin 2010 respectivement avec chacune des périodes
d'extraction désirées.&lt;br /&gt;
&lt;br /&gt;
Dans ce contexte, il est intéressant de savoir détecter l'équivalence entre les
éléments de nos deux dimensions temporelles.&lt;br /&gt;
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/linkmember/Test_cube_with_two_time_hierarchies.jpg&quot;&gt;&lt;img title=&quot;Test_cube_with_two_time_hierarchies.jpg, mar. 2010&quot; alt=&quot;&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/linkmember/.Test_cube_with_two_time_hierarchies_t.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;

Cela peut être réalisé par l'utilisation de la fonction MDX suivante, qui
retourne le membre équivalent à un membre spécifié dans une hiérarchie
spécifique :&lt;br /&gt;
&lt;pre&gt;
&lt;a href=&quot;http://msdn.microsoft.com/fr-fr/library/ms146058.aspx&quot;&gt;LinkMember&lt;/a&gt;(Member_Expression, Hierarchy_Expression)
&lt;/pre&gt;
L'utilisation de cette fonction est illustrée dans les formules
suivantes.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Les Formules&lt;/h2&gt;
Voici maintenant les formules utilisées pour calculer les écarts pour chaque
période par rapport à la période de référence.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;[Qty on Schedule]&lt;/strong&gt;&lt;br /&gt;
Description : Quantité de référence. correspond à la date d'extraction &amp;quot;la plus
proche&amp;quot; de la date prévue.&lt;br /&gt;
&lt;pre&gt;
SUM(LINKMEMBER([Schedule Time].[Schedule Time].currentmember,[Extract Time].[Extract Time])
&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;[Accuracy Qty]&lt;/strong&gt;&lt;br /&gt;
description : % de validité des quantités (totales) entre la date d'extraction
du contexte et la quantité de référence (ci-dessus)&lt;br /&gt;
&lt;pre&gt;
iif([Measures].[QTY] &amp;gt; 0,&lt;br /&gt;
1- ABS(([Measures].[QTY] - [Measures].[Qty on Schedule]) /iif([Measures].[Qty on Schedule] &amp;gt; [Measures].[QTY],[Measures].[Qty on Schedule],[Measures].[QTY]))&lt;br /&gt;
,0)
&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;[Accuracy Qty by Item]&lt;/strong&gt;&lt;br /&gt;
Description : % de validité pondéré par article&lt;br /&gt;
&lt;pre&gt;
SUM(descendants([Item].[By Model].currentmember,[Item].[By Model].[Item Code])&lt;br /&gt;
,Measures.[Accuracy Qty]*Measures.[Qty on Schedule])/SUM(Measures.[Qty on Schedule])
&lt;/pre&gt;
&lt;br /&gt;
&lt;h2&gt;Exemple de rapport&lt;/h2&gt;
Voici un exemple de rapport attaquant un cube SSAS depuis Cognos.&lt;br /&gt;
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/linkmember/Cognos_report_example.jpg&quot;&gt;&lt;img title=&quot;Cognos_report_example.jpg, mar. 2010&quot; alt=&quot;&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/linkmember/.Cognos_report_example_t.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;</description>
    
    
    
          <comments>http://blog.jbheren.com/post/2010/03/23/Analyse-d-%C3%A9carts-dans-le-temps-avec-Analysis-Services#comment-form</comments>
      <wfw:comment>http://blog.jbheren.com/post/2010/03/23/Analyse-d-%C3%A9carts-dans-le-temps-avec-Analysis-Services#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.jbheren.com/feed/atom/comments/17</wfw:commentRss>
      </item>
    
  <item>
    <title>Cognos 8 Macro functions list</title>
    <link>http://blog.jbheren.com/post/2009/11/13/Cognos-8-Macro-functions-list</link>
    <guid isPermaLink="false">urn:md5:ad9dbbb753ab1c279654010a03774449</guid>
    <pubDate>Fri, 13 Nov 2009 11:24:00 +0100</pubDate>
    <dc:creator>Jean-Baptiste HEREN</dc:creator>
        <category>Décisionnel</category>
        <category>Business Intelligence</category><category>Cognos</category><category>Report Studio</category>    
    <description>&lt;p&gt;We have seen that cognos macro functions available in framework manager are also available in report studio.&lt;/p&gt;
&lt;p&gt;Here is a simple list of existing Cognos Macro with description.&lt;/p&gt;    &lt;p&gt;This list contains functions that can be used within a macro. A macro may contain one or more macro functions. A macro is delimited by&amp;nbsp; a number sign (#) at the beginning and at the end. Everything between the number signs is treated as a macro expression, which is executed at run time.&lt;/p&gt;
&lt;h2&gt;+&lt;/h2&gt;
&lt;p&gt;value1 + value2&lt;br /&gt;Concatenates two strings.&lt;br /&gt;Example: # '{' + $runLocale + '}'#&lt;br /&gt;Result: {en-us}&lt;/p&gt;
&lt;h2&gt;CAMIDList&lt;/h2&gt;
&lt;p&gt;CAMIDList ( [ separator_string ] )&lt;br /&gt;Returns the pieces of the user's identity (account name, group names, role names) as a list of values separated by commas.&lt;br /&gt;Example: #CAMIDList ( )#&lt;br /&gt;Result: CAMID(&quot;::Everyone&quot;), CAMID(&quot;:Authors&quot;), CAMID(&quot;:Query Users&quot;), CAMID(&quot;:Consumers&quot;), CAMID(&quot;:Metrics Authors&quot;)&lt;/p&gt;
&lt;h2&gt;CAMIDListForType&lt;/h2&gt;
&lt;p&gt;CAMIDListForType ( identity type )&lt;br /&gt;Returns an array of the user's identities based on the identity type (account, group, or role). It can be used with the macro functions csv or join.&lt;br /&gt;Example: [qs].[userRole] IN ( #csv ( CAMIDListForType ( 'role' ) ) # ) &lt;br /&gt;Result: [qs].[userRole] IN ( 'Administrator', 'developer' )&lt;/p&gt;
&lt;h2&gt;CAMPassport&lt;/h2&gt;
&lt;p&gt;CAMPassport ( )&lt;br /&gt;Returns the passport.&lt;br /&gt;Example: #CAMPassport ( )#&lt;br /&gt;Result: 111:98812d62-4fd4-037b-4354-26414cf7ebef:3677162321&lt;/p&gt;
&lt;h2&gt;CSVIdentityName&lt;/h2&gt;
&lt;p&gt;CSVIdentityName ( %parameter_map_name [ , separator_string ] )&lt;br /&gt;Use the identity information of the current authenticated user to lookup values in the specified parameter map. Each individual piece of the user's identity (account name, group names, role names) is used as a key into the map. The unique list of values that is retrieved from the map is then returned as a string, where each value is surrounded by single quotes and where multiple values are separated by commas.&lt;br /&gt;Example: #CSVIdentityName ( %security_clearance_level_map )#&lt;br /&gt;Result: 'level_500' , 'level_501' , 'level_700'&lt;/p&gt;
&lt;h2&gt;CSVIdentityNameList&lt;/h2&gt;
&lt;p&gt;CSVIdentityNameList ( [ separator_string ] )&lt;br /&gt;Returns the pieces of the user's identity (account name, group names, role names) as a list of strings. The unique list of values is returned as a string, where each value is surrounded by single quotes and where multiple values are separated by commas.&lt;br /&gt;Example: #CSVIdentityNameList ( )#&lt;br /&gt;Result: 'Everyone' , 'Report Administrators' , 'Query User'&lt;/p&gt;
&lt;h2&gt;array&lt;/h2&gt;
&lt;p&gt;array ( string_exp | array_exp { , string_exp | array_exp } )&lt;br /&gt;Constructs an array out of the list of parameters.&lt;br /&gt;Example: &lt;br /&gt;#csv ( 'x1' , 'x2' , array ( 'a1' , 'a2' ) )#&lt;br /&gt;Result: &lt;br /&gt;'x1' , 'x2' , 'a1' , 'a2' &lt;/p&gt;
&lt;h2&gt;csv&lt;/h2&gt;
&lt;p&gt;csv ( array_exp [ , separator_string [ , quote_string ] ] )&lt;br /&gt;Constructs a comma separated values string from the elements of the array. Optionally the separator and quote strings can be specified. The default separator is a comma ( , ) and the default quote character is a single quote ( ' ).&lt;br /&gt;Example: &lt;br /&gt;#csv ( array ( 'a1' , 'a2' ) )#&lt;br /&gt;Result: &lt;br /&gt;'a1' , 'a2' &lt;/p&gt;
&lt;h2&gt;dq&lt;/h2&gt;
&lt;p&gt;dq ( string_exp )&lt;br /&gt;Surround the passed string with double quotes.&lt;br /&gt;Example: #dq ( 'zero' )#&lt;br /&gt;Result: &quot;zero&quot;&lt;/p&gt;
&lt;h2&gt;grep&lt;/h2&gt;
&lt;p&gt;grep ( pattern_string , array_exp )&lt;br /&gt;Searches for elements of an array that match the pattern specified in the first argument. It returns an array with the elements that pass the pattern.&lt;br /&gt;Example: &lt;br /&gt;#csv ( grep ( 's' , array ( 'as', 'an', 'arts' ) ) )#&lt;br /&gt;Result: &lt;br /&gt;'as', 'arts'&lt;/p&gt;
&lt;h2&gt;join&lt;/h2&gt;
&lt;p&gt;join ( separator_string , array_exp )&lt;br /&gt;Joins the elements of an array using the separator string.&lt;br /&gt;Example: &lt;br /&gt;# sq ( join ( ' | | ' , array ( 'as', 'an', 'arts' ) ) )#&lt;br /&gt;Result: &lt;br /&gt;'as | | an | | arts'&lt;/p&gt;
&lt;h2&gt;prompt&lt;/h2&gt;
&lt;p&gt;prompt ( prompt_name , datatype , defaultText , text , queryItem , trailing_text )&lt;br /&gt;Prompt the user for a single value. Only the prompt_name argument is required. The datatype defaults to string when not specified. The prompt is optional when defaultText is specified. The text, when specified, will precede the value. A queryItem can be specified to take advantage of the Prompt Info properties of the query item. The trailing_text, when specified, will be appended to the value.&lt;br /&gt;Example: &lt;br /&gt;select . . . where COUNTRY_MULTILINGUAL.COUNTRY_CODE&amp;nbsp; &amp;gt; #prompt('Starting CountryCode',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'integer',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; '10'&lt;br /&gt;)#&lt;br /&gt;Result: &lt;br /&gt;select . . . where COUNTRY_MULTILINGUAL.COUNTRY_CODE&amp;nbsp; &amp;gt; 10&lt;/p&gt;
&lt;h2&gt;promptmany&lt;/h2&gt;
&lt;p&gt;promptmany ( prompt_name , datatype , defaultText , text , queryItem , trailing_text )&lt;br /&gt;Prompt the user for one or more values. Only the prompt_name argument is required. The datatype defaults to string when not specified. The prompt is optional when defaultText is specified. The text, when specified, will precede the value. A queryItem can be specified to take advantage of the Prompt Info properties of the query item. The trailing_text, when specified, will be appended to the value.&lt;br /&gt;Example: &lt;br /&gt;select . . . where COUNTRY_MULTILINGUAL.COUNTRY IN ( #promptmany ( 'CountryName' ) # )&lt;br /&gt;&lt;br /&gt;Result: &lt;br /&gt;select . . . where COUNTRY_MULTILINGUAL.COUNTRY_CODE&amp;nbsp; IN ('Canada' , 'The Netherlands' , 'Russia')&lt;/p&gt;
&lt;h2&gt;sb&lt;/h2&gt;
&lt;p&gt;sb ( string_exp )&lt;br /&gt;Surround the passed string with square brackets.&lt;br /&gt;Example: #sb ( 'abc' )#&lt;br /&gt;Result: [abc]&lt;/p&gt;
&lt;h2&gt;sort&lt;/h2&gt;
&lt;p&gt;sort ( array_exp )&lt;br /&gt;Sorts the elements of the array in alphabetical order. Duplicates are retained.&lt;br /&gt;Example: &lt;br /&gt;#csv ( sort ( array ( 's3', 'a', 'x' ) ) )#&lt;br /&gt;Result: &lt;br /&gt;'a', 's3', 'x'&lt;/p&gt;
&lt;h2&gt;split&lt;/h2&gt;
&lt;p&gt;split ( pattern_string, string_exp | array_exp )&lt;br /&gt;Splits a string or the string elements of the array into separate elements.&lt;br /&gt;Example: &lt;br /&gt;#csv ( split ( '::', 'ab=c::de=f::gh=i' ) )#&lt;br /&gt;Result: &lt;br /&gt;'ab=c' , 'de=f', 'gh=i'&lt;br /&gt;Example: &lt;br /&gt;#csv ( split ( '=' , split ( '::', 'ab=c::de=f::gh=i' ) ) )#&lt;br /&gt;Result: &lt;br /&gt;'ab' , 'c' , 'de' , 'f',&amp;nbsp; 'gh' , 'i'&lt;/p&gt;
&lt;h2&gt;sq&lt;/h2&gt;
&lt;p&gt;sq ( string_exp )&lt;br /&gt;Surround the passed string with single quotes.&lt;br /&gt;Example: #sq ( 'zero' )#&lt;br /&gt;Result: 'zero'&lt;/p&gt;
&lt;h2&gt;substitute&lt;/h2&gt;
&lt;p&gt;substitute ( pattern_string, replacement_string, string_exp | array_exp )&lt;br /&gt;Search for a pattern in a string or in the string elements of an array and substitute the found text with other text.&lt;br /&gt;Example: &lt;br /&gt;#sq ( substitute ( '^cn=', '***', 'cn=help' ) )#&lt;br /&gt;Result: &lt;br /&gt;'***help'&lt;br /&gt;Example: &lt;br /&gt;#csv ( substitute ( '^cn=', '***', array ( 'cn=help' , 'acn=5' ) ) )#&lt;br /&gt;Result: &lt;br /&gt;'***help' , 'acn=5'&lt;br /&gt;Example: &lt;br /&gt;#csv ( substitute ( 'cn=', '', array ( 'cn=help' , 'acn=5' ) ) )#&lt;br /&gt;Result: &lt;br /&gt;'help' , 'a5'&lt;/p&gt;
&lt;p&gt;Example :&lt;br /&gt;&lt;br /&gt;Transform : &lt;br /&gt;[Ph_Quality].[Manufacturing Business Unit].[Manufacturing Business Units].[Business Units]-&amp;gt;:[YK].[[Manufacturing Business Unit]].[Manufacturing Business Units]].[Business Units]].&amp;amp;[FOOKEY]]]&lt;br /&gt;to&lt;br /&gt;[Ph_Quality].[Inventory Business Unit].[Business Units].[Business Units]-&amp;gt;:[YK].[[Inventory Business Unit]].[Business Units]].[Business Units]].&amp;amp;[FOOKEY]]]&lt;br /&gt;&lt;br /&gt;the macro will be like that : (regex need the brackets to be escaped with \)&lt;br /&gt;#&lt;br /&gt;substitute('\[\[Inventory Business Unit\]\]\.\[Business Units\]\]','[[Manufacturing Business Unit]].[Manufacturing Business Units]]',&lt;br /&gt;&amp;nbsp; substitute('\[Inventory Business Unit\]\.\[Business Units\]\.\[Business Units\]','[Manufacturing Business Unit].[Manufacturing Business Units].[Business Units]'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,prompt('BU Inventory','MUN'))&lt;br /&gt;)&lt;br /&gt;#&lt;/p&gt;
&lt;h2&gt;unique&lt;/h2&gt;
&lt;p&gt;unique ( array_exp )&lt;br /&gt;Removes duplicate entries from the array. The order of the elements is retained.&lt;br /&gt;Example:&lt;br /&gt;#csv ( unique ( array ( 's3', 'a', 's3', 'x' ) ) )#&lt;br /&gt;Result: &lt;br /&gt;'s3', 'a', 'x'&lt;/p&gt;
&lt;h2&gt;urlencode&lt;/h2&gt;
&lt;p&gt;field_one=urlencode(prompt('userValue'))&lt;br /&gt;URL encodes the passed argument. Useful when specifying XML connection strings.&lt;br /&gt;urlencode(prompt('some_val'))&lt;br /&gt;%27testValue%27&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.jbheren.com/post/2009/11/13/Cognos-8-Macro-functions-list#comment-form</comments>
      <wfw:comment>http://blog.jbheren.com/post/2009/11/13/Cognos-8-Macro-functions-list#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.jbheren.com/feed/atom/comments/38</wfw:commentRss>
      </item>
    
  <item>
    <title>Cognos 8 Report Studio's Conditional block</title>
    <link>http://blog.jbheren.com/post/2009/11/13/Report-Studio-s-Conditional-block</link>
    <guid isPermaLink="false">urn:md5:1268f48049f29abc6ae55795c9d800d1</guid>
    <pubDate>Thu, 12 Nov 2009 16:51:00 +0100</pubDate>
    <dc:creator>Jean-Baptiste HEREN</dc:creator>
        <category>Décisionnel</category>
        <category>Cognos</category><category>Report Studio</category>    
    <description>&lt;p&gt;Conditional blocks allow you to add multiple reports to one page. By
defining multiple zones, for example, you can coose between a Synthesis and a
detailed table.&lt;/p&gt;    &lt;p&gt;To make use of conditional blocks, you will need :&lt;/p&gt;
&lt;h2&gt;1 - one value prompt&lt;/h2&gt;
&lt;p&gt;This prompt will allow the user to choose the conditional block to display.
It can be located on a promt page, on the reports pages themselves or
both.&lt;br /&gt;
On this particulat prompt, set a parameter name, auto-submit to 'Yes' and
define a static list of choices.&lt;br /&gt;
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/conditional_block/01-_value_prompt.jpg&quot;&gt;&lt;img title=&quot;01-_value_prompt.jpg, nov. 2009&quot; alt=&quot;&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/conditional_block/.01-_value_prompt_m.jpg&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/conditional_block/02_-_value_prompt_static_choices.jpg&quot;&gt;&lt;img title=&quot;02_-_value_prompt_static_choices.jpg, nov. 2009&quot; alt=&quot;&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/conditional_block/.02_-_value_prompt_static_choices_s.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;2 - one variable for conditional choices&lt;/h2&gt;
&lt;p&gt;in menu view-&amp;gt;variables, create a string variable to be used as
conditional variable in the conditional block. and set Expression to get the
prompt choice parameter value.&lt;br /&gt;
Create as many values as conditional blocks you need, keep the same ones as in
the conditional prompts.&lt;br /&gt;
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/conditional_block/03_-_string_variable_choice.jpg&quot;&gt;&lt;img title=&quot;03_-_string_variable_choice.jpg, nov. 2009&quot; alt=&quot;&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/conditional_block/.03_-_string_variable_choice_m.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;3 - one conditional block&lt;/h3&gt;
&lt;p&gt;On report's page, add a conditional block and set the conditional variable
to the one you have created &amp;amp; select values you vant to use.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/conditional_block/04_-_conditional_block_variable.jpg&quot;&gt;&lt;img title=&quot;04_-_conditional_block_variable.jpg, nov. 2009&quot; alt=&quot;&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/conditional_block/.04_-_conditional_block_variable_m.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Then, you only have to select one value in current block, add contents to
it. Select another value, add contents... it's done.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/conditional_block/05_-_conditional_block_selected_with_contents.jpg&quot;&gt;
&lt;img title=&quot;05_-_conditional_block_selected_with_contents.jpg, nov. 2009&quot; alt=&quot;&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/conditional_block/.05_-_conditional_block_selected_with_contents_m.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.jbheren.com/post/2009/11/13/Report-Studio-s-Conditional-block#comment-form</comments>
      <wfw:comment>http://blog.jbheren.com/post/2009/11/13/Report-Studio-s-Conditional-block#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.jbheren.com/feed/atom/comments/21</wfw:commentRss>
      </item>
    
  <item>
    <title>Last period prompt option in Cognos report Studio</title>
    <link>http://blog.jbheren.com/post/2009/11/10/Last-period-prompt-option-in-Cognos-report-Studio</link>
    <guid isPermaLink="false">urn:md5:d669488083ee58739999f8d36f1b1042</guid>
    <pubDate>Tue, 10 Nov 2009 20:42:00 +0100</pubDate>
    <dc:creator>Jean-Baptiste HEREN</dc:creator>
        <category>Décisionnel</category>
        <category>Business Intelligence</category><category>Cognos</category><category>Report Studio</category>    
    <description>&lt;p&gt;When you build a new report with some prompts, including a time dimension;
you may want to add an option to automatically select the last Period. this way
users can :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;see their last data without chosing it in a time tree (but with ability to
choose another one).&lt;/li&gt;
&lt;li&gt;schedule a report witch will always select the last period available.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This can be done by using a set containing the #promptmany()# Cognos
macro&lt;/p&gt;    &lt;h2&gt;1- create the set definition&lt;/h2&gt;
First, we need a report with at least one query and a prompt on the time
dimension. Following examples works on the Month level.&lt;br /&gt;
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/automatic_period/time_dimension.jpg&quot;&gt;&lt;img title=&quot;time_dimension.jpg, nov. 2009&quot; alt=&quot;&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/automatic_period/.time_dimension_t.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
If your query already exists, just remove any filter on your Time dimension as
we will replace it with a data item set.&lt;br /&gt;
&lt;br /&gt;
In report's Query, we will add a new data item containing our set definition,
named Chosen_Month.&lt;br /&gt;
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/automatic_period/Cognos_Report_Studio_Crosstab_Query.jpg&quot;&gt;&lt;img title=&quot;Cognos_Report_Studio_Crosstab_Query.jpg, nov. 2009&quot; alt=&quot;&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/automatic_period/.Cognos_Report_Studio_Crosstab_Query_t.jpg&quot; /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The #promptmany()# Cognos macro allows create a set from parameters with
ability to specify a default value :
&lt;blockquote&gt;
&lt;p&gt;#promptmany('&lt;strong&gt;[parameter name]&lt;/strong&gt;','&lt;strong&gt;[Output
Type]&lt;/strong&gt;','&lt;strong&gt;[Default set definition]&lt;/strong&gt;')#&lt;/p&gt;
&lt;/blockquote&gt;
We want to set the Date prompt MONTH parameter with last period as default
value:&lt;br /&gt;
&lt;blockquote&gt;
&lt;p&gt;set( #promptmany('MONTH', 'MUN', 'closingPeriod([Invoice Sales].[Time
Dimension].[YMD Hierarchy].[Month])')# ).&lt;/p&gt;
&lt;/blockquote&gt;
The Output Type MUN (Member Unique Name) format will give the following Result
:&lt;br /&gt;
&lt;blockquote&gt;
&lt;p&gt;[Invoice Sales].[Time Dimension].[YMD
Hierarchy].[Month]-&amp;gt;[all].[2009].[Oct-2009]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;h2&gt;2- Set prompts to reflect our new behaviour&lt;/h2&gt;
&lt;p&gt;&lt;br /&gt;
Now the Time prompts is not required anymore so update the required flag to
Optional&lt;br /&gt;
&lt;br /&gt;
(optional) Another solution would be to create a prompt option Box named &amp;quot;Last
Period&amp;quot; using a collection ('Y','N') ie with parameter named last_period.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/automatic_period/last_period_prompt_properties.jpg&quot;&gt;&lt;img title=&quot;last_period_prompt_properties.jpg, nov. 2009&quot; alt=&quot;&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/automatic_period/.last_period_prompt_properties_t.jpg&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/automatic_period/last_period_prompt_static_choice.jpg&quot;&gt;&lt;img title=&quot;last_period_prompt_static_choice.jpg, nov. 2009&quot; alt=&quot;&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/automatic_period/.last_period_prompt_static_choice_t.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
Then create a render variable on the period prompt.&lt;br /&gt;
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/automatic_period/period_prompt_render_variable.jpg&quot;&gt;&lt;img title=&quot;period_prompt_render_variable.jpg, nov. 2009&quot; alt=&quot;[IMG]&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/automatic_period/.period_prompt_render_variable_t.jpg&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/automatic_period/render_variable.jpg&quot;&gt;&lt;img title=&quot;render_variable.jpg, nov. 2009&quot; alt=&quot;&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/automatic_period/.render_variable_t.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
You cans also set a default value to make the parameters selection faster&lt;br /&gt;
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/automatic_period/last_period_prompt_default_selection.jpg&quot;&gt;
&lt;img title=&quot;last_period_prompt_default_selection.jpg, nov. 2009&quot; alt=&quot;&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/automatic_period/.last_period_prompt_default_selection_t.jpg&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
set all other required prompts to cascading prompt on last_period.&lt;br /&gt;
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/automatic_period/prompt_cascading_last_period.jpg&quot;&gt;&lt;img title=&quot;prompt_cascading_last_period.jpg, nov. 2009&quot; alt=&quot;&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/automatic_period/.prompt_cascading_last_period_t.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Then you will see the Period list only if required.&lt;/p&gt;
&lt;p&gt;I hope this will help you :).&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.jbheren.com/post/2009/11/10/Last-period-prompt-option-in-Cognos-report-Studio#comment-form</comments>
      <wfw:comment>http://blog.jbheren.com/post/2009/11/10/Last-period-prompt-option-in-Cognos-report-Studio#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.jbheren.com/feed/atom/comments/36</wfw:commentRss>
      </item>
    
  <item>
    <title>SSAS Batch Processing with XMLA</title>
    <link>http://blog.jbheren.com/post/2009/11/09/SSAS-Batch-Processing-with-XMLA</link>
    <guid isPermaLink="false">urn:md5:c4dd485b52e6212f784014e74db29071</guid>
    <pubDate>Mon, 09 Nov 2009 12:10:00 +0100</pubDate>
    <dc:creator>Jean-Baptiste HEREN</dc:creator>
        <category>Décisionnel</category>
        <category>Analysis Services</category><category>Business Intelligence</category><category>SQL Server</category><category>SSAS</category>    
    <description>&lt;p&gt;When you want to schedule the processing of SSAS database (using Sql Server
jobs), you have two options :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;create ans SSIS package containing Analysis services tasks &amp;amp; schedule
it.&lt;/li&gt;
&lt;li&gt;Build ans XMLA script &amp;amp; schedule it.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Here we will see how you can build an XML script describing the processing
tasks you want to execute.    &lt;h2&gt;1- Buiding &amp;amp; testing the script&lt;/h2&gt;
In Sql Server management studio, connect to yous SSAS database.&lt;br /&gt;
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/XMLA/04_-_Sql_Server_management_studio_-_connect_Analysis_services.jpg&quot;&gt;
&lt;img title=&quot;04_-_Sql_Server_management_studio_-_connect_Analysis_services.jpg, nov. 2009&quot; alt=&quot;&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/XMLA/04_-_Sql_Server_management_studio_-_connect_Analysis_services.jpg&quot; /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Open a new XMLA Query window &amp;amp; paste the following script in it.&lt;br /&gt;
&lt;br /&gt;
 &lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/XMLA/07_-_Sql_Server_management_studio_-_new_Query_XMLA.jpg&quot;&gt;&lt;img title=&quot;07_-_Sql_Server_management_studio_-_new_Query_XMLA.jpg, nov. 2009&quot; alt=&quot;&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/XMLA/.07_-_Sql_Server_management_studio_-_new_Query_XMLA_m.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;

&lt;br /&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;Batch ProcessAffectedObjects=&amp;quot;true&amp;quot;
xmlns=&amp;quot;http://schemas.microsoft.com/analysisservices/2003/engine&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;strong&gt;&amp;lt;Process&lt;/strong&gt;
xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;
xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;
xmlns:ddl2=&amp;quot;http://schemas.microsoft.com/analysisservices/2003/engine/2&amp;quot;
xmlns:ddl2_2=&amp;quot;http://schemas.microsoft.com/analysisservices/2003/engine/2/2&amp;quot;&amp;gt;&lt;br /&gt;

    &amp;lt;Object&amp;gt;&lt;br /&gt;
     
&amp;lt;DatabaseID&amp;gt;&lt;strong&gt;ASdatabase&lt;/strong&gt;&amp;lt;/DatabaseID&amp;gt;&lt;br /&gt;
      &amp;lt;DimensionID&amp;gt;&lt;strong&gt;Dimension ID(not
name)&lt;/strong&gt;&amp;lt;/DimensionID&amp;gt;&lt;br /&gt;
    &amp;lt;/Object&amp;gt;&lt;br /&gt;
    &amp;lt;Type&amp;gt;ProcessFull&amp;lt;/Type&amp;gt;&lt;br /&gt;
   
&amp;lt;WriteBackTableCreation&amp;gt;UseExisting&amp;lt;/WriteBackTableCreation&amp;gt;&lt;br /&gt;
  &lt;strong&gt;&amp;lt;/Process&amp;gt;&lt;/strong&gt;&lt;br /&gt;
  &lt;strong&gt;&amp;lt;Process&amp;gt;&lt;/strong&gt;&lt;br /&gt;
    &amp;lt;Object&amp;gt;&lt;br /&gt;
     
&amp;lt;DatabaseID&amp;gt;&lt;strong&gt;ASdatabase&lt;/strong&gt;&amp;lt;/DatabaseID&amp;gt;&lt;br /&gt;
    &amp;lt;DimensionID&amp;gt;&lt;strong&gt;Dimension 2
ID&lt;/strong&gt;&amp;lt;/DimensionID&amp;gt;&lt;br /&gt;
  &amp;lt;/Object&amp;gt;&lt;br /&gt;
  &amp;lt;Type&amp;gt;ProcessFull&amp;lt;/Type&amp;gt;&lt;br /&gt;
 
&amp;lt;WriteBackTableCreation&amp;gt;UseExisting&amp;lt;/WriteBackTableCreation&amp;gt;&lt;br /&gt;
&lt;strong&gt;&amp;lt;/Process&amp;gt;&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;&amp;lt;Process&amp;gt;&lt;/strong&gt;&lt;br /&gt;
  &amp;lt;Object&amp;gt;&lt;br /&gt;
   
&amp;lt;DatabaseID&amp;gt;&lt;strong&gt;ASdatabase&lt;/strong&gt;&amp;lt;/DatabaseID&amp;gt;&lt;br /&gt;
    &amp;lt;CubeID&amp;gt;&lt;strong&gt;Cube ID&lt;/strong&gt;&amp;lt;/CubeID&amp;gt;&lt;br /&gt;
  &amp;lt;/Object&amp;gt;&lt;br /&gt;
  &amp;lt;Type&amp;gt;ProcessFull&amp;lt;/Type&amp;gt;&lt;br /&gt;
 
&amp;lt;WriteBackTableCreation&amp;gt;UseExisting&amp;lt;/WriteBackTableCreation&amp;gt;&lt;br /&gt;
&lt;strong&gt;&amp;lt;/Process&amp;gt;&lt;/strong&gt;&lt;br /&gt;
&amp;lt;/Batch&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
Of course, you just have to set your own database and dimensions/cubes IDs. You
can add as many &amp;lt;process&amp;gt;&amp;lt;/process&amp;gt; blocks you need.&lt;br /&gt;
Now just run your Script and see what happens.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;2- Scheduling&lt;/h2&gt;
When you are ready, create or open ans Sql job under SQL Server Agent.&lt;br /&gt;
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/XMLA/01_-_Sql_Server_management_studio_-_create_new_job.jpg&quot;&gt;
&lt;img title=&quot;01_-_Sql_Server_management_studio_-_create_new_job.jpg, nov. 2009&quot; alt=&quot;&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/XMLA/.01_-_Sql_Server_management_studio_-_create_new_job_m.jpg&quot; /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
add a step to your job, choose &amp;quot;SQL Server Analysis Services&amp;quot; as Type &amp;amp;
paste your script.&lt;br /&gt;
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/XMLA/03_-_Sql_Server_management_studio_-_step_properties.jpg&quot;&gt;
&lt;img title=&quot;03_-_Sql_Server_management_studio_-_step_properties.jpg, nov. 2009&quot; alt=&quot;&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/XMLA/.03_-_Sql_Server_management_studio_-_step_properties_m.jpg&quot; /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Of course this is just a Quickstart. For more informations about XMLA structure
&amp;amp; options, just refer to the MSDN Help.</description>
    
    
    
          <comments>http://blog.jbheren.com/post/2009/11/09/SSAS-Batch-Processing-with-XMLA#comment-form</comments>
      <wfw:comment>http://blog.jbheren.com/post/2009/11/09/SSAS-Batch-Processing-with-XMLA#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.jbheren.com/feed/atom/comments/37</wfw:commentRss>
      </item>
    
  <item>
    <title>setup cognos to work with OLAP MSAS cubes security</title>
    <link>http://blog.jbheren.com/post/2009/08/26/HOWTO-setup-cognos-connection-to-use-users-sactive-directory-credentials</link>
    <guid isPermaLink="false">urn:md5:4f0b5e7269e2839e3bb698deef2f63a8</guid>
    <pubDate>Wed, 26 Aug 2009 20:38:00 +0200</pubDate>
    <dc:creator>Jean-Baptiste HEREN</dc:creator>
        <category>Décisionnel</category>
        <category>Analysis Services</category><category>Business Intelligence</category><category>Cognos</category><category>SQL Server 2005</category><category>SSAS</category>    
    <description>&lt;p&gt;Usually, when we create a data source in Cognos, it is easier to specify a
connection using Cognos Service Credentials. This means that all connections to
the data source are done using the Cognos service user's profile.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Advantage of this method is that it needs less setup on the corresponding
database server (only one account).&lt;/li&gt;
&lt;li&gt;Disadvantage is that you cannot make use of &amp;quot;row level security&amp;quot; as all
Cognos users will connect using the same profile (Data source has no
information about current Cognos user).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To take advantage of an eventual user level security setup behind Cognos
data sources, we need to connect using the current Cognos user's profile.&lt;/p&gt;    &lt;p&gt;In the following example, we are editing a Microsoft Analysis services data
source. We will setup that Cognos connection so that user's own credentials are
transmitted to the database server:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Remove SSO  : just because it didn't work for me when combined with
MSAS active directory connections to data sources, on Cognos 8.2. It may work
on later releases… If someone can help, let me know :).&lt;/li&gt;
&lt;li&gt;Using the portal, change connection's setup so that it uses an external
namespace (AD).&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;In Cognos directory, select data sources tab and click on the
connection&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/MSAS_Security/Cognos_Setup_SSAS_Connection.png&quot;&gt;&lt;img title=&quot;Cognos_Setup_SSAS_Connection.png, août 2009&quot; alt=&quot;&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/MSAS_Security/.Cognos_Setup_SSAS_Connection_s.jpg&quot; /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;On the connexion page, click on the properties icon to edit
parameters.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/MSAS_Security/Cognos_Setup_SSAS_Connection_2_edit_parameters.png&quot;&gt;
&lt;img title=&quot;Cognos_Setup_SSAS_Connection_2_edit_parameters.png, août 2009&quot; alt=&quot;&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/MSAS_Security/.Cognos_Setup_SSAS_Connection_2_edit_parameters_s.jpg&quot; /&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;On connection string, click on the pen icon to edit credentials.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/MSAS_Security/Cognos_Setup_SSAS_Connection_3_edit_connection_string.png&quot;&gt;
&lt;img title=&quot;Cognos_Setup_SSAS_Connection_3_edit_connection_string.png, août 2009&quot; alt=&quot;&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/MSAS_Security/.Cognos_Setup_SSAS_Connection_3_edit_connection_string_s.jpg&quot; /&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;In the connection string, we change from &amp;quot;Cognos 8 service credentials&amp;quot; to
&amp;quot;External Namespace: Active Directory&amp;quot;. Then click OK on each page to
validate.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/MSAS_Security/Cognos_Setup_SSAS_Connection_4_edit_signon.png&quot;&gt;
&lt;img title=&quot;Cognos_Setup_SSAS_Connection_4_edit_signon.png, août 2009&quot; alt=&quot;&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/MSAS_Security/.Cognos_Setup_SSAS_Connection_4_edit_signon_s.jpg&quot; /&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
    
    
    
          <comments>http://blog.jbheren.com/post/2009/08/26/HOWTO-setup-cognos-connection-to-use-users-sactive-directory-credentials#comment-form</comments>
      <wfw:comment>http://blog.jbheren.com/post/2009/08/26/HOWTO-setup-cognos-connection-to-use-users-sactive-directory-credentials#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.jbheren.com/feed/atom/comments/24</wfw:commentRss>
      </item>
    
  <item>
    <title>Row Level security in MSAS</title>
    <link>http://blog.jbheren.com/post/2009/08/26/Setup-Row-Level-security-in-Analysis-services</link>
    <guid isPermaLink="false">urn:md5:43e9dc3395898c5af7cce869b7aef9b9</guid>
    <pubDate>Wed, 26 Aug 2009 07:11:00 +0200</pubDate>
    <dc:creator>Jean-Baptiste HEREN</dc:creator>
        <category>Décisionnel</category>
        <category>Analysis Services</category><category>Business Intelligence</category><category>Cognos</category><category>SSAS</category>    
    <description>&lt;h1&gt;Security implementation in Analysis Services&lt;/h1&gt;
In some cases, companies want to give different level of access to strategic
data, depending on user’s profiles. Analysis services gives us ability to
secure cubes data by building Roles containing security rules, mainly by
filtering dimensions data.&lt;br /&gt;
For example, if you have a cube giving Turnover amounts per salesperson,
salesmen should see only the data corresponding to their sales area only. Also,
one manager may want to see data for all areas he’s responsible for.&lt;br /&gt;
This document describes how we can achieve security on the sales Area axis for
the sales domain. Notice taht in this example, &lt;strong&gt;we are using Cognos as
reporting tool&lt;/strong&gt;. This addidional layer has no impact on the way we
setup MSAS &amp;amp; Active directory, results will be the same with Microsoft
Reporting services    &lt;h2&gt;Use Case&lt;/h2&gt;
&lt;p&gt;As an abstract, here is a typical use case, after setup of row level
security in MSAS and Active directory sign on in Cognos.&lt;br /&gt;
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/MSAS_Security/use_case.png&quot;&gt;&lt;img title=&quot;use_case.png, août 2009&quot; alt=&quot;[image:Use_Case]&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/MSAS_Security/.use_case_m.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Security Definition architecture&lt;/h2&gt;
&lt;p&gt;To apply row level security, we will have to define User profiles &amp;amp;
associate them with Security Roles in Sql Analysis services, using Active
directory for Binding.&lt;/p&gt;
&lt;p&gt;To apply Security on Dimensions in MSAS Cubes, we want to rely directly on
active directory. This way we will be able to add new users without changing
the security definitions in Analysis services:&lt;br /&gt;
-         We create one active
directory group for each MSAS Security role&lt;br /&gt;
-         Each MSAS Role has only one
AD Group as member.&lt;br /&gt;
-         New users just have to get
the right AD Groups to get the right access to MSAS Cubes &amp;amp;
dimensions.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/MSAS_Security/MSAS_Security_Static_Model.png&quot;&gt;&lt;img title=&quot;MSAS_Security_Static_Model.png, août 2009&quot; alt=&quot;[image:Static model of Security Elements]&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/MSAS_Security/.MSAS_Security_Static_Model_s.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;

Figure 1 - Static model of Security Elements&lt;br /&gt;
&lt;br /&gt;
We will work on dimensions data security with order defined as Deny, Allow. In
other words, if a dimensions is secured : default is deny and we specify
allowed elements. This way, we will be able to combine multiple roles givig
access to different elements.&lt;br /&gt;
&lt;br /&gt;
One role in Analysis services can manage access to any element:&lt;br /&gt;
-         connexion&lt;br /&gt;
-         cubes&lt;br /&gt;
-         cell data&lt;br /&gt;
-         dimensions&lt;br /&gt;
-         dimension data (the one we
are working on)&lt;br /&gt;
 &lt;br /&gt;
Here we want to manage security on dimensions attributes, so that users can
only access to data filtered using allowed dimension’s attributes. Notice that
we can apply security on each level of one dimension.&lt;br /&gt;
&lt;br /&gt;
We have one “Sales Area” Dimension with three levels, on witch we want to
create security roles.&lt;br /&gt;
&lt;br /&gt;
&lt;img title=&quot;Sales_Area_Dimension.png, août 2009&quot; alt=&quot;&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/MSAS_Security/Sales_Area_Dimension.png&quot; /&gt;&lt;br /&gt;
Figure 2 - Static model of Sales Area Dimension&lt;/p&gt;
&lt;h3&gt;One Global user Role&lt;/h3&gt;
&lt;p&gt;We will change the way Cognos connects to MSAS. Instead of always connecting
using Cognos Service credentials, we want Cognos to connect using user’s
credentials.&lt;br /&gt;
&lt;br /&gt;
Then we have to create a generic user role in each SSAS Database, so that all
users can access to cubes, even if they don’t own a secured group. This role
must at least set database &amp;amp; cubes read access. All Cognos users will have
to be member of this role, this can be done using a Cognousers group defined in
Active directory.&lt;br /&gt;
&lt;br /&gt;
&lt;img title=&quot;user.role_general_tab.png, août 2009&quot; alt=&quot;[image:user.role]&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/MSAS_Security/user.role_general_tab.png&quot; /&gt;&lt;br /&gt;
All Cognos Users groups will need a basic read access, at least.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/MSAS_Security/user.role_Cubes_tab.png&quot;&gt;&lt;img title=&quot;user.role_Cubes_tab.png, août 2009&quot; alt=&quot;[image:user.role Cubes]&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/MSAS_Security/.user.role_Cubes_tab_m.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Specific user Roles (with security on data)&lt;/h3&gt;
&lt;p&gt;Those roles will limit access to specified Dimensions Elements.&lt;br /&gt;
&lt;br /&gt;
For Example:&lt;br /&gt;
-         Sales_Asia.role will grant
access to the Sales area attribute Member ASIA.&lt;br /&gt;
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/MSAS_Security/sales_Asia.role.png&quot;&gt;&lt;img title=&quot;sales_Asia.role.png, août 2009&quot; alt=&quot;[image:sales_asia.role]&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/MSAS_Security/.sales_Asia.role_m.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;-         France.role will grant
access to the Country attribute Member FRANCE.&lt;br /&gt;
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/MSAS_Security/Sales_France.role.png&quot;&gt;&lt;img title=&quot;Sales_France.role.png, août 2009&quot; alt=&quot;[image:sales_france.role]&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/MSAS_Security/.Sales_France.role_m.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
If we want the cube to recalculate aggregations and totals regarding the
applied security, we will have to select the “Enable visual Total” option on
advanced Tab.&lt;br /&gt;
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/MSAS_Security/Sales_France.role_Advanced_tab.png&quot;&gt;&lt;img title=&quot;Sales_France.role_Advanced_tab.png, août 2009&quot; alt=&quot;[image:sales_france.role advanced tab]&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/MSAS_Security/.Sales_France.role_Advanced_tab_m.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;

 &lt;/p&gt;
&lt;h2&gt;MSAS Roles validation&lt;/h2&gt;
&lt;p&gt;The “Grant based” Security allows a user to cumulate access from multiple
roles.&lt;br /&gt;
&lt;br /&gt;
For Example, one user with ASIA &amp;amp; FRANCE groups will get both access. We
can validate this using the cube browser’s testing tools.&lt;br /&gt;
&lt;br /&gt;
In the Sql Server Management studio, we can browse cubes using specified
profile or roles :&lt;br /&gt;
&lt;br /&gt;
&lt;img title=&quot;MSAS_Security_Context_button.png, août 2009&quot; alt=&quot;[image:security Context Roles]&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/MSAS_Security/MSAS_Security_Context_button.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;In SQL server management studio cube browser, we Specify the security
context;&lt;br /&gt;
&lt;img title=&quot;MS_BROWSER_Security_Context.png, août 2009&quot; alt=&quot;[image:security Context]&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/MSAS_Security/MS_BROWSER_Security_Context.png&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;Then we navigate Dimensions and data;&lt;br /&gt;
&lt;a href=&quot;http://blog.jbheren.com/public/Decisionnel/MSAS_Security/Brows_Sales_Area_Example.png&quot;&gt;&lt;img title=&quot;Brows_Sales_Area_Example.png, août 2009&quot; alt=&quot;[image:Navigate Cube]&quot; src=&quot;http://blog.jbheren.com/public/Decisionnel/MSAS_Security/.Brows_Sales_Area_Example_m.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We can see that both Asia and France Roles associated members are
allowed.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.jbheren.com/post/2009/08/26/Setup-Row-Level-security-in-Analysis-services#comment-form</comments>
      <wfw:comment>http://blog.jbheren.com/post/2009/08/26/Setup-Row-Level-security-in-Analysis-services#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.jbheren.com/feed/atom/comments/25</wfw:commentRss>
      </item>
    
</channel>
</rss>
