<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" version="2.0">
  <channel>
    <title>Miky Schreiber's Blog - BI</title>
    <link>http://www.miky-schreiber.com/Blog/</link>
    <description>Business Intelligence, Analysis Services, MDX, DataWarehousing and more...</description>
    <language>en-us</language>
    <copyright>Miky Schreiber</copyright>
    <lastBuildDate>Wed, 21 Jul 2010 12:09:06 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.9.6264.0</generator>
    <managingEditor>miky@zahav.net.il</managingEditor>
    <webMaster>miky@zahav.net.il</webMaster>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=92ecf93e-0cc7-418e-b092-918adc819e22</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,92ecf93e-0cc7-418e-b092-918adc819e22.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,92ecf93e-0cc7-418e-b092-918adc819e22.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=92ecf93e-0cc7-418e-b092-918adc819e22</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>Note: In order to understand and implement this you need to know <a href="http://www.miky-schreiber.com/Blog/PermaLink,guid,dd64d937-e0d6-4bf5-8c44-63213719282f.aspx">how
to add JavaScript to OBIEE</a>. I strongly suggest you to read my <a href="http://www.miky-schreiber.com/Blog/CategoryView,category,BI%2cOracle%2cOBIEE.aspx">older
posts about OBIEE manipulation</a>. this feature has been tested on version 10.1.3.4</em>
        </p>
        <p>
I've been <a href="http://www.miky-schreiber.com/Blog/PermaLink,guid,dd64d937-e0d6-4bf5-8c44-63213719282f.aspx">asked</a> how
to create radio-buttons prompt in OBIEE dashboards. The purpose of this is to make
the dashboard more beautiful, becasue radio buttons looks better than drop down list
(aka ddl). Another nice thing you can do with this is to add description to every
option (as I hope to implement in the near future). So, this is how you'll do it:
</p>
        <ul>
          <li>
