<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>David Lai&#039;s Business Intelligence Blog &#187; Workarounds</title>
	<atom:link href="http://davidlai101.com/blog/category/xcelsius/workarounds/feed/" rel="self" type="application/rss+xml" />
	<link>http://davidlai101.com/blog</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Tue, 08 May 2012 15:42:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Using Xcelsius and Webservices to insert comments into a database</title>
		<link>http://davidlai101.com/blog/2012/01/26/using-xcelsius-and-webservices-to-insert-comments-into-a-database/</link>
		<comments>http://davidlai101.com/blog/2012/01/26/using-xcelsius-and-webservices-to-insert-comments-into-a-database/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 03:02:41 +0000</pubDate>
		<dc:creator>David Lai</dc:creator>
				<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[Workarounds]]></category>
		<category><![CDATA[Xcelsius]]></category>
		<category><![CDATA[Comments]]></category>
		<category><![CDATA[SAP BusinessObjects Dashboards]]></category>
		<category><![CDATA[Web Service]]></category>
		<category><![CDATA[Xcelsius 2008]]></category>

		<guid isPermaLink="false">http://davidlai101.com/blog/?p=551</guid>
		<description><![CDATA[A common request that I have seen with my clients, is the ability to enter comments into a dashboard and then view those comments when they re-open the dashboard in the future. Unfortunately Xcelsius does not have a native mechanism to send data back to the database, as a dashboard&#8217;s main purpose to read data [...]]]></description>
			<content:encoded><![CDATA[<p>A common request that I have seen with my clients, is the ability to enter comments into a dashboard and then view those comments when they re-open the dashboard in the future.</p>
<p>Unfortunately Xcelsius does not have a native mechanism to send data back to the database, as a dashboard&#8217;s main purpose to read data and not write back to the database.  However, I do see the value in being able to persist comments so that we can go back later and be able to look at documentation on why certain things happened, etc.</p>
<p>In this article I will give step by step instructions on how to use web services and Xcelsius to accomplish the task of inserting comments.  However you will have to write your own web service code <img src='http://davidlai101.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://davidlai101.com/blog/wp-content/uploads/2012/01/lifecycle.png"><img class="aligncenter size-full wp-image-560" title="lifecycle" src="http://davidlai101.com/blog/wp-content/uploads/2012/01/lifecycle.png" alt="Web Service Comments life cycle" width="664" height="781" /></a></p>
<h1><span id="more-551"></span></h1>
<h1>Preparation</h1>
<p>In order to facilitate the ability to create comments from Xcelsius we must have a mechanism to do so and a place to persist the comments.</p>
<p>You will need to store the comments in a database.</p>
<p>Thus you will need the following:</p>
<ul>
<li>Database</li>
<li>Database table that will house the comments and additional parameters such as user, dashboard, etc</li>
</ul>
<p>To allow Xcelsius to send comments to the database, we will need to create a <em>Web Service</em> and then call that <em>Web Service</em> from Xcelsius while sending in the appropriate parameters (comments, user, dashboard, etc).</p>
<p>To facilitate the ability to use Web Services, you must have a .NET or Java application server available.</p>
<h1>Pseudo steps to create the Web Service</h1>
<ol>
<li>Start creating your web service using the programming language of choice (VB .NET or Java)</li>
<li>Create a method that will house your “insert comment” code</li>
<li>Method will need to have input parameters that contains your comment text and any other parameters such as user, dashboard, etc</li>
</ol>
<p><span style="color: #99ccff;"><strong>       Steps in the method</strong></span></p>
<ol>
<li><span style="color: #99ccff;">Log into database</span></li>
<li><span style="color: #99ccff;">Begin Transaction</span></li>
<li><span style="color: #99ccff;">Create insert statement that will insert the input parameters (comment text, etc)</span></li>
<li><span style="color: #99ccff;">Make sure that there is some sort of rollback mechanism to handle errors</span></li>
<li><span style="color: #99ccff;">End transaction</span></li>
<li><span style="color: #99ccff;">Close database connection</span></li>
</ol>
<p>When you are finished coding, you will then need to deploy the Web Service onto your .NET or Java application server.</p>
<h1>Useful Resources to help you code your Web Service</h1>
<p>1.  Introduction on what a Web Service is</p>
<p><a href="http://en.wikipedia.org/wiki/Web_service">http://en.wikipedia.org/wiki/Web_service</a></p>
<p><a href="http://www.w3schools.com/webservices/ws_intro.asp">http://www.w3schools.com/webservices/ws_intro.asp</a></p>
<p>2.  Example of creating a simple VB . NET Web Service for a .NET application server</p>
<p><a href="http://www.w3schools.com/webservices/ws_example.asp">http://www.w3schools.com/webservices/ws_example.asp</a><br />
3.  Example of creating a simple java based Web Service that runs on a Java server</p>
<p><a href="http://www.roseindia.net/webservices/buildingsimplewebservice.shtml">http://www.roseindia.net/webservices/buildingsimplewebservice.shtml</a></p>
<p>4.  Java code to connect to a DB, create a table, insert into table, and retrieve from a table (you are only interested in inserting) Start on step 22 if you are interested in the code</p>
<p><a href="http://www.java2s.com/Code/Java/Database-SQL-JDBC/AccessMySQLDatabaseopenconnectioncreatetableinsertandretrieve.htm">http://www.java2s.com/Code/Java/Database-SQL-JDBC/AccessMySQLDatabaseopenconnectioncreatetableinsertandretrieve.htm</a></p>
<h1>Xcelsius Steps</h1>
<p>In the Xcelsius example, we will walk through the steps on creating an input/output comment box; and creating a web service connection that inserts a user&#8217;s comment into the database.</p>
<p>1.  Drag an <em>Input Text Area</em> and <em>Label </em>component onto the canvas.  Users will enter their comments into the input text area and the label component contain existing comments.</p>
<p>&nbsp;</p>
<p>2.  Bind the <em>Input Text </em>Area to the cell highlighted in yellow.  The web service connection will use this as one of the inputs.</p>
<p style="text-align: center;"><a href="http://davidlai101.com/blog/wp-content/uploads/2012/01/bind_input_text.png"><img class="aligncenter size-full wp-image-558" title="bind_input_text" src="http://davidlai101.com/blog/wp-content/uploads/2012/01/bind_input_text.png" alt="Bind input text" width="908" height="574" /></a></p>
<p>3.  Now let&#8217;s setup our Web Service Connection.  On the data manager, add a <em>Web Service Connection</em> and enter the WSDL url into the <em>WSDL URL: input box</em>.</p>
<p>4.  Bind the input values to the cells of your spreadsheet.  (In our example we bind to 3 input values. Note that the output value is optional so we will skip that part.  In addition we will skip creating a Web Service Connection that retreives prior comments since it uses the same concept of what we are doing here)</p>
<p><a href="http://davidlai101.com/blog/wp-content/uploads/2012/01/datamanager.png"><img class="aligncenter size-full wp-image-559" title="datamanager" src="http://davidlai101.com/blog/wp-content/uploads/2012/01/datamanager.png" alt="Data Manager" width="1116" height="627" /></a></p>
<p>5.  Insert a <em>Connection Refresh Button</em> component onto the canvas.  Make sure the <em>Web Service Connection</em> is checked.</p>
<p><a href="http://davidlai101.com/blog/wp-content/uploads/2012/01/comment_button.png"><img class="aligncenter size-full wp-image-563" title="comment_button" src="http://davidlai101.com/blog/wp-content/uploads/2012/01/comment_button.png" alt="Connection Refresh Button" width="969" height="359" /></a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://davidlai101.com/blog/2012/01/26/using-xcelsius-and-webservices-to-insert-comments-into-a-database/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Embedded Charts inside an Xcelsius Spreadsheet Table</title>
		<link>http://davidlai101.com/blog/2011/02/08/embedded-charts-inside-an-xcelsius-spreadsheet-table/</link>
		<comments>http://davidlai101.com/blog/2011/02/08/embedded-charts-inside-an-xcelsius-spreadsheet-table/#comments</comments>
		<pubDate>Wed, 09 Feb 2011 04:15:32 +0000</pubDate>
		<dc:creator>David Lai</dc:creator>
				<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[Workarounds]]></category>
		<category><![CDATA[Xcelsius]]></category>
		<category><![CDATA[Business Objects Dashboards]]></category>
		<category><![CDATA[Embedded Charts]]></category>
		<category><![CDATA[spreadsheet table]]></category>

		<guid isPermaLink="false">http://davidlai101.com/blog/?p=344</guid>
		<description><![CDATA[One of the important features that Xcelsius lacks right now is to be able to embed charts in a table. This is a very powerful feature as we are able to present a lot of meaningful information with little real estate when embedding charts inside a table as shown. In this example I will give [...]]]></description>
			<content:encoded><![CDATA[<p>One of the important features that Xcelsius lacks right now is to be able to embed<br />
charts in a table. This is a very powerful feature as we are able to present a<br />
lot of meaningful information with little real estate when embedding charts inside<br />
a table as shown.</p>
<div id="attachment_347" class="wp-caption aligncenter" style="width: 312px"><a href="http://davidlai101.com/blog/wp-content/uploads/2011/02/embed_bar_chart.png"><img class="size-medium wp-image-347 " title="Embedded Bar Chart" src="http://davidlai101.com/blog/wp-content/uploads/2011/02/embed_bar_chart-300x117.png" alt="" width="302" height="117" /></a><p class="wp-caption-text">Embedded Bar Chart in Table</p></div>
<p><span id="more-344"></span></p>
<p>In this example I will give step by step instructions on embedding a horizontal bar<br />
chart into a table. This will allow end users to be able to compare values on the<br />
bar making each row visually comparable which adds great value as well as being able<br />
to see other misc table values very easily.</p>
<p>A big thanks goes to Michael Thompson for coming up with a WEBI solution to accomplish<br />
this task if we are using live office.  You can visit his blog post <a href="http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/21193" target="_blank">here</a>.</p>
<div id="attachment_347" class="wp-caption aligncenter" style="width: 310px"><a href="http://davidlai101.com/blog/wp-content/uploads/2011/02/embed_bar_chart.png"><img class="size-medium wp-image-347" title="Embedded Bar Chart" src="http://davidlai101.com/blog/wp-content/uploads/2011/02/embed_bar_chart-300x117.png" alt="" width="300" height="117" /></a><p class="wp-caption-text">Embedded Bar Chart in Table</p></div>
<p>The first option is if the number of rows are static.  If this is the case, we can<br />
simply put a bar chart underneath the table so it looks like it&#8217;s part of the table. We<br />
can then easily bind the chart to the appropriate values.</p>
<p>However this only works if the number of rows are static, the reason being that we<br />
cannot control the synchronization of bar size and spacing with a table that has a<br />
dynamic number of rows.</p>
<p>So now we&#8217;ll show how to accomplish this if we are using Live Office or QAAWS.<br />
<em>Note that you can create an object in the universe that will get the same value as the bar length calculation<br />
we will be performing below. But I&#8217;ll show you the other options so that you will have a variety of<br />
solutions to choose from.</em></p>
<p><strong>If using Live Office:</strong><br />
1. Create an emulated bar using a filler character. To get your filler character<br />
ready, Open up Microsoft Word, then Insert -&gt; Symbol. Make sure the Font is (normal text)<br />
and select Character code &#8220;2588&#8243; from &#8220;Unicode (hex)&#8221;</p>
<p><a href="http://davidlai101.com/blog/wp-content/uploads/2011/02/word_symbol.png"><img class="size-medium wp-image-350 alignnone" style="margin-left: 150px; margin-right: 150px;" title="Bar Character" src="http://davidlai101.com/blog/wp-content/uploads/2011/02/word_symbol-300x231.png" alt="" width="300" height="231" /></a></p>
<p>2. Now let&#8217;s create a new Web Intelligence document.<br />
Choose the eFashion 1998 Universe.<br />
I&#8217;ve just chosen a set of lines, sales revenue measure in my query.<br />
For our table we will have the lines, sales revenue and sales revenue chart as columns</p>
<p style="text-align: center;"><a href="http://davidlai101.com/blog/wp-content/uploads/2011/02/lo_query.png"><img class="size-medium wp-image-351 aligncenter" style="margin-left: 150px; margin-right: 150px;" title="WEBI Query" src="http://davidlai101.com/blog/wp-content/uploads/2011/02/lo_query-300x229.png" alt="" width="300" height="229" /></a></p>
<p>3. Create a variable called &#8220;length of bar&#8221;<br />
The formula for the variable will be &#8220;=Round(([Sales revenue]/(max([Sales revenue]) forall ([Lines]))*40;0)&#8221;<br />
We&#8217;ll use a multiple of 40 because with 100 the bar is too long.</p>
<p style="text-align: center;"><a href="http://davidlai101.com/blog/wp-content/uploads/2011/02/lob_variable.png"><img class="size-medium wp-image-352 aligncenter" style="margin-left: 150px; margin-right: 150px;" title="Length of Bar Variable" src="http://davidlai101.com/blog/wp-content/uploads/2011/02/lob_variable-300x164.png" alt="" width="300" height="164" /></a></p>
<p>4. Go back to your temporary Word document and copy the symbol that you inserted.</p>
<p>Now on the Sales revenue column put the formula shown below<br />
&#8220;=fill(pasted symbol from Word;[length of bar])&#8221;</p>
<p style="text-align: center;"><a href="http://davidlai101.com/blog/wp-content/uploads/2011/02/fill_formula.png"><img class="size-medium wp-image-353 aligncenter" style="margin-left: 100px; margin-right: 100px;" title="Fill Formula" src="http://davidlai101.com/blog/wp-content/uploads/2011/02/fill_formula-300x62.png" alt="" width="350" height="72" /></a></p>
<p>5. In Xcelsius setup your live office connection and bind the values to a spreadsheet table object and you are done!</p>
<p style="text-align: center;"><a href="http://davidlai101.com/blog/wp-content/uploads/2011/02/lo_embedded_final.png"><img class="size-medium wp-image-354 aligncenter" style="margin-left: 150px; margin-right: 150px;" title="Live Office Embedded Chart" src="http://davidlai101.com/blog/wp-content/uploads/2011/02/lo_embedded_final-300x177.png" alt="" width="300" height="177" /></a></p>
<p><strong>If using QWAAS:</strong><br />
Since we can&#8217;t do the logic in WEBI, we&#8217;ll need to do it in Excel to construct the emulated bar.<br />
The logic is very similar.<br />
1. Create a QAAWS object using the same query that we used in the Live Office Example</p>
<p>2. On a cell above the QAAWS values that come in let&#8217;s get the max sales revenue.  We will assume that there are a dynamic<br />
range of rows ranging from 1 to 50 &#8220;=max(B4:B54)&#8221;</p>
<p style="text-align: center;"><a href="http://davidlai101.com/blog/wp-content/uploads/2011/02/qaaws_max.png"><img class="size-medium wp-image-355 aligncenter" style="margin-left: 150px; margin-right: 150px;" title="Get Max Value for denominator" src="http://davidlai101.com/blog/wp-content/uploads/2011/02/qaaws_max-300x242.png" alt="" width="300" height="242" /></a></p>
<p>3. Copy the symbol from Word</p>
<p>Now on each row from C5 to C54 put the formula =&#8221;rept(&#8220;pasted symbol from Word&#8221;, round((B5/$C$2)*40,0))&#8221;<br />
The rept function is just like the fill function in webi.<br />
Also we are using *40 because with 100 the bar will be too long.</p>
<p style="text-align: center;"><a href="http://davidlai101.com/blog/wp-content/uploads/2011/02/qaaws_bar.png"><img class="size-medium wp-image-356 aligncenter" style="margin-left: 150px; margin-right: 150px;" title="Qaaws Excel Formula" src="http://davidlai101.com/blog/wp-content/uploads/2011/02/qaaws_bar-294x300.png" alt="" width="294" height="300" /></a></p>
<p>4. Now copy the columns appropriately so that when we bind to the spreadsheet, the formatting looks nice.</p>
<p style="text-align: center;"><a href="http://davidlai101.com/blog/wp-content/uploads/2011/02/qaaws_embedded_final.png"><img class="size-medium wp-image-357 aligncenter" style="margin-left: 150px; margin-right: 150px;" title="QaaWS version of Embedded Chart" src="http://davidlai101.com/blog/wp-content/uploads/2011/02/qaaws_embedded_final-300x238.png" alt="" width="300" height="238" /></a></p>
<p>That&#8217;s it,<br />
Now that you are familiar with how to emulate a bar, you can try creating a bar length object in the universe so you keep<br />
all data manipulations logic in the data layer for best practices <img src='http://davidlai101.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>You can download the source files for the 3 examples <a href="http://davidlai101.com/blog/wp-content/uploads/2011/02/Embedded-Chart-Examples.zip">here for reference</a></p>
]]></content:encoded>
			<wfw:commentRss>http://davidlai101.com/blog/2011/02/08/embedded-charts-inside-an-xcelsius-spreadsheet-table/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SAP Crystal Dashboard and Presentation Design (Xcelsius) Cookbook Coming Soon!</title>
		<link>http://davidlai101.com/blog/2011/02/07/sap-crystal-dashboard-and-presentation-design-xcelsius-cookbook-coming-soon/</link>
		<comments>http://davidlai101.com/blog/2011/02/07/sap-crystal-dashboard-and-presentation-design-xcelsius-cookbook-coming-soon/#comments</comments>
		<pubDate>Mon, 07 Feb 2011 19:51:13 +0000</pubDate>
		<dc:creator>David Lai</dc:creator>
				<category><![CDATA[Design Practices]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[Main]]></category>
		<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[Workarounds]]></category>
		<category><![CDATA[Xcelsius]]></category>
		<category><![CDATA[Business Objects Dashboards]]></category>
		<category><![CDATA[Cookbook]]></category>
		<category><![CDATA[sap crystal dashboard design]]></category>

		<guid isPermaLink="false">http://davidlai101.com/blog/?p=332</guid>
		<description><![CDATA[I hope that everyone has had a great start to 2011! 2010 was a huge year but 2011 looks to be even bigger! I&#8217;m very pleased to announce that the Xcelsius Cookbook, which Xavier Hacking and I have been working very hard on, is scheduled to be released in it&#8217;s final format on May 2011. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://davidlai101.com/blog/wp-content/uploads/2011/02/cookbook-cover.jpg"><img class="alignleft size-full wp-image-334" title="cookbook cover" src="http://davidlai101.com/blog/wp-content/uploads/2011/02/cookbook-cover.jpg" alt="" width="240" height="296" /></a><strong>I hope that everyone has had a great start to 2011!</strong><br />
<strong>2010 was a huge year but 2011 looks to be even bigger!</strong></p>
<p>I&#8217;m very pleased to announce that the Xcelsius Cookbook, which <a href="http://www.hackingsap.com/blog/">Xavier Hacking</a> and I have been working very hard on, is scheduled to be released in it&#8217;s final format on May 2011.</p>
<p>The book will be structured like a cookbook where we will go through step by step on accomplishing different tasks (recipes) in Xcelsius.</p>
<p>In addition we will be showcasing some of the more popular 3rd party addons, provide best practices for development, as well as provide some real life dashboard examples built using recipes learned from the cookbook.</p>
<p>The book is currently available as RAW (Read as we write) format since it is currently under development, so feel free to check it out at the <a href="https://www.packtpub.com/sap-crystal-dashboard-and-presentation-design-cookbook/book">Packt Publishing website</a> for more information.  In addition, since SAP is re-branding Xcelsius yet again, the book name will most likely change to SAP Business Objects Dashboards Cookbook.  Stay Tuned for updates!</p>
<p>Thanks for all your support!</p>
]]></content:encoded>
			<wfw:commentRss>http://davidlai101.com/blog/2011/02/07/sap-crystal-dashboard-and-presentation-design-xcelsius-cookbook-coming-soon/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Trick to synchronize the hovering/selection of multiple scorecards</title>
		<link>http://davidlai101.com/blog/2010/12/08/trick-to-synchronize-the-hoveringselection-of-multiple-scorecards/</link>
		<comments>http://davidlai101.com/blog/2010/12/08/trick-to-synchronize-the-hoveringselection-of-multiple-scorecards/#comments</comments>
		<pubDate>Thu, 09 Dec 2010 00:51:36 +0000</pubDate>
		<dc:creator>David Lai</dc:creator>
				<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[Workarounds]]></category>
		<category><![CDATA[Xcelsius]]></category>
		<category><![CDATA[hovering]]></category>
		<category><![CDATA[scorecard]]></category>
		<category><![CDATA[syncronize]]></category>

		<guid isPermaLink="false">http://davidlai101.com/blog/?p=313</guid>
		<description><![CDATA[Recently for one of my clients, I had to figure out a way to synchronize the selection of multiple scorecard components. The tables needed to be separated but at the same time we needed to make sure that when hover over a row on one table, that the other tables would have the same row [...]]]></description>
			<content:encoded><![CDATA[<p>Recently for one of my clients, I had to figure out a way to synchronize the selection of multiple scorecard components.  The tables needed to be separated but at the same time we needed to make sure that when hover over a row on one table, that the other tables would have the same row highlighted.</p>
<p>The easiest way to accomplish this is to have a separator column to separate each table, and then overlay a background or rectangle on the blank column.  However the rectangle/background looks very ugly as what I have shown on the video.</p>
<p>Please watch the video for a detailed example on how to accomplish the synchronization trick with multiple scorecards.</p>
<p><span class="youtube">
<iframe title="YouTube video player" class="youtube-player" type="text/html" width="425" height="355" src="http://www.youtube.com/embed/9lDCYXT_5Jw?color1=d6d6d6&amp;color2=f0f0f0&amp;border=0&amp;fs=1&amp;hl=en&amp;modestbranding=1&amp;loop=&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0&amp;rel=1" frameborder="0" allowfullscreen></iframe>
</span><p><a href="http://www.youtube.com/watch?v=9lDCYXT_5Jw"><img src="http://img.youtube.com/vi/9lDCYXT_5Jw/default.jpg" width="130" height="97" border=0></a></p><p><a href="http://www.youtube.com/watch?v=9lDCYXT_5Jw">www.youtube.com/watch?v=9lDCYXT_5Jw</a></p></p>
<p>I&#8217;ve also outlined the steps to accomplish this if you click on &#8220;More&#8221;<br />
<span id="more-313"></span><br />
<strong> Step 1:</strong> Have 2 or more scorecards lined up side by side on the canvas</p>
<p><strong>Step 2:</strong> Stretch the scorecards to the maximum vertical length that you think will be possible. For example it might be a maximum of 20 rows. The reason why we have to do this is because the table doesn&#8217;t automatically shrink even if we ignore blank row cells.</p>
<p><strong>Step 3:</strong> Put the scorecards inside a canvas of your desired vertical length. Make sure that &#8220;vertical scrollbar&#8221; is automatic and &#8220;horizontal scrollbar&#8221; is Off for the Scroll Bar Options of the Canvas container.</p>
<p><strong>Step 4:</strong> On the scorecard components, uncheck the rows selectable option and column sorting</p>
<p><strong>Step 5:</strong> Overlay a list box selector on top of the scorecards and make it the same size and length starting from after the header.  It is important to make sure that the text in both the list box selector and the scorecard components are the same.</p>
<p><strong>Step 6: </strong>Set the transparency on the list box selector to about 80-85% and create a dummy column that has a &#8220;.&#8221; if there exists a value for the scorecard and blank if there is none.  Right justify the list box selector text so we don&#8217;t see the &#8220;.&#8221;</p>
<p>There you go! now when you hover over one scorecard row, it looks like all the scorecard rows are being hovered in sync!</p>
<p>You can download the example xlf file from <a href="http://davidlai101.com/blog/wp-content/uploads/2010/12/sync-scorecard.zip">here</a></p>
]]></content:encoded>
			<wfw:commentRss>http://davidlai101.com/blog/2010/12/08/trick-to-synchronize-the-hoveringselection-of-multiple-scorecards/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Xcelisius Dashboards outside of Infoview with the help of CELogonToken</title>
		<link>http://davidlai101.com/blog/2010/11/18/xcelisius-dashboards-outside-of-infoview-with-the-help-of-celogontoken/</link>
		<comments>http://davidlai101.com/blog/2010/11/18/xcelisius-dashboards-outside-of-infoview-with-the-help-of-celogontoken/#comments</comments>
		<pubDate>Thu, 18 Nov 2010 21:21:12 +0000</pubDate>
		<dc:creator>David Lai</dc:creator>
				<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[Workarounds]]></category>
		<category><![CDATA[Xcelsius]]></category>
		<category><![CDATA[CELogonToken]]></category>
		<category><![CDATA[connectivity]]></category>
		<category><![CDATA[Dashboards outside Infoview]]></category>
		<category><![CDATA[external web application]]></category>
		<category><![CDATA[Infoview]]></category>
		<category><![CDATA[Single Sign On]]></category>

		<guid isPermaLink="false">http://davidlai101.com/blog/?p=279</guid>
		<description><![CDATA[Not all corporations want their employees to access dashboards through Infoview as some may want to access dashboards through a 3rd party website or portal such as Sharepoint. On top of that, users generally don’t want a login pop-up to appear whenever dashboard data is first refreshed. So we’ll need some sort of hidden login [...]]]></description>
			<content:encoded><![CDATA[<p>Not all corporations want their employees to access dashboards through Infoview as some may want to access dashboards through a 3rd party website or portal such as Sharepoint. On top of that, users generally don’t want a login pop-up to appear whenever dashboard data is first refreshed.</p>
<p>So we’ll need some sort of hidden login mechanism that bypasses the pop-up and allows data to be refreshed on the dashboard.</p>
<p>Thanks to <strong>Ryan Goodman</strong> for de-mystifying the CELogonToken @ <a href="http://ryangoodman.net/blog/index.php/2008/01/21/xcelsius_single_sign_on_with_celogontoke" target="_blank">http://ryangoodman.net/blog/index.php/2008/01/21/xcelsius_single_sign_on_with_celogontoke</a><br />
and thanks to <strong>William Sees</strong> for posting his code in the SDN network @ <a href="http://forums.sdn.sap.com/thread.jspa?threadID=1544768&amp;tstart=30" target="_blank">http://forums.sdn.sap.com/thread.jspa?threadID=1544768&amp;tstart=30</a></p>
<p>In this article we will go step by step through the solution on how to retrieve a Business Objects Logon token and insert it into the CELogonToken Flash variable.</p>
<p><span id="more-279"></span></p>
<p>First let&#8217;s talk about the CELogonToken and what it does</p>
<p><strong>What is the CELogonToken and what happens during dashboard run time?</strong></p>
<p>The CELogonToken is a Flash Variable that is passed into the Xcelsius Dashboard whenever an Xcelsius Dashboard is opened up from Infoview. The token is populated with a session token that BOE creates when a person is logged into Infoview and any Xcelsius Dashboard using Query as a Web Service or Live Office connections will automatically use the CELogonToken to perform authentication.  With each transaction to Business Objects, the token is passed back to Business Objects for authentication.  If the CELogonToken does not exist (ie: if we opened the dashboard swf outside of Infoview), the login pop-up asking for authentication will show up when the data is trying to refresh.</p>
<p><strong>How does Xcelsius consume the CELogonToken?</strong><br />
If you look at the &lt;OBJECT&gt; tag in the code below, you will see that the CELogonToken Flash Variable is populated with a Business Objects session token.  From there authentication can take place transparently when the Query as a Web Service or Live Office connection is executed from the dashboard.</p>
<p><code>&lt;OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"<br />
codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" WIDTH="100%" HEIGHT="100%" VIEWASTEXT&gt;<br />
&lt;PARAM VALUE="../../../../opendoc/documentDownload?iDocID=10000&amp;sKind=Flash"&gt;<br />
&lt;PARAM VALUE=high&gt;<br />
&lt;PARAM VALUE=#FFFFFF&gt;<br />
&lt;PARAM VALUE="<strong>CELogonToken=servername.domain%4066270JJ45M1Ox2XibIf2B66268JUPcDiNQd2vGZEBe&amp;CEWebServiceURL=http%3A%2F%2Fservername %3Aportnumber%2Fdswsbobje%2Fservices%2Fsession</strong>"&gt;<br />
&lt;EMBED src="../../../../opendoc/documentDownload?iDocID=10000&amp;sKind=Flash" flashVars="<strong>CELogonToken=servername.domain%4066270JJ45M1Ox2XibIf2B66268JUPcDiNQd2vGZEBe&amp;CEWebServiceURL=http%3A%2F%2Fservername%3Aportnumber8443%2Fdswsbobje%2Fservices%2Fsession</strong>" quality=high bgcolor=#FFFFFF WIDTH="100%" HEIGHT="100%" ALIGN="" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"&gt;<br />
&lt;/EMBED&gt;<br />
&lt;/OBJECT&gt;</code></p>
<h2>Instructions</h2>
<p>Now that we have a better understanding of what the CELogonToken does, lets go through the steps on getting the transparent authentication to work.</p>
<p><strong>Step 1:</strong></p>
<p>Make sure your dashboard is complete with a QAAWS or Live Office Connection.</p>
<p><strong>Step 2:</strong></p>
<p>Create a jsp (dashboardTest.jsp) that your tomcat webapp server can access and store that in a directory.  For testing purposes just create the following directory &lt;BO Installation&gt;\Tomcat55\webapps\InfoViewApp\DashboardTest</p>
<p>This will ensure that the jsp can access all the required packages.  You can customize which directory you want to put the jsp but you will need to make sure the BOE sdks are accessible.</p>
<p><strong>Step 3:</strong></p>
<p>Again for testing purposes, export the swf file as Test.swf in &lt;BO Installation&gt;\Tomcat55\webapps\InfoViewApp\DashboardTest</p>
<p><strong>Step 4:</strong></p>
<p>Insert the code snippet at the end of the article into the dashboardTest.jsp file.  Note that everything I have highlighted in blue you will need to change according to your specific settings.</p>
<p><strong>Step 5:</strong></p>
<p>Open up the URL in your browser http://server:port/InfoViewApp/DashboardTest/dashboardTest.jsp and verify that the data connection refreshes without the login pop-up coming up.</p>
<h2>Explanation of jsp Code</h2>
<p>The first part of the code imports the required libraries from the Business Objects SDK to retrieve the logon token.</p>
<p><code>&lt;%@ page import="com.crystaldecisions.sdk.exception.SDKException,<br />
com.crystaldecisions.sdk.framework.*,<br />
com.crystaldecisions.sdk.occa.infostore.*,<br />
com.crystaldecisions.sdk.occa.security.*,<br />
java.net.*,<br />
com.crystaldecisions.Enterprise.*,<br />
com.crystaldecisions.sdk.plugin.admin.*,<br />
com.businessobjects.webutil.Encoder"<br />
%&gt;<br />
&lt;%@ page import="java.sql.*"%&gt;</code></p>
<p>The second part of the code sets the server, username and password. We can use a hard coded username/password if for example we want one universal Dashboard user that has view access to a set of dashboards which would make maintenance easier. If you are interested in single sign on you will have to write some extra code to grab the appropriate username and password. Finally you can create a method that returns the username/password in an external class if you don’t want to hardcode the username/password. The code bolded in the try block retrieves the Business Objects logon token.</p>
<p><code>//-------------------------------------------------------------------Create BO Session and redirect to Infoview<br />
IEnterpriseSession enterpriseSession;<br />
/* * Set Enterprise Logon credentials. */<br />
final String BO_CMS_NAME = "<strong><a href="http://forums.sdn.sap.com/" target="_newWindow">server</a></strong>";<br />
final String BO_AUTH_TYPE = "secEnterprise";<br />
final String BO_USERNAME = "<strong><a href="http://forums.sdn.sap.com/" target="_newWindow">username</a></strong>";<br />
final String BO_PASSWORD = "<strong><a href="http://forums.sdn.sap.com/" target="_newWindow">password</a></strong>";<br />
</code><br />
<code>ILogonTokenMgr logonTokenMgr;<br />
String defaultToken = "";<br />
final String INFOVIEW_URL = "http://<strong><a href="http://forums.sdn.sap.com/" target="_newWindow">server</a>:<a href="http://forums.sdn.sap.com/" target="_newWindow">port</a></strong>/InfoViewApp/logon/start.do";<br />
/*<br />
* Log onto Enterprise<br />
*/<br />
boolean loggedIn = true;<br />
try {<br />
<strong>enterpriseSession = CrystalEnterprise.getSessionMgr().logon(BO_USERNAME,BO_PASSWORD, BO_CMS_NAME,<br />
BO_AUTH_TYPE);</strong><br />
<strong>logonTokenMgr = enterpriseSession.getLogonTokenMgr();</strong><br />
<strong>defaultToken = logonTokenMgr.createWCAToken("", 20, 1);</strong><br />
}</code></p>
<p>The third part of the code does a check to see if the token generated above was valid and generates the appropriate output which will call the dashboard with the appropriate CELogonToken variable.</p>
<p><code>//-------------------------------------------------------------------If login successful<br />
if(loggedIn) {<br />
String Flashvars="&amp;CELogonToken=" + Encoder.encodeURL(defaultToken);<br />
Flashvars += "&amp;CEWebServiceURL=" + Encoder.encodeURL("http://<strong><a href="http://forums.sdn.sap.com/" target="_newWindow">server</a>:<a href="http://forums.sdn.sap.com/" target="_newWindow">port</a></strong>/dswsbobje/services/session");<br />
String output = "";<br />
output = output + "&lt;OBJECT classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0' id='myMovieName' style='width: 355px; height: 237px'&gt; \r\r";<br />
output = output + "&lt;PARAM VALUE='<strong><a href="http://forums.sdn.sap.com/" target="_newWindow">Test.swf</a>'&gt; \r\r"; //( \r = carriage return to make output more legible )<br />
output = output + "&lt;PARAM VALUE=high&gt; \r\r";<br />
output = output + "&lt;PARAM value=\"" + Flashvars + "\"&gt;\r\r";<br />
output = output + "&lt;EMBED src='<strong><a href="http://forums.sdn.sap.com/" target="_newWindow">Test.swf</a>' flashvars=\" " + Flashvars + "\" quality=high bgcolor=#FFFFFF WIDTH='1000' HEIGHT='600' NAME='myMovieName' ALIGN=\"\" TYPE='application/x-shockwave-flash' PLUGINSPAGE='http://www.macromedia.com/go/getflashplayer'&gt;&lt;/EMBED&gt;&lt;/OBJECT&gt;\r\r";<br />
out.println(output);<br />
}<br />
//-------------------------------------------------------------------If login failed<br />
else {<br />
out.println("Login to Business Objects Failed.");<br />
}</strong></strong></code></p>
<h2>Full JSP Code (Sections highlighted need to be changed)</h2>
<p><code>&lt;%@ page import="com.crystaldecisions.sdk.exception.SDKException,<br />
com.crystaldecisions.sdk.framework.*,<br />
com.crystaldecisions.sdk.occa.infostore.*,<br />
com.crystaldecisions.sdk.occa.security.*,<br />
java.net.*,<br />
com.crystaldecisions.Enterprise.*,<br />
com.crystaldecisions.sdk.plugin.admin.*,<br />
com.businessobjects.webutil.Encoder"<br />
%&gt;<br />
&lt;%@ page import="java.sql.*"%&gt;<br />
&lt;%<br />
//-------------------------------------------------------------------Create BO Session and redirect to Infoview<br />
IEnterpriseSession enterpriseSession;<br />
/* * Set Enterprise Logon credentials. */<br />
final String BO_CMS_NAME = "<strong><a href="http://forums.sdn.sap.com/" target="_newWindow">server</a></strong>";<br />
final String BO_AUTH_TYPE = "secEnterprise";<br />
final String BO_USERNAME = "<strong><a href="http://forums.sdn.sap.com/" target="_newWindow">username</a></strong>";<br />
final String BO_PASSWORD = "<strong><a href="http://forums.sdn.sap.com/" target="_newWindow">password</a></strong>";<br />
ILogonTokenMgr logonTokenMgr;<br />
String defaultToken = "";<br />
final String INFOVIEW_URL = "http://<strong><a href="http://forums.sdn.sap.com/" target="_newWindow">server</a>:<a href="http://forums.sdn.sap.com/" target="_newWindow">port</a></strong>/InfoViewApp/logon/start.do";<br />
/*<br />
* Log onto Enterprise<br />
*/<br />
boolean loggedIn = true;<br />
try {<br />
enterpriseSession = CrystalEnterprise.getSessionMgr().logon(BO_USERNAME,BO_PASSWORD, BO_CMS_NAME,<br />
BO_AUTH_TYPE);<br />
logonTokenMgr = enterpriseSession.getLogonTokenMgr();<br />
defaultToken = logonTokenMgr.createWCAToken("", 20, 1);<br />
}<br />
catch (Exception error)<br />
{<br />
loggedIn = false;<br />
}<br />
//-------------------------------------------------------------------If login successful<br />
if(loggedIn) {<br />
String Flashvars="&amp;CELogonToken=" + Encoder.encodeURL(defaultToken);<br />
Flashvars += "&amp;CEWebServiceURL=" + Encoder.encodeURL("http://<strong><a href="http://forums.sdn.sap.com/" target="_newWindow">server</a>:<a href="http://forums.sdn.sap.com/" target="_newWindow">port</a></strong>/dswsbobje/services/session");<br />
String output = "";<br />
output = output + "&lt;OBJECT classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0' id='myMovieName' style='width: 355px; height: 237px'&gt; \r\r";<br />
output = output + "&lt;PARAM VALUE='<strong><a href="http://forums.sdn.sap.com/" target="_newWindow">Test.swf</a>'&gt; \r\r"; //( \r = carriage return to make output more legible )<br />
output = output + "&lt;PARAM VALUE=high&gt; \r\r";<br />
output = output + "&lt;PARAM value=\"" + Flashvars + "\"&gt;\r\r";<br />
output = output + "&lt;EMBED src='<strong><a href="http://forums.sdn.sap.com/" target="_newWindow">Test.swf</a>' flashvars=\" " + Flashvars + "\" quality=high bgcolor=#FFFFFF WIDTH='1000' HEIGHT='600' NAME='myMovieName' ALIGN=\"\" TYPE='application/x-shockwave-flash' PLUGINSPAGE='http://www.macromedia.com/go/getflashplayer'&gt;&lt;/EMBED&gt;&lt;/OBJECT&gt;\r\r";<br />
out.println(output);<br />
}<br />
//-------------------------------------------------------------------If login failed<br />
else {<br />
out.println("Login to Business Objects Failed.");<br />
}<br />
%&gt;</strong></strong></code></p>
]]></content:encoded>
			<wfw:commentRss>http://davidlai101.com/blog/2010/11/18/xcelisius-dashboards-outside-of-infoview-with-the-help-of-celogontoken/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Building Scorecards in Xcelsius 2008 and the significance of Global Embedded Fonts</title>
		<link>http://davidlai101.com/blog/2008/10/21/building-scorecards-in-xcelsius-2008-and/</link>
		<comments>http://davidlai101.com/blog/2008/10/21/building-scorecards-in-xcelsius-2008-and/#comments</comments>
		<pubDate>Wed, 22 Oct 2008 03:30:26 +0000</pubDate>
		<dc:creator>David Lai</dc:creator>
				<category><![CDATA[Workarounds]]></category>
		<category><![CDATA[Xcelsius]]></category>
		<category><![CDATA[alerts]]></category>
		<category><![CDATA[global embedded fonts]]></category>
		<category><![CDATA[label based menu]]></category>
		<category><![CDATA[scorecard]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[One of the very powerful new additions to Xcelsius 2008 is the ability to create scorecards easily. If we wanted to create scorecards in Xcelsius 4.5 we would need to manually insert trending icons into each row in order to create a scorecard. In Xcelsius 2008 however we can use a label based menu with [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter" style="margin-left: 100px; margin-right: 100px;" src="http://www.davidlai101.com/blog/media/blogs/bobj/scorecard/scorecard.jpg" alt="" width="362" height="239" /></p>
<p>One of the very powerful new additions to Xcelsius 2008 is the ability to create scorecards easily.  If we wanted to create scorecards in Xcelsius 4.5 we would need to manually insert trending icons into each row in order to create a scorecard.</p>
<p>In Xcelsius 2008 however we can use a <em>label based menu</em> with alerts.  The alerts will act as the trending icons and from there we only need one object to show our indicators.</p>
<p>Here are some simple instructions to create a scorecard.<br />
<span id="more-10"></span><br />
1. <strong>Create an Excel file</strong> with measures that you want to evaluate.  In this example I&#8217;ve created a revenue table that contains Net Income for years 2001 -&gt; 2007.  In our scorecard we will have indicators that show red for negative income, yellow for income 0 -&gt; $1000, and green for income $1000+</p>
<p><img style="margin-left: 125px; margin-right: 125px;" src="http://www.davidlai101.com/blog/media/blogs/bobj/scorecard/excel.jpg" alt="" width="310" height="173" /></p>
<p>2. Import the Excel file you created in Xcelsius 2008 and <strong>insert a spreadsheet table object</strong> containing the data from the Excel file</p>
<p><img src="http://www.davidlai101.com/blog/media/blogs/bobj/scorecard/scorecard_table.jpg" alt="" /></p>
<p>3. Now insert a <strong>label menu object</strong> and <em>align it vertically</em>.  Make sure that it lines up nicely with your table and that the object is layered underneath the table.  Now on the <strong>label menu properties</strong>, go to the <strong>alerts section</strong> and <strong>check Enable Alerts</strong>.  The alert values will be the values on the Net Income.  After that you can setup your alert thresholds accordingly.</p>
<p><img src="http://www.davidlai101.com/blog/media/blogs/bobj/scorecard/label_menu.jpg" alt="" /></p>
<p>We now have a simple scorecard setup, however here&#8217;s a common problem that developers will run into when they mix tables with label menus.  <strong>The text on different objects will be rendered differently depending on the size of the swf you end up placing onto your page.</strong> This is a bug that the Xcelsius Developers are working on fixing hopefully for the next release.</p>
<p>I have shown 2 examples of the same swf but of different sizes.</p>
<p><img style="margin-left: 60px; margin-right: 60px;" src="http://www.davidlai101.com/blog/media/blogs/bobj/scorecard/bad_alignment.jpg" alt="" width="410" height="529" /></p>
<p>The first swf you can see has incorrect alignment, whereas the second swf has the correct alignment.</p>
<p>There are 2 solutions on how to solve this problem.</p>
<p>1. Manually play with the swf size so that the displayed swf has everything aligned correctly.</p>
<p>2. <strong>Global Embedded Fonts</strong><br />
To set global embedded fonts, go to <strong>File -&gt; Document Properties and check Use Global Font, then select Use Embedded Fonts</strong>.</p>
<p><img style="margin-left: 25px; margin-right: 25px;" src="http://www.davidlai101.com/blog/media/blogs/bobj/scorecard/global_embedded_fonts.jpg" alt="" width="492" height="469" /></p>
<p>Using global embedded fonts has the following advantages from my experience.</p>
<p><strong>-Smoother fonts on display<br />
-Objects always render with consistent alignment no matter what size you set it to.</strong></p>
<p>The only thing you will have to note is that while developing, you will have incorrect alignment when building your scorecards, but after exporting things will look fine.</p>
<p>I recommend using global fonts because of the smooth font look and the consistent rendering of text after exporting to a swf.  You can download the scorecard example I used <a href="http://www.davidlai101.com/blog/media/blogs/bobj/scorecard/scorecard.zip" target="_blank">here</a></p>
]]></content:encoded>
			<wfw:commentRss>http://davidlai101.com/blog/2008/10/21/building-scorecards-in-xcelsius-2008-and/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