In the OBIEE Administration application, I have a session variable called MyProjectWorkingMode
(replace MyProject with your project name). This variable controls the mode (or whatever)
of the user (let's say it can be red, green or blue). The default value for this variable
is red. This variable is important for us because we'll use it to "remember" what
the user selected. 
</li>
          <li>
In OBIEE Answers, I created a dashboard prompt which is a drop-down-list. This prompt
has the same default value as the variable (red, in our example) and it sets our variable. <strong>important</strong>:
the caption of this prompt must be MyProjectWorkingMode. 
</li>
          <li>
In order for us (or the JS code) to know in which mode we are we'll create a report
called MyProjectCurrentWorkingMode. Put there one column which will show our variable's
value and one column from the presentation layer (all reports must go to the underlying
DB). The expression in the first column will be ValueOf(NQ_SESSION.MyProjectWorkingMode).
In the results tab, create a narrative view which will have a div <strong>with the
id</strong>="MyProjectWorkingMode<strong>Div</strong>" and inside it write @1. This
will give us the current working mode inside the div. In the compound view, make that
the report will only contain the narrative view. Save the report. 
</li>
          <li>
Create a new dashboard page. Add Text object and inside it put the javascript code
from the file attached to this post and replace anywhere the "MyProjectWorkingMode"
with the name you entered. Make sure the name is the same as in the prompt's
caption and the div. Don't forget to mark the "contains HTML markup" checkbox.
Add the report we created in the previous step in a seperate Section and hide that
section (Properties -&gt; Format Section -&gt; Use Custom CSS style = display:none).
Add the dashboard prompt. 
</li>
          <li>
That's it. If you did everything right, the JS code will make the ddl as radio buttons.</li>
        </ul>
        <p>
I suggest that you'll get over the JS code in the file attached in order to understand
what I did. That will let you change the implementation if something is not as you
wanted.
</p>
        <p>
          <em>Last thing: Before you ask me why it doesn't work in your application, make sure
you did everything right and that you have the same version as mine. If it still refuse
to work, ask for help from a web/JS developer who can debug the code and see what
failed. In my previous posts my features didn't work for some and they thought that
this ain't working, where it worked for a lot of people who thanked me.</em>
        </p>
        <p>
Enjoy.
</p>
        <a href="http://www.miky-schreiber.com/Blog/content/binary/obieeRadioButtons.txt">obieeRadioButtons.txt
(4.12 KB)</a>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=92ecf93e-0cc7-418e-b092-918adc819e22" />
      </body>
      <title>Radio Buttons Prompt in OBIEE</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,92ecf93e-0cc7-418e-b092-918adc819e22.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,92ecf93e-0cc7-418e-b092-918adc819e22.aspx</link>
      <pubDate>Wed, 21 Jul 2010 12:09:06 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;Note: In order to understand and implement this you need to know &lt;a href="http://www.miky-schreiber.com/Blog/PermaLink,guid,dd64d937-e0d6-4bf5-8c44-63213719282f.aspx"&gt;how
to add JavaScript to OBIEE&lt;/a&gt;. I strongly suggest you to read my &lt;a href="http://www.miky-schreiber.com/Blog/CategoryView,category,BI%2cOracle%2cOBIEE.aspx"&gt;older
posts about OBIEE manipulation&lt;/a&gt;. this feature has been tested&amp;nbsp;on version 10.1.3.4&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
I've been &lt;a href="http://www.miky-schreiber.com/Blog/PermaLink,guid,dd64d937-e0d6-4bf5-8c44-63213719282f.aspx"&gt;asked&lt;/a&gt; how
to create radio-buttons prompt in OBIEE dashboards. The purpose of this is to make
the dashboard more beautiful, becasue radio buttons looks better than drop down list
(aka ddl). Another nice thing you can do with&amp;nbsp;this is to add description to every
option (as I hope to implement in the near future). So, this is how you'll do it:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
In the OBIEE Administration application, I have a session variable called MyProjectWorkingMode
(replace MyProject with your project name). This variable controls the mode (or whatever)
of the user (let's say it can be red, green or blue). The default value for this variable
is red. This variable is important for us because we'll use it to "remember" what
the user selected. 
&lt;li&gt;
In OBIEE Answers, I created a dashboard prompt which is a drop-down-list. This prompt
has the same default value as the variable (red, in our example) and it sets our variable. &lt;strong&gt;important&lt;/strong&gt;:
the caption of this prompt must be MyProjectWorkingMode. 
&lt;li&gt;
In order for us (or the JS code) to know in which mode we are we'll create a report
called MyProjectCurrentWorkingMode. Put there one column which will show our variable's
value and one column from the presentation layer (all reports must go to the underlying
DB). The expression in the first column will be ValueOf(NQ_SESSION.MyProjectWorkingMode).
In the results tab, create a narrative view which will have a div &lt;strong&gt;with the
id&lt;/strong&gt;="MyProjectWorkingMode&lt;strong&gt;Div&lt;/strong&gt;" and inside it write @1. This
will give us the current working mode inside the div. In the compound view, make that
the report will only contain&amp;nbsp;the narrative view. Save the report. 
&lt;li&gt;
Create a new dashboard page. Add Text object and inside it put the javascript code
from the file attached to this post and replace anywhere the "MyProjectWorkingMode"
with the name you entered. Make sure the name is the same as in the&amp;nbsp;prompt's
caption and the div.&amp;nbsp;Don't forget to mark the "contains HTML markup" checkbox.
Add the report we created in the previous step in a seperate Section and hide that
section (Properties -&amp;gt; Format Section -&amp;gt; Use Custom CSS&amp;nbsp;style = display:none).
Add the dashboard prompt. 
&lt;li&gt;
That's it. If you did everything right, the JS code will make the ddl as radio buttons.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
I suggest that you'll get over the JS code in the file attached in order to understand
what I did. That will let you change the implementation if something is not as you
wanted.
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Last thing: Before you ask me why it doesn't work in your application, make sure
you did everything right and that you have the same version as mine. If it still refuse
to work, ask for help from a web/JS developer who can debug the code and see what
failed. In my previous posts my features didn't work for some and they thought that
this ain't working, where it worked for a lot of people who thanked me.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Enjoy.
&lt;/p&gt;
&lt;a href="http://www.miky-schreiber.com/Blog/content/binary/obieeRadioButtons.txt"&gt;obieeRadioButtons.txt
(4.12 KB)&lt;/a&gt;&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=92ecf93e-0cc7-418e-b092-918adc819e22" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,92ecf93e-0cc7-418e-b092-918adc819e22.aspx</comments>
      <category>BI;BI/Oracle;BI/Oracle/OBIEE</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=a6d2ee8b-7426-419f-a069-8b31fa2b5923</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,a6d2ee8b-7426-419f-a069-8b31fa2b5923.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,a6d2ee8b-7426-419f-a069-8b31fa2b5923.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=a6d2ee8b-7426-419f-a069-8b31fa2b5923</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <img style="MARGIN: 0px 1em 1em" src="http://www.miky-schreiber.com/Blog/content/binary/stop_signs.JPG" align="left" border="0" />
        <p>
No-one in my organization knew what is the difference between stop and abort in the
Informatica Workflow Monitor. I googled it, and here is the answer in short term:
Abort is killing the process in the underlying operating system, meaning that the
memory that the session took for itself won't be released. Most of the OS don't have
good-enough garbage collectors, meaning that this memory allocation won't be free
until you'll restart the whole server(!). The stop command will ask the session to
quit whenever it can, meaning that this will take more time.
</p>
        <p>
Use the abort command only if you must stop the session right now. If you see that
over time your informatica server goes slower and slower, restart the server in the
weekend.
</p>
        <p>
You can see the full answer <a href="http://datawarehouse.ittoolbox.com/documents/difference-between-stop-and-abort-in-informatica-12862">here</a>.
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=a6d2ee8b-7426-419f-a069-8b31fa2b5923" />
      </body>
      <title>The difference between stop and abort in Informatica</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,a6d2ee8b-7426-419f-a069-8b31fa2b5923.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,a6d2ee8b-7426-419f-a069-8b31fa2b5923.aspx</link>
      <pubDate>Thu, 15 Jul 2010 12:37:52 GMT</pubDate>
      <description>&lt;img style="MARGIN: 0px 1em 1em" src="http://www.miky-schreiber.com/Blog/content/binary/stop_signs.JPG" align=left border=0&gt; 
&lt;p&gt;
No-one in my organization knew what is the difference between stop and abort in the
Informatica Workflow Monitor. I googled it, and here is the answer in short term:
Abort is killing the process in the underlying operating system, meaning that the
memory that the session took for itself won't be released. Most of the OS don't have
good-enough garbage collectors, meaning that this memory allocation won't be free
until you'll restart the whole server(!). The stop command will ask the session to
quit whenever it can, meaning that this will take more time.
&lt;/p&gt;
&lt;p&gt;
Use the abort command only if you must stop the session right now. If you see that
over time your informatica server goes slower and slower, restart the server in the
weekend.
&lt;/p&gt;
&lt;p&gt;
You can see the full answer &lt;a href="http://datawarehouse.ittoolbox.com/documents/difference-between-stop-and-abort-in-informatica-12862"&gt;here&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=a6d2ee8b-7426-419f-a069-8b31fa2b5923" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,a6d2ee8b-7426-419f-a069-8b31fa2b5923.aspx</comments>
      <category>BI;BI/Informatica</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=74fd776a-97c3-4148-94dc-b6ccad13b191</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,74fd776a-97c3-4148-94dc-b6ccad13b191.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,74fd776a-97c3-4148-94dc-b6ccad13b191.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=74fd776a-97c3-4148-94dc-b6ccad13b191</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>This is the fifth and last post regarding <a href="http://blogs.microsoft.co.il/blogs/itaybraun/">Itay
Braun</a>'s</em>
          <em> seminar in the SQL &amp; BI conference. In this post, I'll
write some notes I collected from the last part of the seminar which discussed
SSRS. As you can see, most of the tips are relevent for every reporting tool.</em>
        </p>
        <ul>
          <li>
Scale-Out instead of Scale-In. Meaning that it's better to have multiple SSRS servers
on one DB then bigger and better single SSRS server. 
</li>
          <li>
One report should not return all the data. Define and build your report to answer
specific answer. 
</li>
          <li>
Use subscriptions. Minimile impact on performance. 
</li>
          <li>
Use cache executions or at least snapshots. 
</li>
          <li>
Visualization (see also my <a href="http://www.miky-schreiber.com/Blog/PermaLink,guid,6e4ca812-5a91-49b9-9b9e-64ef1e978257.aspx">post
about dashboard design</a>) 
<ul><li>
Use same colors for for the same business units 
</li><li>
Use images for better data recognition (e.g countries' flags)</li></ul></li>
          <li>
Monitor the SSRS server. Look at the trace logs, the execution log and the performance
counters. You can use <a href="http://www.summitcloud.com/solutions/scrubs/ssrs-report-catalog.aspx">Scrubs</a>(free
SSRS performance reports).</li>
        </ul>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=74fd776a-97c3-4148-94dc-b6ccad13b191" />
      </body>
      <title>Notes from the SQL &amp; BI conference - Reporting Services</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,74fd776a-97c3-4148-94dc-b6ccad13b191.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,74fd776a-97c3-4148-94dc-b6ccad13b191.aspx</link>
      <pubDate>Thu, 01 Jul 2010 09:31:33 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;This is the&amp;nbsp;fifth and last&amp;nbsp;post&amp;nbsp;regarding &lt;a href="http://blogs.microsoft.co.il/blogs/itaybraun/"&gt;Itay
Braun&lt;/a&gt;'s&lt;/em&gt;&lt;em&gt;&amp;nbsp;seminar in the SQL &amp;amp; BI conference. In this post, I'll
write some notes I collected from the&amp;nbsp;last part of the seminar which discussed
SSRS. As you can see, most of the tips are relevent for every reporting tool.&lt;/em&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Scale-Out instead of Scale-In. Meaning that it's better to have multiple SSRS servers
on one DB then bigger and better single SSRS server. 
&lt;li&gt;
One report should not return all the data. Define and build your report to answer
specific answer. 
&lt;li&gt;
Use subscriptions. Minimile impact on performance. 
&lt;li&gt;
Use cache executions or at least snapshots. 
&lt;li&gt;
Visualization (see also my &lt;a href="http://www.miky-schreiber.com/Blog/PermaLink,guid,6e4ca812-5a91-49b9-9b9e-64ef1e978257.aspx"&gt;post
about dashboard design&lt;/a&gt;) 
&lt;ul&gt;
&lt;li&gt;
Use same colors for for the same business units 
&lt;li&gt;
Use images for better data recognition (e.g countries' flags)&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
Monitor the SSRS server. Look at the trace logs, the execution log and the performance
counters. You can use &lt;a href="http://www.summitcloud.com/solutions/scrubs/ssrs-report-catalog.aspx"&gt;Scrubs&lt;/a&gt;(free
SSRS performance reports).&lt;/li&gt;
&lt;/ul&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=74fd776a-97c3-4148-94dc-b6ccad13b191" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,74fd776a-97c3-4148-94dc-b6ccad13b191.aspx</comments>
      <category>BI;BI/SQL Server 2005;BI/SQL Server 2008</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=43cbf1b9-4b77-4d7c-b8e9-5aa2dbf584d3</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,43cbf1b9-4b77-4d7c-b8e9-5aa2dbf584d3.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,43cbf1b9-4b77-4d7c-b8e9-5aa2dbf584d3.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=43cbf1b9-4b77-4d7c-b8e9-5aa2dbf584d3</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>This is the fourth post about <a href="http://blogs.microsoft.co.il/blogs/itaybraun/">Itay
Braun</a></em>
          <em>'s seminar in the SQL &amp; BI conference. In this post, I'll write
some notes I collected from the third part of the seminar which discussed SSIS.</em>
        </p>
        <ul>
          <li>
Log everything that happens inside the package. Use the SSIS log providers and the
event handlers. The effect on performance is not significant. 
</li>
          <li>
Analyize the log data. You can analize total execution time, SSAS partition processing
time and much more.</li>
          <li>
Log detailed error information about rejected rows. You can even log the actual error
row.</li>
          <li>
Monitor also the execution of the ETL jobs.</li>
          <li>
Data Profiling is a new feature in SSIS 2008. It's used for analysis of the data's
quality in the DWH. Go and learn.</li>
          <li>
Configure everything you can in the package configuration, such as: tasks, containers,
variables, connection managers and data flow components. You can use XML config
file, config from parent package, registry configuration or even configuration from
a table.</li>
          <li>
The Cache Transformation saves data in the cache. It's very useful in lookups.</li>
          <li>
Data types: Make them as "small" as possible (better performance). Be aware of
precision issues when using money, float and decimal types.</li>
          <li>
Don't sort in SSIS unless it's absolutely necessary.</li>
          <li>
Sometimes using T-SQL will be faster then running it in SSIS.</li>
        </ul>
        <p>
Some of the tips are also relevant in Informatica. For example, I always let the DB
make the sort whenever possible. Sometimes it's also works with joins. Running packages
or procedures can be much more faster than running it in the ETL, but if you look
at it from maintenance point of view you'll do it in the ETL. It depends on much factors,
such as the time you can have to run the ETL, the knowledge in your team and more.
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=43cbf1b9-4b77-4d7c-b8e9-5aa2dbf584d3" />
      </body>
      <title>Notes from the SQL &amp; BI conference - SSIS</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,43cbf1b9-4b77-4d7c-b8e9-5aa2dbf584d3.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,43cbf1b9-4b77-4d7c-b8e9-5aa2dbf584d3.aspx</link>
      <pubDate>Tue, 22 Jun 2010 12:40:51 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;This is the&amp;nbsp;fourth post about &lt;a href="http://blogs.microsoft.co.il/blogs/itaybraun/"&gt;Itay
Braun&lt;/a&gt;&lt;/em&gt;&lt;em&gt;'s seminar in the SQL &amp;amp; BI conference. In this post, I'll write
some notes I collected from the third part of the seminar which discussed SSIS.&lt;/em&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Log everything that happens inside the package. Use the SSIS log providers and the
event handlers. The effect on performance is not significant. 
&lt;/li&gt;
&lt;li&gt;
Analyize the log data. You can analize total execution time, SSAS partition processing
time and much more.&lt;/li&gt;
&lt;li&gt;
Log detailed error information about rejected rows. You can even log the actual error
row.&lt;/li&gt;
&lt;li&gt;
Monitor also the execution of the ETL jobs.&lt;/li&gt;
&lt;li&gt;
Data Profiling is a new feature in SSIS 2008. It's used for analysis of the data's
quality in the DWH. Go and learn.&lt;/li&gt;
&lt;li&gt;
Configure everything you can in the package configuration, such as: tasks, containers,
variables, connection managers and&amp;nbsp;data flow components. You can use XML config
file, config from parent package, registry configuration or even configuration from
a table.&lt;/li&gt;
&lt;li&gt;
The Cache Transformation saves data in the cache. It's very useful in lookups.&lt;/li&gt;
&lt;li&gt;
Data types: Make them as "small" as possible (better performance).&amp;nbsp;Be aware&amp;nbsp;of
precision issues when using money, float and decimal types.&lt;/li&gt;
&lt;li&gt;
Don't sort in SSIS unless it's absolutely necessary.&lt;/li&gt;
&lt;li&gt;
Sometimes using T-SQL will be faster then running it in SSIS.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Some of the tips are also relevant in Informatica. For example, I always let the DB
make the sort whenever possible. Sometimes it's also works with joins. Running packages
or procedures can be much more faster than running it in the ETL, but if you look
at it from maintenance point of view you'll do it in the ETL. It depends on much factors,
such as the time you can have to run the ETL, the knowledge in your team and more.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=43cbf1b9-4b77-4d7c-b8e9-5aa2dbf584d3" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,43cbf1b9-4b77-4d7c-b8e9-5aa2dbf584d3.aspx</comments>
      <category>BI;BI/SQL Server 2005;BI/SQL Server 2005/Integration Services;BI/SQL Server 2008;BI/SQL Server 2008/Integration Services</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=6537c330-ca32-4855-9313-e798a37981ec</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,6537c330-ca32-4855-9313-e798a37981ec.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,6537c330-ca32-4855-9313-e798a37981ec.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=6537c330-ca32-4855-9313-e798a37981ec</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>This is the third post about <a href="http://blogs.microsoft.co.il/blogs/itaybraun/">Itay
Braun</a></em>
          <em>'s seminar in the SQL &amp; BI conference. In this post, I'll write
some notes I collected from the second part of the seminar which discussed SSAS design,
but here I'll focus on near real-time cubes. I decided to write an independent post
about near real-time cubes because this subject deserves its own place. By the
way, I personally think that this subject is very interesting.</em>
        </p>
        <p>
There are several solutions to implement near real-time cubes:
</p>
        <ol>
          <li>
Processing only the last partition. Pros: Trivial and simple. Cons: Might impact users
in terms of resources and cache.</li>
          <li>
Small real-time cube. Pros: Simple and elegant solution. Cons: It's small,
so it can't contain much data even if you need to. This is the main reason why people
usually don't do it.</li>
          <li>
Backend processing server. Now it's getting interesting. The backend server is only
used for processing. The front-end server(s) is used for querying. Pros: Good performance
on query time. Cons: You need to take care of syncing the cubes, using XMLA sync,
physical file sync (SAN snapshots) or any other technology. The cache is deleted
with every sync.</li>
          <li>
Flip-Flop. It's like the previous solution, only here we switch between the servers.
Pros: It enables you to check your data/cube before making the switch. Good performance
on query time. Cons: You need to take care of changing the connection string in the
client side or implement NLB solution. It might disconnect users or you need to take
care of waiting for the end of the session and only then change the connection string.</li>
          <li>
ROLAP partition. Pros: No processing at all! Cons: Bad, bad performance.</li>
        </ol>
        <p>
If anyone have implemented one of these I'll be happy to hear.
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=6537c330-ca32-4855-9313-e798a37981ec" />
      </body>
      <title>Notes from the SQL &amp; BI conference - Near Real-Time Cubes</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,6537c330-ca32-4855-9313-e798a37981ec.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,6537c330-ca32-4855-9313-e798a37981ec.aspx</link>
      <pubDate>Tue, 22 Jun 2010 12:17:34 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;This is the&amp;nbsp;third post about &lt;a href="http://blogs.microsoft.co.il/blogs/itaybraun/"&gt;Itay
Braun&lt;/a&gt;&lt;/em&gt;&lt;em&gt;'s seminar in the SQL &amp;amp; BI conference. In this post, I'll write
some notes I collected from the second part of the seminar which discussed SSAS design,
but here I'll focus on near real-time cubes. I decided to write an independent&amp;nbsp;post
about&amp;nbsp;near real-time cubes because this subject deserves its own place. By the
way, I personally think that this subject is very interesting.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
There are several solutions to implement near real-time cubes:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Processing only the last partition. Pros: Trivial and simple. Cons: Might impact users
in terms of resources and cache.&lt;/li&gt;
&lt;li&gt;
Small real-time cube. Pros:&amp;nbsp;Simple and elegant solution.&amp;nbsp;Cons: It's small,
so it can't contain much data even if you need to. This is the main reason why people
usually don't do it.&lt;/li&gt;
&lt;li&gt;
Backend processing server. Now it's getting interesting. The backend server is only
used for processing. The front-end server(s) is used for querying. Pros: Good performance
on query time. Cons: You need to take care of syncing the cubes, using XMLA sync,
physical file sync (SAN snapshots)&amp;nbsp;or any other technology. The cache is deleted
with every sync.&lt;/li&gt;
&lt;li&gt;
Flip-Flop. It's like the previous solution, only here we switch between the servers.
Pros: It enables you to check your data/cube before making the switch. Good performance
on query time. Cons: You need to take care of changing the connection string in the
client side or implement NLB solution. It might disconnect users or you need to take
care of waiting for the end of the session and only then change the connection string.&lt;/li&gt;
&lt;li&gt;
ROLAP partition. Pros: No processing at all! Cons: Bad, bad&amp;nbsp;performance.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
If anyone have implemented one of these I'll be happy to hear.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=6537c330-ca32-4855-9313-e798a37981ec" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,6537c330-ca32-4855-9313-e798a37981ec.aspx</comments>
      <category>BI;BI/SQL Server 2005;BI/SQL Server 2005/Analysis Services;BI/SQL Server 2008;BI/SQL Server 2008/Analysis Services</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=de92bdd9-8397-40b5-a969-035a17897699</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,de92bdd9-8397-40b5-a969-035a17897699.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,de92bdd9-8397-40b5-a969-035a17897699.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=de92bdd9-8397-40b5-a969-035a17897699</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This is the second post about <a href="http://blogs.microsoft.co.il/blogs/itaybraun/">Itay
Braun</a>'s seminar in the SQL &amp; BI conference. In this post, I'll write some
notes I collected from the second part of the seminar which discussed SSAS design.
</p>
        <ul>
          <li>
There's a very common misunderstanding about what is an entity. You can see it
when there are a lot of dimensions. If there are "car color", "car manufacturer"
and "car creation year" dimensions it seems you've got a problem. If there are dimensions
with only key and description attributes (or worse - only one description attribute)
then you've got a serious problem. 
</li>
          <li>
Design to Scale: Often the performance problem are caused by the dimensions and
not by the fact/cubes. 
</li>
          <li>
Don't develop SSAS with hebrew (or any other right-to-left language). Use hebrew only
in translations .I've personally got hurt with this. Maintaining MDX with hebrew is
hell. 
</li>
          <li>
Avoid using linked measures. If you have some, consider joining the cubes to one cube. 
</li>
          <li>
There need to be a balance between the amount of the dimensions and the amount of
the cubes. If they are equal, you've got a problem. BIDS will warn you (in the 2008
version) if you have two measure groups with the same dimensionality. 
</li>
          <li>
Keep the dimension keys as narrow as possible. Dimension keys based on more than one
column is not optimal. Use member properties, such as AttributeHierarchyEnabled, AttributeHierarchyOptimized
and GroupingBehaviour. 
</li>
          <li>
Data types is an issue in SSAS. Make sure the data types in the DSV are the same as
in the dimension attributes. 
</li>
          <li>
The SSAS engine works best when the foreign key between the fact and the dimension
is based on integer columns. Read more about dimension design <a href="http://sqlcat.com/whitepapers/archive/2009/02/15/the-analysis-services-2008-performance-guide.aspx">here</a>. 
</li>
          <li>
Attribute relationships and flexible vs. rigid are critical to performance.
As I read more and more about SSAS I understand how much it's crucial to performance. 
</li>
          <li>
Automatic creation of partitions can be a good solution for a wide variety of problems.
Note that when deploying your SSAS solution to the server you might override the partitions
you created with your code. To solve this, you can use the deployment wizard or to <a href="http://www.miky-schreiber.com/Blog/PermaLink,guid,b8dcb74f-14df-4240-b5be-40c916b301f5.aspx">import
your SSAS database into solution</a>. 
</li>
          <li>
Each partition should have up to 50M records or up to 250MB. Optimize the partition
query. It's only plain SQL query. Get help from your DBA and get a better performance. 
</li>
          <li>
99% Aggregations will not cover 99% of the aggregation possibilities/combinations.
The engine chooses statistically-randomly which aggregation to save. Use the usage
based wizard. 
</li>
          <li>
Most of the processing time is the time required for the relational DB to return the
results of the SQL query. As before, get help from the DBA, improve this query (note
that you can't change it) and get a shorter processing time. 
</li>
          <li>
To solve MDX performance issues, you need to learn what is the difference between
the formula engine and the storage engine. I was suprised to see that many SSAS developers
never heard of it. 
</li>
          <li>
In MDX Scripts, use scoping instead of conditional calculations when possible. 
</li>
          <li>
Avoid StrToMember or StrToSet functions.</li>
        </ul>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=de92bdd9-8397-40b5-a969-035a17897699" />
      </body>
      <title>Notes from the SQL &amp; BI conference - SSAS Design</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,de92bdd9-8397-40b5-a969-035a17897699.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,de92bdd9-8397-40b5-a969-035a17897699.aspx</link>
      <pubDate>Mon, 14 Jun 2010 11:34:43 GMT</pubDate>
      <description>&lt;p&gt;
This is the second post about &lt;a href="http://blogs.microsoft.co.il/blogs/itaybraun/"&gt;Itay
Braun&lt;/a&gt;'s seminar in the SQL &amp;amp; BI conference. In this post, I'll write some
notes I collected from the second part of the seminar which discussed SSAS design.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
There's a&amp;nbsp;very common misunderstanding about what is an entity. You can see it
when there are a lot of dimensions. If there&amp;nbsp;are "car color", "car manufacturer"
and "car creation year" dimensions it seems you've got a problem. If there are dimensions
with only key and description attributes (or worse - only one description attribute)
then you've got a serious problem. 
&lt;li&gt;
Design to Scale: Often the performance problem are caused by the dimensions&amp;nbsp;and
not&amp;nbsp;by the fact/cubes. 
&lt;li&gt;
Don't develop SSAS with hebrew (or any other right-to-left language). Use hebrew only
in translations .I've personally got hurt with this. Maintaining MDX with hebrew is
hell. 
&lt;li&gt;
Avoid using linked measures. If you have some, consider joining the cubes to one cube. 
&lt;li&gt;
There need to be a balance between the amount of the dimensions and the amount of
the cubes. If they are equal, you've got a problem. BIDS will warn you (in the 2008
version) if you have two measure groups with the same dimensionality. 
&lt;li&gt;
Keep the dimension keys as narrow as possible. Dimension keys based on more than one
column is not optimal. Use member properties, such as AttributeHierarchyEnabled, AttributeHierarchyOptimized
and GroupingBehaviour. 
&lt;li&gt;
Data types is an issue in SSAS. Make sure the data types in the DSV are the same as
in the dimension attributes. 
&lt;li&gt;
The SSAS engine works best when the foreign key between the fact and the dimension
is based on integer columns. Read more about dimension design &lt;a href="http://sqlcat.com/whitepapers/archive/2009/02/15/the-analysis-services-2008-performance-guide.aspx"&gt;here&lt;/a&gt;. 
&lt;li&gt;
Attribute relationships and&amp;nbsp;flexible vs. rigid&amp;nbsp;are critical to performance.
As I read more and more about SSAS I understand how much it's crucial to performance. 
&lt;li&gt;
Automatic creation of partitions can be a good solution for a wide variety of problems.
Note that when deploying your SSAS solution to the server you might override the partitions
you created with your code. To solve this, you can use the deployment wizard or to &lt;a href="http://www.miky-schreiber.com/Blog/PermaLink,guid,b8dcb74f-14df-4240-b5be-40c916b301f5.aspx"&gt;import
your SSAS database into solution&lt;/a&gt;. 
&lt;li&gt;
Each partition should have up to 50M records or up to 250MB. Optimize the partition
query. It's only plain SQL query. Get help from your DBA and get a better performance. 
&lt;li&gt;
99% Aggregations will not cover 99% of the aggregation possibilities/combinations.
The engine chooses statistically-randomly which aggregation to save. Use the usage
based wizard. 
&lt;li&gt;
Most of the processing time is the time required for the relational DB to return the
results of the SQL query. As before, get help from the DBA, improve this query (note
that you can't change it) and get a shorter processing time. 
&lt;li&gt;
To solve MDX performance issues, you need to learn what is the difference between
the formula engine and the storage engine. I was suprised to see that many SSAS developers
never heard of it. 
&lt;li&gt;
In MDX Scripts, use scoping instead of conditional calculations when possible. 
&lt;li&gt;
Avoid StrToMember or StrToSet functions.&lt;/li&gt;
&lt;/ul&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=de92bdd9-8397-40b5-a969-035a17897699" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,de92bdd9-8397-40b5-a969-035a17897699.aspx</comments>
      <category>BI;BI/SQL Server 2005;BI/SQL Server 2005/Analysis Services;BI/SQL Server 2008;BI/SQL Server 2008/Analysis Services</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=3cfaec4b-c358-411e-80fa-d270362cba80</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,3cfaec4b-c358-411e-80fa-d270362cba80.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,3cfaec4b-c358-411e-80fa-d270362cba80.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=3cfaec4b-c358-411e-80fa-d270362cba80</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
These are some important notes I written in the great seminar by <a href="http://blogs.microsoft.co.il/blogs/itaybraun/">Itay
Braun</a>. The seminar was held in the SQL &amp; BI conference in Tel-Aviv two weeks
ago. Sorry for the delay, believe me I was busy. The title of the seminar was "Solution
- Oriented BI for developers". Actually, it was a collection of lectures and
tips on general BI and on SSAS, SSIS and SSRS, mainly on the 2008 R2 version. In this
post, I'll bring some notes I collected from the first part of the seminar, which
was on general BI development and desing. I'll also bring my personal point of view.
</p>
        <ul>
          <li>
The solution objective: Taking some reports and showing them is not BI. BI is on combining
several sources and bring knowledge based on this integration. Only then it's
getting interesting.</li>
          <li>
We need to aspire to answer 5 question through our BI solution: What have happened?
Why did it happen? What is happening now? What will happen? What do I want to happen?
Just for thinking, try to tell yourself which answers does your BI solution
give. I think you'll find out (as I did) that you're far away from these five answers.
We all are.</li>
          <li>
BI is a process, not a one-off project. I always say that BI design &amp; development
requires maturity. You need to know that you can't do everything in one shot. There
are even things that you can do but it won't be right at the moment. The organization
also needs to grow up with the solution.</li>
          <li>
You need to decide on an early stage of the project which client tools you
going to have. You also need, of course, to decide if you'll have reporting, OLAP
or both.</li>
          <li>
The ideal BI solution gives an infrastructure and let the customers do their own reporting.
The big disadvantage here is performance. You can't know what kind of a killer-queries
the user will run.</li>
          <li>
A good dashboard gives the manager all the knowledge he needs to have in front of
him. It tells him what is the current status of his organization without one click.
Do you have this kind of dashboard? I don't...</li>
          <li>
Microsoft has a lack of good visual client tools in the BI field. This is where third-side
companies, such as Panorama comes.</li>
        </ul>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=3cfaec4b-c358-411e-80fa-d270362cba80" />
      </body>
      <title>Notes from the SQL &amp; BI conference - General BI</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,3cfaec4b-c358-411e-80fa-d270362cba80.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,3cfaec4b-c358-411e-80fa-d270362cba80.aspx</link>
      <pubDate>Mon, 14 Jun 2010 09:21:47 GMT</pubDate>
      <description>&lt;p&gt;
These are some important notes I written&amp;nbsp;in the&amp;nbsp;great seminar by &lt;a href="http://blogs.microsoft.co.il/blogs/itaybraun/"&gt;Itay
Braun&lt;/a&gt;. The seminar was held in the SQL &amp;amp; BI conference in Tel-Aviv two weeks
ago. Sorry for the delay, believe me I was busy. The title of the seminar was "Solution
- Oriented BI for developers". Actually, it was a collection of&amp;nbsp;lectures and
tips on general BI and on SSAS, SSIS and SSRS, mainly on the 2008 R2 version. In this
post, I'll bring some&amp;nbsp;notes I collected from the first part of the seminar, which
was on general BI development and desing. I'll also bring my personal point of view.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
The solution objective: Taking some reports and showing them is not BI. BI is on combining
several sources and bring knowledge based on&amp;nbsp;this integration. Only then it's
getting interesting.&lt;/li&gt;
&lt;li&gt;
We need to aspire to answer 5 question through our BI solution: What have happened?
Why did it happen? What is happening now? What will happen? What do I want to happen?
Just for thinking, try to&amp;nbsp;tell yourself&amp;nbsp;which answers does your BI solution
give. I think you'll find out (as I did) that you're far away from these five answers.
We all are.&lt;/li&gt;
&lt;li&gt;
BI is a process, not a one-off project. I always say that BI design &amp;amp; development
requires maturity. You need to know that you can't do everything in one shot. There
are even things that you can do but it won't be right at the moment. The organization
also needs to grow up with the solution.&lt;/li&gt;
&lt;li&gt;
You need to decide on an early stage of the project&amp;nbsp;which&amp;nbsp;client tools you
going to have. You also need, of course, to decide if you'll have reporting, OLAP
or both.&lt;/li&gt;
&lt;li&gt;
The ideal BI solution gives an infrastructure and let the customers do their own reporting.
The big disadvantage here is performance. You can't know what kind of a killer-queries
the user will run.&lt;/li&gt;
&lt;li&gt;
A good dashboard gives the manager all the knowledge he needs to have in front of
him. It tells him what is the current status of his organization without one click.
Do you have this kind of dashboard? I don't...&lt;/li&gt;
&lt;li&gt;
Microsoft has a lack of good visual client tools in the BI field. This is where third-side
companies, such as Panorama comes.&lt;/li&gt;
&lt;/ul&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=3cfaec4b-c358-411e-80fa-d270362cba80" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,3cfaec4b-c358-411e-80fa-d270362cba80.aspx</comments>
      <category>BI</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=7745c013-b12a-4b95-9302-8ed00629cb2a</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,7745c013-b12a-4b95-9302-8ed00629cb2a.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,7745c013-b12a-4b95-9302-8ed00629cb2a.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=7745c013-b12a-4b95-9302-8ed00629cb2a</wfw:commentRss>
      <title>Joining in OBIEE with not-equality operator</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,7745c013-b12a-4b95-9302-8ed00629cb2a.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,7745c013-b12a-4b95-9302-8ed00629cb2a.aspx</link>
      <pubDate>Sun, 16 May 2010 15:42:16 GMT</pubDate>
      <description>&lt;= and &gt;If you want to join fact and dimension table based on non-equality operator, such as between statement or =, you can't do it using simple join. It will throw you the error "All operators must be equality". To do it, you must use the complex join (the one with the yellow button).&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=7745c013-b12a-4b95-9302-8ed00629cb2a" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,7745c013-b12a-4b95-9302-8ed00629cb2a.aspx</comments>
      <category>BI;BI/Oracle;BI/Oracle/OBIEE</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=5d896ea0-b01b-4de3-ae5c-e2e3733bd884</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,5d896ea0-b01b-4de3-ae5c-e2e3733bd884.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,5d896ea0-b01b-4de3-ae5c-e2e3733bd884.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=5d896ea0-b01b-4de3-ae5c-e2e3733bd884</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">From time to time I find myself writing
a hierarchial query in Oracle DB. It helps me a lot when I need to understand hierarchial
data, mostly resides in the source systems of the Datawarehouse. Yesterday I've
seen that a lot of my colleagues haven't heard about these kind of queries, even the
most experienced ones. So here is a tiny tutorial for this subject which you can go
back to any time. The important thing here is that you'll know that these kind of
queries exists even if you'll google it the next time you'll need it (search for "<a href="http://www.google.co.il/search?q=oracle+start+with">start
with</a>" or "<a href="http://www.google.co.il/search?q=oracle+connect+by">connect
by</a>").<br />
Let's say you have a table which looks like this:<br /><table border="1"><tbody><tr><td><u>Key</u></td><td><u>Father</u></td><td><u>Description</u></td></tr><tr><td><font size="2">1</font></td><td><font size="2">10</font></td><td><font size="2">Renault</font></td></tr><tr><td><font size="2">2</font></td><td><font size="2">20</font></td><td><font size="2">Jambo</font></td></tr><tr><td><font size="2">3</font></td><td><font size="2">20</font></td><td><font size="2">Airbus</font></td></tr><tr><td><font size="2">4</font></td><td><font size="2">10</font></td><td><font size="2">Hyundai</font></td></tr><tr><td><font size="2">5</font></td><td><font size="2">10</font></td><td><font size="2">Toyota</font></td></tr><tr><td><font size="2">6</font></td><td><font size="2">10</font></td><td><font size="2">Honda</font></td></tr><tr><td><font size="2">7</font></td><td><font size="2">20</font></td><td><font size="2">F16</font></td></tr><tr><td><font size="2">8</font></td><td><font size="2">20</font></td><td><font size="2">F15</font></td></tr><tr><td><font size="2">9</font></td><td><font size="2">10</font></td><td><font size="2">Alpha Romeo</font></td></tr><tr><td><font size="2">10</font></td><td><font size="2">-1</font></td><td><font size="2">Cars</font></td></tr><tr><td><font size="2">20</font></td><td><font size="2">-1</font></td><td><font size="2">Airplanes</font></td></tr><tr><td><font size="2">-1</font></td><td><font size="2">-99</font></td><td><font size="2">Transportation</font></td></tr></tbody></table><br />
You want to see the data in a tree form, meaning that you'll see Renault, its parent,
its grandparent and so on. All you need to write is the following query:<br /><br />
select * from MyTable<br />
start with KEY = 1<br />
connect by prior FATHER = KEY<br /><br />
That's it. The result is:<br /><table border="1"><tbody><tr><td><u>Key</u></td><td><u>Father</u></td><td><u>Description</u></td></tr><tr><td><font size="2">1</font></td><td><font size="2">10</font></td><td><font size="2">Renault</font></td></tr><tr><td><font size="2">10</font></td><td><font size="2">-1</font></td><td><font size="2">Cars</font></td></tr><tr><td><font size="2">-1</font></td><td><font size="2">-99</font></td><td><font size="2">Transportation</font></td></tr></tbody></table><br />
Note that the recursion stops only when it cannot find the next parent. In addition,
many times you'll want only one row from the tree (the root, its son or some other
criteria). In this case you can simply add a where clause to the query.<br />
Unfortunately, doing the same with SQL Server is much more <a href="http://dbbest.net/blog/?p=44">difficult</a> (tell
me if I'm wrong). 
<p>
Enjoy.
</p><img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=5d896ea0-b01b-4de3-ae5c-e2e3733bd884" /></body>
      <title>Hierarchial Queries in Oracle</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,5d896ea0-b01b-4de3-ae5c-e2e3733bd884.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,5d896ea0-b01b-4de3-ae5c-e2e3733bd884.aspx</link>
      <pubDate>Mon, 10 May 2010 12:57:55 GMT</pubDate>
      <description>From time to time I find myself writing a hierarchial query in Oracle DB. It helps me a lot when I need to understand hierarchial data, mostly resides&amp;nbsp;in the source systems of the Datawarehouse. Yesterday I've seen that a lot of my colleagues haven't heard about these kind of queries, even the most experienced ones. So here is a tiny tutorial for this subject which you can go back to any time. The important thing here is that you'll know that these kind of queries exists even if you'll google it the next time you'll need it (search for "&lt;a href="http://www.google.co.il/search?q=oracle+start+with"&gt;start
with&lt;/a&gt;" or "&lt;a href="http://www.google.co.il/search?q=oracle+connect+by"&gt;connect
by&lt;/a&gt;").&lt;br&gt;
Let's say you have a table which looks like this:&lt;br&gt;
&lt;table border=1&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;u&gt;Key&lt;/u&gt;&lt;/td&gt;
&lt;td&gt;
&lt;u&gt;Father&lt;/u&gt;&lt;/td&gt;
&lt;td&gt;
&lt;u&gt;Description&lt;/u&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;1&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;10&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;Renault&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;2&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;20&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;Jambo&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;3&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;20&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;Airbus&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;4&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;10&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;Hyundai&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;5&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;10&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;Toyota&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;6&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;10&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;Honda&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;7&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;20&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;F16&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;8&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;20&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;F15&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;9&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;10&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;Alpha Romeo&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;10&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;-1&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;Cars&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;20&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;-1&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;Airplanes&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;-1&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;-99&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;Transportation&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
You want to see the data in a tree form, meaning that you'll see Renault, its parent,
its grandparent and so on. All you need to write is the following query:&lt;br&gt;
&lt;br&gt;
select * from MyTable&lt;br&gt;
start with KEY = 1&lt;br&gt;
connect by prior FATHER = KEY&lt;br&gt;
&lt;br&gt;
That's it. The result is:&lt;br&gt;
&lt;table border=1&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;u&gt;Key&lt;/u&gt;&lt;/td&gt;
&lt;td&gt;
&lt;u&gt;Father&lt;/u&gt;&lt;/td&gt;
&lt;td&gt;
&lt;u&gt;Description&lt;/u&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;1&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;10&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;Renault&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;10&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;-1&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;Cars&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;-1&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;-99&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;Transportation&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
Note that the recursion stops only when it cannot find the next parent. In addition,
many times you'll want only one row from the tree (the root, its son or some other
criteria). In this case you can simply add a where clause to the query.&lt;br&gt;
Unfortunately, doing the same with SQL Server is much more &lt;a href="http://dbbest.net/blog/?p=44"&gt;difficult&lt;/a&gt; (tell
me if I'm wrong). 
&lt;p&gt;
Enjoy.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=5d896ea0-b01b-4de3-ae5c-e2e3733bd884" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,5d896ea0-b01b-4de3-ae5c-e2e3733bd884.aspx</comments>
      <category>BI;BI/DataWarehousing;BI/Oracle;Tips &amp; Tricks</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=f64785b0-e1a6-4033-bff9-8c6e8219ce2f</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,f64785b0-e1a6-4033-bff9-8c6e8219ce2f.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,f64785b0-e1a6-4033-bff9-8c6e8219ce2f.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=f64785b0-e1a6-4033-bff9-8c6e8219ce2f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
SQL Server 2008 R2 has been released not-so-long-ago. You can <a href="http://www.microsoft.com/sqlserver/2008/en/us/R2Downloads.aspx">download</a> the
trial and check it for yourselves. Alternatively, you can enter the <a href="http://www.microsoft.com/sqlserver/tour/en/default.aspx">digital
tour</a> or read the <a href="http://go.microsoft.com/fwlink/?LinkId=189147">free
e-book</a>. I started reading the e-book and I promise to update here about the new
features of R2.
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=f64785b0-e1a6-4033-bff9-8c6e8219ce2f" />
      </body>
      <title>Some SQL Server 2008 R2 Sources</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,f64785b0-e1a6-4033-bff9-8c6e8219ce2f.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,f64785b0-e1a6-4033-bff9-8c6e8219ce2f.aspx</link>
      <pubDate>Mon, 10 May 2010 07:51:59 GMT</pubDate>
      <description>&lt;p&gt;
SQL Server 2008 R2 has been released not-so-long-ago. You can &lt;a href="http://www.microsoft.com/sqlserver/2008/en/us/R2Downloads.aspx"&gt;download&lt;/a&gt;&amp;nbsp;the
trial&amp;nbsp;and check it&amp;nbsp;for yourselves. Alternatively, you can enter the &lt;a href="http://www.microsoft.com/sqlserver/tour/en/default.aspx"&gt;digital
tour&lt;/a&gt; or read the &lt;a href="http://go.microsoft.com/fwlink/?LinkId=189147"&gt;free
e-book&lt;/a&gt;. I started reading the e-book and I promise to update here about the new
features of R2.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=f64785b0-e1a6-4033-bff9-8c6e8219ce2f" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,f64785b0-e1a6-4033-bff9-8c6e8219ce2f.aspx</comments>
      <category>BI;BI/SQL Server 2008</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=82c9a2d6-f14a-4f47-9eca-0cfaf45cecf6</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,82c9a2d6-f14a-4f47-9eca-0cfaf45cecf6.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,82c9a2d6-f14a-4f47-9eca-0cfaf45cecf6.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=82c9a2d6-f14a-4f47-9eca-0cfaf45cecf6</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <img style="MARGIN: 0px 1em 1em" src="http://www.miky-schreiber.com/Blog/content/binary/OracleIronMan2.jpg" align="left" border="0" />
        <p>
 
</p>
        <p>
"Tony Stark once saved his heart - and his life - with the Iron Man suit. Now he's
found his heart and forged new life into his company. Stark Industries, by abandoning
munitions manufacture for cutting-edge communications. Learn how Oracle helped with
the transformation"
</p>
        <p>
Have they <a href="http://www.oracle.com/us/ironman2/index.html">lost</a><a href="http://www.oracle.com/us/ironman2/iron-man-2-oracle-magazine-065664.pdf">their</a><a href="http://www.oracleimg.com/ocom/groups/public/@ocom/documents/digitalasset/065298.jpg">minds</a>?
Don't they have better ways to increase their <a href="http://www.google.com/finance?chdnp=1&amp;chdd=1&amp;chds=1&amp;chdv=1&amp;chvs=maximized&amp;chdeh=0&amp;chfdeh=0&amp;chdet=1273354157143&amp;chddm=8211&amp;chls=IntervalBasedLine&amp;q=NASDAQ:ORCL&amp;ntsp=0">revenues</a>?
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=82c9a2d6-f14a-4f47-9eca-0cfaf45cecf6" />
      </body>
      <title>What the...</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,82c9a2d6-f14a-4f47-9eca-0cfaf45cecf6.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,82c9a2d6-f14a-4f47-9eca-0cfaf45cecf6.aspx</link>
      <pubDate>Sun, 09 May 2010 21:30:08 GMT</pubDate>
      <description>&lt;img style="MARGIN: 0px 1em 1em" src="http://www.miky-schreiber.com/Blog/content/binary/OracleIronMan2.jpg" align=left border=0&gt; 
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
"Tony Stark once saved his heart - and his life - with the Iron Man suit. Now he's
found his heart and forged new life into his company. Stark Industries, by abandoning
munitions manufacture for cutting-edge communications. Learn how Oracle helped with
the transformation"
&lt;/p&gt;
&lt;p&gt;
Have they &lt;a href="http://www.oracle.com/us/ironman2/index.html"&gt;lost&lt;/a&gt; &lt;a href="http://www.oracle.com/us/ironman2/iron-man-2-oracle-magazine-065664.pdf"&gt;their&lt;/a&gt; &lt;a href="http://www.oracleimg.com/ocom/groups/public/@ocom/documents/digitalasset/065298.jpg"&gt;minds&lt;/a&gt;?
Don't they have better ways to increase their &lt;a href="http://www.google.com/finance?chdnp=1&amp;amp;chdd=1&amp;amp;chds=1&amp;amp;chdv=1&amp;amp;chvs=maximized&amp;amp;chdeh=0&amp;amp;chfdeh=0&amp;amp;chdet=1273354157143&amp;amp;chddm=8211&amp;amp;chls=IntervalBasedLine&amp;amp;q=NASDAQ:ORCL&amp;amp;ntsp=0"&gt;revenues&lt;/a&gt;?
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=82c9a2d6-f14a-4f47-9eca-0cfaf45cecf6" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,82c9a2d6-f14a-4f47-9eca-0cfaf45cecf6.aspx</comments>
      <category>BI;BI/Oracle</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=a4378ea5-4aba-4104-a5f8-b94504839132</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,a4378ea5-4aba-4104-a5f8-b94504839132.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,a4378ea5-4aba-4104-a5f8-b94504839132.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=a4378ea5-4aba-4104-a5f8-b94504839132</wfw:commentRss>
      <title>Free Pass to The SQL &amp; BI Convention</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,a4378ea5-4aba-4104-a5f8-b94504839132.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,a4378ea5-4aba-4104-a5f8-b94504839132.aspx</link>
      <pubDate>Wed, 05 May 2010 07:11:59 GMT</pubDate>
      <description>&lt;p&gt;
At the end of the month the Israeli &lt;a href="http://site.e-dologic.co.il/SQLBI0410/"&gt;SQL
&amp; BI conference&lt;/a&gt; will be held. The conference will last two days and there will
be number of seminars, some of them will cover Microsoft BI issues. You can see &lt;a href="http://site.e-dologic.co.il/SQLBI0410/details.html"&gt;here&lt;/a&gt; the
list of the seminars. Luckily, I give away a free ticket and you, dear reader, can
have it. All you have to do is to answer the following question by leaving a comment
here and maybe you'll get a ticket. And here's the answer:
&lt;/p&gt;
&lt;p&gt;
During 2007-2008, Microsoft made two important acquisitions. Two of the new features
in SQL Server 2008 R2 are based on these acquisitions. Which are those acquisitions
and what are those new features?
&lt;/p&gt;
Your comments won't show here but don't worry, I can see them. 
&lt;p&gt;
Good luck.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=a4378ea5-4aba-4104-a5f8-b94504839132" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,a4378ea5-4aba-4104-a5f8-b94504839132.aspx</comments>
      <category>BI</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=987f8375-15cd-4397-85a0-ca40f427c61c</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,987f8375-15cd-4397-85a0-ca40f427c61c.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,987f8375-15cd-4397-85a0-ca40f427c61c.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=987f8375-15cd-4397-85a0-ca40f427c61c</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I just opened a <a href="http://blogs.microsoft.co.il/blogs/mikypuff">new blog</a> in
the Israeli Microsoft blogs site. The blog will be written in Hebrew and it will be
focused on the israeli BI scene. If you're from Israel or know reading Hebrew, you're
welcome to visit or the subscribe to the <a href="http://blogs.microsoft.co.il/blogs/mikypuff/rss.aspx">RSS
feed</a>.
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=987f8375-15cd-4397-85a0-ca40f427c61c" />
      </body>
      <title>New Hebrew Blog</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,987f8375-15cd-4397-85a0-ca40f427c61c.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,987f8375-15cd-4397-85a0-ca40f427c61c.aspx</link>
      <pubDate>Sat, 01 May 2010 20:01:48 GMT</pubDate>
      <description>&lt;p&gt;
I just opened a &lt;a href="http://blogs.microsoft.co.il/blogs/mikypuff"&gt;new blog&lt;/a&gt; in
the Israeli Microsoft blogs site. The blog will be written in Hebrew and it will be
focused on the israeli BI scene. If you're from Israel or know reading Hebrew, you're
welcome to visit or the subscribe to the &lt;a href="http://blogs.microsoft.co.il/blogs/mikypuff/rss.aspx"&gt;RSS
feed&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=987f8375-15cd-4397-85a0-ca40f427c61c" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,987f8375-15cd-4397-85a0-ca40f427c61c.aspx</comments>
      <category>BI</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=4e7887c4-c61c-4f52-8ab5-5d4417bbb714</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,4e7887c4-c61c-4f52-8ab5-5d4417bbb714.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,4e7887c4-c61c-4f52-8ab5-5d4417bbb714.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=4e7887c4-c61c-4f52-8ab5-5d4417bbb714</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>
            <a href="http://www.miky-schreiber.com/Blog/PermaLink,guid,dd64d937-e0d6-4bf5-8c44-63213719282f.aspx">Do
you know how to add JS code to your OBIEE site?</a>
          </em>
        </p>
        <p>
It all started with a bug in OBIEE (version 10.1.3.4) and ended with a wonderful solution
that can help us in future problems. Look at the following report table:
</p>
        <table border="1">
          <tbody>
            <tr>
              <td>
                <p align="center">
                  <font size="2">
                    <u>Customer</u>
                  </font>
                </p>
              </td>
              <td>
                <p align="center">
                  <font size="2">
                    <u>Day</u>
                  </font>
                </p>
              </td>
              <td>
                <p align="center">
                  <font size="2">
                    <u>Shop</u>
                  </font>
                </p>
              </td>
            </tr>
            <tr>
              <td>
                <font size="2">A</font>
              </td>
              <td>
                <font size="2">1/1/2000</font>
              </td>
              <td>
                <font color="#0000ff" size="2">
                  <u>EBay</u>
                </font>
              </td>
            </tr>
            <tr>
              <td>
                <font size="2">B</font>
              </td>
              <td>
                <font size="2">15/2/2002</font>
              </td>
              <td>
                <font color="#0000ff" size="2">
                  <u>AdventureWorks</u>
                </font>
              </td>
            </tr>
            <tr>
              <td>
                <font size="2">C</font>
              </td>
              <td>
                <font size="2">28/5/2005</font>
              </td>
              <td>
                <font color="#0000ff" size="2">
                  <u>Office Depot</u>
                </font>
              </td>
            </tr>
          </tbody>
        </table>
        <p>
Building the Business Model layer and the report correctly will take care that clicking
on the EBay link will take us to the Ebay shop page (in OBIEE, not ebay.com) which
is prompted on 1/1/2000 and customer A. This happens because the Shop report is also
prompted on Customer and Day. The problem starts when we sort the table by the shop
name:
</p>
        <table border="1">
          <tbody>
            <tr>
              <td>
                <p align="center">
                  <font size="2">
                    <u>Customer</u>
                  </font>
                </p>
              </td>
              <td>
                <p align="center">
                  <font size="2">
                    <u>Day</u>
                  </font>
                </p>
              </td>
              <td>
                <p align="center">
                  <font size="2">
                    <u>Shop</u>
                  </font>
                </p>
              </td>
            </tr>
            <tr>
              <td>
                <font size="2">B</font>
              </td>
              <td>
                <font size="2">15/2/2002</font>
              </td>
              <td>
                <font color="#0000ff" size="2">
                  <u>AdventureWorks</u>
                </font>
              </td>
            </tr>
            <tr>
              <td>
                <font size="2">A</font>
              </td>
              <td>
                <font size="2">1/1/2000</font>
              </td>
              <td>
                <font color="#0000ff" size="2">
                  <u>EBay</u>
                </font>
              </td>
            </tr>
            <tr>
              <td>
                <font size="2">C</font>
              </td>
              <td>
                <font size="2">28/5/2005</font>
              </td>
              <td>
                <font color="#0000ff" size="2">
                  <u>Office Depot</u>
                </font>
              </td>
            </tr>
          </tbody>
        </table>
        <br />
I would expect that clicking on the EBay link will make the same thing as before,
but actually it prompts the Shop page on Customer B and 15/2/2002. It seems that the
report saves the original location of the record instead of prompting on the actual
record! In order to solve that I written a small JS code that enables us to navigate
based on previous fields in the report (See the attached file). In order to use it
we need to change the link. Edit the column properties, go to the Data Format tab,
check "Override Default Data Format", Pick Treat Text As Custom Text Format and in
the editbox enter the new link. A link example can be found in the attached file.
Note that the third parameter for every field is how much fields to go back.<br />
The great thing about this solution is that it doesn't only solves this particular
issue. It enables you to prompt on every logical column, no matter on which column
the original value was shown.<br /><a href="http://www.miky-schreiber.com/Blog/content/binary/BIPortalPageNav.js">BIPortalPageNav.js
(1.04 KB)</a><img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=4e7887c4-c61c-4f52-8ab5-5d4417bbb714" /></body>
      <title>Advanced Navigation in OBIEE</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,4e7887c4-c61c-4f52-8ab5-5d4417bbb714.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,4e7887c4-c61c-4f52-8ab5-5d4417bbb714.aspx</link>
      <pubDate>Sun, 25 Apr 2010 17:53:13 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;&lt;a href="http://www.miky-schreiber.com/Blog/PermaLink,guid,dd64d937-e0d6-4bf5-8c44-63213719282f.aspx"&gt;Do
you know how to add JS code to your OBIEE site?&lt;/a&gt;&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
It all started with a bug in OBIEE (version 10.1.3.4) and ended with a wonderful solution
that can help us in future problems. Look at the following report table:
&lt;/p&gt;
&lt;table border=1&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p align=center&gt;
&lt;font size=2&gt;&lt;u&gt;Customer&lt;/u&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p align=center&gt;
&lt;font size=2&gt;&lt;u&gt;Day&lt;/u&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p align=center&gt;
&lt;font size=2&gt;&lt;u&gt;Shop&lt;/u&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;A&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;1/1/2000&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font color=#0000ff size=2&gt;&lt;u&gt;EBay&lt;/u&gt;&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;B&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;15/2/2002&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font color=#0000ff size=2&gt;&lt;u&gt;AdventureWorks&lt;/u&gt;&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;C&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;28/5/2005&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font color=#0000ff size=2&gt;&lt;u&gt;Office Depot&lt;/u&gt;&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
Building the Business Model layer and the report correctly will take care that clicking
on the EBay link will take us to the Ebay shop page (in OBIEE, not ebay.com) which
is prompted on 1/1/2000 and customer A. This happens because the Shop report is also
prompted on Customer and Day. The problem starts when we sort the table by the shop
name:
&lt;/p&gt;
&lt;table border=1&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p align=center&gt;
&lt;font size=2&gt;&lt;u&gt;Customer&lt;/u&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p align=center&gt;
&lt;font size=2&gt;&lt;u&gt;Day&lt;/u&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p align=center&gt;
&lt;font size=2&gt;&lt;u&gt;Shop&lt;/u&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;B&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;15/2/2002&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font color=#0000ff size=2&gt;&lt;u&gt;AdventureWorks&lt;/u&gt;&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;A&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;1/1/2000&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font color=#0000ff size=2&gt;&lt;u&gt;EBay&lt;/u&gt;&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;font size=2&gt;C&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font size=2&gt;28/5/2005&lt;/font&gt;&lt;/td&gt;
&lt;td&gt;
&lt;font color=#0000ff size=2&gt;&lt;u&gt;Office Depot&lt;/u&gt;&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
I would expect that clicking on the EBay link will make the same thing as before,
but actually it prompts the Shop page on Customer B and 15/2/2002. It seems that the
report saves the original location of the record instead of prompting on the actual
record! In order to solve that I written a small JS code that enables us to navigate
based on previous fields in the report (See the attached file). In order to use it
we need to change the link. Edit the column properties, go to the Data Format tab,
check "Override Default Data Format", Pick Treat Text As Custom Text Format and in
the editbox enter the new link. A link example can be found in the attached file.
Note that the third parameter for every field is how much fields to go back.&lt;br&gt;
The great thing about this solution is that it doesn't only solves this particular
issue. It enables you to prompt on every logical column, no matter on which column
the original value was shown.&lt;br /&gt;
&lt;a href="http://www.miky-schreiber.com/Blog/content/binary/BIPortalPageNav.js"&gt;BIPortalPageNav.js
(1.04 KB)&lt;/a&gt;&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=4e7887c4-c61c-4f52-8ab5-5d4417bbb714" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,4e7887c4-c61c-4f52-8ab5-5d4417bbb714.aspx</comments>
      <category>BI;BI/Oracle;BI/Oracle/OBIEE</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=625062ab-25fa-4d20-bf2d-9a1a2bc5a56e</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,625062ab-25fa-4d20-bf2d-9a1a2bc5a56e.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,625062ab-25fa-4d20-bf2d-9a1a2bc5a56e.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=625062ab-25fa-4d20-bf2d-9a1a2bc5a56e</wfw:commentRss>
      <slash:comments>12</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>
            <u>Note:</u> all my <a href="http://www.miky-schreiber.com/Blog/CategoryView,category,BI%2cOracle%2cOBIEE.aspx">OBIEE
posts</a> are based one upon the other. If you want to implement this, please read
and do everything I mentioned in my <a href="http://www.miky-schreiber.com/Blog/CategoryView,category,BI%2cOracle%2cOBIEE.aspx">previous
posts</a>.</em>
        </p>
        <p>
I think that this is the most impressive development that we did over OBIEE. OBIEE
is very lack in paging abilities. You can navigate only forward and backwards in the
report. Here is how our google-like paging looks like: 
</p>
        <center>
          <img src="http://www.miky-schreiber.com/Blog/content/binary/paging.GIF" border="0" />
        </center>
        <br />
In order to implement this in your environment, you should be familiar with <a href="http://www.miky-schreiber.com/Blog/PermaLink,guid,dd64d937-e0d6-4bf5-8c44-63213719282f.aspx">how
to add javascript into OBIEE </a>. Just call the addPageNumbers() function in every
page you'd like. Note that this is heavily based on the current OBIEE's DOM (version
10.1.3.4). In addition, this will only work for one report per dashboard page (this
was the original requirement in our dashboard site). 
<br />
The JS is attached below. Enjoy. 
<p><a href="http://www.miky-schreiber.com/Blog/content/binary/addPageNumbers.js">addPageNumbers.js
(6.44 KB)</a></p><img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=625062ab-25fa-4d20-bf2d-9a1a2bc5a56e" /></body>
      <title>Paging in OBIEE</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,625062ab-25fa-4d20-bf2d-9a1a2bc5a56e.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,625062ab-25fa-4d20-bf2d-9a1a2bc5a56e.aspx</link>
      <pubDate>Mon, 15 Mar 2010 08:21:16 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;&lt;u&gt;Note:&lt;/u&gt; all my &lt;a href="http://www.miky-schreiber.com/Blog/CategoryView,category,BI%2cOracle%2cOBIEE.aspx"&gt;OBIEE
posts&lt;/a&gt; are based one upon the other. If you want to implement this, please read
and do everything I mentioned in my &lt;a href="http://www.miky-schreiber.com/Blog/CategoryView,category,BI%2cOracle%2cOBIEE.aspx"&gt;previous
posts&lt;/a&gt;.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
I think that this is the most impressive development that we did over OBIEE. OBIEE
is very lack in paging abilities. You can navigate only forward and backwards in the
report. Here is how our google-like paging looks like: 
&lt;/p&gt;
&lt;center&gt;&lt;img src="http://www.miky-schreiber.com/Blog/content/binary/paging.GIF" border=0&gt;
&lt;/center&gt;
&lt;br&gt;
In order to implement this in your environment, you should be familiar with &lt;a href="http://www.miky-schreiber.com/Blog/PermaLink,guid,dd64d937-e0d6-4bf5-8c44-63213719282f.aspx"&gt;how
to add javascript into OBIEE &lt;/a&gt;. Just call the addPageNumbers() function in every
page you'd like. Note that this is heavily based on the current OBIEE's DOM (version
10.1.3.4). In addition, this will only work for one report per dashboard page (this
was the original requirement in our dashboard site). 
&lt;br&gt;
The JS is attached below. Enjoy. 
&lt;p&gt;
&lt;a href="http://www.miky-schreiber.com/Blog/content/binary/addPageNumbers.js"&gt;addPageNumbers.js
(6.44 KB)&lt;/a&gt; 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=625062ab-25fa-4d20-bf2d-9a1a2bc5a56e" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,625062ab-25fa-4d20-bf2d-9a1a2bc5a56e.aspx</comments>
      <category>BI;BI/Oracle;BI/Oracle/OBIEE</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=8e03be39-f1c3-4ee1-9ef4-199e427ac9ea</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,8e03be39-f1c3-4ee1-9ef4-199e427ac9ea.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,8e03be39-f1c3-4ee1-9ef4-199e427ac9ea.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=8e03be39-f1c3-4ee1-9ef4-199e427ac9ea</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Our users had a weird requirement: They wanted to search all the columns in one action.
We thought how to do it. In this post I'll describe the solution. Note that this solution
is not good in terms of performance, but this is the best we've got.
</p>
        <ol>
          <li>
In every report (/answer/request) you develop, add a column and call it SearchColumn.
Define its formula as the concatenation of all the columns in the report. You also
need to cast the numeric columns to char in order to concatenate them. For example:
FirstColumn || cast(NumericColumn as char) || LastColumn. To make things easier, I
written a little C# program that takes the request XML and outputs this column's formula.
It's a very simple program so I won't put it here (unless someone will ask for it).
You can write this simple program in every language you know. 
</li>
          <li>
Hide the column (Column Properties -&gt; Column Format -&gt; Hide). 
</li>
          <li>
Create a filter based on this column. In the operator drop-down-list, choose "contains
any". Then, click on Add -&gt; Variable -&gt; Presentation. Enter Term in the "Variable
Expr" box (Term will be our variable name) and enter space in the (default) box. 
</li>
          <li>
Now, we'll let the user to enter the search term. Create a new Dashboard Prompt based
on any column you'll like. In the operator, choose "is equal to / is in". Control
- "Edit Box". Show Default To - "Variable Expression" and enter Term. Set Variable
- "Presentation Variable" and enter Term here too. Label - "Search", for example. 
</li>
          <li>
All you have to do is to add the prompt in every page you want to let the user search.</li>
        </ol>
        <p>
Note that the search term will stay until the user will clear the prompt field. As
I said, this solution is problematic for number of reason (performance, "why the other
page filters too?" and maintenance).
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=8e03be39-f1c3-4ee1-9ef4-199e427ac9ea" />
      </body>
      <title>One-shot Search in OBIEE</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,8e03be39-f1c3-4ee1-9ef4-199e427ac9ea.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,8e03be39-f1c3-4ee1-9ef4-199e427ac9ea.aspx</link>
      <pubDate>Thu, 04 Mar 2010 13:29:14 GMT</pubDate>
      <description>&lt;p&gt;
Our users had a weird requirement: They wanted to search all the columns in one action.
We thought how to do it. In this post I'll describe the solution. Note that this solution
is not good in terms of performance, but this is the best we've got.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
In every report (/answer/request) you develop, add a column and call it SearchColumn.
Define its formula as the concatenation of all the columns in the report. You also
need to cast the numeric columns to char in order to concatenate them. For example:
FirstColumn || cast(NumericColumn as char) || LastColumn. To make things easier, I
written a little C# program that takes the request XML and outputs this column's formula.
It's a very simple program so I won't put it here (unless someone will ask for it).
You can write this simple program in every language you know. 
&lt;li&gt;
Hide the column (Column Properties -&amp;gt; Column Format -&amp;gt; Hide). 
&lt;li&gt;
Create a filter based on this column. In the operator drop-down-list, choose "contains
any". Then, click on Add -&amp;gt; Variable -&amp;gt; Presentation. Enter Term in the "Variable
Expr" box (Term will be our variable name) and enter space in the (default) box. 
&lt;li&gt;
Now, we'll let the user to enter the search term. Create a new Dashboard Prompt based
on any column you'll like. In the operator, choose "is equal to / is in". Control
- "Edit Box". Show Default To - "Variable Expression" and&amp;nbsp;enter Term. Set Variable
- "Presentation Variable" and enter Term here too. Label - "Search", for example. 
&lt;li&gt;
All you have to do is to add the prompt in every page you want to let the user search.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Note that the search term will stay until the user will clear the prompt field. As
I said, this solution is problematic for number of reason (performance, "why the other
page filters too?" and maintenance).
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=8e03be39-f1c3-4ee1-9ef4-199e427ac9ea" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,8e03be39-f1c3-4ee1-9ef4-199e427ac9ea.aspx</comments>
      <category>BI;BI/Oracle;BI/Oracle/OBIEE</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=1d6c00fb-00f7-4a78-b5af-544fb9fb8c17</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,1d6c00fb-00f7-4a78-b5af-544fb9fb8c17.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,1d6c00fb-00f7-4a78-b5af-544fb9fb8c17.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=1d6c00fb-00f7-4a78-b5af-544fb9fb8c17</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This is quite simple, so I'll let the JavaScript talk by itself (attached). I assume
that you know how to <a href="http://www.miky-schreiber.com/Blog/PermaLink,guid,dd64d937-e0d6-4bf5-8c44-63213719282f.aspx">add
your JS to OBIEE</a>. You need to call the function hideTabs from every dashboard
page and edit the hiddenTabs array.
</p>
        <p>
This was written on version 10.1.3.4 of OBIEE. Note that if the DOM will be changed
in a future version it won't work.
</p>
        <a href="http://www.miky-schreiber.com/Blog/content/binary/hideDashboardPages.txt">hideDashboardPages.txt
(2.03 KB)</a>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=1d6c00fb-00f7-4a78-b5af-544fb9fb8c17" />
      </body>
      <title>Hiding Dashboard Pages in OBIEE</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,1d6c00fb-00f7-4a78-b5af-544fb9fb8c17.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,1d6c00fb-00f7-4a78-b5af-544fb9fb8c17.aspx</link>
      <pubDate>Wed, 03 Mar 2010 18:51:32 GMT</pubDate>
      <description>&lt;p&gt;
This is quite simple, so I'll let the JavaScript talk by itself (attached). I assume
that you know how to &lt;a href="http://www.miky-schreiber.com/Blog/PermaLink,guid,dd64d937-e0d6-4bf5-8c44-63213719282f.aspx"&gt;add
your JS to OBIEE&lt;/a&gt;. You need to call the function hideTabs from every dashboard
page and edit the hiddenTabs array.
&lt;/p&gt;
&lt;p&gt;
This was written on version 10.1.3.4 of OBIEE. Note that if the DOM will be changed
in a future version it won't work.
&lt;/p&gt;
&lt;a href="http://www.miky-schreiber.com/Blog/content/binary/hideDashboardPages.txt"&gt;hideDashboardPages.txt
(2.03 KB)&lt;/a&gt;&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=1d6c00fb-00f7-4a78-b5af-544fb9fb8c17" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,1d6c00fb-00f7-4a78-b5af-544fb9fb8c17.aspx</comments>
      <category>BI;BI/Oracle;BI/Oracle/OBIEE</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=d5f658b0-f87f-4975-ad06-f878d99b6301</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,d5f658b0-f87f-4975-ad06-f878d99b6301.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,d5f658b0-f87f-4975-ad06-f878d99b6301.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=d5f658b0-f87f-4975-ad06-f878d99b6301</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Non Empty Behavior is a very good optimization method you can use with your calculated
measures. It allows you to define a list of measures that their emptiness defines
the emptiness of your calculated measure. To understand this, look at the picture
(taken from the <a href="http://msdn.microsoft.com/en-us/library/ms166568.aspx">MSDN</a>):
</p>
        <p>
          <img src="http://www.miky-schreiber.com/Blog/content/binary/NonEmptyBehavior.gif" border="0" />
        </p>
        <p>
This is the calculation expressions pane from the Calculations tab in the cube designer.
From MSDN:
</p>
        <p>
"<span class="Apple-style-span" style="WORD-SPACING: 0px; FONT: 16px 'Times New Roman'; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="FONT-SIZE: 11px; LINE-HEIGHT: 15px; FONT-FAMILY: Verdana">The
measures you specify in the<span class="Apple-converted-space"> </span><strong>Non-empty
behavior</strong><span class="Apple-converted-space"> </span>list are used to
resolve NON EMPTY queries in MDX. When you specify one or more measures in the<span class="Apple-converted-space"> </span><strong>Non-empty
behavior</strong><span class="Apple-converted-space"> </span>list, Analysis Services
treats the calculated member as empty if all the specified measures are empty. If
the<span class="Apple-converted-space"> </span><strong>Non-empty behavior</strong><span class="Apple-converted-space"> </span>property
is blank, Analysis Services must evaluate the calculated member itself to determine
whether the member is empty.</span></span>"
</p>
        <p>
This is not new. NEB is quite old feature in SSAS. The new thing (at least for me)
is that NEB can also be used in Panorama formulas! For example, M1+M2 /*NONEMPTY_BEHAVIOR={M1,M2}*/
will apply M1 &amp; M2 as NEB. You can see more Panorama optimization methods <a href="http://tech.panorama.com/index.php/category-table/367-a">here</a>.
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=d5f658b0-f87f-4975-ad06-f878d99b6301" />
      </body>
      <title>Non Empty Behavior in Panorama</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,d5f658b0-f87f-4975-ad06-f878d99b6301.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,d5f658b0-f87f-4975-ad06-f878d99b6301.aspx</link>
      <pubDate>Wed, 03 Mar 2010 17:01:11 GMT</pubDate>
      <description>&lt;p&gt;
Non Empty Behavior is a very good optimization method you can use with your calculated
measures. It allows you to define a list of measures that their emptiness defines
the emptiness of your calculated measure. To understand this, look at the picture
(taken from the &lt;a href="http://msdn.microsoft.com/en-us/library/ms166568.aspx"&gt;MSDN&lt;/a&gt;):
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.miky-schreiber.com/Blog/content/binary/NonEmptyBehavior.gif" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
This is the calculation expressions pane from the Calculations tab in the cube designer.
From MSDN:
&lt;/p&gt;
&lt;p&gt;
"&lt;span class=Apple-style-span style="WORD-SPACING: 0px; FONT: 16px 'Times New Roman'; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;&lt;span class=Apple-style-span style="FONT-SIZE: 11px; LINE-HEIGHT: 15px; FONT-FAMILY: Verdana"&gt;The
measures you specify in the&lt;span class=Apple-converted-space&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;Non-empty
behavior&lt;/strong&gt;&lt;span class=Apple-converted-space&gt;&amp;nbsp;&lt;/span&gt;list are used to resolve
NON EMPTY queries in MDX. When you specify one or more measures in the&lt;span class=Apple-converted-space&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;Non-empty
behavior&lt;/strong&gt;&lt;span class=Apple-converted-space&gt;&amp;nbsp;&lt;/span&gt;list, Analysis Services
treats the calculated member as empty if all the specified measures are empty. If
the&lt;span class=Apple-converted-space&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;Non-empty behavior&lt;/strong&gt;&lt;span class=Apple-converted-space&gt;&amp;nbsp;&lt;/span&gt;property
is blank, Analysis Services must evaluate the calculated member itself to determine
whether the member is empty.&lt;/span&gt;&lt;/span&gt;"
&lt;/p&gt;
&lt;p&gt;
This is not new. NEB is quite old feature in SSAS. The new thing (at least for me)
is that NEB can also be used in Panorama formulas! For example, M1+M2 /*NONEMPTY_BEHAVIOR={M1,M2}*/
will apply M1 &amp;amp; M2 as NEB. You can see more Panorama optimization methods &lt;a href="http://tech.panorama.com/index.php/category-table/367-a"&gt;here&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=d5f658b0-f87f-4975-ad06-f878d99b6301" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,d5f658b0-f87f-4975-ad06-f878d99b6301.aspx</comments>
      <category>BI;BI/MDX;BI/Panorama</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=6c28fd76-8c34-4ef0-8a42-ba2f267df8d3</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,6c28fd76-8c34-4ef0-8a42-ba2f267df8d3.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,6c28fd76-8c34-4ef0-8a42-ba2f267df8d3.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=6c28fd76-8c34-4ef0-8a42-ba2f267df8d3</wfw:commentRss>
      <title>History Browsing in OLAP and LastNonEmptyLeaf</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,6c28fd76-8c34-4ef0-8a42-ba2f267df8d3.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,6c28fd76-8c34-4ef0-8a42-ba2f267df8d3.aspx</link>
      <pubDate>Wed, 03 Mar 2010 12:34:48 GMT</pubDate>
      <description>&lt;img style="MARGIN: 0px 1em 1em" height="50%" src="http://www.miky-schreiber.com/Blog/content/binary/time.jpg" width="25%" align=left&gt; One
of the basic requirements of a modern BI system or Data Warehouse is to be non-volatile,
meaning that the DWH will save the history. In this post I'll explain how to implement
it in the DWH while assuming that the history can be changed and (the more interesting
part) how to implement it in Analysis Services.&lt;br&gt;
&lt;p&gt;
Before starting with history saving in the DWH,&amp;nbsp;I need to say that this has nothing
to do with Slowly Changing Dimensions. You can work with Type 1, 2 or 3. All you need
to take care of is that the fact table will be consistent with the dimension tables.
Assuming that the history can change (this is&amp;nbsp;the scenario&amp;nbsp;in my organization),
we need to extract all the fact data every time. If you work with staging level/environment/layer
you can use it to calculate which records has been changed or&amp;nbsp;inserted&amp;nbsp;and
only upsert them&amp;nbsp;to the DWH itself (it's more secure). In our case, we'll work
without such staging level so we need to load all the fact data in every load to the
DWH.
&lt;/p&gt;
&lt;p&gt;
Loading&amp;nbsp;the fact&amp;nbsp;in the ETL is very simple - we'll&amp;nbsp;save the&amp;nbsp;datetime
of the execution start, round it&amp;nbsp;and put it in every&amp;nbsp;row in the fact table.
We can call this field&amp;nbsp;CreateTime. You probably ask yourself why we need to round
it. The answer is that we don't want the time dimension to have every possible value
of datetime. It's huge and the users don't need that kind of accuracy. That's why
I round it in my projects to half-hour, meaning that 14:27 becomes 14:00 and 14:50
becomes 14:30. Let's look at an example of such fact table:
&lt;/p&gt;
&lt;p&gt;
&lt;table style="WIDTH: 389pt; BORDER-COLLAPSE: collapse" cellspacing=0 cellpadding=0 width=518 border=0 x:str&gt;
&lt;colgroup&gt;
&lt;col style="WIDTH: 50pt; mso-width-source: userset; mso-: 2450" width=67&gt;
&lt;col style="WIDTH: 63pt; mso-width-source: userset; mso-: 3072" span=2 width=84&gt;
&lt;col style="WIDTH: 53pt; mso-width-source: userset; mso-: 2560" span=2 width=70&gt;
&lt;col style="WIDTH: 107pt; mso-width-source: userset; mso: 5229" width=143&gt;
&lt;tbody&gt;
&lt;tr style="HEIGHT: 12.75pt" height=17&gt;
&lt;td class=xl22 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 50pt; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12.75pt; BACKGROUND-: transparent" width=67 height=17&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;&lt;strong&gt;&lt;em&gt;&lt;u&gt;RowNum&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl22 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext 0.5pt solid; BORDER-LEFT: windowtext; WIDTH: 63pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width=84&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;&lt;strong&gt;&lt;em&gt;&lt;u&gt;Dimension1&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/font&gt; 
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl22 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext 0.5pt solid; BORDER-LEFT: windowtext; WIDTH: 63pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width=84&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;&lt;strong&gt;&lt;em&gt;&lt;u&gt;Dimension2&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/font&gt; 
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl22 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext 0.5pt solid; BORDER-LEFT: windowtext; WIDTH: 53pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width=70&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;&lt;strong&gt;&lt;em&gt;&lt;u&gt;Measure1&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/font&gt; P&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl22 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext 0.5pt solid; BORDER-LEFT: windowtext; WIDTH: 53pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width=70&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;&lt;strong&gt;&lt;em&gt;&lt;u&gt;Measure2&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/font&gt; P&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl23 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext 0.5pt solid; BORDER-LEFT: windowtext; WIDTH: 107pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width=143&gt;
&lt;p align=center&gt;
&lt;strong&gt;&lt;em&gt;&lt;u&gt;&lt;font face=Arial color=#000000 size=2&gt;CreateTime&lt;/font&gt;&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 12.75pt" height=17&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 0.5pt solid; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12.75pt; BACKGROUND-COLOR: transparent" height=17 x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;1&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;X&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;A&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;4&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;20&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl25 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;03/03/2010 15:00&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 12.75pt" height=17&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 0.5pt solid; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12.75pt; BACKGROUND-COLOR: transparent" height=17 x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;2&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;X&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;B&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;56&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl26 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;strong&gt;&lt;font face=Arial color=#000000 size=2&gt;19&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl25 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;03/03/2010 15:00&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 12.75pt" height=17&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 0.5pt solid; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12.75pt; BACKGROUND-COLOR: transparent" height=17 x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;3&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;Y&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;B&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;2&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;3&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl25 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;03/03/2010 15:00&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 12.75pt" height=17&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 0.5pt solid; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12.75pt; BACKGROUND-COLOR: transparent" height=17 x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;4&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;Y&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;B&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl26 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;strong&gt;&lt;font face=Arial color=#000000 size=2&gt;1&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;10&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl25 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;03/03/2010 15:00&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 12.75pt" height=17&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 0.5pt solid; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12.75pt; BACKGROUND-COLOR: transparent" height=17 x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;5&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;Y&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;C&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;7&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;5&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl25 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;03/03/2010 15:00&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 12.75pt" height=17&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 0.5pt solid; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12.75pt; BACKGROUND-COLOR: transparent" height=17 x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;6&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;X&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;A&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;4&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;20&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl25 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;03/03/2010 15:30&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 12.75pt" height=17&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 0.5pt solid; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12.75pt; BACKGROUND-COLOR: transparent" height=17 x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;7&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;X&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;B&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;56&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl26 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;strong&gt;&lt;font face=Arial color=#000000 size=2&gt;40&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl25 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;03/03/2010 15:30&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 12.75pt" height=17&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 0.5pt solid; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12.75pt; BACKGROUND-COLOR: transparent" height=17 x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;8&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;Y&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;B&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;2&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;3&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl25 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;03/03/2010 15:30&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 12.75pt" height=17&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 0.5pt solid; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12.75pt; BACKGROUND-COLOR: transparent" height=17 x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;9&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;Y&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;B&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl26 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;strong&gt;&lt;font face=Arial color=#000000 size=2&gt;10&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;10&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl25 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;03/03/2010 15:30&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 12.75pt" height=17&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 0.5pt solid; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12.75pt; BACKGROUND-COLOR: transparent" height=17 x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;10&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;Y&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;C&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;7&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;5&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl25 style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;03/03/2010 15:30&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;
Here we can see two executions of the ETL: The first between 15:00 and 15:00, the
second between 15:31 and 15:59. Note the differences in rows 2 vs. 7 and 4 vs. 9.
This means that the source table(s) has changed between the executions.
&lt;/p&gt;
&lt;p&gt;
In the DWH, we create foreign keys from Dimension1 and Dimension2 to their dimension
tables. We'll also create FK between CreateTime and the time dimension. I won't get
into the time dimension design here, you can read about it&amp;nbsp;a &lt;a href="http://www.miky-schreiber.com/Blog/PermaLink,guid,73f9d050-05bd-4dc9-b719-ae9d256557b3.aspx"&gt;past
post&lt;/a&gt;. I assume that the time dimension has the hierarchy Year -&amp;gt; Month -&amp;gt;
Day -&amp;gt; Hour -&amp;gt; Half-Hour. It seems that now we have a good fact table for use
in Reporting Services (or any other reporting tool). Create a parameter called Extraction
Time/ETL Time and assign it values from distinct on CreateTime. The user can pick
a date and the report will filter on this date. Perfect.
&lt;/p&gt;
&lt;p&gt;
The problematic part starts in Analysis Services. &lt;strong&gt;Only one extraction time
can be the current member. There is no sense in summing or aggregating more than one
extraction time.&lt;/strong&gt; There are two ways to deal with it:
&lt;/p&gt;
&lt;u&gt;The wrong way&lt;/u&gt; - I'm writing&amp;nbsp;this down so you'll learn from this &lt;em&gt;design
mistake&lt;/em&gt;. We created a calculated member which takes the last extraction time: 
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Create Member CurrentCube.[Extraction Time]. [Calendar].[All].[Last Data Time]&lt;br&gt;
AS&lt;br&gt;
Tail ([Extraction Time].[Calendar].[HALF HOUR].Members,1).Item(0),&lt;br&gt;
Visible = 1; 
&lt;p&gt;
In every Panorama view, we sliced the Extraction time on the [Last Data Time] member,
which will show the user the data of the last ETL run. Our basic assumption was that
the user wants to see the current data and when he'll want to see the historical data
he will pick another member from the Extraction time dimension. This is the point
we missed and it soon&amp;nbsp; enough bumped into our face. 
&lt;p&gt;
We forgot that every system, even BI system which is built for analysts should be
intuitive and idiot-proof. The users picked members from the day level in the Extraction
time dimension. When we asked them why they did it they said that "we wanted to see
the data from 03/03/2010 and suddenly the numbers got bigger!". That happened, of
course, because the member 03/03/2010 is the sum of 03/03/2010 15:00 and 03/03/2010
15:30. The solution is that no matter which member the user picks in the Extraction
time dimension, he should see only one leaf (half-hour level) member at a time. This
takes us to 
&lt;p&gt;
&lt;u&gt;The right way&lt;/u&gt; - We set the [Last Data Time] member to be visible = 0 (I kept
it for debug purposes) and I written MDX script which I call NonLastEmptyLeaf. This
script makes sure that&amp;nbsp;no matter which member in the Extraction time hierarchy
will be picked, the user will be sliced only on the last non empty leaf. For example,
if the user picks 03/03/2010 he will see the data of 03/03/2010 15:30. This is what
will happen also when he'll slice on 03/2010, 2010 and even the [All] member. This
is the MDX script:&lt;br&gt;
&lt;br&gt;
Freeze([Extraction time].[Calendar].[All]);&lt;br&gt;
Scope(&lt;br&gt;
&amp;nbsp; Descendants (&lt;br&gt;
&amp;nbsp;&amp;nbsp; [Extraction time].[Calendar]. [All],&lt;br&gt;
&amp;nbsp;&amp;nbsp; 0,&lt;br&gt;
&amp;nbsp;&amp;nbsp; SELF_AND_AFTER&lt;br&gt;
&amp;nbsp; )&lt;br&gt;
);&lt;br&gt;
&amp;nbsp; this = Tail (&lt;br&gt;
&amp;nbsp;&amp;nbsp; Filter(&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Descendants(&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Extraction time]. [Calendar].CurrentMember,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Extraction time].[Calendar].[HALF HOUR],&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LEAVES&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ),&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; [Measures].CurrentMember &amp;gt; 0&lt;br&gt;
&amp;nbsp;&amp;nbsp; ) 
&lt;br&gt;
&amp;nbsp; ).Item(0);&lt;br&gt;
End Scope;
&lt;/p&gt;
&lt;p&gt;
Now, there is no meaning of [Last Data Time] member because slicing on the [All] member
will show the current data, meaning that no slicing at all will show the current data
because [All] is the default member.
&lt;/p&gt;
&lt;p&gt;
To conclude,&amp;nbsp;history browsing can be dangerous if we let the users the option
to slice on more than one data time. The open question that I have is how can I prevent
the user from picking more than one member in this hierarchy in Panorama views? Should
I even try to do that or should I count on his minimal common sense?
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=6c28fd76-8c34-4ef0-8a42-ba2f267df8d3" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,6c28fd76-8c34-4ef0-8a42-ba2f267df8d3.aspx</comments>
      <category>BI;BI/DataWarehousing;BI/MDX;BI/SQL Server 2005;BI/SQL Server 2005/Analysis Services;BI/SQL Server 2008;BI/SQL Server 2008/Analysis Services</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=51a6ed33-2855-4d28-af43-6af5d6c8ecd6</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,51a6ed33-2855-4d28-af43-6af5d6c8ecd6.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,51a6ed33-2855-4d28-af43-6af5d6c8ecd6.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=51a6ed33-2855-4d28-af43-6af5d6c8ecd6</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <title>Text in OLAP Measures</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,51a6ed33-2855-4d28-af43-6af5d6c8ecd6.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,51a6ed33-2855-4d28-af43-6af5d6c8ecd6.aspx</link>
      <pubDate>Sun, 14 Feb 2010 12:49:00 GMT</pubDate>
      <description>&lt;p&gt;
I knew for a long time that measures can have text and not only numbers, but last
week I had a scenario where it was the perfect solution for my problem.
&lt;/p&gt;
&lt;p&gt;
Let's say that I work in number of jobs. In every job I got some tasks that I need
to do. The fact table looks like this:
&lt;/p&gt;
&lt;p&gt;
&lt;table style="WIDTH: 319pt; BORDER-COLLAPSE: collapse" cellspacing=0 cellpadding=0 width=425 border=0 x:str&gt;
&lt;colgroup&gt;
&lt;col style="WIDTH: 74pt; mso-width-source: userset; mso-width-alt: 3620" width=99&gt;
&lt;col style="WIDTH: 89pt; mso-width-source: userset; mso-width-alt: 4315" width=118&gt;
&lt;col style="WIDTH: 74pt; mso-width-source: userset; mso-width-alt: 3620" width=99&gt;
&lt;col style="WIDTH: 82pt; mso-width-source: userset; mso-width-alt: 3986" width=109&gt;
&lt;tbody&gt;
&lt;tr style="HEIGHT: 12.75pt" height=17&gt;
&lt;td class=xl24 style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; WIDTH: 74pt; BORDER-BOTTOM: #ece9d8; HEIGHT: 12.75pt; BACKGROUND-COLOR: transparent" width=99 height=17&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;&lt;strong&gt;&lt;em&gt;&lt;u&gt;Job&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; WIDTH: 89pt; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent" width=118&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;&lt;strong&gt;&lt;em&gt;&lt;u&gt;Task&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; WIDTH: 74pt; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent" width=99&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;&lt;strong&gt;&lt;em&gt;&lt;u&gt;Tasks To Do&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl24 style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; WIDTH: 82pt; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent" width=109&gt;
&lt;p align=center&gt;
&lt;strong&gt;&lt;em&gt;&lt;u&gt;&lt;font face=Arial color=#000000 size=2&gt;Tasks Completed&lt;/font&gt;&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 12.75pt" height=17&gt;
&lt;td class=xl25 style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; HEIGHT: 12.75pt; BACKGROUND-COLOR: transparent" height=17&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;Developer&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl25 style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;Develop BI System&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl25 style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;1&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl25 style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;1&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 12.75pt" height=17&gt;
&lt;td class=xl25 style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; HEIGHT: 12.75pt; BACKGROUND-COLOR: transparent" height=17&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;Developer&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl25 style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;Help Friends&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl25 style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;1&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl25 style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;0&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 12.75pt" height=17&gt;
&lt;td class=xl25 style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; HEIGHT: 12.75pt; BACKGROUND-COLOR: transparent" height=17&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;Manager&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl25 style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;Manage&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl25 style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;1&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl25 style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;1&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="HEIGHT: 12.75pt" height=17&gt;
&lt;td class=xl25 style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; HEIGHT: 12.75pt; BACKGROUND-COLOR: transparent" height=17&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;Therapist&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl25 style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent"&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;&lt;/font&gt;&amp;nbsp;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl25 style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;0&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td class=xl25 style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent" x:num&gt;
&lt;p align=center&gt;
&lt;font face=Arial color=#000000 size=2&gt;0&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;
Summarizing the "Tasks To Do" column will get the total tasks that I need to do. Summarizing
the "Tasks Completed" column will get the tasks that I did. Note that in the Therapist
job I didn't get any tasks.&lt;br&gt;
In the OLAP cube, I created a calculated measure which is the percent of the completed
tasks (for every job or for any other dimension). The&amp;nbsp;problem is: What is the
answer in case that there are no any tasks to do? Some will say 0% and some will say
100%. That's why a text measure such as "There are no tasks" can be a perfect solution
for this kind of problem. This is the calculation of the calculated measure:
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
Create Member CurrentCube.[Measures].[Completed Percentage] as&lt;br&gt;
IIF(IsEmpty([Measures].[Tasks To Do]),&lt;br&gt;
&amp;nbsp;&amp;nbsp;null,&lt;br&gt;
&amp;nbsp;&amp;nbsp;IIF([Measures].[Tasks To Do] = 0),&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'There are no tasks',&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Measures].[Completed Tasks] / [Measures].[Tasks To Do]&lt;br&gt;
&amp;nbsp;&amp;nbsp;)&lt;br&gt;
)&lt;br&gt;
This scenario can happen in many cubes. Tell me if you have any other solution for
this kind of problem.
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&lt;u&gt;Update:&lt;/u&gt;&lt;/em&gt; Read the important comments below.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=51a6ed33-2855-4d28-af43-6af5d6c8ecd6" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,51a6ed33-2855-4d28-af43-6af5d6c8ecd6.aspx</comments>
      <category>BI;BI/MDX;BI/SQL Server 2005;BI/SQL Server 2005/Analysis Services;BI/SQL Server 2008;BI/SQL Server 2008/Analysis Services</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=dd64d937-e0d6-4bf5-8c44-63213719282f</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,dd64d937-e0d6-4bf5-8c44-63213719282f.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,dd64d937-e0d6-4bf5-8c44-63213719282f.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=dd64d937-e0d6-4bf5-8c44-63213719282f</wfw:commentRss>
      <slash:comments>5</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">This is a basic post which I'll assume
you know in the posts to come. 
<br />
Basically, There are two ways of adding JS into the OBIEE dashboard: 
<p><u>If the script is for one page only</u> - Enter the dashboard editor and edit
your page. Add a new Text object from the bar on the left. It doesn't matter where
you add it in the page. Click on its Properties button and write your script in the
text box. Don't forget to start it with &lt;script&gt; and end it with &lt;/script&gt;.
Check the "Contains HTML Markup" box. There is no need to hide this object because
it doesn't contain anything visual. Rename the text object and give it a <em>descriptive
name</em>.
</p><p><u>If the script is common to more than one page or <em><strong>may be</strong> <strong>in
the future</strong></em></u> - Create a new request which contains only one column.
It can be any column from any table, but I recommend you to use a column which doesn't
have many rows (you can use a small dimension if you have one). Click on the Results
tab and enter the Narrative view. Write your script in the Narrative text box. Like
before, don't forget to start it with &lt;script&gt; and end it with &lt;/script&gt;.
Check the "Contains HTML Markup" box and enter zero in the "Rows to display" text
box. You can save your request now. Every dashboard page that contains this request
will run the JS you just written.
</p><p><u>How to develop <strong><em>correctly</em></strong> with JS in OBIEE</u><br />
Don't enter bunch of code in the request. It'll only get you messy once the length
of the code will grow. Your code inside the dashboard should only call functions.
For example, it can look like this:<br />
&lt;script&gt;<br />
if (myFunction)<br />
{<br />
  myFunction();<br />
}<br />
if (mySecondFunction)<br />
{<br />
  mySecondFunction();<br />
}<br />
&lt;/script&gt;
</p><p>
You will write and maintain these functions in external JS file. Take the common.js
file (search it under the OBIEE dir <strong><em>in the server</em></strong>) which
is called in every page in OBIEE dashboards <em>(<strong>don't forget to backup first!!</strong>)</em> and
add your code in the bottom of the file. Now you have a convenient place where
you can edit your JS code. There is one last thing you need to know before proceeding
- the browser caches the JS files so you'll need to clear the browser's cache every
time you change your code. In Internet Explorer, you can do it in Tools -&gt;
Internet Options -&gt; Delete Files -&gt; Delete all offline content. You'll do it a
lot while developing, so having a button that does that will be great. You can use
Microsoft's <a href="http://www.microsoft.com/downloads/details.aspx?familyid=e59c3964-672d-4511-bb3e-2d5e1db91038&amp;displaylang=en">IE
developer toolbar</a> or another developer toolbar.
</p><p>
Now we can apply new features to OBIEE.
</p><img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=dd64d937-e0d6-4bf5-8c44-63213719282f" /></body>
      <title>How to add JavaScript in OBIEE Dashboards</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,dd64d937-e0d6-4bf5-8c44-63213719282f.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,dd64d937-e0d6-4bf5-8c44-63213719282f.aspx</link>
      <pubDate>Tue, 19 Jan 2010 14:46:07 GMT</pubDate>
      <description>This is a basic post which I'll assume you know in the posts to come. &lt;br&gt;
Basically, There are two ways of adding JS into the OBIEE dashboard: 
&lt;p&gt;
&lt;u&gt;If the script is for one page only&lt;/u&gt;&amp;nbsp;- Enter the dashboard editor and edit
your page. Add a new Text object from the bar on the left. It doesn't matter where
you add it in the page. Click on its Properties button and write your script in the
text box. Don't forget to start it with &amp;lt;script&amp;gt; and end it with &amp;lt;/script&amp;gt;.
Check the "Contains HTML Markup" box. There is no need to hide this object because
it doesn't contain anything visual. Rename the text object and give it a &lt;em&gt;descriptive
name&lt;/em&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;If the script is common to more than one page or&amp;nbsp;&lt;em&gt;&lt;strong&gt;may be&lt;/strong&gt;&amp;nbsp;&lt;strong&gt;in
the future&lt;/strong&gt;&lt;/em&gt;&lt;/u&gt; - Create a new request which contains only one column.
It can be any column from any table, but I recommend you to use a column which doesn't
have many rows (you can use a small dimension if you have one). Click on the Results
tab and enter the Narrative view. Write your script in the Narrative text box. Like
before, don't forget to start it with &amp;lt;script&amp;gt; and end it with &amp;lt;/script&amp;gt;.
Check the "Contains HTML Markup" box and enter zero in the "Rows to display" text
box. You can save your request now. Every dashboard page that contains this request
will run the JS you just written.
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;How to&amp;nbsp;develop &lt;strong&gt;&lt;em&gt;correctly&lt;/em&gt;&lt;/strong&gt; with JS in OBIEE&lt;/u&gt;
&lt;br&gt;
Don't enter bunch of code in the request. It'll only get you messy once the length
of the code will grow.&amp;nbsp;Your code inside the dashboard should only call functions.
For example, it can look like this:&lt;br&gt;
&amp;lt;script&amp;gt;&lt;br&gt;
if (myFunction)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;myFunction();&lt;br&gt;
}&lt;br&gt;
if (mySecondFunction)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;mySecondFunction();&lt;br&gt;
}&lt;br&gt;
&amp;lt;/script&amp;gt;
&lt;/p&gt;
&lt;p&gt;
You will write and maintain these functions in external JS file. Take the common.js
file (search it under the OBIEE dir &lt;strong&gt;&lt;em&gt;in the server&lt;/em&gt;&lt;/strong&gt;)&amp;nbsp;which
is called in every page in OBIEE dashboards &lt;em&gt;(&lt;strong&gt;don't forget to backup first!!&lt;/strong&gt;)&lt;/em&gt; and
add your&amp;nbsp;code in the bottom of the file. Now you have a convenient place where
you can edit your JS code. There is one last thing you need to know before proceeding
- the browser caches the JS files so you'll need to clear the browser's cache every
time you&amp;nbsp;change your code. In Internet Explorer, you can do it in Tools -&amp;gt;
Internet Options -&amp;gt; Delete Files -&amp;gt; Delete all offline content. You'll do it&amp;nbsp;a
lot while developing, so having a button that does that will be great. You can use
Microsoft's &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=e59c3964-672d-4511-bb3e-2d5e1db91038&amp;amp;displaylang=en"&gt;IE
developer toolbar&lt;/a&gt;&amp;nbsp;or another developer toolbar.
&lt;/p&gt;
&lt;p&gt;
Now we can&amp;nbsp;apply&amp;nbsp;new features to&amp;nbsp;OBIEE.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=dd64d937-e0d6-4bf5-8c44-63213719282f" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,dd64d937-e0d6-4bf5-8c44-63213719282f.aspx</comments>
      <category>BI;BI/Oracle;BI/Oracle/OBIEE</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=c924d9dd-d74a-42cf-ab0f-34b58e6d5404</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,c924d9dd-d74a-42cf-ab0f-34b58e6d5404.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,c924d9dd-d74a-42cf-ab0f-34b58e6d5404.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=c924d9dd-d74a-42cf-ab0f-34b58e6d5404</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This tip can save you a lot of time because when you don't follow it or you're not
aware of it, finding the bug will take you a lot of time.
</p>
        <p>
When you build your workflow or worklet in Informatica, you usually define dependencies
between the tasks, meaning that task A will start only after task B finishes. You
do it using the "Link Tasks" button in the toolbar. The issue is when you define for
example that task C will run only after both task A and task B will finish.
In that case, linking the tasks is not enough. You need to edit task C and choose
"AND" in the "Treat the input links as" box. The default is "OR", meaning that the
task will run when either task A or task B finishes. This can cause you a lot of trouble
if task C is using data from task A and B (otherwise, why there's dependency between
them?).
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=c924d9dd-d74a-42cf-ab0f-34b58e6d5404" />
      </body>
      <title>Tasks Dependency in Informatica</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,c924d9dd-d74a-42cf-ab0f-34b58e6d5404.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,c924d9dd-d74a-42cf-ab0f-34b58e6d5404.aspx</link>
      <pubDate>Tue, 19 Jan 2010 14:40:13 GMT</pubDate>
      <description>&lt;p&gt;
This tip can save you a lot of time because when you don't follow it or you're not
aware of it, finding the bug will take you a lot of time.
&lt;/p&gt;
&lt;p&gt;
When you build your workflow or worklet in Informatica, you usually define dependencies
between the tasks, meaning that task A will start only after task B finishes. You
do it using the "Link Tasks" button in the toolbar. The issue is when you define for
example that task C will run only after both&amp;nbsp;task A and task B&amp;nbsp;will finish.
In that case, linking the tasks is not enough. You need to edit task C and choose
"AND" in the "Treat the input links as" box. The default is "OR", meaning that the
task will run when either task A or task B finishes. This can cause you a lot of trouble
if task C is using data from task A and B (otherwise, why there's dependency between
them?).
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=c924d9dd-d74a-42cf-ab0f-34b58e6d5404" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,c924d9dd-d74a-42cf-ab0f-34b58e6d5404.aspx</comments>
      <category>BI;BI/Informatica</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=266091f0-2c95-4d68-9b01-e30d5a305bf0</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,266091f0-2c95-4d68-9b01-e30d5a305bf0.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,266091f0-2c95-4d68-9b01-e30d5a305bf0.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=266091f0-2c95-4d68-9b01-e30d5a305bf0</wfw:commentRss>
      <slash:comments>5</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">While developing reports in OBIEE, I found
myself making the same action over and over again: Styling a column, clicking on "Copy
Cell Format", going through all other columns and pasting the format. A better way
to do this kind of actions in one shot is by changing the Request XML. Let's say you
applied style to the first column and you want to copy it to the other columns. This
is how you'll do this: 
<ol><li>
In the report editor, click on the Advanced tab. 
</li><li>
Copy the Request XML. 
</li><li>
You'll need to edit the xml in a text editor which supports macros. My favorite is <a href="http://notepad-plus.sourceforge.net/uk/site.htm">Notepad++</a>.
Paste the xml in the text editor. 
</li><li>
Now you'll have to learn by yourself how the XML is built. Don't worry, it's very
simple. Note that each column is a xml element called saw:column and the style is
stored in its child element called saw:displayFormat. 
</li><li>
Start recording the macro and copy the desired elements to the next column. After
that, stop the recording. Pay attention to where the keyboard cursor is before and
after the recording. 
</li><li>
Place the keyboard cursor in the desired place and run the macro several times as
much as the columns you need to update. The shortcut to do it in Notepad++ is Ctrl+Shift+P.</li><li>
Paste the xml back in the report: Go back to the page where you copied the xml
from, paste the new xml and click on "Set XML". That's it.</li></ol>
Learning the schema of the Request XML, you can do many other customizations
to your report in one click. You'll see another example in my future post about searching
all columns in one click. Thinking about this approach, you may find that it can help
you to make your work shorter and cleaner.<img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=266091f0-2c95-4d68-9b01-e30d5a305bf0" /></body>
      <title>Quick Copy of Column Properties in OBIEE</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,266091f0-2c95-4d68-9b01-e30d5a305bf0.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,266091f0-2c95-4d68-9b01-e30d5a305bf0.aspx</link>
      <pubDate>Wed, 06 Jan 2010 09:33:30 GMT</pubDate>
      <description>While developing reports in OBIEE, I found myself making the same action over and over again: Styling a column, clicking on "Copy Cell Format", going through all other columns and pasting the format. A better&amp;nbsp;way to do this kind of actions in one shot is by changing the Request XML. Let's say you applied style to the first column and you want to copy it to the other columns. This is how you'll do this: 
&lt;ol&gt;
&lt;li&gt;
In the report editor, click on the Advanced tab. 
&lt;li&gt;
Copy the Request XML. 
&lt;li&gt;
You'll need to edit the xml in a text editor which supports macros. My favorite is &lt;a href="http://notepad-plus.sourceforge.net/uk/site.htm"&gt;Notepad++&lt;/a&gt;.
Paste the xml in the text editor. 
&lt;li&gt;
Now you'll have to learn by yourself how the XML is built. Don't worry, it's very
simple. Note that each column is a xml element called saw:column and the style is
stored&amp;nbsp;in its child element called saw:displayFormat. 
&lt;li&gt;
Start recording the macro and copy the desired elements to the next column. After
that, stop the recording. Pay attention to where the keyboard cursor is before and
after the recording. 
&lt;li&gt;
Place the keyboard cursor in the desired place and run the macro several times as
much as the columns you need to update. The shortcut to do it in Notepad++ is Ctrl+Shift+P.&lt;/li&gt;
&lt;li&gt;
Paste the xml back in the report: Go back to the&amp;nbsp;page where you copied the xml
from, paste the new xml and click on "Set XML". That's it.&lt;/li&gt;
&lt;/ol&gt;
Learning the&amp;nbsp;schema of the&amp;nbsp;Request XML, you can do many other customizations
to your report in one click. You'll see another example in my future post about searching
all columns in one click. Thinking about this approach, you may find that it can help
you to make your work shorter and cleaner.&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=266091f0-2c95-4d68-9b01-e30d5a305bf0" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,266091f0-2c95-4d68-9b01-e30d5a305bf0.aspx</comments>
      <category>BI;BI/Oracle;BI/Oracle/OBIEE</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=e964552b-eb6e-449b-b2c6-42adea2376cd</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,e964552b-eb6e-449b-b2c6-42adea2376cd.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,e964552b-eb6e-449b-b2c6-42adea2376cd.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=e964552b-eb6e-449b-b2c6-42adea2376cd</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
One of the (many) missing features in OBIEE is record/row count. In this post I'll
show how to implement record count and show it below the table, or report in the OBIEE
dashboard. I know that you can find this in other blogs and forums, but I intend to
show more sophisticated methods in my next posts <em>that will be heavily based on
this</em>, so I recommend you to read it first.
</p>
        <ol>
          <li>
            <u>Create the record count column in your report</u>: click on any column in the sidebar
to add a new column in your report. Edit its formula using the fx button. In the formula
text area, enter Max(RCount(XXX || YYY)), where XXX and YYY are two fields which define
the key, or lowest granuality of the report. In other words: The combination of XXX
and YYY will not show more than once in the report. You can add more columns if you
need (column adding is made using the Column button in the "Edit Column Formula" window).
If the type of the column is not char, wrap the column with cast(XXX as char). 
</li>
          <li>
            <u>Check yourself</u>: Preview the report. The last column should contain the record
count. The value is the same in every row. If it's not working, go back and fix the
formula. 
</li>
          <li>
            <u>Hide the formula</u>: Click the "Column Properties" button in the column (the button
with the hand), go to the "Column Format" tab and check the Hide checkbox. Now, check
and remember the location of the column in the report. In other words, remember
if it's the fifth column or the tenth column, for example. 
</li>
          <li>
            <u>Create the narrative:</u> Click the Results tab and in the drop-down list choose
Narrative. In the prefix, enter: "Row Count:" or something like that, and in the narrative
itself, enter: &lt;div id="RecordCount"&gt;@XX&lt;/div&gt;, where XX is the location
of the new column we created. In rows to display, enter 1. Return to the compound
layout and look how the narrative below the table looks like. You can return
to the narrative and change its style if you don't like it. Just leave the RecordCount
div as it is. <em>We'll use it a lot in the upcoming posts</em>.</li>
        </ol>
        <p>
          <u>Problems with this implementation:</u>
          <br />
        </p>
        <ol>
          <li>
The count is made in the BI Server after all records are coming from the database.
If you'll check query time with and without the record count, you'll see
a big difference.</li>
          <li>
The record count is getting scrambled if the user sorts the table.</li>
        </ol>
        <p>
I'll post here any updates, if there will be any, about these problems.
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=e964552b-eb6e-449b-b2c6-42adea2376cd" />
      </body>
      <title>Record count in OBIEE</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,e964552b-eb6e-449b-b2c6-42adea2376cd.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,e964552b-eb6e-449b-b2c6-42adea2376cd.aspx</link>
      <pubDate>Mon, 04 Jan 2010 10:07:41 GMT</pubDate>
      <description>&lt;p&gt;
One of the (many) missing features in OBIEE is record/row count. In this post I'll
show how to implement record count and show it below the table, or report in the OBIEE
dashboard. I know that you can find this in other blogs and forums, but I intend to
show more sophisticated methods in my next posts &lt;em&gt;that will be heavily based on
this&lt;/em&gt;, so I recommend you to read it first.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;u&gt;Create the record count column in your report&lt;/u&gt;: click on any column in the sidebar
to add a new column in your report. Edit its formula using the fx button. In the formula
text area, enter Max(RCount(XXX || YYY)), where XXX and YYY are two fields which define
the key, or lowest granuality of the report. In other words: The combination of XXX
and YYY will not show more than once in the report. You can add more columns if you
need (column adding is made using the Column button in the "Edit Column Formula" window).
If the type of the column is not char, wrap the column with cast(XXX as char). 
&lt;li&gt;
&lt;u&gt;Check yourself&lt;/u&gt;: Preview the report. The last column should contain the record
count. The value is the same in every row. If it's not working, go back and fix the
formula. 
&lt;li&gt;
&lt;u&gt;Hide the formula&lt;/u&gt;: Click the "Column Properties" button in the column (the button
with the hand), go to the "Column Format" tab and check the Hide checkbox. Now, check
and remember&amp;nbsp;the location of the column in the report. In other words, remember
if it's the fifth column or&amp;nbsp;the tenth column, for example. 
&lt;li&gt;
&lt;u&gt;Create the narrative:&lt;/u&gt; Click the Results tab and in the drop-down list choose
Narrative. In the prefix, enter: "Row Count:" or something like that, and in the narrative
itself, enter: &amp;lt;div id="RecordCount"&amp;gt;@XX&amp;lt;/div&amp;gt;, where XX is the location
of the new column we created. In rows to display, enter 1. Return to the compound
layout and look how the narrative below the&amp;nbsp;table looks like. You can return
to the narrative and change its style if you don't like it. Just leave the RecordCount
div as it is. &lt;em&gt;We'll use it a lot in the upcoming posts&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&lt;u&gt;Problems with this implementation:&lt;/u&gt;
&lt;br&gt;
&lt;ol&gt;
&lt;li&gt;
The count is made in the BI Server after all records are coming from the database.
If you'll check&amp;nbsp;query time&amp;nbsp;with and without the record count, you'll see
a big difference.&lt;/li&gt;
&lt;li&gt;
The record count is getting scrambled if the user sorts the table.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
I'll post here any updates, if there&amp;nbsp;will be any,&amp;nbsp;about these problems.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=e964552b-eb6e-449b-b2c6-42adea2376cd" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,e964552b-eb6e-449b-b2c6-42adea2376cd.aspx</comments>
      <category>BI;BI/Oracle;BI/Oracle/OBIEE</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=fd39d7a9-4217-449b-ae66-f0a582eed50a</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,fd39d7a9-4217-449b-ae66-f0a582eed50a.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,fd39d7a9-4217-449b-ae66-f0a582eed50a.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=fd39d7a9-4217-449b-ae66-f0a582eed50a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
For documentation purposes: When you get "Unexpected error occured: Error in Application"
error in SSAS while trying to view the cube's calculations tab, you'll need to close
BIDS and <a href="http://www.bronios.com/index.php/2007/06/13/unexpected-error-occured-viewing-calculations-tab-for-ssas-project">do
some file copy tasks</a>.
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=fd39d7a9-4217-449b-ae66-f0a582eed50a" />
      </body>
      <title>Unexpected Error when viewing Calculations in SSAS</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,fd39d7a9-4217-449b-ae66-f0a582eed50a.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,fd39d7a9-4217-449b-ae66-f0a582eed50a.aspx</link>
      <pubDate>Mon, 04 Jan 2010 09:22:08 GMT</pubDate>
      <description>&lt;p&gt;
For documentation purposes: When you get "Unexpected error occured: Error in Application"
error in SSAS while trying to view the cube's calculations tab, you'll need to close
BIDS and &lt;a href="http://www.bronios.com/index.php/2007/06/13/unexpected-error-occured-viewing-calculations-tab-for-ssas-project"&gt;do
some file copy tasks&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=fd39d7a9-4217-449b-ae66-f0a582eed50a" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,fd39d7a9-4217-449b-ae66-f0a582eed50a.aspx</comments>
      <category>BI;BI/SQL Server 2005;BI/SQL Server 2005/Analysis Services</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=01f28f1d-5798-4155-8ba8-83e1d158a4ed</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,01f28f1d-5798-4155-8ba8-83e1d158a4ed.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,01f28f1d-5798-4155-8ba8-83e1d158a4ed.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=01f28f1d-5798-4155-8ba8-83e1d158a4ed</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
It's been a while since I last posted here. It's because it was the end of the year
with annoying deadline and a new reporting tool we needed to learn - OBIEE. We learned
a lot about it and even extended it, so the next posts will be about that. I'll start
with a collection of tips &amp; tricks we collected over the development process. Some
tips will be helpful only to newbies, where the others will be also relevant to experienced
developers. I divided it to two sections: The administration program and
the webby part. Have fun.
</p>
        <p>
          <u>The Administration program</u>
        </p>
        <ul>
          <li>
There is no way to auto arrange to ERDs of the physical and the Business model (aka
logical) layers. The best approach to make things more simple is to finish the tables
import in the physical layer and arrange it by yourself: choose to show all tables,
zoom to 50% and move the tables so it will create a nice and clear star schema. after
that, just print it out and sent it to your co-developers. 
</li>
          <li>
Naming standards are, as always, very helpful, especially when working as a team.
A foreign-key column (non measure) name should end the same for all columns
in the project. Measure field name should end with _sum, _count, etc. 
</li>
          <li>
In order to develop in the administration program, the developer should be defined
as administrator... 
</li>
          <li>
The "check out objects" dialog box will get annoying after few hours of development.
To get rid of it, go to Tools -&gt; Options -&gt; General, and select "check out objects
automatically". Pay attention to what you do from now on, because even viewing
a table's properties will check it out. 
</li>
          <li>
You can always convert a table to a view in the physical layer. Right click on it,
properties, and choose "Select" in the table type. Then, write the SQL query. 
</li>
          <li>
When working online against the repository and making an action against the DB (such
as row count or view data), the connection to the DB is made using the BI server's
data source. Only when working in offline mode the DB connection is made using the
local ODBC. 
</li>
          <li>
When dragging a physical table into the logical layer it won't save the tables relationships.
Only when dragging a number of tables into the logical layer the relationships will
also be imported. 
</li>
          <li>
Circular relationships between the tables are not permitted in the logical layer
but permitted in the physical layer. 
</li>
          <li>
Always use complex join in the logical layer. The BI Server supposes to understand
in which physical relationship to use. Change it only when it doesn't. 
</li>
          <li>
When defining one-to-many join in the ERD you drag the line from the single to the
many table. 
</li>
          <li>
In a dimension with a hierarchy (not flat one), the lowest level should contain the
table's key column. Every column which won't be associated to a level will be automatically
associated to the lowest level. 
</li>
          <li>
In 90% of the cases, all the measures will have sum as aggregation rule. You can define
it in a single shot by selecting all the measure columns, right click on them and
choose "Set aggregation". 
</li>
          <li>
The best practice is to build a dimension over any dimension-table, even if it's a
flat hierarchy. Also, you should connect each fact table to its levels in the dimensions.
You enter into the fact's source's properties and in the content tab you select the
logical level for every dimension which is connected to the fact table. 
</li>
          <li>
You can quickly build a dimension by right-clicking the dimension-table and choose
"Create dimension". It won't always be good enough, but it's not so bad.</li>
        </ul>
        <p>
          <u>The Webby part (Answers &amp; Dashboard)</u>
        </p>
        <ul>
          <li>
The error "Incorrectly defined logical table source (for fact table XXX) does not
contain mapping for YYY" means that the BI Server cannot reach from table XXX to table
YYY. It can happen because of two reasons: The first one is that there are no relationships
defined in the logical or the physical layers (or maybe both). Note that the connections
can be indirect. The second one is that the relationships doesn't makes sense.
For example, going from a fact table to a dimension table through many-to-many table
cannot happen. You'll see this error many times as a beginner and it can be quite
frustrating at first. You need to understand that the BI Server can only understand
simple and classic star schemas. More complex ERDs need to be split by using alias
tables. 
</li>
          <li>
While developing a complex report (answer, request, you name it) with many columns,
save it from time to time. Don't forget that you're working with a webby application.
Closing the window won't save your work and won't alert you if you didn't. 
</li>
          <li>
After styling a column in the report, you can copy the style to other columns. In
the styling window there's a "copy format" button. You can click on paste in the other
columns' style windows. 
</li>
          <li>
In order to make a customized report, you can use the Narrative view. To insert a
column's value, use @ and the column's location. For example, @2 is the placeholder
for the second column. You can also apply javascript in the narrative to make dynamic
columns and effects. 
</li>
          <li>
When you add a column in a fact-based report, bring it from the dimension table and
not from the fact table. This will help you when you'll make navigation from
this report to the dimension-based report. 
</li>
          <li>
The last button (<img src="http://www.miky-schreiber.com/Blog/content/binary/siebel_tapedeck_all.GIF" border="0" />)
in the navigation toolbar won't go to the last page as expected but will bring all
the rows. In a case of a big table, this operation will take a long time and will
make the browser freeze. 
</li>
          <li>
After a change in the RPD you need to update the answers site: Click on "Reload Server
Metadata" below to side bar. Then, Settings -&gt; Administrator -&gt; Manage Sessions
-&gt; Close all cursors.</li>
        </ul>
        <p>
This is definitely not the last post about OBIEE. The next posts will be much
more interesting and helpful. I promise!
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=01f28f1d-5798-4155-8ba8-83e1d158a4ed" />
      </body>
      <title>OBIEE tips &amp; tricks</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,01f28f1d-5798-4155-8ba8-83e1d158a4ed.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,01f28f1d-5798-4155-8ba8-83e1d158a4ed.aspx</link>
      <pubDate>Sun, 03 Jan 2010 13:54:45 GMT</pubDate>
      <description>&lt;p&gt;
It's been a while since I last posted here. It's because it was the end of the year
with annoying deadline and a new reporting tool we needed to learn - OBIEE. We learned
a lot about it and even extended it, so the next posts will be about that. I'll start
with a collection of tips &amp;amp; tricks we collected over the development process.&amp;nbsp;Some
tips will be helpful only to newbies, where the others will be also relevant&amp;nbsp;to&amp;nbsp;experienced
developers.&amp;nbsp;I divided it to&amp;nbsp;two sections: The administration program and
the webby part. Have fun.
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;The Administration program&lt;/u&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
There is no way to auto arrange to ERDs of the physical and the Business model (aka
logical) layers. The best approach to make things more simple is to finish the tables
import in the physical layer and&amp;nbsp;arrange it by yourself: choose to show all tables,
zoom to 50% and move the tables so it will create a nice and clear star schema. after
that, just print it out and sent it to your co-developers. 
&lt;li&gt;
Naming standards are, as always, very helpful, especially when working as a team.
A foreign-key&amp;nbsp;column (non measure)&amp;nbsp;name should end the same for all columns
in the project. Measure field name should end with _sum, _count, etc. 
&lt;li&gt;
In order to develop in the administration program, the&amp;nbsp;developer should be defined
as administrator... 
&lt;li&gt;
The "check out objects" dialog box will get annoying after few hours of development.
To get rid of it, go to Tools -&amp;gt; Options -&amp;gt; General, and select "check out objects
automatically". Pay attention to what you do from now on, because even&amp;nbsp;viewing
a table's properties will check it out. 
&lt;li&gt;
You can always convert a table to a view in the physical layer. Right click on it,
properties, and choose "Select" in the table type. Then, write the SQL query. 
&lt;li&gt;
When working online against the repository and making an action against the DB (such
as row count or view data), the connection to the DB is made using the BI server's
data source. Only when working in offline mode the DB connection is made using the
local ODBC. 
&lt;li&gt;
When dragging a physical table into the logical layer it won't save the tables relationships.
Only when dragging a number of tables into the logical layer the relationships will
also be imported. 
&lt;li&gt;
Circular relationships between the tables&amp;nbsp;are not permitted in the logical layer
but permitted in the physical layer. 
&lt;li&gt;
Always use complex join in the logical layer. The BI Server supposes to understand
in which physical relationship to use. Change it only when it doesn't. 
&lt;li&gt;
When defining one-to-many join in the ERD you drag the line from the single to the
many table. 
&lt;li&gt;
In a dimension with a hierarchy (not flat one), the lowest level should contain the
table's key column. Every column which won't be associated to a level will be automatically
associated to the lowest level. 
&lt;li&gt;
In 90% of the cases, all the measures will have sum as aggregation rule. You can define
it in a single shot by selecting all the measure columns, right click on them and
choose "Set aggregation". 
&lt;li&gt;
The best practice is to build a dimension over any dimension-table, even if it's a
flat hierarchy. Also, you should connect each fact table to its levels in the dimensions.
You enter into the fact's source's properties and in the content tab you select the
logical level for every dimension which is connected to the fact table. 
&lt;li&gt;
You can quickly build a dimension by right-clicking the dimension-table and choose
"Create dimension". It won't always be good enough, but it's not so bad.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;u&gt;The Webby part (Answers &amp;amp; Dashboard)&lt;/u&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
The error "Incorrectly defined logical table source (for fact table XXX) does not
contain mapping for YYY" means that the BI Server cannot reach from table XXX to table
YYY. It can happen because of two reasons: The first one is that there are no relationships
defined in the logical or the physical layers (or maybe both). Note that the&amp;nbsp;connections
can be indirect.&amp;nbsp;The second one is that the relationships doesn't makes sense.
For example, going from a fact table to a dimension table through many-to-many table
cannot happen. You'll see this error many times as a beginner and it can be quite
frustrating at first. You need to understand that the BI Server can only understand
simple and classic star schemas. More complex ERDs need to be split by using alias
tables. 
&lt;li&gt;
While developing a complex report (answer, request, you name it) with many columns,
save it from time to time. Don't forget that you're working with a webby application.
Closing the window won't save your work and won't alert you if you didn't. 
&lt;li&gt;
After styling a column in the report, you can copy the style to other columns. In
the styling window there's a "copy format" button. You can click on paste in the other
columns' style windows. 
&lt;li&gt;
In order to make a customized report, you can use the Narrative view. To insert a
column's value, use @ and the column's location. For example,&amp;nbsp;@2 is the placeholder
for the second column. You can also apply javascript in the narrative to make dynamic
columns and effects. 
&lt;li&gt;
When you add a column in a fact-based report, bring it from the dimension table and
not from the fact table. This will help you when you'll make navigation&amp;nbsp;from
this report to the dimension-based report. 
&lt;li&gt;
The last button (&lt;img src="http://www.miky-schreiber.com/Blog/content/binary/siebel_tapedeck_all.GIF" border=0&gt;)
in the navigation toolbar won't go to the last page as expected but will bring all
the rows. In a case of a big table, this operation will take a long time and will
make the browser freeze. 
&lt;li&gt;
After a change in the RPD you need to update the answers site: Click on "Reload Server
Metadata" below to side bar. Then, Settings -&amp;gt; Administrator -&amp;gt; Manage Sessions
-&amp;gt; Close all cursors.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
This is&amp;nbsp;definitely not the last post about OBIEE. The next posts will be much
more interesting and helpful. I promise!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=01f28f1d-5798-4155-8ba8-83e1d158a4ed" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,01f28f1d-5798-4155-8ba8-83e1d158a4ed.aspx</comments>
      <category>BI;BI/Oracle;BI/Oracle/OBIEE</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=801cefae-7de4-4e1c-9ad4-115c70c2813e</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,801cefae-7de4-4e1c-9ad4-115c70c2813e.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,801cefae-7de4-4e1c-9ad4-115c70c2813e.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=801cefae-7de4-4e1c-9ad4-115c70c2813e</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <img style="MARGIN: 0px 1em 1em" height="50%" src="http://www.miky-schreiber.com/blog/content/binary/horseshoe.jpg" width="25%" align="left" />In
both SSIS and Informatica, the union transformation doesn't delete duplicate rows.
In SSIS it's clear because the transformation is called "Union all", which reminds
us the union all statement in SQL which doesn't remove duplicate rows. The confusing
part is in Informatica, where the transformation is called Union although it doesn't
remove duplicates. One of my teammates got confused this week so I thought it's worth
blogging about. 
<br /><br />
One more tip about ETLs with union transformations: When you'll investigate, maintain
or fix ETL it will be much help if you'll know where each row came from. That's why
I recommend adding a column named "src" or something like that and store there the
source of the row before the union happened.
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=801cefae-7de4-4e1c-9ad4-115c70c2813e" />
      </body>
      <title>Union Transformations and Duplicate Rows</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,801cefae-7de4-4e1c-9ad4-115c70c2813e.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,801cefae-7de4-4e1c-9ad4-115c70c2813e.aspx</link>
      <pubDate>Mon, 09 Nov 2009 14:41:31 GMT</pubDate>
      <description>&lt;p&gt;
&lt;img style="MARGIN: 0px 1em 1em" height="50%" src="http://www.miky-schreiber.com/blog/content/binary/horseshoe.jpg" width="25%" align=left&gt;In
both SSIS and Informatica, the union transformation doesn't delete duplicate rows.
In SSIS it's clear because the transformation is called "Union all", which reminds
us the union all statement in SQL which doesn't remove duplicate rows. The confusing
part is in Informatica, where the transformation is called Union although it doesn't
remove duplicates. One of my teammates got confused this week so I thought it's worth
blogging about. 
&lt;br&gt;
&lt;br&gt;
One more tip about ETLs with union transformations: When you'll investigate, maintain
or fix ETL it will be much help if you'll know where each row came from. That's why
I recommend adding a column named "src" or something like that and store there the
source of the row before the union happened.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=801cefae-7de4-4e1c-9ad4-115c70c2813e" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,801cefae-7de4-4e1c-9ad4-115c70c2813e.aspx</comments>
      <category>BI;BI/Informatica;BI/SQL Server 2005;BI/SQL Server 2005/Integration Services;BI/SQL Server 2008;BI/SQL Server 2008/Integration Services</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=03a8f9ca-790a-4e8a-91e3-f25ea1a32c94</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,03a8f9ca-790a-4e8a-91e3-f25ea1a32c94.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,03a8f9ca-790a-4e8a-91e3-f25ea1a32c94.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=03a8f9ca-790a-4e8a-91e3-f25ea1a32c94</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <img style="MARGIN: 0px 1em 1em" src="http://www.miky-schreiber.com/blog/content/binary/policeman.jpg" align="left" />
        <p>
Lucky for me, I have the opportunity to work with more than one ETL tool in my daily
work. In the far past, I worked much with DTS and PL/SQL packages (which is an ETL,
but not exactly a tool). Nowadays I work both with SSIS and Informatica so I
can compare them in several aspects. I don't think that one is better than the other.
It's just that they have different approaches to the ETL mechanism. Anyway, I always
expect that the data transformations will behave the same in every tool and I
found one transformation that behaves differently between the tools - the Router.
</p>
        <p>
The Informatica's Router, if you're not familiar with, receives a data row and
routes it a specific data flow. Its parallel transformation in SSIS is the Conditional
Split. As I said, I always thought that they behave the same. In both transformations
you provide boolean expressions that determine where the row will be routed. The difference
is that in SSIS, "<em>each input row can be sent to only one output, that being the
output for the first condition that evaluates to true</em>" (from SSIS's documentation).
In programmer's words, it behaves like switch-case statement with break in each condition.
In Informatica, <em>"If a row meets more than one group filter condition, the Integration
Service passes this row multiple times</em>" (from Informatica's documentation). Back
to the programmer's language, it's like switch-case statement with no break inside
the conditions.
</p>
        <p>
If you know other transformation that behaves different between ETL tools, I'll be
happy to know.
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=03a8f9ca-790a-4e8a-91e3-f25ea1a32c94" />
      </body>
      <title>Different Router behaviour in SSIS and Informatica</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,03a8f9ca-790a-4e8a-91e3-f25ea1a32c94.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,03a8f9ca-790a-4e8a-91e3-f25ea1a32c94.aspx</link>
      <pubDate>Tue, 27 Oct 2009 14:10:34 GMT</pubDate>
      <description>&lt;img style="MARGIN: 0px 1em 1em" src="http://www.miky-schreiber.com/blog/content/binary/policeman.jpg" align=left&gt; 
&lt;p&gt;
Lucky for me, I have the opportunity to work with more than one ETL tool in my daily
work. In the far past, I worked much with DTS and PL/SQL packages (which is an ETL,
but not exactly a tool). Nowadays I work both with&amp;nbsp;SSIS and Informatica so I
can compare them in several aspects. I don't think that one is better than the other.
It's just that they have different approaches to the ETL mechanism. Anyway, I always
expect that the data transformations will behave the same in every tool&amp;nbsp;and I
found one transformation that behaves differently between the tools - the Router.
&lt;/p&gt;
&lt;p&gt;
The&amp;nbsp;Informatica's Router, if you're not familiar with, receives a data row and
routes it a specific data flow. Its parallel transformation in SSIS is the Conditional
Split. As I said, I always thought that they behave the same. In both transformations
you provide boolean expressions that determine where the row will be routed. The difference
is that in SSIS, "&lt;em&gt;each input row can be sent to only one output, that being the
output for the first condition that evaluates to true&lt;/em&gt;" (from SSIS's documentation).
In programmer's words, it behaves like switch-case statement with break in each condition.
In Informatica, &lt;em&gt;"If a row meets more than one group filter condition, the Integration
Service passes this row multiple times&lt;/em&gt;" (from Informatica's documentation). Back
to the programmer's language, it's like switch-case statement with no break inside
the conditions.
&lt;/p&gt;
&lt;p&gt;
If you know other transformation that behaves different between ETL tools, I'll be
happy to know.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=03a8f9ca-790a-4e8a-91e3-f25ea1a32c94" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,03a8f9ca-790a-4e8a-91e3-f25ea1a32c94.aspx</comments>
      <category>BI;BI/Informatica;BI/SQL Server 2005;BI/SQL Server 2005/Integration Services;BI/SQL Server 2008;BI/SQL Server 2008/Integration Services</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=a0eb7d43-c389-43fc-90ba-59df85f0f526</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,a0eb7d43-c389-43fc-90ba-59df85f0f526.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,a0eb7d43-c389-43fc-90ba-59df85f0f526.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=a0eb7d43-c389-43fc-90ba-59df85f0f526</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <img style="MARGIN: 0px 1em 1em" src="http://www.miky-schreiber.com/blog/content/binary/OracleSiebelLogo.jpg" align="left" />
        <p>
We're now starting to work with OBIEE (aka Siebel Analytics) as our main reporting
tool. Our vision is to completely replace it with the old Oracle Discoverer, who will
be soon out of Oracle's support. As I'll go on and on with OBIEE, I'll post here things
you might want to know. Even if you don't work with this tool you can open your mind
and get familiar with new stuff.
</p>
        <p>
My first experience with OBIEE - the installation, was not a great fun. The main problem
was the error: <em>Oracle Business Intelligence is not supported on this Windows version.
Oracle Business Intelligence is only supported on Windows XP x86, Windows 2003 x86,
Windows 2003 AMD64, Windows 2003 EM64T, Windows Vista x86, Windows Vista AMD64, Windows
Vista EM64T, and Windows 2000 x86.</em></p>
        <p>
The problem is that the installation can't find the windows version because systeminfo
is not working. Try to run c:\windows\system32\systeminfo.exe. If you get an
error about framedyn.dll, this is exactly the problem. Copy this file from the wbem
sub-directory to the system32 directory. Try to run again systeminfo and you'll see
it's running. Make sure the PATH environment variable contains the system32 directory
and that's it.
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=a0eb7d43-c389-43fc-90ba-59df85f0f526" />
      </body>
      <title>OBIEE Installation Windows XP issue</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,a0eb7d43-c389-43fc-90ba-59df85f0f526.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,a0eb7d43-c389-43fc-90ba-59df85f0f526.aspx</link>
      <pubDate>Sun, 25 Oct 2009 07:44:38 GMT</pubDate>
      <description>&lt;img style="MARGIN: 0px 1em 1em" src="http://www.miky-schreiber.com/blog/content/binary/OracleSiebelLogo.jpg" align=left&gt; 
&lt;p&gt;
We're now starting to work with OBIEE (aka Siebel Analytics) as our main reporting
tool. Our vision is to completely replace it with the old Oracle Discoverer, who will
be soon out of Oracle's support. As I'll go on and on with OBIEE, I'll post here things
you might want to know. Even if you don't work with this tool you can open your mind
and get familiar with new stuff.
&lt;/p&gt;
&lt;p&gt;
My first experience with OBIEE - the installation, was not a great fun. The main problem
was the error: &lt;em&gt;Oracle Business Intelligence is not supported on this Windows version.
Oracle Business Intelligence is only supported on Windows XP x86, Windows 2003 x86,
Windows 2003 AMD64, Windows 2003 EM64T, Windows Vista x86, Windows Vista AMD64, Windows
Vista EM64T, and Windows 2000 x86.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
The problem is that the installation can't find the windows version because systeminfo
is not working.&amp;nbsp;Try to run c:\windows\system32\systeminfo.exe. If you get an
error about framedyn.dll, this is exactly the problem. Copy this file from the wbem
sub-directory to the system32 directory. Try to run again systeminfo and you'll see
it's running. Make sure the PATH environment variable contains the system32 directory
and that's it.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=a0eb7d43-c389-43fc-90ba-59df85f0f526" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,a0eb7d43-c389-43fc-90ba-59df85f0f526.aspx</comments>
      <category>BI;BI/Oracle;BI/Oracle/OBIEE</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=3ded0f0b-56ab-4086-9a38-8ca0d784b6dd</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,3ded0f0b-56ab-4086-9a38-8ca0d784b6dd.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,3ded0f0b-56ab-4086-9a38-8ca0d784b6dd.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=3ded0f0b-56ab-4086-9a38-8ca0d784b6dd</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">Two weeks ago I did a talk about SCD. <a href="http://www.miky-schreiber.com/Blog/content/binary/Slowly%20Changing%20Dimensions.ppt">Here</a> is
the presentation.<br />
I think that even if you're doing BI (design or development) for quite a while you'll
find this presention resourceful and maybe you'll learn a thing or two...<br />
Have a nice learning!<img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=3ded0f0b-56ab-4086-9a38-8ca0d784b6dd" /></body>
      <title>Slowly Changing Dimensions Presentation</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,3ded0f0b-56ab-4086-9a38-8ca0d784b6dd.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,3ded0f0b-56ab-4086-9a38-8ca0d784b6dd.aspx</link>
      <pubDate>Tue, 13 Oct 2009 14:38:41 GMT</pubDate>
      <description>Two weeks ago I did a talk about SCD. &lt;a href="http://www.miky-schreiber.com/Blog/content/binary/Slowly%20Changing%20Dimensions.ppt"&gt;Here&lt;/a&gt; is
the presentation.&lt;br&gt;
I think that even if you're doing BI (design or development) for quite a while you'll
find this presention resourceful and maybe you'll learn a thing or two...&lt;br&gt;
Have a nice learning!&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=3ded0f0b-56ab-4086-9a38-8ca0d784b6dd" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,3ded0f0b-56ab-4086-9a38-8ca0d784b6dd.aspx</comments>
      <category>BI;BI/DataWarehousing</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=d8eb1331-dfd7-4c1a-823d-4e34c20565e3</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,d8eb1331-dfd7-4c1a-823d-4e34c20565e3.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,d8eb1331-dfd7-4c1a-823d-4e34c20565e3.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=d8eb1331-dfd7-4c1a-823d-4e34c20565e3</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Last August, I've seen an Informatica webinar featuring Dr. Ralph Kimball (you can
see it <a href="http://www12.informatica.com/livemeetings/Kimball_Webinar_Q109.asx">here</a>).
The topic of the webinar was "Reverse the flow of Data Warehouse Design to Ensure
Success". In order to make long things short, what he says is that in the DWH's first
steps you don't and can't know what are the full requirements. This is quite problematic,
because the first steps of the DWH - its design - are the most crucial steps, where
you take the most important decisions which will be hard to change later. His solution
is revolutionary and sounds a little bit hallucinatory - Start with the website. After
you have the front-end finished, whether it's a dashboard website or just a simple
tabular report, and you have the customer's approval, you can start the DWH design
and you know exactly what you should do and what you should not.
</p>
        <p>
Thinking of that, we decided that he's right but it's too much. The cost of building
a website with a data source behind it which will be changed 100 times in a short
period is very high. Instead, we're working in a defferent method - We are working
with <a href="http://en.wikipedia.org/wiki/Mockup">Mockups</a>.
</p>
        <p>
Our mockups are PowerPoint presentations which mock the dashboard website that will
be the project's front-end. We're using a lot of buttons and hyperlinks between the
different slides in order to create a feeling of a real website with navigation and
interactivity. When we show it to the customer and tell him that this is what his
dashboard will look like, at first he's very happy and then the new requirement's
phase begin: Can I have this button here? This one more slicer there? What about replacing
this chart with this one? etc. In PowerPoint presentation, making these changes is
very easy and after a couple of days we have a good understanding of how our front-end
will look like. Threfore, we fully understand how our DWH will look like. This
is a <strong>great</strong> method, I recommend you'll start using it in your next
project. Try and see for yourself!
</p>
There are some more points you need to know before starting using it: 
<ul><li>
You're not have to use Power Point for this. Visio and even Paint Brush can assist
you. Nevertheless, I recommend you to use a tool for this (remember that the mockup
will be changing a lot). There are <a href="http://www.google.co.il/search?q=visio+open+source+alternative">many
free &amp; open-source tools</a> to do it.</li><li>
You may consider to have the mockup to be your contract with the customer. On the
other hand, the final result may look a little bit different. You can draw everything
in PowerPoint but in the reality things may be hard to implement.</li><li>
After finishing the design phase, don't go over and over to the mockup to keep it
updated. Again - The reality is stronger than the first design. When the project will
be finished, no-one will care about the mockup.</li></ul><img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=d8eb1331-dfd7-4c1a-823d-4e34c20565e3" /></body>
      <title>Let's Mockup</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,d8eb1331-dfd7-4c1a-823d-4e34c20565e3.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,d8eb1331-dfd7-4c1a-823d-4e34c20565e3.aspx</link>
      <pubDate>Thu, 24 Sep 2009 11:49:44 GMT</pubDate>
      <description>&lt;p&gt;
Last August, I've seen an Informatica webinar featuring Dr. Ralph Kimball (you can
see it &lt;a href="http://www12.informatica.com/livemeetings/Kimball_Webinar_Q109.asx"&gt;here&lt;/a&gt;).
The topic of the webinar was "Reverse the flow of Data Warehouse Design to Ensure
Success". In order to make long things short, what he says is that in the DWH's first
steps you don't and can't know what are the full requirements. This is quite problematic,
because the first steps of the DWH - its design - are the most crucial steps, where
you take the most important decisions which will be hard to change later. His solution
is revolutionary and sounds a little bit hallucinatory - Start with the website. After
you have the front-end finished, whether it's a dashboard website or just a simple
tabular report, and you have the customer's approval, you can start the DWH design
and you know exactly what you should do and what you should not.
&lt;/p&gt;
&lt;p&gt;
Thinking of that, we decided that he's right but it's too much. The cost of building
a website with a data source behind it which will be changed 100 times in a short
period is very high. Instead, we're working in a defferent method - We are working
with &lt;a href="http://en.wikipedia.org/wiki/Mockup"&gt;Mockups&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Our mockups are PowerPoint presentations which mock the dashboard website that will
be the project's front-end. We're using a lot of buttons and hyperlinks between the
different slides in order to create a feeling of a real website with navigation and
interactivity. When we show it to the customer and tell him that this is what his
dashboard will look like, at first he's very happy and then the new requirement's
phase begin: Can I have this button here? This one more slicer there? What about replacing
this chart with this one? etc. In PowerPoint presentation, making these changes is
very easy and after a couple of days we have a good understanding of how our front-end
will look like. Threfore, we&amp;nbsp;fully understand how our DWH will look like. This
is a &lt;strong&gt;great&lt;/strong&gt; method, I recommend you'll start using it in your next
project. Try and see for yourself!
&lt;/p&gt;
There are some more points you need to know before starting using it: 
&lt;ul&gt;
&lt;li&gt;
You're not have to use Power Point for this. Visio and even Paint Brush can assist
you. Nevertheless, I recommend you to use a tool for this (remember that the mockup
will be changing a lot). There are &lt;a href="http://www.google.co.il/search?q=visio+open+source+alternative"&gt;many
free &amp;amp; open-source tools&lt;/a&gt; to do it.&lt;/li&gt;
&lt;li&gt;
You may consider to have the mockup to be your contract with the customer. On the
other hand, the final result may look a little bit different. You can draw everything
in PowerPoint but in the reality things may be hard to implement.&lt;/li&gt;
&lt;li&gt;
After finishing the design phase, don't go over and over to the mockup to keep it
updated. Again - The reality is stronger than the first design. When the project will
be finished, no-one will care about the mockup.&lt;/li&gt;
&lt;/ul&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=d8eb1331-dfd7-4c1a-823d-4e34c20565e3" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,d8eb1331-dfd7-4c1a-823d-4e34c20565e3.aspx</comments>
      <category>BI;BI/DataWarehousing</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=3fbe370c-8fa9-45ea-9d11-559cd48ca61d</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,3fbe370c-8fa9-45ea-9d11-559cd48ca61d.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,3fbe370c-8fa9-45ea-9d11-559cd48ca61d.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=3fbe370c-8fa9-45ea-9d11-559cd48ca61d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Panorama views with parameters are very common wherever mass Panorama-based development
is made. Some use it within websites and others let the users change the parameters
using Panorama WebAccess. When using such views within websites, a common thing that
we do is to change those parameters ourselves using the Panorama SDK, where the values
are based on the current status of the user, the current time or other parameters
which come from outer source such as XML files, Databases, etc.
</p>
        <p>
The main challenge when using parameters within web sites is that you must think
of end cases for the parameters' values. <strong>When you send a bad parameter to
a view using the SDK, the view will sometimes go off and it will stop responding to
other things you may do with it in the website</strong>. I'll describe it with a life-experience
example: We've built a website with panorama paramertized views. Some of the views
had FromDate and ToDate parameters, which define the time period for the view
to be sliced on. By the way, this is in fact an error by itself - we can use other
dedicated functions to do that as described <a href="http://www.miky-schreiber.com/Blog/PermaLink,guid,8b8e0ab7-5fc8-48b1-9faa-34005f0e742d.aspx">here</a>.
The source of these parameters came from a database. The values inside the DB were
given from a power user which is the only one who can change them. In some cases,
the power user changed these values and the views weren't sliced at all. Debugging
it, we've seen that the period between FromDate and ToDate has no data at all so the
view wasn't changed. The problem was that once the view was trying to slice on
empty period and failed, it stopped responding to other actions (it can be also
changed from other controls on the page). So again - think of the end cases when
you create parameters-based views.
</p>
        <p>
What I written so far is easy to say, but sometimes you have to do it. The views have
to have parameters and sometimes they will get bad data from the users. We have no
control over it and we can't deny it. What can we do? A simple approach I use from
time to time is to create shadow views. A shadow view is a hidden view (or 1x1 pixel
sized) that cannot be seen by the user. Everything that the user tries to do on the
real view will be tested before that on runtime on the shadow view. Only if the action
succeeded on the shadow view it will be made on the real view. Otherwise, no action
will be made on the real view and instead the user will get a message (using Javascript's
alert() function, for example) describing why his request cannot be made. The way
to check if the user's action succeeded on the shadow view is using output from Panorama
SDK functions, but this subject is a little bit wider for this post and it's very
case-specific. There are no generic solutions for this problem that I know of, but
if I'll find something I'll write another post about it.
</p>
        <p>
To conclude: Think twice about end cases when using parameters inside your views.
If you have no choice use the shadow view approach. Write and run tests to check the
different values that you'll send to your views.
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=3fbe370c-8fa9-45ea-9d11-559cd48ca61d" />
      </body>
      <title>Panorama Views and Parameters End Cases</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,3fbe370c-8fa9-45ea-9d11-559cd48ca61d.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,3fbe370c-8fa9-45ea-9d11-559cd48ca61d.aspx</link>
      <pubDate>Sat, 12 Sep 2009 21:13:01 GMT</pubDate>
      <description>&lt;p&gt;
Panorama views with parameters are very common wherever mass Panorama-based development
is made. Some use it within websites and others let the users change the parameters
using Panorama WebAccess. When using such views within websites, a common thing that
we do is to change those parameters ourselves using the Panorama SDK, where the values
are based on the current status of the user, the current time or other parameters
which come from outer source such as XML files, Databases, etc.
&lt;/p&gt;
&lt;p&gt;
The main&amp;nbsp;challenge when using parameters within web sites is that you must think
of end cases for the parameters' values. &lt;strong&gt;When you send a bad parameter to
a view using the SDK, the view will sometimes go off and it will stop responding to
other things you may do with it in the website&lt;/strong&gt;. I'll describe it with a life-experience
example: We've built a website with panorama paramertized views. Some of the views
had FromDate and ToDate parameters, which define the time&amp;nbsp;period for the view
to be sliced on. By the way, this is in fact an error by itself - we can use other
dedicated functions to do that as described &lt;a href="http://www.miky-schreiber.com/Blog/PermaLink,guid,8b8e0ab7-5fc8-48b1-9faa-34005f0e742d.aspx"&gt;here&lt;/a&gt;.
The source of these parameters came from a database. The values inside the DB were
given from a power user which is the only one who can change them. In some cases,
the power user changed these values and the views weren't sliced at all. Debugging
it, we've seen that the period between FromDate and ToDate has no data at all so the
view wasn't changed. The problem was that&amp;nbsp;once the view was trying to slice on
empty period and failed, it&amp;nbsp;stopped responding to other actions (it can be also
changed&amp;nbsp;from other controls on the page). So again - think of the end cases when
you create parameters-based views.
&lt;/p&gt;
&lt;p&gt;
What I written so far is easy to say, but sometimes you have to do it. The views have
to have parameters and sometimes they will get bad data from the users. We have no
control over it and we can't deny it. What can we do? A simple approach I use from
time to time is to create shadow views. A shadow view is a hidden view (or 1x1 pixel
sized) that cannot be seen by the user. Everything that the user tries to do on the
real view will be tested before that on runtime on the shadow view. Only if the action
succeeded on the shadow view it will be made on the real view. Otherwise, no action
will be made on the real view and instead the user will get a message (using Javascript's
alert() function, for example) describing why his request cannot be made. The way
to check if the user's action succeeded on the shadow view is using output from Panorama
SDK functions, but this subject is a little bit wider for this post and it's very
case-specific. There are no generic solutions for this problem that I know of, but
if I'll find something I'll write another post about it.
&lt;/p&gt;
&lt;p&gt;
To conclude: Think twice about end cases when using parameters inside your views.
If you have no choice use the shadow view approach. Write and run tests to check the
different values that you'll send to your views.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=3fbe370c-8fa9-45ea-9d11-559cd48ca61d" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,3fbe370c-8fa9-45ea-9d11-559cd48ca61d.aspx</comments>
      <category>BI;BI/Panorama</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=4da4297b-ff02-45cb-88b6-ba9b0a4ba785</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,4da4297b-ff02-45cb-88b6-ba9b0a4ba785.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,4da4297b-ff02-45cb-88b6-ba9b0a4ba785.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=4da4297b-ff02-45cb-88b6-ba9b0a4ba785</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Make sure that all the Panorama developers has the same version of Panorama NovaView
Desktop and that it's the same version of the Panorama server. In addition, check
that all the Panorama servers (meaning development server, production server, etc.)
also have the same Panorama version. It's very unpleasant when you copy the views
from the development server to the production server while installing your new or updated
BI project just to find out that some of the views don't show because of that.
That's right - it won't cause all of the views to malfunction, it will only affect
some. That's the dangerous thing and this is why you need to double check it immiedetly.
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=4da4297b-ff02-45cb-88b6-ba9b0a4ba785" />
      </body>
      <title>Panorama Versions</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,4da4297b-ff02-45cb-88b6-ba9b0a4ba785.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,4da4297b-ff02-45cb-88b6-ba9b0a4ba785.aspx</link>
      <pubDate>Thu, 27 Aug 2009 13:05:43 GMT</pubDate>
      <description>&lt;p&gt;
Make sure that all the Panorama developers has the same version of Panorama NovaView
Desktop and that it's the same version of the Panorama server. In addition, check
that all the Panorama servers (meaning development server, production server, etc.)
also have the same Panorama version. It's very unpleasant when you copy the views
from the development server to the production server while installing your new or&amp;nbsp;updated
BI project just to&amp;nbsp;find out that some of the views don't show because of that.
That's right - it won't cause all of the views to malfunction, it will only affect
some. That's the dangerous thing and this is why you need to double check it immiedetly.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=4da4297b-ff02-45cb-88b6-ba9b0a4ba785" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,4da4297b-ff02-45cb-88b6-ba9b0a4ba785.aspx</comments>
      <category>BI;BI/Panorama</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=a407116c-be26-48e5-bb83-ef8bf84de3d0</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,a407116c-be26-48e5-bb83-ef8bf84de3d0.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,a407116c-be26-48e5-bb83-ef8bf84de3d0.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=a407116c-be26-48e5-bb83-ef8bf84de3d0</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
in my <a href="http://www.miky-schreiber.com/Blog/PermaLink,guid,1f2e8d76-c4a1-4f1f-9e9d-5b3ba794b092.aspx">last
post</a> I recommended you to learn about the batch mode feature of Panorama. There's
one more thing you've got to know: Check you're code flow very well because if you'll
use batch mode within batch mode, meaning that you'll call the EnterBatchCommandMode
function after you did it previously, the view will get stuck. Be sure that you don't
have such a case.
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=a407116c-be26-48e5-bb83-ef8bf84de3d0" />
      </body>
      <title>One More Thing About Batch Mode</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,a407116c-be26-48e5-bb83-ef8bf84de3d0.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,a407116c-be26-48e5-bb83-ef8bf84de3d0.aspx</link>
      <pubDate>Thu, 27 Aug 2009 12:51:37 GMT</pubDate>
      <description>&lt;p&gt;
in my &lt;a href="http://www.miky-schreiber.com/Blog/PermaLink,guid,1f2e8d76-c4a1-4f1f-9e9d-5b3ba794b092.aspx"&gt;last
post&lt;/a&gt; I recommended you to learn about the batch mode feature of Panorama. There's
one more thing you've got to know: Check you're code flow very well because if you'll
use batch mode within batch mode, meaning that you'll call the EnterBatchCommandMode
function after you did it previously, the view will get stuck. Be sure that you don't
have such a case.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=a407116c-be26-48e5-bb83-ef8bf84de3d0" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,a407116c-be26-48e5-bb83-ef8bf84de3d0.aspx</comments>
      <category>BI;BI/Panorama</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=1f2e8d76-c4a1-4f1f-9e9d-5b3ba794b092</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,1f2e8d76-c4a1-4f1f-9e9d-5b3ba794b092.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,1f2e8d76-c4a1-4f1f-9e9d-5b3ba794b092.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=1f2e8d76-c4a1-4f1f-9e9d-5b3ba794b092</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">After going to production, we encountered
a serious bug where a web page simply stucked and made the browser freeze. This page
is a little bit complex: It contains three views with interaction between them,
so we had much trouble with this page in the past. We weren't suprised to hear that
this page causes us more trouble, so we went on to debugging.<br />
One of the views in this page get two parameters from the web page (using Panorama's
SDK) - fromDate and toDate, which define a time interval for the view to slice on.
After debugging, we've found that the problem was that after updating the fromDate
parameter and before updating the toDate parameter, the view had no rows left. When
trying to update the toDate parameters in the view with no rows, it made the browser
stuck.<br /><p>
The solution is to make the parameters update in one action. There are two ways of
doing this: 
<br />
The first one is to use the CallUpdateParametersEx with number of parameters. You
can update many parameters in one function call (look in the SDK documentation). The
problem with this solution is that the code is not readable.<br />
The second and better solution is to use the EnterBatchCommandMode and LeaveBatchCommandMode
functions to make the parameters update in one transaction. This way, the code is
much more readable. You can update every parameter in its own CallUpdateParametersEx
call. The usage of this function is very simple: Call the EnterBatchCommandMode function
before the parameters update and call the LeaveBatchCommandMode after that.
</p><p>
I'm sure that there are more scenarios where this concept can be helpful, so it's
important to get familiar with. 
</p><img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=1f2e8d76-c4a1-4f1f-9e9d-5b3ba794b092" /></body>
      <title>Usage of Batch Mode in Panorama Web Development</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,1f2e8d76-c4a1-4f1f-9e9d-5b3ba794b092.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,1f2e8d76-c4a1-4f1f-9e9d-5b3ba794b092.aspx</link>
      <pubDate>Wed, 19 Aug 2009 10:24:15 GMT</pubDate>
      <description>After going to production, we encountered a serious bug where a web page simply stucked and made the browser freeze. This page is a little bit complex:&amp;nbsp;It contains three views with interaction between them, so we had much trouble with this page in the past. We weren't suprised to hear that this page causes us more trouble, so we went on to debugging.&lt;br&gt;
One of the views in this page get two parameters from the web page (using Panorama's
SDK) - fromDate and toDate, which define a time interval for the view to slice on.
After debugging, we've found that the problem was that after updating the fromDate
parameter and before updating the toDate parameter, the view had no rows left. When
trying to update the toDate parameters in the view with no rows, it made the browser
stuck.&lt;br&gt;
&lt;p&gt;
The solution is to make the parameters update in one action. There are two ways of
doing this: 
&lt;br&gt;
The first one is to use the CallUpdateParametersEx with number of parameters. You
can update many parameters in one function call (look in the SDK documentation). The
problem with this solution is that the code is not readable.&lt;br&gt;
The second and better solution is to use the EnterBatchCommandMode and LeaveBatchCommandMode
functions to make the parameters update in one transaction. This way, the code is
much more readable. You can update every parameter in its own CallUpdateParametersEx
call. The usage of this function is very simple: Call the EnterBatchCommandMode function
before the parameters update and call the LeaveBatchCommandMode after that.
&lt;/p&gt;
&lt;p&gt;
I'm sure that there are more scenarios where this concept can be helpful, so it's
important to get familiar with. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=1f2e8d76-c4a1-4f1f-9e9d-5b3ba794b092" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,1f2e8d76-c4a1-4f1f-9e9d-5b3ba794b092.aspx</comments>
      <category>BI;BI/Panorama</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=8b8e0ab7-5fc8-48b1-9faa-34005f0e742d</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,8b8e0ab7-5fc8-48b1-9faa-34005f0e742d.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,8b8e0ab7-5fc8-48b1-9faa-34005f0e742d.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=8b8e0ab7-5fc8-48b1-9faa-34005f0e742d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">This post is a collection of some
tips we collected in the last week regarding Panorama views development: 
<ul><li>
You should always check that the view is loaded with data. Sometimes it will be loaded
with no data because of lack of data in the DWH or because the view is sliced on a
member with no data. It confuses the applet and from that point it won't always continue
to function. From Dashboards developer point of view, if the view is loaded with no
data, replace the view with a descriptive message. Dashboard page with "No Data" message
will make the users think that something is very wrong with the BI system.</li><li>
Panorama has some issues with formats. Define the formats in the OLAP. Panorama
will use them as defined in the OLAP.</li><li>
Avoid as much as you can from sending parameters to views. When adding parameter to
the view, think twice if you have a way of getting this parameter's data from the
OLAP. You'll be suprised to find out that in many cases you'll be able to do that.</li><li>
If you slice your view as a result of a user event, try not to use parameters. Try
to use the callFilterGridMembers function or callSliceByMember function.</li><li>
Slicing a view on a member which has no data can cause the view to stop working. What
you can do is to create a hidden view (1 pixel x 1 pixel) which is the same as the
first view. Whenever you want to slice the view, make the slicing on the
hidden view first. Using the Panorama's SDK, find if the view has data and only then
slice the original view.</li></ul>
Thanks to Itay Segal for the tips and for the help.<img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=8b8e0ab7-5fc8-48b1-9faa-34005f0e742d" /></body>
      <title>Panorama Tips for Developers</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,8b8e0ab7-5fc8-48b1-9faa-34005f0e742d.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,8b8e0ab7-5fc8-48b1-9faa-34005f0e742d.aspx</link>
      <pubDate>Sun, 26 Jul 2009 13:25:33 GMT</pubDate>
      <description>This post is a collection of&amp;nbsp;some tips we collected in the last week regarding Panorama views development: 
&lt;ul&gt;
&lt;li&gt;
You should always check that the view is loaded with data. Sometimes it will be loaded
with no data because of lack of data in the DWH or because the view is sliced on a
member with no data. It confuses the applet and from that point it won't always continue
to function. From Dashboards developer point of view, if the view is loaded with no
data, replace the view with a descriptive message. Dashboard page with "No Data" message
will make the users think that something is very wrong with the BI system.&lt;/li&gt;
&lt;li&gt;
Panorama has&amp;nbsp;some issues with formats. Define the formats in the OLAP. Panorama
will use them as&amp;nbsp;defined in the OLAP.&lt;/li&gt;
&lt;li&gt;
Avoid as much as you can from sending parameters to views. When adding parameter to
the view, think twice if you have a way of getting this parameter's data from the
OLAP. You'll be suprised to find out that in many cases you'll be able to do that.&lt;/li&gt;
&lt;li&gt;
If you slice your view as a result of a user event, try not to use parameters. Try
to use the callFilterGridMembers function or callSliceByMember function.&lt;/li&gt;
&lt;li&gt;
Slicing a view on a member which has no data can cause the view to stop working. What
you can do is to create a hidden view (1 pixel x 1 pixel) which is the same as the
first view. Whenever you want to slice the view, make&amp;nbsp;the slicing&amp;nbsp;on the
hidden view first. Using the Panorama's SDK, find if the view has data and only then
slice the original view.&lt;/li&gt;
&lt;/ul&gt;
Thanks to Itay Segal for the tips and for the help.&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=8b8e0ab7-5fc8-48b1-9faa-34005f0e742d" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,8b8e0ab7-5fc8-48b1-9faa-34005f0e742d.aspx</comments>
      <category>BI;BI/Panorama;Tips &amp; Tricks</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=327f334e-c8b0-4662-b013-46ad75cd4e77</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,327f334e-c8b0-4662-b013-46ad75cd4e77.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,327f334e-c8b0-4662-b013-46ad75cd4e77.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=327f334e-c8b0-4662-b013-46ad75cd4e77</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">What will happen when new members are added
to the dimension which is shown in your Panorama chart?<br />
The answer is one of the following:<br />
A. Scroll bar will be added in the bottom side of the chart.<br />
B. The chart will expand itself. If the chart is in a dashboards page, it may ruin
the page because the view will extend beyond its area. 
<p>
That's why Panorama's default setting for "Auto Select all X-axis Members to Chart"
(and Y) is false, meaning that the chart won't expand even if new data arrives.
</p>
The other side of this default setting can be bad. Last week, we had a situation
where one of our dashboard pages acted in a strange way: The page contained two views,
where the first view is a crosstab and the second one is a chart. When the user clicked
on a row in the first view, it sliced the second view on the desired member in the
Y axis. What happened is that after the chart showed two members in the X axis, for
example, It didn't show three or four members in the X axis, no matter what. We didn't
underatand what went wrong and went home with sad faces on Friday. This morning, we
realized that we forgot to enable the Auto-Select setting.<img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=327f334e-c8b0-4662-b013-46ad75cd4e77" /></body>
      <title>Auto-Select Axis Members in Panorama</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,327f334e-c8b0-4662-b013-46ad75cd4e77.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,327f334e-c8b0-4662-b013-46ad75cd4e77.aspx</link>
      <pubDate>Sun, 26 Jul 2009 13:01:16 GMT</pubDate>
      <description>What will happen when new members are added to the dimension which is shown in your Panorama chart?&lt;br&gt;
The answer is&amp;nbsp;one of the following:&lt;br&gt;
A. Scroll bar will be added in the bottom side of the chart.&lt;br&gt;
B. The chart will expand itself. If the chart is in a dashboards page, it may ruin
the page because the view will extend beyond its area. 
&lt;p&gt;
That's why Panorama's default setting for "Auto Select all X-axis Members to Chart"
(and Y) is false, meaning that the chart won't expand even if new data arrives.
&lt;/p&gt;
The other side of this default setting&amp;nbsp;can be bad. Last week, we had a situation
where one of our dashboard pages acted in a strange way: The page contained two views,
where the first view is a crosstab and the second one is a chart. When the user clicked
on a row in the first view, it sliced the second view on the desired member in the
Y axis. What happened is that after the chart showed two members in the X axis, for
example, It didn't show three or four members in the X axis, no matter what. We didn't
underatand what went wrong and went home with sad faces on Friday. This morning, we
realized that we forgot to enable the Auto-Select setting.&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=327f334e-c8b0-4662-b013-46ad75cd4e77" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,327f334e-c8b0-4662-b013-46ad75cd4e77.aspx</comments>
      <category>BI;BI/Panorama;Tips &amp; Tricks</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=07245596-c190-485c-808f-7699f10cb928</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,07245596-c190-485c-808f-7699f10cb928.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,07245596-c190-485c-808f-7699f10cb928.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=07245596-c190-485c-808f-7699f10cb928</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <img style="MARGIN: 0px 1em 1em" src="http://www.miky-schreiber.com/blog/content/binary/oldpc.gif" align="left" />The
BI team and the source system team has a great bond between them. When the source
system's team wants to change the system's logic or the physical tables, they must
inform the BI team as soon as possible, because the BI team must change their system
too. Otherwise, the ETL will fail and the users will see old or no data, or in the
worse case the users will see incorrect data. 
<p>
On the other hand, when the BI system shows data which is not the same as the data
in the source system, the responsibility of showing that the BI system is OK is on
the BI team's shoulders. It needs to investigate the problem and see if the error
is on the BI side or in the source system side. Maybe there is no error at all and
the difference is caused by difference in the logic.
</p><p>
Sometimes, we (the BI team, of course) investigates the data problems and find that
the error resides in the source system itself. Then, we need to make sure that the
error is fixed in the system, whether by the IT staff or by the power users. The important
point here, and this is why I decided to write this post, is that the change must
be done first in the development environment of the source system. Then, we'll run
the ETL process and see that everything is fixed. This is important because sometimes
we think that the change will make things right and it's not. That's why everything
should be changed in the development environments first in both systems.
</p><p>
Only after we've seen that the data is fine, we can make the change in the production
environments. Last tip: <strong>Make sure that the change is also made in the source
system's production environment</strong>. Sometimes the time interval between these
events is long and the source system's team just forgets all about it. Write it down
as a task before going to production.
</p><img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=07245596-c190-485c-808f-7699f10cb928" /></body>
      <title>The BI Team and the Source System's Team Bond</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,07245596-c190-485c-808f-7699f10cb928.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,07245596-c190-485c-808f-7699f10cb928.aspx</link>
      <pubDate>Mon, 20 Jul 2009 09:24:28 GMT</pubDate>
      <description>&lt;img style="MARGIN: 0px 1em 1em" src="http://www.miky-schreiber.com/blog/content/binary/oldpc.gif" align=left&gt;The
BI team and the source system team has a great bond between them. When the source
system's team wants to change the system's logic or the physical tables, they must
inform the BI team as soon as possible, because the BI team must change their system
too. Otherwise, the ETL will fail and the users will see old or no data, or in the
worse case the users will see incorrect data. 
&lt;p&gt;
On the other hand, when the BI system shows data which is not the same as the data
in the source system, the responsibility of showing that the BI system is OK is on
the BI team's shoulders. It needs to investigate the problem and see if the error
is on the BI side or in the source system side. Maybe there is no error at all and
the difference is caused by difference in the logic.
&lt;/p&gt;
&lt;p&gt;
Sometimes, we (the BI team, of course) investigates the data problems and find that
the error resides in the source system itself. Then, we need to make sure that the
error is fixed in the system, whether by the IT staff or by the power users. The important
point here, and this is why I decided to write this post, is that the change must
be done first in the development environment of the source system. Then, we'll run
the ETL process and see that everything is fixed. This is important because sometimes
we think that the change will make things right and it's not. That's why everything
should be changed in the development environments first in both systems.
&lt;/p&gt;
&lt;p&gt;
Only after we've seen that the data is fine, we can make the change in the production
environments. Last tip: &lt;strong&gt;Make sure that the change is also made in the source
system's production environment&lt;/strong&gt;. Sometimes the time interval between these
events is long and the source system's team just forgets all about it. Write it down
as a task before going to production.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=07245596-c190-485c-808f-7699f10cb928" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,07245596-c190-485c-808f-7699f10cb928.aspx</comments>
      <category>BI;BI/DataWarehousing;Tips &amp; Tricks</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=d45d0c48-5f6d-4eba-804b-f94441619681</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,d45d0c48-5f6d-4eba-804b-f94441619681.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,d45d0c48-5f6d-4eba-804b-f94441619681.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=d45d0c48-5f6d-4eba-804b-f94441619681</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <img style="MARGIN: 0px 1em 1em 0px" src="http://www.miky-schreiber.com/Blog/content/binary/source.jpg" align="left" border="0" />
        <p>
          <font size="2">Last Week we had a funny case which took us much time to understand.</font>
        </p>
        <p>
          <font size="2">In our development environment, we like to have the same source data
for a long period of time. This way we're familiar with our data and we can expect
the numeric results in the higher layers (OLAP, dashboard, etc.). When we have a stable
environment and we think that our system gives the correct data, we ask our infrastructure
team to refresh our sources, meaning that they bring new production data to the development
environment.</font>
        </p>
        <p>
          <font size="2">The situation that we had last week is that we refreshed our sources
and from that point the data didn't make any sense. We asked the infrastructure team
if they're sure they refreshed the data and they said they are sure. We checked the
system and the data many times and seen that the data is different from what we had
but still it didn't make any sense.</font>
        </p>
        <p>
          <font size="2">After much frustration, one of us made a suggestion to write sql query
in this form:<br />
select max(some_date_field) from fact_table</font>
        </p>
        <p>
Then we were all amazed. After much time of sisyphean work we realized that our
data is not new at all. Moreover - our old data was old too. The maximum date in our
main fact table was <strong>half a year ago</strong>. The reason was that we took
our data from a legacy system which runs a job that exports their tables into
files, and our infrastructure team imports these files into our source tables. The
problem was that no-one ran the job so the files themselves were old, meaning that
our refresh activity means nothing.
</p>
        <p>
          <u>Conclusion</u>: Never trust your sources. Always run a sql query like mentioned
above to check that you have recent data and that the data you think you have is the
data you have. You can think of more queries that validates that what you have is
what you expect to have. Run them every morning to make sure you're ground is stable.
It's only a matter of seconds and it's worth it.
</p>
        <p>
May the source be with you.
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=d45d0c48-5f6d-4eba-804b-f94441619681" />
      </body>
      <title>Don't Trust Your Sources</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,d45d0c48-5f6d-4eba-804b-f94441619681.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,d45d0c48-5f6d-4eba-804b-f94441619681.aspx</link>
      <pubDate>Mon, 20 Jul 2009 07:50:02 GMT</pubDate>
      <description>&lt;img style="MARGIN: 0px 1em 1em 0px" src="http://www.miky-schreiber.com/Blog/content/binary/source.jpg" align=left border=0&gt; 
&lt;p&gt;
&lt;font size=2&gt;Last Week we had a funny case which took us much time to understand.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font size=2&gt;In our development environment, we like to have the same source data
for a long period of time. This way we're familiar with our data and we can expect
the numeric results in the higher layers (OLAP, dashboard, etc.). When we have a stable
environment and we think that our system gives the correct data, we ask our infrastructure
team to refresh our sources, meaning that they bring new production data to the development
environment.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font size=2&gt;The situation that we had last week is that we refreshed our sources
and from that point the data didn't make any sense. We asked the infrastructure team
if they're sure they refreshed the data and they said they are sure. We checked the
system and the data many times and seen that the data is different from what we had
but still it didn't make any sense.&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font size=2&gt;After much frustration, one of us made a suggestion to write sql query
in this form:&lt;br&gt;
select max(some_date_field) from fact_table&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Then we were all&amp;nbsp;amazed. After much time of sisyphean work we realized that our
data is not new at all. Moreover - our old data was old too. The maximum date in our
main fact table was &lt;strong&gt;half a year ago&lt;/strong&gt;. The reason was that we took
our data from a legacy system which runs a job that&amp;nbsp;exports their tables into
files, and our infrastructure team imports these files into our source tables. The
problem was that no-one ran the job so the files themselves were old, meaning that
our refresh activity means nothing.
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;Conclusion&lt;/u&gt;: Never trust your sources. Always run a sql query like mentioned
above to check that you have recent data and that the data you think you have is the
data you have. You can think of more queries that validates that what you have is
what you expect to have. Run them every morning to make sure you're ground is stable.
It's only a matter of seconds and it's worth it.
&lt;/p&gt;
&lt;p&gt;
May the source be with you.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=d45d0c48-5f6d-4eba-804b-f94441619681" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,d45d0c48-5f6d-4eba-804b-f94441619681.aspx</comments>
      <category>BI;BI/DataWarehousing;Tips &amp; Tricks</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=0e4490ed-7f54-4883-b542-2595a0d95323</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,0e4490ed-7f54-4883-b542-2595a0d95323.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,0e4490ed-7f54-4883-b542-2595a0d95323.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=0e4490ed-7f54-4883-b542-2595a0d95323</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The error function in Informatica can be very useful when you want to know why you
have failed rows without failing the whole process. The use of the function is ERROR(string).
Calling this function will make the error appear in the session log and the row will
be ignored. For example: IIF(my_date_field &gt; sysdate, ERROR('Futuristic Date'),
my_date_field). This will ignore futuristic dates and show them only in the session
log. By the way, you can declare default value for the port and the process will replace
the ERROR with the default output.
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=0e4490ed-7f54-4883-b542-2595a0d95323" />
      </body>
      <title>Using the Error function in Informatica</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,0e4490ed-7f54-4883-b542-2595a0d95323.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,0e4490ed-7f54-4883-b542-2595a0d95323.aspx</link>
      <pubDate>Thu, 09 Jul 2009 11:19:26 GMT</pubDate>
      <description>&lt;p&gt;
The error function in Informatica can be very useful when you want to know why you
have failed rows without failing the whole process. The use of the function is ERROR(string).
Calling this function will make the error appear in the session log and the row will
be ignored. For example: IIF(my_date_field &amp;gt; sysdate, ERROR('Futuristic Date'),
my_date_field). This will ignore futuristic dates and show them only in the session
log. By the way, you can declare default value for the port and the process will replace
the ERROR with the default output.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=0e4490ed-7f54-4883-b542-2595a0d95323" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,0e4490ed-7f54-4883-b542-2595a0d95323.aspx</comments>
      <category>BI;BI/Informatica</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=8d29e8e0-e3af-42d3-a3c3-f5ee6df13102</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,8d29e8e0-e3af-42d3-a3c3-f5ee6df13102.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,8d29e8e0-e3af-42d3-a3c3-f5ee6df13102.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=8d29e8e0-e3af-42d3-a3c3-f5ee6df13102</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A wonderful idea I heard of is to turn to full screen mode in Internet Explorer when
entering the Dashboard site. It can make a better user experience. Try it yourself
and you'll see the huge difference.<br />
How will we do that? We will add a JavaScript code to the first page of the dashboards
site and after that we'll ask our system administrator to enable this script for us.
Let's get to work: 
</p>
        <p>
          <u>Step 1 - The JavaScript</u>
        </p>
        <p>
        </p>
Create a new HTML component in the dashboard page. Edit it and click on the "View
Source" button (the one with the &lt;&gt;). Enter the following code:<br />
&lt;SCRIPT&gt;<br />
var wscript = new ActiveXObject("Wscript.shell");<br />
wscript.SendKeys("{F11}");<br />
&lt;/SCRIPT&gt; 
<p>
It will simulate the user hitting the F11 key which will turn the IE to
fullscreen mode. The only problem is that when viewing the page, you'll see this message:
</p><p align="center"><img src="http://www.miky-schreiber.com/Blog/content/binary/ActiveXPromt.JPG" border="0" /></p><p>
This takes us to step 2.
</p><p><u>Step 2 - Enabling ActiveX</u></p><p>
First, I'll show you how to do this on your local maching and then you'll ask your
system administrator to enable it on all the machines in the organization using distribution.
Enter the Tools menu in IE and hit Internet Options. Click on the Security tab and
make sure the "Trusted Sites" zone is selected. Note that the Panorama Dashboards
site is already defined as trusted site (if the initial installation of Panorama Dashboards
made according to the installation manual. If it's not, you have a problem). Click
on "Custom Level" and Enable the "Initialize and script ActiveX ..." option:
</p><p align="center"><img src="http://www.miky-schreiber.com/Blog/content/binary/EnableActiveXIE.JPG" border="0" /></p><p align="left">
Now, you'll see that there's no promting for ActiveX controls. Show this to your sys
admin and ask him to make this happen on every user's machine (using distribution,
of course). As I said, the dashboards site is a trusted site so I can't see any problem
to enable this. The result is very beautiful and can make a lot of users happy. Note
that you can also add a button in your page that will call the same script in order
to return to normal mode.
</p><p align="left">
Enjoy.
</p><img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=8d29e8e0-e3af-42d3-a3c3-f5ee6df13102" /></body>
      <title>Entering the Dashboards Site in Full Screen Mode</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,8d29e8e0-e3af-42d3-a3c3-f5ee6df13102.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,8d29e8e0-e3af-42d3-a3c3-f5ee6df13102.aspx</link>
      <pubDate>Wed, 17 Jun 2009 08:08:44 GMT</pubDate>
      <description>&lt;p&gt;
A wonderful idea I heard of is to turn to full screen mode in Internet Explorer when
entering the Dashboard site. It can make a better user experience. Try it yourself
and you'll see the&amp;nbsp;huge difference.&lt;br&gt;
How will we&amp;nbsp;do that? We will add a JavaScript code to the first page of the dashboards
site and after that we'll ask our system administrator to enable this script for us.
Let's get to work: 
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;Step 1 - The JavaScript&lt;/u&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
Create a new HTML component in the dashboard page. Edit it and click on the "View
Source" button (the one with the &amp;lt;&amp;gt;). Enter the following code:&lt;br&gt;
&amp;lt;SCRIPT&amp;gt;&lt;br&gt;
var wscript = new ActiveXObject("Wscript.shell");&lt;br&gt;
wscript.SendKeys("{F11}");&lt;br&gt;
&amp;lt;/SCRIPT&amp;gt; 
&lt;p&gt;
It will simulate the user&amp;nbsp;hitting the&amp;nbsp;F11 key which will turn the IE to
fullscreen mode. The only problem is that when viewing the page, you'll see this message:
&lt;/p&gt;
&lt;p align=center&gt;
&lt;img src="http://www.miky-schreiber.com/Blog/content/binary/ActiveXPromt.JPG" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
This takes us to step 2.
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;Step 2 - Enabling ActiveX&lt;/u&gt;
&lt;/p&gt;
&lt;p&gt;
First, I'll show you how to do this on your local maching and then you'll ask your
system administrator to enable it on all the machines in the organization using distribution.
Enter the Tools menu in IE and hit Internet Options. Click on the Security tab and
make sure the "Trusted Sites" zone is selected. Note that the Panorama Dashboards
site is already defined as trusted site (if the initial installation of Panorama Dashboards
made according to the installation manual. If it's not, you have a problem). Click
on "Custom Level" and Enable the "Initialize and script ActiveX ..." option:
&lt;/p&gt;
&lt;p align=center&gt;
&lt;img src="http://www.miky-schreiber.com/Blog/content/binary/EnableActiveXIE.JPG" border=0&gt;
&lt;/p&gt;
&lt;p align=left&gt;
Now, you'll see that there's no promting for ActiveX controls. Show this to your sys
admin and ask him to make this happen on every user's machine (using distribution,
of course). As I said, the dashboards site is a trusted site so I can't see any problem
to enable this. The result is very beautiful and can make a lot of users happy. Note
that you can also add a button in your page that will call the same script in order
to return to normal mode.
&lt;/p&gt;
&lt;p align=left&gt;
Enjoy.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=8d29e8e0-e3af-42d3-a3c3-f5ee6df13102" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,8d29e8e0-e3af-42d3-a3c3-f5ee6df13102.aspx</comments>
      <category>BI;BI/Panorama;Programming;Programming/Web</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=9ab606eb-512e-43b8-9a34-f32dd5324406</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,9ab606eb-512e-43b8-9a34-f32dd5324406.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,9ab606eb-512e-43b8-9a34-f32dd5324406.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=9ab606eb-512e-43b8-9a34-f32dd5324406</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
When adding parameters to your view, you'll see that they appear in the upper-left
corner of the grid/crosstab. In the NovaView Desktop program it can be tolerated,
but in the Web Access or in the Dashboards web site it cannot be. It's very annoying
and we can't let the users see our inside use of the parameters. What can we do?
</p>
        <p>
The solution is very simple: We need to change the skin of the view/dashboards page/dashboards
site (depends on how you work) and make the grid corner font's color identical to
the color of the grid's background. That way, the users will not see the text in the grid's
corner. The way of doing it is also not hard:
</p>
        <p>
          <em>Remember: Always backup your files before modifying them</em>. In the panorama
folder, enter E-BI/Config/Skins and enter your skin's folder. In the classic way of
work, you're using the default skin which can be changed in the Dashboards settings
section. I recommend you to make a new skin out from the default one (see <a href="http://kb.panorama.com/index.php?option=com_content&amp;task=view&amp;id=185&amp;Itemid=2">here</a>),
update the skin's name in the Dashboards settings section and not touching the default
skin itself. In your new skin, change the GridCornerFont setting so that its
color will be the color of the grid's corner's background. You can see the color of
the grid's corner in the GridTopLeftBackground setting. For example, if GridTopLeftBackground=(194,210,226),
then if you set GridCornerFont=((Arial,1,R),(194,210,226)) then no-one will see
the text over there.
</p>
        <p>
Enjoy.
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=9ab606eb-512e-43b8-9a34-f32dd5324406" />
      </body>
      <title>Panorama's Grid Corner Problem</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,9ab606eb-512e-43b8-9a34-f32dd5324406.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,9ab606eb-512e-43b8-9a34-f32dd5324406.aspx</link>
      <pubDate>Tue, 09 Jun 2009 12:55:27 GMT</pubDate>
      <description>&lt;p&gt;
When adding parameters to your view, you'll see that they appear in the upper-left
corner of the grid/crosstab. In the NovaView Desktop program it can be tolerated,
but in the Web Access or in the Dashboards web site it cannot be. It's very annoying
and we can't let the users see our inside use of the parameters. What can we do?
&lt;/p&gt;
&lt;p&gt;
The solution is very simple: We need to change the skin of the view/dashboards page/dashboards
site (depends on how you work) and make the grid corner font's color identical to
the color of the grid's background. That way, the users will not see the text in the&amp;nbsp;grid's
corner.&amp;nbsp;The way of doing it is also not hard:
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Remember: Always backup your files before modifying them&lt;/em&gt;. In the panorama
folder, enter E-BI/Config/Skins and enter your skin's folder. In the classic way of
work, you're using the default skin which can be changed in the Dashboards settings
section. I recommend you to make a new skin out from the default one (see &lt;a href="http://kb.panorama.com/index.php?option=com_content&amp;amp;task=view&amp;amp;id=185&amp;amp;Itemid=2"&gt;here&lt;/a&gt;),
update the skin's name in the Dashboards settings section and not touching the default
skin itself. In your new skin, change the GridCornerFont setting&amp;nbsp;so that its
color will be the color of the grid's corner's background. You can see the color of
the grid's corner&amp;nbsp;in the GridTopLeftBackground setting. For example, if GridTopLeftBackground=(194,210,226),
then if you set&amp;nbsp;GridCornerFont=((Arial,1,R),(194,210,226)) then no-one will see
the text over there.
&lt;/p&gt;
&lt;p&gt;
Enjoy.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=9ab606eb-512e-43b8-9a34-f32dd5324406" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,9ab606eb-512e-43b8-9a34-f32dd5324406.aspx</comments>
      <category>BI;BI/Panorama</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=e52c58d8-4e4f-4077-9656-5242bcf49f7c</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,e52c58d8-4e4f-4077-9656-5242bcf49f7c.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,e52c58d8-4e4f-4077-9656-5242bcf49f7c.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=e52c58d8-4e4f-4077-9656-5242bcf49f7c</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Trying to build ASP.NET page with Panorama
applets, I could not understand why the applets appeared blank when I put them in
tables. After a while, I've found that this got something to do with the DOCTYPE declaration
that each aspx has in its head (<span class="doctype">!DOCTYPE html PUBLIC "-//W3C//DTD
XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span>).
When I removed this line, it all seems to work fine. Digging into this <a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">DTD
specification</a>, I can't see anything that will prevent from applet tag to appear
inside td tag. Strange.<br /><p></p><img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=e52c58d8-4e4f-4077-9656-5242bcf49f7c" /></body>
      <title>Using Applet Tag in ASP.NET Pages</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,e52c58d8-4e4f-4077-9656-5242bcf49f7c.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,e52c58d8-4e4f-4077-9656-5242bcf49f7c.aspx</link>
      <pubDate>Mon, 01 Jun 2009 11:32:34 GMT</pubDate>
      <description>Trying to build ASP.NET page with Panorama applets, I could not understand why the applets appeared blank when I put them in tables. After a while, I've found that this got something to do with the DOCTYPE declaration that each aspx has in its head (&lt;span class="doctype"&gt;!DOCTYPE
html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&lt;/span&gt;).
When I removed this line, it all seems to work fine. Digging into this &lt;a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;DTD
specification&lt;/a&gt;, I can't see anything that will prevent from applet tag to appear
inside td tag. Strange.&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=e52c58d8-4e4f-4077-9656-5242bcf49f7c" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,e52c58d8-4e4f-4077-9656-5242bcf49f7c.aspx</comments>
      <category>BI;BI/Panorama;Programming;Programming/Web</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=db6b1c12-2e99-44de-be5f-627166d2dd65</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,db6b1c12-2e99-44de-be5f-627166d2dd65.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,db6b1c12-2e99-44de-be5f-627166d2dd65.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=db6b1c12-2e99-44de-be5f-627166d2dd65</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A new desire came from one of our customers. The request was to have the ability to
search in Panorama Crosstab. The first solution I thought of was searching the grid
in iterative way and it worked fine using the Panorama SDK. After that, my friend
Boris came with another simple and elegant solution: We can use Parameter in the Panorama
view and highlight the number which was defined in the parameter. In this post I'll
explain how to implement this.
</p>
        <p>
1. Create a new view using Panorama NovaView Desktop and make sure you see the
grid in the view.
</p>
        <p>
2. Define a new parameter: Click on View -&gt; Paramaters, and click on the "Manage
Parameters" button. Click on Add. The default type is Number and this is exactly what
wee need (for now). In the name, type Highlight and in the Default Value type a number
that you see in the grid (this is the number that will be highlighted later). Let's
take 0 for example. Click on OK twice and close the little Parameters window.
</p>
        <p>
3. Create a new Exception: Click on Data -&gt; Exceptions -&gt; Exceptions... -&gt; Add.
Click on Next and then choose "Custom Exception". Click on "Edit Exception" and there
write the following formula: [Measures].CurrentMember = [[Highlight]]<br />
This will simply select all the cells with the number that we defined earlier in the
Highlight parameter. Click on OK and click Next. In this step, define the style of
the highlighted cells. I picked red color and Bold font style. You can click on Finish
now and then click OK. Open the small Parameters window (right click in the crosstab's
corner and choose Parameters) and click on "Apply Changes". Now, you will see that
all the cells with 0 are highlighted. If you don't see it, check that you did all
the steps correctly.
</p>
        <p>
4. When we will show the view to the user, we don't want to show him anything highlighed
when the view is loaded. This is where a little trick takes place: open the small
Parameters window (right click in the crosstab's corner and choose Parameters), double
click on the Highlight parameter. Choose String as the parameter type (on the right
part) and in the Default value, enter abc. Click twice on OK and then on the
apply button and you'll see that now the highlighed cells are regular ones.
</p>
        <p>
5. In the dashboards page, or in the web page you created using the Panorama SDK,
create a button that will call the function searchGrid. Just add the button the property
onclick="searchGrid('master')", where master is the applet's name. this is the code
of the searchGrid function:
</p>
        <p>
function searchGrid (applet) {<br />
var reply = prompt('Please enter the number to search','');<br />
eval(applet + '.CallUpdateParametersEx("P|~|Highlight|~|' + reply + '|~~|")');<br />
}
</p>
Another tweaks I implemented and I didn't write in this post in order to make it simple
(for advanced developers only): 
<ul><li>
You can search all the views in the current web/dashboard page. Just call the function
for every applet, but make it in Batch mode.</li><li>
You can search all the grid even if the user doesn't see all the rows. You can tell
him if the number he searched for is in there or not.</li></ul><p>
That's all. Test your new page and enjoy. For every question about this and anything
else, you can leave a comment or write my mail.
</p><img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=db6b1c12-2e99-44de-be5f-627166d2dd65" /></body>
      <title>Searching in Panorama Crosstab</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,db6b1c12-2e99-44de-be5f-627166d2dd65.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,db6b1c12-2e99-44de-be5f-627166d2dd65.aspx</link>
      <pubDate>Sun, 31 May 2009 08:11:47 GMT</pubDate>
      <description>&lt;p&gt;
A new desire came from one of our customers. The request was to have the ability to
search in Panorama Crosstab. The first solution I thought of was searching the grid
in iterative way and it worked fine&amp;nbsp;using the Panorama SDK. After that, my friend
Boris came with another simple and elegant solution: We can use Parameter in the Panorama
view and highlight the number which was defined in the parameter. In this post I'll
explain how to implement this.
&lt;/p&gt;
&lt;p&gt;
1. Create a new view using Panorama NovaView Desktop and make sure you see&amp;nbsp;the
grid in the view.
&lt;/p&gt;
&lt;p&gt;
2. Define a new parameter: Click on View -&amp;gt; Paramaters, and click on the "Manage
Parameters" button. Click on Add. The default type is Number and this is exactly what
wee need (for now). In the name, type Highlight and in the Default Value type a number
that you see in the grid (this is the number that will be highlighted later). Let's
take 0 for example. Click on OK twice and close the little Parameters window.
&lt;/p&gt;
&lt;p&gt;
3. Create a new Exception: Click on Data -&amp;gt; Exceptions -&amp;gt; Exceptions... -&amp;gt;&amp;nbsp;Add.
Click on Next and then choose "Custom Exception". Click on "Edit Exception" and there
write the following formula: [Measures].CurrentMember = [[Highlight]]&lt;br&gt;
This will simply select all the cells with the number that we defined earlier in the
Highlight parameter. Click on OK and click Next. In this step, define the style of
the highlighted cells. I picked red color and Bold font style. You can click on Finish
now and then click OK. Open the small Parameters window (right click in the crosstab's
corner and choose Parameters) and click on "Apply Changes". Now, you will see that
all the cells with 0 are highlighted. If you don't see it, check that you did all
the steps correctly.
&lt;/p&gt;
&lt;p&gt;
4. When we will show the view to the user, we don't want to show him anything highlighed
when the view is loaded. This is where a little trick takes place: open the small
Parameters window (right click in the crosstab's corner and choose Parameters), double
click on the Highlight parameter. Choose String as the parameter type (on the right
part)&amp;nbsp;and in the Default value, enter abc. Click twice on OK and then on the
apply button and you'll see that now the highlighed cells are regular ones.
&lt;/p&gt;
&lt;p&gt;
5. In the dashboards page, or in the web page you created using the Panorama SDK,
create a button that will call the function searchGrid. Just add the button the property
onclick="searchGrid('master')", where master is the applet's name. this is the code
of the searchGrid function:
&lt;/p&gt;
&lt;p&gt;
function searchGrid (applet) {&lt;br&gt;
var reply = prompt('Please enter the number to search','');&lt;br&gt;
eval(applet + '.CallUpdateParametersEx("P|~|Highlight|~|' + reply + '|~~|")');&lt;br&gt;
}
&lt;/p&gt;
Another tweaks I implemented and I didn't write in this post in order to make it simple
(for advanced developers only): 
&lt;ul&gt;
&lt;li&gt;
You can search all the views in the current web/dashboard page. Just call the function
for every applet, but make it in Batch mode.&lt;/li&gt;
&lt;li&gt;
You can search all the grid even if the user doesn't see all the rows. You can tell
him if the number he searched for is in there or not.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
That's all. Test your new page and enjoy. For every question about this and anything
else, you can leave a comment or write my mail.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=db6b1c12-2e99-44de-be5f-627166d2dd65" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,db6b1c12-2e99-44de-be5f-627166d2dd65.aspx</comments>
      <category>BI;BI/Panorama</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=09abb275-1b87-4d76-ac28-e65e4a73d469</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,09abb275-1b87-4d76-ac28-e65e4a73d469.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,09abb275-1b87-4d76-ac28-e65e4a73d469.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=09abb275-1b87-4d76-ac28-e65e4a73d469</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
When you develope a big Panorama Dashboards site, you'll have a lot of javascript
code in the background. We use JS to call the Panorama SDK functions and methods,
make the <a href="http://www.miky-schreiber.com/Blog/PermaLink,guid,89b9ed83-352d-4623-9f2c-45dedeb3543b.aspx">server
side</a> and the client side work together and to make the website dynamic and
user-friendly. After few days, you'll see that you have a lot of code out there, so
you must organize it (if you didn't do it in the first place). My friend Doron wrote
a great <a href="http://blogs.microsoft.co.il/blogs/dorony/archive/2009/04/03/writing-maintainable-javascript-guidelines.aspx">post</a> about
JS development guidelines which can help Panorama Dashboards developers and any big
website developers.
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=09abb275-1b87-4d76-ac28-e65e4a73d469" />
      </body>
      <title>JavaScript Development Guidelines</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,09abb275-1b87-4d76-ac28-e65e4a73d469.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,09abb275-1b87-4d76-ac28-e65e4a73d469.aspx</link>
      <pubDate>Tue, 07 Apr 2009 20:12:17 GMT</pubDate>
      <description>&lt;p&gt;
When you develope a big Panorama Dashboards site, you'll have a lot of javascript
code in the background. We use JS to call the Panorama SDK functions and methods,
make the &lt;a href="http://www.miky-schreiber.com/Blog/PermaLink,guid,89b9ed83-352d-4623-9f2c-45dedeb3543b.aspx"&gt;server
side&lt;/a&gt; and the client side work&amp;nbsp;together and to make the website dynamic and
user-friendly. After few days, you'll see that you have a lot of code out there, so
you must organize it (if you didn't do it in the first place). My friend Doron wrote
a great &lt;a href="http://blogs.microsoft.co.il/blogs/dorony/archive/2009/04/03/writing-maintainable-javascript-guidelines.aspx"&gt;post&lt;/a&gt; about
JS development guidelines which can help Panorama Dashboards developers and any big
website developers.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=09abb275-1b87-4d76-ac28-e65e4a73d469" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,09abb275-1b87-4d76-ac28-e65e4a73d469.aspx</comments>
      <category>BI;BI/Panorama;Programming;Tips &amp; Tricks</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=e8983b76-ab68-4cf3-824b-77b340acc19c</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,e8983b76-ab68-4cf3-824b-77b340acc19c.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,e8983b76-ab68-4cf3-824b-77b340acc19c.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=e8983b76-ab68-4cf3-824b-77b340acc19c</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Very easy. In Sql Server:<br />
Select top n * from my_table<br />
In Oracle:<br />
Select * from my_table where rownum &lt;= n<br /><p>
It can be very useful in many many cases. For example, you're designing DWH over a
system and you're looking at a certain field in one of its tables. You want to know
which values this field contains, but fetching "select distinct my_field from my_table"
takes too much time. Instead, if you <strike>believe</strike> know that the data is
well distributed, you can use "select distinct my_field from my_table where rownum
&lt;= n". Use 1000 for n in the first trial and add one zero in the end of the number
n every time until you got a query that takes too much time than you want to wait. after
you got the n you can live with, can use the values you have in your query result.
</p><img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=e8983b76-ab68-4cf3-824b-77b340acc19c" /></body>
      <title>Fetching N Rows In Sql Server and Oracle</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,e8983b76-ab68-4cf3-824b-77b340acc19c.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,e8983b76-ab68-4cf3-824b-77b340acc19c.aspx</link>
      <pubDate>Tue, 07 Apr 2009 19:54:28 GMT</pubDate>
      <description>Very easy. In Sql Server:&lt;br&gt;
Select top n * from my_table&lt;br&gt;
In Oracle:&lt;br&gt;
Select * from my_table where rownum &amp;lt;= n&lt;br&gt;
&lt;p&gt;
It can be very useful in many many cases. For example, you're designing DWH over a
system and you're looking at a certain field in one of its tables. You want to know
which values this field contains, but fetching "select distinct my_field from my_table"
takes too much time. Instead, if you &lt;strike&gt;believe&lt;/strike&gt; know that the data is
well distributed, you can use "select distinct my_field from my_table where rownum
&amp;lt;= n". Use 1000 for n in the first trial and add one zero in the end of the number
n every time until you got a query that takes too much time than you want to wait.&amp;nbsp;after
you&amp;nbsp;got the n you can live with, can use the values you have in your query result.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=e8983b76-ab68-4cf3-824b-77b340acc19c" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,e8983b76-ab68-4cf3-824b-77b340acc19c.aspx</comments>
      <category>BI;BI/DataWarehousing;BI/SQL Server 2005;BI/SQL Server 2008;BI/Oracle</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=89b9ed83-352d-4623-9f2c-45dedeb3543b</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,89b9ed83-352d-4623-9f2c-45dedeb3543b.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,89b9ed83-352d-4623-9f2c-45dedeb3543b.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=89b9ed83-352d-4623-9f2c-45dedeb3543b</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
We're now beginning a quick session of Panorama Dashboard development using the 5.5
version. The Dashboard site is written in ASP, so it seems very native to write our
custom code also in ASP. On the other hand, writing in C# is much more fun, so we
decided to try and see if we can make the server side code be in C#. We found that
it is indeed possible. You can place an iframe with ASP.NET page and reference the
dashboard page from it using JavaScript (start from page.parent and go on from
there).
</p>
        <p>
This way you can enjoy the two worlds. In the next posts I'll show some examples of
what you can do using this method.
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=89b9ed83-352d-4623-9f2c-45dedeb3543b" />
      </body>
      <title>Developing Panorama Dashboards with .Net</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,89b9ed83-352d-4623-9f2c-45dedeb3543b.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,89b9ed83-352d-4623-9f2c-45dedeb3543b.aspx</link>
      <pubDate>Sun, 22 Mar 2009 21:55:14 GMT</pubDate>
      <description>&lt;p&gt;
We're now beginning a quick session of Panorama Dashboard development using the 5.5
version. The Dashboard site is written in ASP, so it seems very native to write&amp;nbsp;our
custom code also in ASP. On the other hand, writing in C# is much more fun, so we
decided to try and see if we can make the server side code be in C#. We found that
it is indeed possible. You can place an iframe with ASP.NET page and reference the
dashboard page from it&amp;nbsp;using JavaScript (start from page.parent and go on from
there).
&lt;/p&gt;
&lt;p&gt;
This way you can enjoy the two worlds. In the next posts I'll show some examples of
what you can do using this method.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=89b9ed83-352d-4623-9f2c-45dedeb3543b" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,89b9ed83-352d-4623-9f2c-45dedeb3543b.aspx</comments>
      <category>BI;BI/Panorama</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=cbc9ec2a-6745-411d-ba63-19561dc9f411</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,cbc9ec2a-6745-411d-ba63-19561dc9f411.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,cbc9ec2a-6745-411d-ba63-19561dc9f411.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=cbc9ec2a-6745-411d-ba63-19561dc9f411</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
There are some things you can only learn in the hard way. It didn't happenned
to me personally but to my team friends, so I consider it as it is my bad.
</p>
        <p>
We upgraded our ETL tool - Informatica, from version 8.5 to 8.6. We had to run
some tests to see that the results are the same. So, what we did is to save the result
table from 8.5 in Excel, save the result table from 8.6 in Excel and then compare
them using Excel-built-in functions. The only problem is we didn't pay attention to
the places where zero and null interchanged. This happened because the two versions
act differently where null values take places in aggregation functions. For example,
when there is a sum function and it aggregates only on null values. In one version
the output is zero and in the other the output is null... 
</p>
        <p>
This can also happen in other tools and technology. For example, in OLAP cubes the
difference between zero and null is the difference between seeing the member of the
dimension on the screen and not knowing of its existence.
</p>
        <p>
For conclusion, always be aware to this point and don't forget to check it.
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=cbc9ec2a-6745-411d-ba63-19561dc9f411" />
      </body>
      <title>The Difference between null and zero</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,cbc9ec2a-6745-411d-ba63-19561dc9f411.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,cbc9ec2a-6745-411d-ba63-19561dc9f411.aspx</link>
      <pubDate>Sun, 22 Mar 2009 21:09:59 GMT</pubDate>
      <description>&lt;p&gt;
There are some things you can only learn&amp;nbsp;in&amp;nbsp;the hard way. It didn't happenned
to me personally but to my team friends, so I consider it as it is my bad.
&lt;/p&gt;
&lt;p&gt;
We upgraded our ETL tool&amp;nbsp;- Informatica, from version 8.5 to 8.6. We had to&amp;nbsp;run
some tests to see that the results are the same. So, what we did is to save the result
table from 8.5 in Excel, save the result table from 8.6 in Excel and then compare
them using Excel-built-in functions. The only problem is we didn't pay attention to
the places where zero and null interchanged. This happened because the two versions
act differently where null values take places in aggregation functions. For example,
when there is a sum function and it aggregates only on null values. In one version
the output is zero and in the other the output is null... 
&lt;/p&gt;
&lt;p&gt;
This can also happen in other tools and technology. For example, in OLAP cubes the
difference between zero and null is the difference between seeing the member of the
dimension on the screen and not knowing of its existence.
&lt;/p&gt;
&lt;p&gt;
For conclusion, always be aware to this point and don't forget to check it.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=cbc9ec2a-6745-411d-ba63-19561dc9f411" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,cbc9ec2a-6745-411d-ba63-19561dc9f411.aspx</comments>
      <category>BI;BI/DataWarehousing;BI/Informatica;BI/SQL Server 2005;BI/SQL Server 2005/Analysis Services;BI/SQL Server 2008;BI/SQL Server 2008/Analysis Services</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=6e4ca812-5a91-49b9-9b9e-64ef1e978257</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,6e4ca812-5a91-49b9-9b9e-64ef1e978257.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,6e4ca812-5a91-49b9-9b9e-64ef1e978257.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=6e4ca812-5a91-49b9-9b9e-64ef1e978257</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Here are some tips we collected <strike>over the years</strike> about dashboard design:
</p>
        <p>
          <u>Page Layout</u>
        </p>
        <ul>
          <li>
Less is more - don't put too many views in the page.</li>
          <li>
Rule of thumb - no more than five reports in one page.</li>
          <li>
Don't use scrolling - the average user won't scroll down the screen.</li>
          <li>
Position in screen - some researches made about this subject and here are the recommendations:</li>
          <ul>
            <li>
Top-Left - it's the part of the screen that the user looks at first. Put there the
most important data.</li>
            <li>
Center of the screen - the part the user looks after the top-left. Put there the second-most
important data.</li>
            <li>
Top-Right, Bottom-Left - Neutral parts.</li>
            <li>
Bottom-Right - The user won't pay attention to it, don't put there important data.</li>
          </ul>
          <li>
Fixed menus in every page.</li>
          <li>
Small amount of navigation targets in every page. Too much navigation paths will cause
confusion.</li>
          <li>
Concentrate on the main page - in 90% of the cases the user will stay there.</li>
          <li>
Add graphic components and highlight them if necessary.</li>
          <li>
Blue color only to links (and underline, of course).</li>
        </ul>
        <p>
          <u>Views Layout</u>
        </p>
        <ul>
          <li>
Two digits after the decimal point - in non-integer number, put only two digits after
the decimal point. The human mind can't understand more than that.</li>
          <li>
Focus on the clarity of the data and not only on its beauty. For example, 3D pie charts
are very beautiful, but flatting them will make them more clear to the user.</li>
          <li>
Measures have meaning only when compared to other data. Don't put stand-alone measure.</li>
          <li>
Pay attention to graphical change between the data and not only colors. Remember that
there are color-blind users.</li>
          <li>
Text is more clear than icons.</li>
          <li>
Use the San Serif and Arial fonts. They are the most readable to the user.</li>
          <li>
Align the text only to one side and not to the middle. It seems better to programmers,
but users want their text aligned to the left or to the right.</li>
          <li>
Colors - don't use too much color. The dashboard page is not a jungle. Use colors
of the same family.</li>
          <li>
Put dark text on bright background the vise versa.</li>
        </ul>
        <p>
And to conclude - use CSS whenever you can. It will save you much time and effort.
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=6e4ca812-5a91-49b9-9b9e-64ef1e978257" />
      </body>
      <title>Dashboards Design Tips</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,6e4ca812-5a91-49b9-9b9e-64ef1e978257.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,6e4ca812-5a91-49b9-9b9e-64ef1e978257.aspx</link>
      <pubDate>Sun, 22 Feb 2009 12:14:26 GMT</pubDate>
      <description>&lt;p&gt;
Here are some tips we collected &lt;strike&gt;over the years&lt;/strike&gt; about dashboard design:
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;Page Layout&lt;/u&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Less is more - don't put too many views in the page.&lt;/li&gt;
&lt;li&gt;
Rule of thumb - no more than five reports in one page.&lt;/li&gt;
&lt;li&gt;
Don't use scrolling - the average user won't scroll down the screen.&lt;/li&gt;
&lt;li&gt;
Position in screen - some researches made about this subject and here are the recommendations:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;
Top-Left - it's the part of the screen that the user looks at first. Put there the
most important data.&lt;/li&gt;
&lt;li&gt;
Center of the screen - the part the user looks after the top-left. Put there the second-most
important data.&lt;/li&gt;
&lt;li&gt;
Top-Right, Bottom-Left - Neutral parts.&lt;/li&gt;
&lt;li&gt;
Bottom-Right - The user won't pay attention to it, don't put there important data.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
Fixed menus in every page.&lt;/li&gt;
&lt;li&gt;
Small amount of navigation targets in every page. Too much navigation paths will cause
confusion.&lt;/li&gt;
&lt;li&gt;
Concentrate on the main page - in 90% of the cases the user will stay there.&lt;/li&gt;
&lt;li&gt;
Add graphic components and highlight them if necessary.&lt;/li&gt;
&lt;li&gt;
Blue color only to links (and underline, of course).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;u&gt;Views Layout&lt;/u&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Two digits after the decimal point - in non-integer number, put only two digits after
the decimal point. The human mind can't understand more than that.&lt;/li&gt;
&lt;li&gt;
Focus on the clarity of the data and not only on its beauty. For example, 3D pie charts
are very beautiful, but flatting them will make them more clear to the user.&lt;/li&gt;
&lt;li&gt;
Measures have meaning only when compared to other data. Don't put stand-alone measure.&lt;/li&gt;
&lt;li&gt;
Pay attention to graphical change between the data and not only colors. Remember that
there are color-blind users.&lt;/li&gt;
&lt;li&gt;
Text is more clear than icons.&lt;/li&gt;
&lt;li&gt;
Use the San Serif and Arial fonts. They are the most readable to the user.&lt;/li&gt;
&lt;li&gt;
Align the text only to one side and not to the middle. It seems better to programmers,
but users want their text aligned to the left or to the right.&lt;/li&gt;
&lt;li&gt;
Colors - don't use too much color. The dashboard page is not a jungle. Use colors
of the same family.&lt;/li&gt;
&lt;li&gt;
Put dark text on bright background the vise versa.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
And to conclude - use CSS whenever you can. It will save you much time and effort.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=6e4ca812-5a91-49b9-9b9e-64ef1e978257" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,6e4ca812-5a91-49b9-9b9e-64ef1e978257.aspx</comments>
      <category>BI;BI/Panorama;Tips &amp; Tricks</category>
    </item>
    <item>
      <trackback:ping>http://www.miky-schreiber.com/Blog/Trackback.aspx?guid=fbb5bc6d-aa89-4a58-ba97-46735bd86700</trackback:ping>
      <pingback:server>http://www.miky-schreiber.com/Blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.miky-schreiber.com/Blog/PermaLink,guid,fbb5bc6d-aa89-4a58-ba97-46735bd86700.aspx</pingback:target>
      <dc:creator>mikypuff</dc:creator>
      <wfw:comment>http://www.miky-schreiber.com/Blog/CommentView,guid,fbb5bc6d-aa89-4a58-ba97-46735bd86700.aspx</wfw:comment>
      <wfw:commentRss>http://www.miky-schreiber.com/Blog/SyndicationService.asmx/GetEntryCommentsRss?guid=fbb5bc6d-aa89-4a58-ba97-46735bd86700</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In many cases, extraction of Panorama view's MDX code is necessary. For example, in
order to check whether the performance bottleneck is in Panorama or in the OLAP server,
you can take the MDX code, run it in SQL Server Management Studio and compare run
times. You can take it further more but I'll leave it for future posts.
</p>
        <p>
In Panorama Desktop program, click on Tools -&gt; Direct MDX... and then CTRL + ALT
+ V. Then, you can copy it and use it in any way you want.
</p>
        <img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=fbb5bc6d-aa89-4a58-ba97-46735bd86700" />
      </body>
      <title>Extracting the MDX from Panorama's view</title>
      <guid isPermaLink="false">http://www.miky-schreiber.com/Blog/PermaLink,guid,fbb5bc6d-aa89-4a58-ba97-46735bd86700.aspx</guid>
      <link>http://www.miky-schreiber.com/Blog/PermaLink,guid,fbb5bc6d-aa89-4a58-ba97-46735bd86700.aspx</link>
      <pubDate>Tue, 10 Feb 2009 08:00:54 GMT</pubDate>
      <description>&lt;p&gt;
In many cases, extraction of Panorama view's MDX code is necessary. For example, in
order to check whether the performance bottleneck is in Panorama or in the OLAP server,
you can take the MDX code, run it in SQL Server Management Studio and compare run
times. You can take it further more but I'll leave it for future posts.
&lt;/p&gt;
&lt;p&gt;
In Panorama Desktop program, click on Tools -&amp;gt; Direct MDX... and then CTRL + ALT
+ V. Then, you can copy it and use it in any way you want.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.miky-schreiber.com/Blog/aggbug.ashx?id=fbb5bc6d-aa89-4a58-ba97-46735bd86700" /&gt;</description>
      <comments>http://www.miky-schreiber.com/Blog/CommentView,guid,fbb5bc6d-aa89-4a58-ba97-46735bd86700.aspx</comments>
      <category>BI;BI/Panorama</category>
    </item>
  </channel>
</rss>