tag:blogger.com,1999:blog-62406013839901000022024-03-19T01:48:51.006-07:00BI Curious CognosAdventures in applying intelligence to Business Intelligence.RecoveringBIAdminhttp://www.blogger.com/profile/18059710955267360533noreply@blogger.comBlogger19125tag:blogger.com,1999:blog-6240601383990100002.post-60501945527867309222012-03-26T08:42:00.000-07:002012-03-26T08:42:29.213-07:00Debugging Cognos Issues<div class="separator" style="clear: both; text-align: center;"><a href="http://www.google.com/url?source=imglanding&ct=img&q=http://www.theadvocateweblog.com/wp-content/uploads/2012/01/noooooooooooo.jpg&sa=X&ei=UIxwT8SnG8TWtgepr9m_Bg&ved=0CAkQ8wc&usg=AFQjCNEvEWUQiYgQM2l2sCO5elHIe7n1OA" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://www.google.com/url?source=imglanding&ct=img&q=http://www.theadvocateweblog.com/wp-content/uploads/2012/01/noooooooooooo.jpg&sa=X&ei=UIxwT8SnG8TWtgepr9m_Bg&ved=0CAkQ8wc&usg=AFQjCNEvEWUQiYgQM2l2sCO5elHIe7n1OA" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><span style="text-align: -webkit-auto;">Like the programmers on the Jersey Shore, I like to follow a GTL approach to debugging cognos issues.</span></div><div class="separator" style="clear: both; text-align: center;"><span style="text-align: -webkit-auto;"><br />
</span></div><div class="separator" style="clear: both; text-align: center;"></div><ol><li style="text-align: left;">Google</li>
<li style="text-align: left;">Ticket</li>
<li style="text-align: left;">Logs</li>
</ol><div style="text-align: left;"><b>Google. </b>Cognos is an off the shelf product and has standard error messages. Anything you might see there's a guy with a blog explaining how to fix it. *cough*. Google that error code, message text or other identifying issue.</div><div style="text-align: left;"><br />
</div><div style="text-align: left;"><b>Ticket</b>. Open a ticket with Cognos if you have a support contract. They are usually not the quickest in coming up with a solution so I like to get this started early. Also check that there hasn't been a fix pack released that addresses your issue. Many things, like difficult to debug server stability issues, are constantly being updated by fix packs.</div><div style="text-align: left;"><br />
</div><div style="text-align: left;"><b>Logging. </b>Enable more detailed logging on the server side if you need more context for the error message. And repeat!</div><div style="text-align: left;"><br />
</div><div style="text-align: left;">(Yes I made this post because I thought of an acronym)</div><div style="text-align: left;"><br />
</div><div style="text-align: left;"><br />
</div><div style="text-align: left;"><br />
</div><div style="text-align: left;"><br />
</div><div style="text-align: left;"><br />
</div><div style="text-align: left;"><br />
</div><div style="text-align: left;"><br />
</div>RecoveringBIAdminhttp://www.blogger.com/profile/18059710955267360533noreply@blogger.com7tag:blogger.com,1999:blog-6240601383990100002.post-91377886685573353142011-12-15T08:19:00.000-08:002011-12-15T08:19:43.353-08:00Why do you want a new job?<a href="http://www.forbes.com/sites/ericjackson/2011/12/14/top-ten-reasons-why-large-companies-fail-to-keep-their-best-talent/"><br />
Top Ten Reasons Why Large Companies Fail To Keep Their Best Talent</a><br />
<br />
Is it one of these reasons? I've defiantly changed jobs because of some of these complaints. Developers in the BI area have somewhat of a green field of jobs to choose from. Companies need to recognize the retention risks around keeping their most talented employees.RecoveringBIAdminhttp://www.blogger.com/profile/18059710955267360533noreply@blogger.com3tag:blogger.com,1999:blog-6240601383990100002.post-89225625005996890102011-10-18T21:35:00.000-07:002011-10-18T21:35:22.680-07:00The Downside of Stored Procedure Based Query ItemsIn Cognos Framework Manage one of the query item options is a stored procedure. This item seems promising, but I would suggest avoiding it. First of all, to setup a stored procedure based query item in framework manager:<br />
<ol><li>Write your stored procedure. It can expect prompts.</li>
<li>Select that stored procedure in Framework Manager as a query item source. (I would suggest pulling this in at the database level, or at the business level if you want to make it clear that it's not a base table) It will be scanned and expected prompts will be presented, similar to a drill through definityion.</li>
<li>Enter a prompt macro in the 'Value' field. At the report level we can setup a prompt to populate this value. This procedure expects 1 prompt of 'dept'. We can define a parameter of dept in a report to pass this value.</li>
</ol><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHoboYhXCIuzD40j_Yv7UBdJn_s5vzsWJ-ltUKAckUb3sXPCDLsp8nA7bv2iCIJ1bBgccspLt2wlIGo9FoujF5Cz0mvyvcGzChVi1utUkY6t0JjA6zm-lVk9-T3z1qbXZgtzrkglA0FBCE/s1600/Capture.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="362" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHoboYhXCIuzD40j_Yv7UBdJn_s5vzsWJ-ltUKAckUb3sXPCDLsp8nA7bv2iCIJ1bBgccspLt2wlIGo9FoujF5Cz0mvyvcGzChVi1utUkY6t0JjA6zm-lVk9-T3z1qbXZgtzrkglA0FBCE/s400/Capture.JPG" width="400" /></a></div><br />
Within the framework model, this will behave as an any other query item. It can be related to other items in the model.<br />
<br />
The major downside to this is in the execution plans cognos gennerates around these stored procedures. In a normal query cognos' query engine will look at the selected objects and gennerate an optimal query based on the relationships defined in the framework. Ideally, all the query work can be gennerated in 1 query that can be sent to the database. In the case of stored procedures, since cognos doesn't know about the contents of the stored procedure, the sql in the procedure is not included in the optimization plan. Meaning local processing will be required to join the results of the stored procedure to any other object in the model. Be careful to only include absolutely necessary queries in stored procedures.<br />
<br />
I <b>would</b> use stored procedures for any procedure needing to use several temporary tables or user defined functions. (Although, in the case of user defined functions, I'd rather registered them with the Cognos gateway so that they can be called directly from Cognos reports)RecoveringBIAdminhttp://www.blogger.com/profile/18059710955267360533noreply@blogger.com4tag:blogger.com,1999:blog-6240601383990100002.post-42393965280567645202011-09-09T14:06:00.000-07:002011-09-13T07:03:15.611-07:00Display a # of rows per page based on output typeMost of these articles are about things that frustrated me for enough of my day to swear a bunch and then say 'hey that's annoying enough to make an article about'. Today's tip has the added bonus of being part of a report I didn't even want to build. My user wants a summary of dollars over a variable period of time with the ability to drill into the total and see the distinct set of users that gave those dollars. This is fine, but my dataset has some spots in it that it'd be pretty inefficient to drill through on. Though the standard deviation of donors/unit is pretty high, I'd rather work on a way to assure a horrid query is never passed to the database. (hard to read, large query, resources, developers headaches, etc. But hey data analysis for potential hazard queries and allowing dump reports are post to save for another time)<br />
<br />
That being said, the user also wanted to potentially run this thing out to HTML or Excel. Well, if the data set is potentially large I want to show a good amount of it on the screen in html but not enough that rendering will take a significant amount of time. For this you can use the Rows Per Page property.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggUtqea7bJwf4-LeqEQoDMq4faOJPgcdMZbiNwfp-yXj4gutezEQJuS-05YUvHjqwSuJy9-6DQ3OIe5AgDxh0bu8N3bDbc9ob85jxYBJW-x-OVlGqWfGpJ2l7SdhSb94wUN6rxqQKZDu13/s1600/output+type+1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="208" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggUtqea7bJwf4-LeqEQoDMq4faOJPgcdMZbiNwfp-yXj4gutezEQJuS-05YUvHjqwSuJy9-6DQ3OIe5AgDxh0bu8N3bDbc9ob85jxYBJW-x-OVlGqWfGpJ2l7SdhSb94wUN6rxqQKZDu13/s320/output+type+1.jpg" width="320" /></a></div><br />
<br />
This is fine for HTML only. Based on this setting when you try to run to xls 2007 this rows per page option will create a separate workbook tab for each 150 rows. If you run to xls 2003 single sheet cognos will contain the output to one workbook but the headers and footers will be repeated each 150 rows. BUT, in xls 2007 if the default rows per page (20 unless your admin changes it) setting will cause output to be rendered on a single tab.<br />
<br />
What do we do? I want 150 rows in html and 1 workbook tab in XLS. Well, it's <i>Report Expressions</i> to the rescue! There is a cognos report function <i>ReportOutput()</i> that will return a string populated with the output type at render time. The function definition (as of the 8.4.1 documentation) is defined as:<br />
<br />
<blockquote><div class="clsInfoBox" id="_487_divTipsText" style="height: 94px; width: 418px;"><div style="font-weight: bold;">ReportOutput ()</div><div>Returns the name of the output format. Possible return values are: CSV, HTML, layoutDataXML, MHT, PDF, rawXML, singleXLS, spreadsheetML, XLS, XML, XLWA.</div></div></blockquote>Which is somewhat obtuse, but here's a nice chart of the output formats that I'm interested in. One thing to note is that you need the right string for the version of xls you're expecting to use:<br />
<div style="text-align: left;"></div><br />
<br />
<br />
<br />
<center><br />
<table border="1" style="margin-left: auto; margin-right: auto; text-align: left;"><tbody>
<tr align="left"><td>CSV</td><td>Comma Seperated Value</td></tr>
<tr align="left"><td>HTML</td><td>HTML output</td></tr>
<tr align="left"><td>layoutDataXML</td><td>XML</td></tr>
<tr align="left"><td>MHT</td><td>I assume this is a <a href="http://en.wikipedia.org/wiki/MHTML">MHTML</a> output type for 'saved html'</td></tr>
<tr align="left"><td>PDF</td><td>PDF Output</td></tr>
<tr align="left"><td>rawXML</td><td>XML</td></tr>
<tr align="left"><td>singleXLS</td><td>Excel 2000 single sheet</td></tr>
<tr align="left"><td>spreadsheetML</td><td>Excel 2007 output</td></tr>
<tr align="left"><td>XLS</td><td>appears not to be generated in xls outputs as of 8.4<br />
</td></tr>
<tr align="left"><td>XML</td><td>XML</td></tr>
<tr align="left"><td>XLWA</td><td>Excel 2003</td></tr>
</tbody></table></center><br />
<div style="text-align: center;"></div><br />
So, ideally I'd like to be able to update the properties setting on the list based on the report format.<i> </i>I couldn't figure out if that was possible to overload via javascript, so I took the easy way out. I created 2 lists, one that renders when xls is run and one for html:<br />
<br />
<ol><li>Create a copy of your list A and A1.</li>
<li> Set the rows per page property to 150 on A.</li>
<li>Leave the rows per page property blank on A2</li>
<li>Create a new string variable with 2 Values 'XLS' and 'Other' the expression can be defined as:<br />
<blockquote><i>if (ReportOutput () = 'spreadsheetML') then ('XLS') else ('Other')</i> </blockquote></li>
<li>Set the Render Variable property to this new variable on list A and check the <i>Other </i>value.</li>
<li>Set the Render Variable property to this new variable on list A1 and check the <i>XLS </i>value.</li>
</ol><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyiN5HqGO5vzDVz9WYfEX9VLJ_fz914006BJNVy5wd2ySmBdDIIz5AUr7kzmF_7NW00OT3E7bykyQFRa97eQt7o5x8ezYL3XhLVoKA-xcvFFfDwfxVhSrKvKlottlHuNxvo4IoA9-_AEn-/s1600/output+type+2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="208" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyiN5HqGO5vzDVz9WYfEX9VLJ_fz914006BJNVy5wd2ySmBdDIIz5AUr7kzmF_7NW00OT3E7bykyQFRa97eQt7o5x8ezYL3XhLVoKA-xcvFFfDwfxVhSrKvKlottlHuNxvo4IoA9-_AEn-/s320/output+type+2.jpg" width="320" /></a></div><br />
<ol></ol>RecoveringBIAdminhttp://www.blogger.com/profile/18059710955267360533noreply@blogger.com1tag:blogger.com,1999:blog-6240601383990100002.post-72544477988288205902011-08-25T06:40:00.000-07:002011-08-25T06:40:45.984-07:00Interviewing for a BI positionI've found that interviewing for a position in a business intelligence department is an infuriating dance of half truths, hope and plans. Unlike traditional software development or IT, your experience in business intelligence seems far more dependent on the team members and department around you. That's not the interesting statement from this post, that should be self evident. Business intelligence departments concern themselves with bringing IT knowledge onto business's turf. We're not working on traditional (or even extremely quantifiable) technology products, like say, pushing out exchange server because it's better for the enterprise than that old sendmail box. We are embedding ourselves in the business unit we are working for. Discovering their process and supplying them materials to enhance decision making in that process or at times shedding light on inefficiencies in that process.<br />
<br />
A big indicator of weather you can achieve that goal is measured in the BI world by the meta-metric 'BI Maturity'. In the past, where I've seen it, BI maturity has been calculated with some things like, turnaround time on projects, size of userbase, or other such numbers. Those metrics don't tell me how easy it will be to work in that department, projects can be short or long and failed, the userbase could be huge but only a minority percentage of the available community, or worse they could be users that never login. Worst of all they don't tell me how effective the department is in the community. Does finance hate the IT department? Does HR think BI is junk? I want to know that! I want to know how easy it will be to work in that department, these rankings of maturity don't really answer the main question that I've got when I'm interviewing for a BI position: "How effective is this department, and how interested are it's customers in analytics?".<br />
<br />
So like any data nerd, I came up with my own BI Maturity scale. Rank the company in terms of the following categories (in no real order of importance):<br />
<br />
While I'm interviewing I kind of keep a tally of these areas in my head and try to ask some questions to fill out the numbers.<br />
<ol><li><b>Leadership</b> - The knoledge level and direction of the department/team leaders. The ability of the leadership level to accomplish their stated goals.</li>
<ul><li>Possible Questions: </li>
<ul><li><i>What's the 1 and 5 year direction of BI here? What do you see the team looking like then?</i></li>
<li><i>How do you pick projects to work on? What is expected from a proposal point of view?</i></li>
<li><i>Describe a project where the customer wasn't meeting their end of the relationship. What did you do to remedy that project? </i>(Here I'm looking for a leadership level that puts up effective exit points for projects rather than one that say they can save every project. Sometimes the best use of time is to come back later)</li>
<li> <i>What would you like to do that you currently aren't doing? What successful projects needed stewardship and how did that occur?</i></li>
<li><i>Do you have a system of <a href="http://bicuriouscognos.blogspot.com/2011/08/do-you-do-mentoring-in-your-bi.html">mentoring</a>?</i></li>
<li><i>Is there an enterprise mandate for BI or are we off on our own?</i></li>
<li><i>Are there several smaller BI teams within each department that may be working on their own projects?</i></li>
<li><i>Describe the roles of users at the university. What BI tools do these roles each use? (analyitics, reports, query, dashboard, etc) What types of people are in these roles?</i></li>
</ul></ul><li><b>Staff</b> - The experience and skill level of the staff of the department/team, these would be your direct co workers for a non-leadership position.</li>
<ul><li>Possible Questions:</li>
<ul><li> <i>Of the senior resources, what are there past experiences on previous successful and unsuccessful projects? (</i>I'm looking for team members with BI specific experience, has your dba done dba tasks for BI specifically? Is your etl developer an etl developer or a transactional programmer that knows sql)</li>
<li><i>What is the ratio of senior (in experience) employees to junior?</i></li>
<li><i>Who would I get to mentor? Who would be my mentor?</i></li>
<li><i>Describe the project lifecycle of a previous, successful project, what phases of development occured and what was the engagement like? (</i>Here I am looking for them to describe a mature design, functional requirements gathering, and Testing process. You know, the stuff bad departments skip. I'm looking for them not to say the words 'excel layouts were given to the developer', but that may be asking too much.) </li>
<li><i>What development methodologies do we practice? What standard tools or processes do we use? Do we use version control? Do we use a robust <a href="http://bicuriouscognos.blogspot.com/2011/07/change-management-in-cognos-bi.html">change management process</a>?</i></li>
<li><i>Do we manage our own hardware/servers? Can we tune them how we want?</i></li>
<li><i> What is the restore plan?</i></li>
</ul></ul><li><b>Money</b> - Does the department have resources to do BI? Are they struggling to make do with a specific budget.<ul><li>Possible Questions</li>
<ul><li><i>What software do we use? Is there a cordinated, enterprise software purchase plan?</i></li>
<li><i>How often do team members get new hardware</i></li>
<li><i>What training or confrences did team members last attend?</i></li>
<li><i>Do we manage our own purchasing or is it through a central IT structure.</i><br />
</li>
</ul></ul></li>
<li><b>Business Buy-In</b> - What's the excitement/need level of the business users for BI? Are they clamoring for it and have ideas of what they want and pain points to address? Are they going to be engaged fully in the projects?</li>
<ul><li>Possible Questions</li>
<ul><li> <i>Describe a successful engagement on a prior project from start to finish. How was it proposed, how were requirements gathered, how was it deployed and maintained. </i>(I'm looking for a lot of answers here about how the business is very involved, wants this stuff and is driving a lot of the requirements.)</li>
<li><i>Describe an unsuccessful engagement and how it was mitigated or remedied? </i></li>
<li><i>What projects are in the pipeline? Is customer demand there?</i></li>
<li><i>How do they like the software we push out? Are we trying to supplement what they already have or replace something? </i></li>
<li><i>How willing are the business users to be involved in the development of their applications. </i>(This is a big one, mature BI departments realize that this has to occur. Resources need to be full time on this thing from both sides through all stages, design, development, testing, support. Non-mature BI departments will look at these applications as deliverables, IT projects that can be built and delivered to a business customer)</li>
<li><i>Can the </i><i>users develop their own content? Are the willing to? Describe a project where this occurred or is occurring and how that's maintained.</i></li>
</ul></ul></ol>So Simple. What's the scale? I dunno, lets say 10/10 is the highest, but the actual numbers are arbitrary. If you ask questions about the department around these areas you'll end up with a good picture of the effectiveness of the department.<br />
<br />
Now, the thing for you to think about is where you want to a work. A less mature BI department may have it's pluses, you might be getting in on the ground floor and build some good practices and clients. A mature department may have it's minuses, everything could be so prossessified that your role would be robotic and limited in scope. (You could end up the framework modeler for specifically the database source layer!)<br />
<br />
<br />
<br />
RecoveringBIAdminhttp://www.blogger.com/profile/18059710955267360533noreply@blogger.com0tag:blogger.com,1999:blog-6240601383990100002.post-32579158818976240862011-08-23T09:52:00.000-07:002011-08-23T12:58:46.091-07:00Cognos, get with the Program(ming!)Here's is the current browser support list for IBM Cognos 10 Fix Pack 1 (The latest list is <a href="https://www-304.ibm.com/support/docview.wss?uid=swg27019126#web_browser">here</a>):<br />
<br />
<table><tbody>
<tr valign="top"><td bgcolor="#808080" colspan="3" width="100%"><a href="http://www.blogger.com/post-create.g?blogID=6240601383990100002" name="web_browser"></a><b>Web Browser Support by Component</b></td></tr>
<tr valign="top"><td bgcolor="#C0C0C0" width="46%"><b>Cognos Connection / Report Viewer / <br />
<br />
Query Studio / Metric Studio</b></td><td bgcolor="#C0C0C0" width="31%"><b>Operating System</b></td><td bgcolor="#C0C0C0" width="24%"><b>Support Status</b></td></tr>
<tr valign="top"><td width="46%">Microsoft Internet Explorer 8</td><td width="31%">Windows</td><td width="24%">Active</td></tr>
<tr valign="top"><td width="46%">Microsoft Internet Explorer 7</td><td width="31%">Windows</td><td width="24%">Active</td></tr>
<tr valign="top"><td width="46%">Microsoft Internet Explorer 6 SP1</td><td width="31%">Windows 2000 / 2003</td><td width="24%">Not Supported</td></tr>
<tr valign="top"><td width="46%">Microsoft Internet Explorer 6 SP2</td><td width="31%">Windows XP</td><td width="24%">Compatible</td></tr>
<tr valign="top"><td width="46%">Firefox 3.6 </td><td width="31%">Windows, OS X, UNIX, Linux</td><td width="24%">Compatible</td></tr>
<tr valign="top"><td width="46%">Firefox 3.5</td><td width="31%">Windows, OS X, UNIX, Linux</td><td width="24%">Active</td></tr>
<tr valign="top"><td colspan="3" width="100%">Note: Microsoft Office integration is only supported on Windows platforms (i.e. export to Excel)</td></tr>
<tr valign="top"><td bgcolor="#C0C0C0" width="46%"><b>Report Studio / Analysis Studio / Event Studio</b></td><td bgcolor="#C0C0C0" width="31%"><b>Operating System</b></td><td bgcolor="#C0C0C0" width="24%"><b>Support Status</b></td></tr>
<tr valign="top"><td width="46%">Firefox 3.6 (12)</td><td width="31%">Windows, OS X, UNIX</td><td width="24%">Active</td></tr>
<tr valign="top"><td width="46%">Firefox 3.5 <a href="http://www.blogger.com/support/docview.wss?rs=3442&uid=swg27017522%5Cl11"></a>(12)<a href="http://www.blogger.com/support/docview.wss?rs=3442&uid=swg27017522%5Cl11"></a></td><td width="31%">Windows, OS X, UNIX</td><td width="24%">Compatible</td></tr>
<tr valign="top"><td width="46%">Microsoft Internet Explorer 8</td><td width="31%">Windows</td><td width="24%">Active</td></tr>
<tr valign="top"><td width="46%">Microsoft Internet Explorer 7</td><td width="31%">Windows</td><td width="24%">Compatible</td></tr>
<tr valign="top"><td width="46%">Microsoft Internet Explorer 6 SP1</td><td width="31%">Windows 2003</td><td width="24%">Not Supported</td></tr>
<tr valign="top"><td width="46%">Microsoft Internet Explorer 6 SP2</td><td width="31%">Windows XP</td><td width="24%">Compatible</td></tr>
<tr valign="top"><td bgcolor="#BFBFBF" width="46%"><b>Business Insight / Business Insight Advanced / Active Report (</b><b>13</b><b>)</b></td><td bgcolor="#BFBFBF" width="31%"><b>Operating System</b></td><td bgcolor="#BFBFBF" width="24%"><b>Support Status</b></td></tr>
<tr valign="top"><td width="46%">Microsoft Internet Explorer 8</td><td width="31%">Windows</td><td width="24%">Active</td></tr>
<tr valign="top"><td width="46%">Microsoft Internet Explorer 7</td><td width="31%">Windows</td><td width="24%">Compatible</td></tr>
<tr valign="top"><td width="46%">Firefox 3.6</td><td width="31%">Linux, Windows, UNIX</td><td width="24%">Active</td></tr>
<tr valign="top"><td width="46%">Firefox 3.5</td><td width="31%">Linux, Windows, UNIX</td><td width="24%">Active</td></tr>
</tbody></table><br />
<br />
Notice anything odd? It's 2011! These browsers were out of date when IBM Cognos 10 was released. And <b>it's only going to get worse.</b><br />
<br />
<b>IE 8 was released in 2009</b><br />
<b>Firefox 3.5 was released in 2009 (they are currently on version 6, but it may have changed while I am typing this)</b><br />
<b>Chrome has never been supported</b><br />
<b><br />
</b><br />
That might have been fine in 2009, but the landscape of browser use has changed significantly since then:<br />
<br />
<div height="400" id="browser-ww-monthly-200907-201107" style="height: 400px; width: 600px;" width="600"></div>Source: <a href="http://gs.statcounter.com/#browser-ww-monthly-200907-201107">StatCounter Global Stats - Browser Market Share</a><br />
<script src="http://www.statcounter.com/js/FusionCharts.js" type="text/javascript">
</script><script src="http://gs.statcounter.com/chart.php?browser-ww-monthly-200907-201107" type="text/javascript">
</script><br />
<br />
So now, when I roll out a new datamart I have to convince users to downgrade their browsers. Aside from usage patterns, I'm already testing my reports in multiple browsers for our user community (my users can install any browser that they want), a greater focus on keeping compatibility with them up to date would likely lead to a more robust non-ie experience. In discussions with my IBM rep they are 'looking into' support for Fire Fox 4 and won't commit to any versions after that. This support model doesn't seem tenable. At the very least I'd like the save icon to work in Fire Fox 4! (it currently does not!) And don't get me started on GoMobile and tablet/mobile browsers.<br />
<br />
As many bloggers have noticed already, browser software development is becoming so <i><a href="http://www.codinghorror.com/blog/2011/05/the-infinite-version.html">fluid that it has transcended software versioning altogether</a>. </i>I'm not sure if I totally agree with the voracity of that statement, you'll probably be interested in the version when your 3rd party app stops working, but the point is valid. The current breed of web browsers Chrome, Fire Fox and even IE are continuously updating. Auto updating is now the default behavior. And use of these browsers <a href="http://www.impressivewebs.com/browser-usage-stats/">continues to shift</a>.<br />
<br />
If a vendor leverages a web browser's in it's product, forcing a version number is no longer a safe harbor for you to get out of support. IT departments are either going to have to enforce a particular browser version forever, IBM will have to develop it's own application or it's just going to have to <b>bite the bullet and continuously updates for these new versions of browser</b>s. And they should! I want to use the latest Javascript debugging tools in Firefox and get the new security updates.<br />
<br />
RecoveringBIAdminhttp://www.blogger.com/profile/18059710955267360533noreply@blogger.com4tag:blogger.com,1999:blog-6240601383990100002.post-33509176942358165762011-08-23T07:46:00.000-07:002011-08-23T11:33:20.908-07:00List Prompts for Dimensional ReportsIf you are writing a dimensional report and prompting on particular member, you'd usually present this in a tree prompt. But in the case that you want to guide the prompting options a bit or if the dimension is very simple, this format might be confusing to users. For example, I have a filtering dimension called 'Annual Fund Indicator' with 1 level and 2 values ('Y' and 'N'). So I want to slice my cube based on some set of these values. The easiest way would be to use a tree prompt and allow the usser to select any combination of the flag.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUFfN_sFgTnywdXz_saL_v8p7Dqncm1QyLrlafVJEx-SMg_ZNFzUGxyrZOfMCwK5uDcMxu18wrTnMqMhdGvFFHwBLlQZH-FPpwzy1Oi4gz0A68XLmZPWWMeadoL4VgFFOJkEjxq9YMPDT/s1600/Tree+Prompt.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="187" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUFfN_sFgTnywdXz_saL_v8p7Dqncm1QyLrlafVJEx-SMg_ZNFzUGxyrZOfMCwK5uDcMxu18wrTnMqMhdGvFFHwBLlQZH-FPpwzy1Oi4gz0A68XLmZPWWMeadoL4VgFFOJkEjxq9YMPDT/s320/Tree+Prompt.JPG" width="320" /></a></div><br />
The user can select 1 value, or both. There are some functional drawbacks to this though. For a complex hierarchy, a tree prompt makes sense. Users can navigate the tree and select the members that make most sense to the report. But with a simple set of selectable items, the tree becomes cumbersome administrative overhead.<br />
<br />
<ul><li>This is the presentation of members at 1 level of a tree with no children. Users are confused that the tree prompt has the expansion + option but nothing below it</li>
<li>Users are confused about the wording on the prompt and can be confused about the lexical rules for slicing both Y and N values (they would have to select both) or 'Y' but not 'N'</li>
<li>Here the member captions are shown as values, it may be confusing to users to translate the code 'Y' to 'Transactions that have the annual fund indicator set to yes' or more functionally 'Yes, Include Annual Fund amounts'</li>
</ul><br />
So for these, we should use a list prompt like this.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg203f7otpPKxaIe7bOZzxEvT0mFpGYicc6IuR1D-BSaaCiQ6L_jbc_40otYOJQ8LWXhiePjTQwcTCey00-m_wxIYLbJ9wqXusllJaeJA6Gd3-CO4zqAHhrjtpaBwzX_YZl6QvZsFlafA6g/s1600/Member-List-Prompt.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg203f7otpPKxaIe7bOZzxEvT0mFpGYicc6IuR1D-BSaaCiQ6L_jbc_40otYOJQ8LWXhiePjTQwcTCey00-m_wxIYLbJ9wqXusllJaeJA6Gd3-CO4zqAHhrjtpaBwzX_YZl6QvZsFlafA6g/s320/Member-List-Prompt.JPG" width="320" /></a></div><br />
When you select a member from a tree prompt, the value used for the parameter is a Member Unique Name (MUN). We still want each of these options to resolve to MUN addresses, but now we'll have to construct them ourselves. For the bottom 2 options 'Non Annual Fund Transactions' and 'Annual Fund transactions' I created a query to select the MUN and a Caption as the Use and Display values for this prompt.<br />
<br />
<b>Annual Fund Include Indicator - </b>[Cube].[Annual Fund].[Annual Fund Include Indicator], this expression is a level so will return each member of that level when the query executes. This will be the <i>Use Value</i> of the prompt.<br />
<br />
<b>Annual Fund Label -</b> So, I want a specialized label for each member, to do that I need to get a string value of each member to run through my case statement. This case statement uses the roleValue() and currentMember() dimensional functions to get a string value of the business key of the current member and creates an appropriate caption. This will be the <i>Display Value</i> of the prompt.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhirzDB4L7_CgCmJgwCi9M3_Y5Rc2DsVv-W5rjITyENiXtqqSMctvFoqD5bsxqbIT1eMCCsVRHPJOVuj17lt7OqUto6u7ByOHPKd3Zi97gm5TPxfzSVxGhUvrizCtQIdmdYoWEJtmlAMjHl/s1600/Member-List-Prompt-Query.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="409" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhirzDB4L7_CgCmJgwCi9M3_Y5Rc2DsVv-W5rjITyENiXtqqSMctvFoqD5bsxqbIT1eMCCsVRHPJOVuj17lt7OqUto6u7ByOHPKd3Zi97gm5TPxfzSVxGhUvrizCtQIdmdYoWEJtmlAMjHl/s640/Member-List-Prompt-Query.JPG" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1u_w1Hhyphenhyphen5cjSsYm75L8Mf67BKcoDTcF3LCki8a_J5TzUucxQNa3Js_qCZDIFirwrFEhS_NLgYl_zuVlwAbnq4zfSKVO_sbbaq8uQzD4f3QUitvzCzkkpyg8Q3IfSGSprY7ZKWUoKIIMZl/s1600/Member-List-Prompt-Query-op.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br />
</a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAmn1QAYvpoBHiSnM-0tyktOv9hV90juO6tHo8mfUdWsortBFaFxOAZ3KV4R1-mYoVJ8r7pIRU5mz2nuanhpindkPXVblctbd_vthc-b6d1lkAEMrPFIBWMI2lc8QcUg8enrgZ_e1zSAlG/s1600/Member-List-Prompt-Query-op.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAmn1QAYvpoBHiSnM-0tyktOv9hV90juO6tHo8mfUdWsortBFaFxOAZ3KV4R1-mYoVJ8r7pIRU5mz2nuanhpindkPXVblctbd_vthc-b6d1lkAEMrPFIBWMI2lc8QcUg8enrgZ_e1zSAlG/s1600/Member-List-Prompt-Query-op.JPG" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><blockquote><i>roleValue</i>('expression', member) - expression can be any of these: <br />
<div class="clsInfoBox" id="_487_divTipsText" style="height: 94px; width: 640px;"><div>'_businessKey', '_memberCaption', '_memberDescription', '_memberUniqueName' and will return a string value of the expression. <br />
<i>currentMember</i>(hierarchy) - returns the current member of the specified hierarchy, since we are traversing a level at runtime for Annual Fund Include Indicator, the current member will be each member of the level. </div></div></blockquote><br />
<br />
So that gets me the MUN and caption for those values. But I want a 3rd option for the 'Both Annual Fund and Non-Annual Fund Transactions' I created a static choice in the list with the MUN for the top of the Annual Fund Indicator hierarchy. So this will slice me both 'Y' and 'N' values when I select it (as they are children of the top of the hierarchy). <br />
<br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6ZH4O-Y8aD6fE47twniuqb_xke6P0jUurlX_-M461yI7agn7veFVZiTINR7LsonBdMuM_j24GFQqZy-xHyy4O44f4qG9x1T1mYbla98dgsWPUqvGuJEBMucSu3By_taGltIOxGeFaDuYU/s1600/Member-List-Prompt-Static-Choice.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6ZH4O-Y8aD6fE47twniuqb_xke6P0jUurlX_-M461yI7agn7veFVZiTINR7LsonBdMuM_j24GFQqZy-xHyy4O44f4qG9x1T1mYbla98dgsWPUqvGuJEBMucSu3By_taGltIOxGeFaDuYU/s320/Member-List-Prompt-Static-Choice.JPG" width="283" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfy6QmJY3ioK9p_3O95YD9JMef_p_ShVvZyb5BJSlYSA_IQcHzgJtS8nKfpPjicz9H0Zib6KhY39f00GDB9QiAv2xgN_8KNROaKmLhvEhj1Qp49UMsjyVKRrMZCtyQhFiRDQTZYRQLSBrP/s1600/Member-List-Prompt-Static-Choice.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br />
</a></div><br />
<br />
So when all this is said and done we end up with a list prompt that behaves like a complex tree prompt and I use it in my query like any other MUN filter:<br />
<br />
<blockquote>[CUBE].[Annual Fund].[Annual Fund].[Annual Fund]->?Annual Fund? </blockquote><br />
<br />
I did this in IBM Cognos 8.4.1 but would work the same way in Cognos 10.<br />
<br />
<br />
<br />
RecoveringBIAdminhttp://www.blogger.com/profile/18059710955267360533noreply@blogger.com0tag:blogger.com,1999:blog-6240601383990100002.post-85137956433525267452011-08-16T09:58:00.000-07:002011-08-16T11:20:08.718-07:00Change Management: Project Release NumberingIn a <a href="http://bicuriouscognos.blogspot.com/2011/07/change-management-in-cognos-bi.html">previous post</a> I said I'd post something about my numbering scheme for release candidates. If you recall from the previous post, a release candidate is the set of code that will be moved from development to a higher environment. They are complete enough that by packaging and releasing them we are saying 'this set of items can move into production'. This is the key to change management in these environments. If you are working in an <a href="http://en.wikipedia.org/wiki/Agile_software_development">Agile</a> environment you may have a release every iteration, if not you may be releasing things more infrequently than that. This system is meant to be simple and fit with the change management process defined in the earlier post.<br />
<br />
Any version numbering scheme should be developed to fit your change management process. An initial version of a project will be Version 1. Changes after that are tracked using our numbering system below. A change will increment either the major or minor revision number (very loosely and very purposefully defined as 'depending on the impact of that change') as follows; <br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmek6O1cUR5Gw72lGar1yMpeGmIoJ90EXUYwQUZC9oDiOQFUPP0tZ75WeXDGSv2IBfHhock6q5kgTdmYT7nWGhCw0DayrkPp_B-6KJA4JA93plxESYObvFzzqo5aeFMaT4x9zgn6aropiX/s1600/ChangeManagementProjectNumbering.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmek6O1cUR5Gw72lGar1yMpeGmIoJ90EXUYwQUZC9oDiOQFUPP0tZ75WeXDGSv2IBfHhock6q5kgTdmYT7nWGhCw0DayrkPp_B-6KJA4JA93plxESYObvFzzqo5aeFMaT4x9zgn6aropiX/s1600/ChangeManagementProjectNumbering.jpg" /></a></div><br />
<ul><li>A Version Number is incremented when a project is wholly changed or rebuilt.</li>
<li>A major change to a version will increment the Major Revision Number.</li>
<li>A minor change to a version will increment the Minor Revision Number.</li>
<li>A Patch can be applied if a change to an existing version is required (rather than a rebuild and increment). Additional patches increment the Patch Number. </li>
</ul><br />
Any specific release can be recreated by starting with that version's code sequentially applying all patches.<br />
<br />
*Note, In my environment I don't need release things to users before they are production ready. If you you wish to denote that something being released to customers is in a pre-production state, I would call that a version 0, use the numbering scheme above for changes to that product and attach a greek alphabet prefix (Alpha, Beta, etc) to each release version in this pre production state.<br />
<br />
See Also:<br />
<br />
<ul><li><a href="http://www.amazon.com/Agile-Data-Warehousing-World-Class-Intelligence/dp/0595471676">Agile BI - Ralph Hughes</a></li>
</ul><br />
<br />
<br />
<br />
<br />
RecoveringBIAdminhttp://www.blogger.com/profile/18059710955267360533noreply@blogger.com0tag:blogger.com,1999:blog-6240601383990100002.post-69844374750417024602011-08-14T20:18:00.000-07:002011-08-14T20:20:11.479-07:00Do you do mentoring in your BI department?I came across an interesting article on types of mentorship in this twitter post:<br />
<br />
<!-- http://twitter.com/#!/ianditullio/status/102882381073088512 --> <style type='text/css'>.bbpBox102882381073088512 {background:url(http://a3.twimg.com/profile_background_images/223146239/vector-cool-wallpapers_24879_1280x800.jpg) #470f0f;padding:20px;} p.bbpTweet{background:#fff;padding:10px 12px 10px 12px;margin:0;min-height:48px;color:#000;font-size:18px !important;line-height:22px;-moz-border-radius:5px;-webkit-border-radius:5px} p.bbpTweet span.metadata{display:block;width:100%;clear:both;margin-top:8px;padding-top:12px;height:40px;border-top:1px solid #fff;border-top:1px solid #e6e6e6} p.bbpTweet span.metadata span.author{line-height:19px} p.bbpTweet span.metadata span.author img{float:left;margin:0 7px 0 0px;width:38px;height:38px} p.bbpTweet a:hover{text-decoration:underline}p.bbpTweet span.timestamp{font-size:12px;display:block}</style> <div class='bbpBox102882381073088512'><p class='bbpTweet'>Keeping Great People with Three Kinds of Mentors - Anthony Tjan - Harvard Business Review: <a href="http://t.co/PbQv3bg" rel="nofollow">http://t.co/PbQv3bg</a> via @<a class="tweet-url username" href="http://twitter.com/AddThis" rel="nofollow">AddThis</a><span class='timestamp'><a title='Sun Aug 14 23:20:45 +0000 2011' href='http://twitter.com/#!/ianditullio/status/102882381073088512'>less than a minute ago</a> via <a href="http://twitter.com/tweetbutton" rel="nofollow">Tweet Button</a> <a href='http://twitter.com/intent/favorite?tweet_id=102882381073088512'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/favorite.png' /> Favorite</a> <a href='http://twitter.com/intent/retweet?tweet_id=102882381073088512'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/retweet.png' /> Retweet</a> <a href='http://twitter.com/intent/tweet?in_reply_to=102882381073088512'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/reply.png' /> Reply</a></span><span class='metadata'><span class='author'><a href='http://twitter.com/ianditullio'><img src='http://a2.twimg.com/profile_images/912184252/screenshot_02_normal.jpg' /></a><strong><a href='http://twitter.com/ianditullio'>Ian Di Tullio</a></strong><br />
ianditullio</span></span></p></div><!-- end of tweet --><br />
<br />
Do you do mentoring in BI? I am very much in favor of mentoring. The secondary point of this article is almost more interesting to me,<br />
<blockquote><b>One of the most critical elements in retaining great people is effective mentoring. </b> </blockquote>The community of BI developers is small, and the community of great BI developers is even smaller. If you come across one, hire them or work for them! Mentoring can be a great retention method for talented employees. Simply put, good people want to work for more experienced good people.<br />
<br />
See Also:<br />
<br />
<ul><li> <a href="http://blogs.hbr.org/tjan/2011/08/keeping-great-people-with-thre.html#.TkhYSbHQ8vE.twitter">Keeping Great People with Three Kinds of Mentors</a></li>
</ul>RecoveringBIAdminhttp://www.blogger.com/profile/18059710955267360533noreply@blogger.com0tag:blogger.com,1999:blog-6240601383990100002.post-41858122791944460132011-08-04T08:39:00.000-07:002011-08-04T15:44:53.654-07:00Back from Tufte<div class="separator" style="clear: both; text-align: center;"><a href="http://www.yale.edu/polisci/people/etufte.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://www.yale.edu/polisci/people/etufte.jpg" /></a></div><br />
I spent the day yesterday attending Dr. Edward Tufte's excellent course/seminar/inspirational speech "Presenting Data and Information". Attend this course if you get a chance. <br />
<blockquote><b><span style="font-size: 100%;">Making a presentation is a moral act as well as an ethical and intellectual act.</span></b></blockquote>You'd do well to remember that as a BI developer. EVERYTHING you develop is a presentation. A report, a database table, a fancy dashboard, are all presentations and all tell a story. They become an attempt at concert between what you built (the system), and the user. Now that we've elevated reporting to a moral level, Dr. Tufte urges us to address the content ('do whatever it takes to show the content') with the moral weight of the previous statement. Therefore,<br />
<blockquote><b><span class="st">The <i>presentation stands</i> and <i>falls</i> on the quality, relevance, and integrity of the content.</span></b></blockquote>Dr. Tufte is an engaging speaker and I came away with pages of quotes and notes to share. But it seems the blogosphere has done it already (also it seems this course hasn't changed much in a year), check out this post for most of the gems I wrote down during this course. So I can quote ET quoting TS Elliott, "Talent imitates, but genius steals".<br />
<br />
<a href="http://neurocooking.blogspot.com/2010/11/day-with-edward-tufte.html">A day with edward Tufte</a><br />
<br />
<a href="http://www2.cs.uregina.ca/%7Erbm/cs100/notes/spreadsheets/tufte_paper.html">Tufte Design Principals</a><br />
<blockquote><span style="font-size: 100%;"><br />
</span></blockquote>RecoveringBIAdminhttp://www.blogger.com/profile/18059710955267360533noreply@blogger.com0tag:blogger.com,1999:blog-6240601383990100002.post-27185102430412352992011-07-29T10:15:00.000-07:002011-07-29T10:20:24.021-07:00Change Management In Cognos BIChange management is a difficult beast in any software environment, but in a multi-server Cognos BI environment it's especially hard. Partly because IBM Cognos doesn't seem to think anyone would have a multi server environment or do change management. But even a small team can quickly end up with many developers working with many different objects at different layers of the application stack (Database, ETL, Metadata modeling, OLAP objects, Reporting) and this can become a nightmare to wrangle. I'll discuss change management within a multi-developer project later, lets keep it at the package level for now. you have a multi server architecture, lets say it looks like this:<br />
<br />
<blockquote>Development > (deploys to) Test > UAT/Regression Testing > Production</blockquote><br />
So how do you coordinate multiple developers working on multiple projects at different stages of release? One way we make this easier is with the concept of <i>packages</i>. Whatever you develop in development can't make it out of development until it is packaged into a release candidate. This packaging could be merely conceptual or you could actually move files around, but a package is generally defined as the set of data, metadata and bi objects for this application. (this includes all database changes, etls, OLAP objects, scripts, etc for that version of the application to function in production) This candidate can then move through the other environments and eventually into production, but only that package. Any failures in the testing stages, for example, would need to be addressed in Dev and promoted as a new package. This also lets me know what's in what environment as I can refer to them as packages (HR v1.2.1 is moving to test, Accounting v1.0 is moving to production, etc). We do some other neat tricks for version management with subversion tagging, documentation and a change control software for Cognos items called Motio, but this is the heart of my change management procedure. <b>Only whole packages can move out of development or into the next stage! </b>Here's what that workflow might look like. <br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkMZeMC6wuqbPua6F8PskqUgNT-UzUHkAJyJVjnNCO07Tw2KZUB0WiMS2jJP3Ms2x3AaJM-tratKmOaS-glJKwwNt_uTPHbTPk5qn6ek7Kfpd0gCj97zYMJYqlNkCTF4okkNsP26G2BIsW/s1600/Change+Mgmt.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkMZeMC6wuqbPua6F8PskqUgNT-UzUHkAJyJVjnNCO07Tw2KZUB0WiMS2jJP3Ms2x3AaJM-tratKmOaS-glJKwwNt_uTPHbTPk5qn6ek7Kfpd0gCj97zYMJYqlNkCTF4okkNsP26G2BIsW/s1600/Change+Mgmt.jpg" width="833" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNUPVhAJa8Qiydpef4mZnuJQ4zqhc7oa3BfUK0WektdemeECV7VU66JVshlkuVscgRpR74v73ZvgmLS97bcwzjP0VoSO_OYndqLvqXAItNw8yAq7RnF-OUIhqR76TIkX5EeieupOOwR0Rs/s1600/Change+Mgmt.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br />
</a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyll4Tzg8Z7RF42whbv_MRtGluCOizlBmoG47mKB4Ay3MT6q1Ti0mbLUQsTZi5MteEAiwO8IPuMF8bg_c2MnrwUT8WtTq1MJZRh6LoAnHmKMY-tOxkOlDwFHewB-lUE6msgRfaIYN43jbJ/s1600/Change+Mgmt.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br />
</a></div><br />
In my next post I'll talk about the numbering scheme I use for packaging. Hold on to your seats!<b> </b>RecoveringBIAdminhttp://www.blogger.com/profile/18059710955267360533noreply@blogger.com0tag:blogger.com,1999:blog-6240601383990100002.post-75679161403129604402011-07-27T12:55:00.000-07:002011-07-27T12:57:31.807-07:00thanks blogosphereSometimes Cognos fixes something and doesn't let me know about it. And sometimes those questions come around again and I google for them and the BI Bloggosphere helps me out. Today I had a user who wanted me to change the default analysis of a cube. Thanks guys.<br />
<br />
<a href="http://mybyeexperience.blogspot.com/2011/07/analysis-studio-default-analysis-report.html?spref=bl"></a><br />
<blockquote><a href="http://mybyeexperience.blogspot.com/2011/07/analysis-studio-default-analysis-report.html?spref=bl">My BI Experience: Analysis Studio Default Analysis report</a>: "Recently had a requirement where a blank Analysis Studio report needs to open when you open an existing report and click on new report icon"</blockquote>RecoveringBIAdminhttp://www.blogger.com/profile/18059710955267360533noreply@blogger.com0tag:blogger.com,1999:blog-6240601383990100002.post-72440765039338516502011-07-26T11:17:00.000-07:002011-07-26T13:38:35.129-07:00Debugging Cognos JavascriptHow do you usually debug your Cognos reports with embedded JavaScript? Mostly I develop in IE and then load whatever I'm working on up in Firefox and use the Firebug plugin to look for any errors. (mostly because Firefox 5 doesn't work for report studio (the menu buttons don't work?)). I think I'll put together a longer post on using firebug to debug Cognos issues, but does anyone use any other methods?<br />
<br />
Oh, hey, there's my typo. <br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiXBUbHzdNC9S7zfAKAGB2OOEhrMaWnuVM0ubWPgDPAmYiGpaX_r_FAHc8_fIsUTBt0kbfw7Au336qFXnfFLkxU0YD-tHYWL6GFpE2Agm-XkWlfavuBRkr8hmdxYVoES10prYCt4pcIGMT/s1600/firefoxDebug.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="510" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiXBUbHzdNC9S7zfAKAGB2OOEhrMaWnuVM0ubWPgDPAmYiGpaX_r_FAHc8_fIsUTBt0kbfw7Au336qFXnfFLkxU0YD-tHYWL6GFpE2Agm-XkWlfavuBRkr8hmdxYVoES10prYCt4pcIGMT/s640/firefoxDebug.jpg" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuq6c4Fon8m2ytX7lz6PQ3i1N22m3NpZVjCfQ881kVGq18n4JYniLzmnWaLfsg3vplHuixnIxv_bfxjUbnUcLM0VJDMinyc0UBl8CHTP1av4WBNC1iGo32wvlY7QkPPAbX-6whsM43axub/s1600/firefoxDebug.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br />
</a></div>RecoveringBIAdminhttp://www.blogger.com/profile/18059710955267360533noreply@blogger.com0tag:blogger.com,1999:blog-6240601383990100002.post-64162798963295295352011-07-24T07:42:00.000-07:002011-07-24T07:42:38.986-07:00Visual Analyitics in the NYT!<div class="separator" style="clear: both; text-align: center;"><a href="http://graphics8.nytimes.com/images/2011/07/24/education/201107GRAD-slide-BXEH/201107GRAD-slide-BXEH-thumbWide.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://graphics8.nytimes.com/images/2011/07/24/education/201107GRAD-slide-BXEH/201107GRAD-slide-BXEH-thumbWide.jpg" /></a></div><br />
<br />
Some Visual Arts students in Manhattan graphically represented some data about their lives in the NYT today. Pretty cool analytical design.<br />
<a href="http://www.blogger.com/goog_2069249510"><br />
</a><br />
<a href="http://www.nytimes.com/interactive/2011/07/24/education/edlife/20110724_edlife.html?ref=edlife">http://www.nytimes.com/interactive/2011/07/24/education/edlife/20110724_edlife.html?ref=edlife</a>RecoveringBIAdminhttp://www.blogger.com/profile/18059710955267360533noreply@blogger.com0tag:blogger.com,1999:blog-6240601383990100002.post-15847904709438654992011-07-22T11:19:00.000-07:002011-07-24T08:43:17.096-07:00Working with Dynamic Filtering Part 2<span class="Apple-style-span" style="font-family: inherit;">If we recall, dynamic filtering is a Cognos function allowing us to limit a general target report with contextual information from the drill source. Filter the target by the source. Like this, drilling from an Analysis intersection to a details report.</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpl6Zm39Co6HocsrQi6tQr4BBrBCYZusA92aEAuE5l-84wYkoEpB41SgxSZCNvarNYPJpwHhdWZzdDdZhRmya87coVIjVomB_HIGEnX_5wuaFTlW1vXVsGFpongzRojbr-eFWW5jZl_0tD/s1600/Ddrill1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpl6Zm39Co6HocsrQi6tQr4BBrBCYZusA92aEAuE5l-84wYkoEpB41SgxSZCNvarNYPJpwHhdWZzdDdZhRmya87coVIjVomB_HIGEnX_5wuaFTlW1vXVsGFpongzRojbr-eFWW5jZl_0tD/s1600/Ddrill1.jpg" /></a></div><br />
<span class="Apple-style-span" style="font-family: inherit;">In the previous segment we went through how dynamic filtering works in Cognos 8 and 10. In this one I'll details some issues I had with the way that this works. When I initially looked into this I was working in Cognos 8.2, at that time there was one show stopper (#2) in analysis studio and a few others in Power Play Web, but they've corrected some issues as of 8.4.1 fix pack 3 and Cognos 10. Here's some of the issues I discovered with this latest attempt. </span><br />
<span class="Apple-style-span" style="font-family: inherit;"></span><br />
<a name='more'></a><span class="Apple-style-span" style="font-family: inherit;"><br />
</span><br />
<span class="Apple-style-span" style="font-family: inherit;">1.<span style="font: 7pt 'Times New Roman';"> </span><i>Expanded vs Drilled </i></span><br />
<span class="Apple-style-span" style="font-family: inherit;">(In analysis studio) <b>Drilling down into a hierarchy doesn’t bring that entire hierarchy along</b>. The drill appears to only pass what’s currently in the work area intersection. This behavior is consistent in Cognos 8 and 10. Analysis Studio is a hierarchy exploration and analysis tool, but anytime you drill from an intersection in analysis studio only the current 'work area' is passed! Information about the place in the hierarchy of the current intersection is important too!</span><br />
<span class="Apple-style-span" style="font-family: inherit;"><br />
</span><br />
<span class="Apple-style-span" style="font-family: inherit;">For example, drilling through on Camping Gear / Jan 2007 should be passing some information about the parents of these summary levels. Really we are saying "Give me all the revenue for products in the Camping Gear line that are Cooking Equipment sold in the Year 2007, first quarter, Jan 2007". I can drill into those dims like this. But, you can see the passed parameters only include the current intersection not the hierarchy.</span><br />
<span class="Apple-style-span" style="font-family: inherit;"><br />
</span><br />
<span class="Apple-style-span" style="font-family: inherit;">Expected parameters:</span><br />
<span class="Apple-style-span" style="font-family: inherit;">Product Line = Camping Equipment</span><br />
<span class="Apple-style-span" style="font-family: inherit;">Product Type = Cooking Gear</span><br />
<span class="Apple-style-span" style="font-family: inherit;">Year = 2007</span><br />
<span class="Apple-style-span" style="font-family: inherit;">Quarter = Q1</span><br />
<span class="Apple-style-span" style="font-family: inherit;">Month = Jan</span><br />
<span class="Apple-style-span" style="font-family: inherit;"><br />
</span><br />
<span class="Apple-style-span" style="font-family: inherit;">Result parameters:</span><br />
<span class="Apple-style-span" style="font-family: inherit;">Product Type = Cooking Gear</span><br />
<span class="Apple-style-span" style="font-family: inherit;">Year = 2007/Jan</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGP-CeByBwpF-AEZbYDsHpsmsRV00xhxVgxs7bwoIT8bewCsRop5G-zO9Yqa51WpOmCek-2LqeyI4KaEI0dJ_5OQQQODptDmuB-8-RUKPZc9vsg3K5drXYla4OM599u4WxnQ56eipqYewT/s1600/ddrilPt2-1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGP-CeByBwpF-AEZbYDsHpsmsRV00xhxVgxs7bwoIT8bewCsRop5G-zO9Yqa51WpOmCek-2LqeyI4KaEI0dJ_5OQQQODptDmuB-8-RUKPZc9vsg3K5drXYla4OM599u4WxnQ56eipqYewT/s1600/ddrilPt2-1.jpg" /></a></div>Now, Cognos' Example database, gosales is really an ideal world. In go sales we don't need to know the parents because 'Cooking Gear' doesn't exist under any other grouping than Camping Equipment. But in a scenario where we had an alternate hierarchy or different dimension which also included the Cooking Gear level in a different context, our filter would fail if it only said "Product Type = 'Cooking Gear'". Like above.<br />
<br />
<span class="Apple-style-span" style="font-family: inherit;"><b>But</b>, if I expand the dimension so that the parent information is included in the work area this context is passed along with the intersection. So this is one way to get all the context. But I don't like the idea having to training users to be aware of this.</span><br />
<span class="Apple-style-span" style="font-family: inherit;"><br />
</span><br />
<span class="Apple-style-span" style="font-family: inherit;">Result Parameters:</span><br />
<span class="Apple-style-span" style="font-family: inherit;">Product Line = Camping Equipment</span><br />
<span class="Apple-style-span" style="font-family: inherit;">Product Type = Cooking Gear</span><br />
<span class="Apple-style-span" style="font-family: inherit;">Year = 2007/Jan</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiybBJm0A5X1gG857-rNh6Yj5xEHjTrxNl4J8dZD5DFfPFlWPS5t0OUnc9j282EgMiZppKgmpgSZi9lAtKde30ULMkCidLp_2q0inWtU7cXTb5FGW478xCFkrIDDSCKO23c8Pj8VC98zeEn/s1600/ddrilPt2-2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiybBJm0A5X1gG857-rNh6Yj5xEHjTrxNl4J8dZD5DFfPFlWPS5t0OUnc9j282EgMiZppKgmpgSZi9lAtKde30ULMkCidLp_2q0inWtU7cXTb5FGW478xCFkrIDDSCKO23c8Pj8VC98zeEn/s1600/ddrilPt2-2.jpg" /></a></div><br />
<span class="Apple-style-span" style="font-family: inherit;">Workaround:</span><br />
<span class="Apple-style-span" style="font-family: inherit;">A potential solution to this case could be to create aggregate keys at every level of the drill source such that from any one source key you could tell where and in what hierarchy the reference came from. In the above example the Cooking Gear key would be the Product Line Key + the Product Type key "CampingEquiptmentCookingGear".. This would add some complexity to the model as the drill target report would need to anticipate this.</span><br />
<span class="Apple-style-span" style="font-family: inherit;"><br />
</span><br />
<span class="Apple-style-span" style="font-family: inherit;">2. Context Filters</span><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjeBP0iN6t_-Ttjsji6PxW27JCHJHGYX-sIfmsECcKL8-9onF7v8Lo3PMUvUrnsxIWYFkr1pv-m6B_-r2LthPq-LuKQwdeNXpW8GDZ7FdrTX2LmgG6LfL5FYzLdDHSGXa3zYQi_QogfA-5/s1600/ddrilPt2-3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjeBP0iN6t_-Ttjsji6PxW27JCHJHGYX-sIfmsECcKL8-9onF7v8Lo3PMUvUrnsxIWYFkr1pv-m6B_-r2LthPq-LuKQwdeNXpW8GDZ7FdrTX2LmgG6LfL5FYzLdDHSGXa3zYQi_QogfA-5/s1600/ddrilPt2-3.jpg" /></a></div><br />
<span class="Apple-style-span" style="font-family: inherit;">In Cognos 8.4.1 (fp3) <b>Context filters result in an 'OR' appended to the SQL rather than an 'AND'</b>. This is bad! If I pull a sales region into my previous analysis in the context filter section, say 'United States' My analysis numbers will be sliced accordingly. BUT, if I drill through in this state the resulting SQL will include 'United States' as an OR condition not an AND. This means I would bring back the set of rows from the 'United States' region OR of product type 'Camping Gear'. This is not what I want. <b>Cognos 10</b> appears to have corrected this issue, by default items placed into the Context Filters area will generate an AND condition in the resultant SQL logic. This is a big improvement in my opinion.</span><br />
<br />
<span class="Apple-style-span" style="font-family: inherit;"> </span><br />
<span class="Apple-style-span" style="font-family: inherit;"><br />
</span><br />
<span class="Apple-style-span" style="font-family: inherit;">3. Scope Setting</span><br />
<span class="Apple-style-span" style="font-family: inherit;">The Scop setting allows you to select a dimensional item and require that present in the 'work area' before the drill definition is avaliable. Here I've set the scope to the products dimension.</span><br />
<span class="Apple-style-span" style="font-family: inherit;"><br />
</span><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGlpOTUTcWJhfDXjMtDTcgka6TgGu6qNEzmvjld0pNn-q-gWZ2HCWjDNf5q-p4TPAzuOGWXY5dppXy1SFuGvyOg5ZEAq1-I7p5-QVli8n8rVw5UJq3GHD_PFdziI47jqCpc6mxXjvWXZwD/s1600/ddrilPt2-4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGlpOTUTcWJhfDXjMtDTcgka6TgGu6qNEzmvjld0pNn-q-gWZ2HCWjDNf5q-p4TPAzuOGWXY5dppXy1SFuGvyOg5ZEAq1-I7p5-QVli8n8rVw5UJq3GHD_PFdziI47jqCpc6mxXjvWXZwD/s1600/ddrilPt2-4.jpg" /></a></div><span class="Apple-style-span" style="font-family: inherit;"> </span><br />
<span class="Apple-style-span" style="font-family: inherit;">But the Scope Setting doesn’t really work the way I’d like it to. There is a setting in the drill through property that is supposed to be used to limit <i style="mso-bidi-font-style: normal;">from</i> where a drill through can initiate, the idea being that you wouldn’t want someone to pull in all years and cash and drill through to transactions; <b style="line-height: 17px;">But the setting only allows you to set the scope for 1 hierarchy. I'd like to be able to write more complex rules. </b><span class="Apple-style-span" style="line-height: 17px;">Cognos seems to want you to create 1 scope relationship for one dimension for one drill through definition. I suppose more complex rules can be defined by multiple targets.</span></span><br />
<span style="line-height: 115%;"><span class="Apple-style-span" style="font-family: inherit;"><br />
</span></span><br />
<span class="Apple-style-span" style="font-family: inherit;"><span style="line-height: 115%;">On the bright side, you only need to <i style="mso-bidi-font-style: normal;">include </i>the scoped dim somewhere (in an axis, context filter, nested dimension, etc) to enable drill through. This could be useful if we had a dimension that we wanted to use as a limiter such that we’d be able to cut down the output set. (say, setting the scope to the lowest level of the product dim.)The other issue with not being able to set scope is the potential for someone to drill through to details at a very high level and resulting in a very large output set. </span><span style="line-height: 115%;">For example, a high intersection like Revenue for all of 2011 would bring up all the transactions for 2011, a very large list indeed.</span></span><br />
<span class="Apple-style-span" style="line-height: 17px;"><span class="Apple-style-span" style="font-family: inherit;"><br />
</span></span><br />
<span class="Apple-style-span" style="line-height: 17px;"><span class="Apple-style-span" style="font-family: inherit;">4. Filter Display</span></span><br />
<span class="Apple-style-span" style="line-height: 17px;"><span class="Apple-style-span" style="font-family: inherit;">This one is incredibly annoying. If anyone comes up with a better way that'd be great. </span></span><br />
<span class="Apple-style-span" style="line-height: 17px;"><span class="Apple-style-span" style="font-family: inherit;"> </span></span><br />
<span class="Apple-style-span" style="font-family: inherit;">When you dynamically generate prompts you might want to display what those prompts were on the resulting report right? (I usually set a reporting standard saying we shouldn’t display a report output with incomplete information about what that output set includes) Well Cognos doesn’t make this simple. This task ends up adding a lot of overhead and potential maintenance when the source objects change to these drill objects.</span><br />
<span class="Apple-style-span" style="font-family: inherit;"><br />
</span><br />
<span class="Apple-style-span" style="font-family: inherit;">First, back to our previous explanation of what's happening on drill through (See <a href="http://bicuriouscognos.blogspot.com/2011/07/working-with-dynamic-filtering.html">part 1</a> for a more complete description). When a dynamic drill is requested two things happen, a set of values is used to modify the executed sql (a) and a placeholder parameter to be used in report rendering (b) is created named after the from data element in the source. The drill target report’s definition is meshed with (a) bringing back the filtered set of data. The (b) parameter can be grabed by the reporting engine using the displayParamValue() function IF (b) is REFERENCED in the drill target it is appended to the target report’s SQL. Similar to other optional paramaters, they remain undefined if they are not used in the report definition. So in short, we need to setup the drill target to expect and use (b) so that we can display "Filter Name" in the header.</span><br />
<br />
<span class="Apple-style-span" style="font-family: inherit;">Well what's all that mean? Lets walk through an example. A drill through at the following intersection will generate the following: </span><br />
<span class="Apple-style-span" style="font-family: inherit;"><br />
</span><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8rgvvrA2gGS-Z43y9l0SEDvPXrdcmPf5GaQ23kdK2dkN8csbLjV7EnO6BbF6E_58wCBNHLwmLU6GPBwjOZYIrutN1EfH85HYgsNL25pbldXM0lzu-Khcisu4dUO3j7kprkkzj16yD_sjv/s1600/ddrilPt2-5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8rgvvrA2gGS-Z43y9l0SEDvPXrdcmPf5GaQ23kdK2dkN8csbLjV7EnO6BbF6E_58wCBNHLwmLU6GPBwjOZYIrutN1EfH85HYgsNL25pbldXM0lzu-Khcisu4dUO3j7kprkkzj16yD_sjv/s1600/ddrilPt2-5.jpg" /></a></div><span class="Apple-style-span" style="font-family: inherit;"><br />
</span><br />
<span class="Apple-style-span" style="font-family: inherit;">1. The destination report will have a paramter defined ?Products1? with a display and use value of "TrailChef Canteen". *Note also that the paramater is products<b>1</b> rather than just products. I'll talk about this in the next IssueThis is because the dimension in the OLAP source is named products as well, so the level name 'products' gets a 1 appended to it.</span><br />
<span class="Apple-style-span" style="font-family: inherit;"><br />
</span><br />
<br />
<div class="MsoNormal">So, by dynamic drill, the report will be filtered for Product 'TrailChef Canteen' and display those rows. But it will not, by default, display those filter conditions in the header. In fact, we can’t just use the paramvalue() Cognos report function to display the parameter at this point. (I assume because it’s not referenced in the report xml it is discarded in the same way unsupplied optional parameters are) To do this we create an optional filter in the query that anticipates #1 above. Defined as<span class="Apple-style-span" style="font-family: inherit;"><i>"<b>?Products1? = ?Products1?</b>". </i></span>And then we can use our report functions to display the parameter like normal.</div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEAaViBLyNrsu6jXKuR7vyPM1z97jXpF_m5Oh84CDPaMSTdjkEIH_smoDPNk3q6nAS2cW86nP8beVgz_VbP01pwfWZbNxHRJoGZUGc9Z-_uCp_B1U14_UY7OJojRWTR_ZGSJrbnzI0sVX3/s1600/ddrilPt2-6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEAaViBLyNrsu6jXKuR7vyPM1z97jXpF_m5Oh84CDPaMSTdjkEIH_smoDPNk3q6nAS2cW86nP8beVgz_VbP01pwfWZbNxHRJoGZUGc9Z-_uCp_B1U14_UY7OJojRWTR_ZGSJrbnzI0sVX3/s1600/ddrilPt2-6.jpg" /></a></div><br />
<br />
<span class="Apple-style-span" style="font-family: inherit;"></span><br />
<span class="Apple-style-span" style="font-family: inherit;">2. This filter can be displayed on the report page with a report expression like this:</span><br />
<br />
<blockquote><span class="Apple-style-span" style="font-family: inherit;"><span style="font-family: "Courier New",Courier,monospace;">if (ParamDisplayValue('Products1') <> '') then ('Product: ' + ParamDisplayValue('Products1') + ', ' + ParamValue('Products1'))</span></span></blockquote><br />
3. So simple right? Now do that for every possible intersection in your cube and you'll have an optional parameter for every possible parameter. This is where the maintenance headaches start, you end up with a report that's query items,optional filters and report expressions must be updated for each cube change. <br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTihCzP-BpJN2tqRvYCRK6YQBWLDD3anxOVX09RhgP74PMrEh9B9bNS4cyhtwrMHCYnpoJEqx_pbgm1tJYdliGXanBfP-Vi5H714Q3I1i2pGjioKCL4BTI-eacdBCjZ0kj37ocVfGtM1wW/s1600/ddrilPt2-7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTihCzP-BpJN2tqRvYCRK6YQBWLDD3anxOVX09RhgP74PMrEh9B9bNS4cyhtwrMHCYnpoJEqx_pbgm1tJYdliGXanBfP-Vi5H714Q3I1i2pGjioKCL4BTI-eacdBCjZ0kj37ocVfGtM1wW/s1600/ddrilPt2-7.jpg" /></a></div><br />
<span class="Apple-style-span" style="font-family: inherit;"><br />
</span><br />
<div style="font-family: inherit;"><span class="Apple-style-span" style="font-size: small;">5. Dimensions named the same as a Level</span></div><span style="font-size: small;"><span style="font-family: inherit; line-height: 115%;">If a <i>Level Name</i> in an OLAP object is named the same as an overall <i>dimension name</i>, a # will be appended to the level name. This appears to be an attempt to create uniqueness within the cube. The issue is that a report developer would need to know that though his cube contains a dimension ‘Products’ with a level named ‘Products’ and his drill target report needs to include a query item and filter ‘Products1’ to match this at drill time.</span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8rgvvrA2gGS-Z43y9l0SEDvPXrdcmPf5GaQ23kdK2dkN8csbLjV7EnO6BbF6E_58wCBNHLwmLU6GPBwjOZYIrutN1EfH85HYgsNL25pbldXM0lzu-Khcisu4dUO3j7kprkkzj16yD_sjv/s1600/ddrilPt2-5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8rgvvrA2gGS-Z43y9l0SEDvPXrdcmPf5GaQ23kdK2dkN8csbLjV7EnO6BbF6E_58wCBNHLwmLU6GPBwjOZYIrutN1EfH85HYgsNL25pbldXM0lzu-Khcisu4dUO3j7kprkkzj16yD_sjv/s1600/ddrilPt2-5.jpg" /></a></div><br />
<br />
<span style="font-size: small;"><span style="font-family: inherit; line-height: 115%;">That's all I've noticed so far. By and large, Cognos does not make drill through simple for your developers and pretty much unheard of for your technically proficient business users. So maybe have your modeler set it up. If you're unsure of your dimensional structure I would hold off on implementing drill through until you're sure it's stable given that it's so much work to setup and maintain. </span></span><br />
<div class="MsoNormal" style="margin-left: .25in;"><span class="Apple-style-span" style="font-family: Times,'Times New Roman',serif;"><o:p></o:p></span></div>RecoveringBIAdminhttp://www.blogger.com/profile/18059710955267360533noreply@blogger.com1tag:blogger.com,1999:blog-6240601383990100002.post-23185885506265497792011-07-18T21:12:00.000-07:002011-07-20T14:45:08.043-07:00IBM Cognos Knoledge BaseIn reading some background info on Cognos dynamic drill through I got a lot of current info from IBM's knowledge base. I have to say, since they were taken over by IBM the knowledge base area has gotten a lot better. For about a year it was a barren land full of out of date information and dead links, but here's a few good ones.<br />
<br />
<a href="http://www.ibm.com/developerworks/data/products/cognos/">http://www.ibm.com/developerworks/data/products/cognos/</a><br />
<br />
Specifically the Developer Works area is nice. They have a lot of case studies and examples for some esoteric tasks.<br />
<ul><li><a href="http://www.ibm.com/developerworks/data/library/cognos/reporting/dimensional_queries/page573.html?ca=drs-&utm_medium=twitter&utm_source=twitterfeed">Member Functions</a></li>
<li><a href="http://www.ibm.com/developerworks/data/library/cognos/reporting/dimensional_queries/page563.html?ca=drs-&utm_medium=twitter&utm_source=twitterfeed">Calculate a running total using member functions (OLAP)</a> </li>
<li><a href="http://www.ibm.com/developerworks/data/library/cognos/development/how_to/page565.html?ca=drs-&utm_medium=twitter&utm_source=twitterfeed">Hands on with the Dev Kit</a></li>
<li><a href="http://www.ibm.com/developerworks/data/library/techarticle/dm-1001cognosmashup/index.html">Working with mashup services</a> </li>
<li><a href="http://www.ibm.com/developerworks/data/library/cognos/modeling/security/page544.html?ca=drs-">Dynamic Reporting with role based security</a> </li>
</ul><br />
Java Script Examples<br />
<ul><li><a href="http://www.ibm.com/developerworks/data/library/cognos/reporting/scripting_techniques/page548.html">Restricting a Tree Prompt</a></li>
<li><a href="http://www.ibm.com/developerworks/data/library/cognos/reporting/scripting_techniques/page515.html?ca=drs-">Dynamic sorting in Cognos 8</a></li>
</ul>RecoveringBIAdminhttp://www.blogger.com/profile/18059710955267360533noreply@blogger.com0tag:blogger.com,1999:blog-6240601383990100002.post-61503130712836627342011-07-15T15:51:00.000-07:002011-07-22T11:22:17.033-07:00Working with Dynamic FilteringSo one question I usually get asked by users when I build an analysis object is 'How do I drill through to the details?'. As much as we want to talk users out of looking at the details when we're building them aggregates, the reporting task of detail dumps invariably comes up. It's also a likely a sign of an immature business process, but that's a whole different post.<br />
<br />
In relational scenarios this is straight forward, a drill target mapping can be used to jump from any context to any other, map the parameters and there you go, from a summary level, select the details. <br />
<br />
In IBM Cognos 7 this was not too difficult, you could setup an IMR details report, link it as a drill target and the dynamic filtering would filter that result set based on the context of your selection at the time of drill through. (based on business key). In Cognos 8 this process has become a hectic jumble of xml, sql generation, report variables and other black magic. Don't be fooled by the numbering, Cognos 7 and 8 are totally different pieces of software and handle the drill through process completely differently. This contextual filtering in Cognos 8 and Cognos 10 is handled by a setting you may have seen in drill through definitions called 'dynamic filtering'.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTeI_XFTL1UHDaOI_bPMKkjmeLLZtHj5OPT7ofdRyqEr7S6hEkzbbSSVR-d0qvHP5Jymko0IjlgIAmrklFfYmp0llxVrpz5RUrqo9z0qh_1D5YLOpCKo7-Pxn8237FCVjFW-69A7Wb9cxk/s1600/dynamic+filtering.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTeI_XFTL1UHDaOI_bPMKkjmeLLZtHj5OPT7ofdRyqEr7S6hEkzbbSSVR-d0qvHP5Jymko0IjlgIAmrklFfYmp0llxVrpz5RUrqo9z0qh_1D5YLOpCKo7-Pxn8237FCVjFW-69A7Wb9cxk/s1600/dynamic+filtering.jpg" /></a></div><br />
<br />
<br />
<a name='more'></a><br />
<br />
Cognos 8 (and Cognos 10) Dynamic Drill through, in theory, allows a user to setup a very generic drill target report and supply filter conditions to that report at the time it is requested. The idea is to allow dynamic filtering without having to setup hundreds of drill target mappings for complex cubes. It's still a pretty cumbersome process to get setup and maintain, but I'll try to detail how this handshake works. This process is outlined in this IBM Knowledge base article:<br />
<br />
<a href="http://www.ibm.com/developerworks/data/library/cognos/reporting/drillthrough/page566.html?ca=drs-">http://www.ibm.com/developerworks/data/library/cognos/reporting/drillthrough/page566.html?ca=drs-</a><br />
<br />
Here's how it works, we're trying to take a source and modify the destination code to filter by the source location:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpl6Zm39Co6HocsrQi6tQr4BBrBCYZusA92aEAuE5l-84wYkoEpB41SgxSZCNvarNYPJpwHhdWZzdDdZhRmya87coVIjVomB_HIGEnX_5wuaFTlW1vXVsGFpongzRojbr-eFWW5jZl_0tD/s1600/Ddrill1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpl6Zm39Co6HocsrQi6tQr4BBrBCYZusA92aEAuE5l-84wYkoEpB41SgxSZCNvarNYPJpwHhdWZzdDdZhRmya87coVIjVomB_HIGEnX_5wuaFTlW1vXVsGFpongzRojbr-eFWW5jZl_0tD/s1600/Ddrill1.jpg" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJq5LadMeZf2vQjFQwyHEoG3G7nRaLhG-NlEFcfdMfYZF3R3jPcp19iLB1XjjzEFXrBERThoBHm-sWM_LAR5G2h0Peru38HKNHdcm8vi_vkGN5GJ3cEu9QLFvSYrf9WIwC4LG_QLZeoDon/s1600/Ddrill1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br />
</a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><br />
<div class="MsoNormal">Drill through is the process of combining some information from the source with some information from the target and generating a result set. So when this process happens what is grabbed from where? Take a look here at the drill through details page. (This is output Cognos generates to describe what it is passing on drill through. I have numbered a set of interesting items.)</div><div class="MsoNormal"><br />
</div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvOC5LoPebKXwJ2tYt3fP-wZpk7ADmDfnlklAK2rGHjYF27lNwpLcGD2X-AWhyp836v-fcA5Mk6sNFGBUyPSw-EbUhyphenhyphenluHuo96ko23sYGDySEf5hgv_3DHtqRVVbXQXC_uHN71cQ1xl7gj/s1600/Ddrill2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvOC5LoPebKXwJ2tYt3fP-wZpk7ADmDfnlklAK2rGHjYF27lNwpLcGD2X-AWhyp836v-fcA5Mk6sNFGBUyPSw-EbUhyphenhyphenluHuo96ko23sYGDySEf5hgv_3DHtqRVVbXQXC_uHN71cQ1xl7gj/s1600/Ddrill2.jpg" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaS5gFZoVVXRksOQYla3djlo8fTaCxwWHbFWZXNOywSscgNEBASSolU9QH9xJq99T-emcquVsJ45UgzKwiKTsox_dUuzYLnj1tW8fxdC_LF2lfbUrG_rD2uELN6AzWaZmXzyweK-AIGnCP/s1600/Ddrill2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br />
</a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVNIX4tn3vlUcmRV1qSdaN4ccHu2Ls15h5g2lcgNSkmRzhX0HrqekkB2d8diLv_n8_6TdcNr9ESR33LFshPE2AEs46g3AqmCEMUo6V0d0KJtqjWUUU27c7pwJfJBJwtVSXHxajFTzk-Gwf/s1600/Ddrill3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVNIX4tn3vlUcmRV1qSdaN4ccHu2Ls15h5g2lcgNSkmRzhX0HrqekkB2d8diLv_n8_6TdcNr9ESR33LFshPE2AEs46g3AqmCEMUo6V0d0KJtqjWUUU27c7pwJfJBJwtVSXHxajFTzk-Gwf/s1600/Ddrill3.jpg" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDXitPtxzUka32b8pOo2JwhyphenhypheniG6TPG6sh6LYTviYJEcbAhimfgtirYpNXjaBoHB3L8ugMaYHGkZ0yC4rliRAEdIwz8Bw4pjbTamnSVtV4frR2SxS6dMK3TGK4Pl-m7V626SyJD45IqFDZB/s1600/Ddrill3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br />
</a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLU576BsPG8U6M6yjqSYuMmKPACH_b14KoxaJZZBHzCD5bvGsViWtV3lgKyxmVhmue4LgE1hTkqleyP95SjSKMoqqXV422veCGZK_Vs3cg-fa_tFmrAomFR8sZo5c_r7f13BvnJg7UeUtL/s1600/Ddrill3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br />
</a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCfXioRK1kSDN4PWBpNciaK7QjVmtPT73xybaXE3_3ivcRB-b4iLMSmdiQLxmqod-HelimX7XUK58_BQoTKJXQMikXIKw4N5_kpASU-0mCKCHsLYKJNresUYlriEtAOJZ-_cTiYQwlfZbd/s1600/Ddrill3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br />
</a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLU576BsPG8U6M6yjqSYuMmKPACH_b14KoxaJZZBHzCD5bvGsViWtV3lgKyxmVhmue4LgE1hTkqleyP95SjSKMoqqXV422veCGZK_Vs3cg-fa_tFmrAomFR8sZo5c_r7f13BvnJg7UeUtL/s1600/Ddrill3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span id="goog_31273477"></span><span id="goog_31273478"></span></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCfXioRK1kSDN4PWBpNciaK7QjVmtPT73xybaXE3_3ivcRB-b4iLMSmdiQLxmqod-HelimX7XUK58_BQoTKJXQMikXIKw4N5_kpASU-0mCKCHsLYKJNresUYlriEtAOJZ-_cTiYQwlfZbd/s1600/Ddrill3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br />
</a></div><div class="separator" style="clear: both; text-align: center;"> </div><div class="MsoNormal"><b style="mso-bidi-font-weight: normal;">Regular Dimensions</b></div><div class="MsoListParagraphCxSpFirst" style="margin-left: .25in; mso-add-space: auto; mso-list: l0 level1 lfo1; text-indent: -.25in;">1.<span style="font: 7pt "Times New Roman";"> </span>The string “<b style="mso-bidi-font-weight: normal;">Country</b>” comes from the <i style="mso-bidi-font-style: normal;">Level Name </i>property in the OLAP object. In the drill destination a report parameter will be created called “Country” that can be used to display the passed value. (More on this later)</div><div class="MsoListParagraphCxSpMiddle" style="margin-left: .25in; mso-add-space: auto; mso-list: l0 level1 lfo1; text-indent: -.25in;">2, 3.<span style="font: 7pt "Times New Roman";"> </span>The Display/Use Value is misleading here. In the drill destination the display AND use values for the parameter called “Country” will be the listed “Mexico”. (rather than something useful like say, the source key in the use value?)</div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 0.25in; text-indent: -0.25in;">4.<span style="font: 7pt "Times New Roman";"> </span>This entire fragment represents what is used by the dispatcher to generate dynamic filters and append them to the drill destination SQL. This value “<b>Country</b>” comes from the <i>Level Name</i> in the OLAP object. Cognos will examine the definition of the drill destination looking for a query item named "Country". This will be used as the left side of the dynamic condition.</div><div class="MsoListParagraphCxSpMiddle" style="margin-left: 0.25in; text-indent: -0.25in;">5. The <i>Source or Label Value</i> is used for the right side of the dynamic condition. If a label is not defined the source value is used. In this case "<b>Mexico</b>". The items from 4 and 5 are combine to create the where condition. Country = Mexico.</div><div class="MsoListParagraphCxSpLast" style="margin-left: .25in; mso-add-space: auto; mso-list: l0 level1 lfo1; text-indent: -.25in;">6.<span style="font: 7pt "Times New Roman";"> </span>1-5 are repeated for each unique member intersection touched by the intersection, nested elements expanded levels, etc are appended to the SQL as extra and conditions. <b>*NOTE </b>for a value to be present in the dynamic filter it <b>must</b> be present in the drill target. If you notice in step 4 the drill target is searched for a Country definition. If it's not present it won't be included in the filter set.<br />
<br style="mso-special-character: line-break;" /></div><div class="MsoNormal"><b style="mso-bidi-font-weight: normal;">Time Dimensions – Cognos 8.4</b></div><div class="MsoNormal">Time dimensions act a bit differently.<b> </b></div><div class="MsoListParagraphCxSpFirst" style="margin-left: .25in; mso-add-space: auto; mso-list: l1 level1 lfo2; text-indent: -.25in;">1.<span style="font: 7pt "Times New Roman";"> </span>The string <b style="mso-bidi-font-weight: normal;">Month</b> comes from the level. Same as regular dimension. </div><div class="MsoListParagraphCxSpMiddle" style="margin-left: .25in; mso-add-space: auto; mso-list: l1 level1 lfo2; text-indent: -.25in;">2,3.<span style="font: 7pt "Times New Roman";"> </span>Same as regular dimension</div><div class="MsoListParagraphCxSpMiddle" style="margin-left: .25in; mso-add-space: auto; mso-list: l1 level1 lfo2; text-indent: -.25in;">4.<span style="font: 7pt "Times New Roman";"> </span>A time dimension will read the drill destination looking for a query item named “Month” in this case (The Level name). The value of that query item will be used as the left side of the dynamic condition.</div><div class="MsoListParagraphCxSpLast" style="margin-left: .25in; mso-add-space: auto; mso-list: l1 level1 lfo2; text-indent: -.25in;">5.<span style="font: 7pt "Times New Roman";"> </span>A time dimension is generated as a string of the format (‘START’,’END’). This will be used as the right side of the dynamic condition. The destination sql will be appended with a combination of 3 and 4, in this case looking something like [Month] = (‘5/1/2005’,’5/31/2005’)</div><div class="MsoNormal"><br />
</div><div class="MsoNormal"><b>Time Dimensions – Cognos 10</b></div><div class="MsoNormal">In Cognos 10 this changes a bit. </div><div class="MsoListParagraphCxSpFirst" style="margin-left: .25in; mso-add-space: auto; mso-list: l2 level1 lfo3; text-indent: -.25in;">1.<span style="font: 7pt "Times New Roman";"> </span>The report parameter is still generated from the level name. In the case of drilling through time on months a parameter called ‘Months’ will be created in the destination report. (See section 4 about working with these parameters.) The thing to note here is that 1 and 4 are inconsistent. </div><div class="MsoListParagraphCxSpMiddle" style="margin-left: .25in; mso-add-space: auto; mso-list: l2 level1 lfo3; text-indent: -.25in;">2, 3.<span style="font: 7pt "Times New Roman";"> </span>Same as regular dimension</div><div class="MsoListParagraphCxSpMiddle" style="margin-left: .25in; mso-add-space: auto; mso-list: l2 level1 lfo3; text-indent: -.25in;">4.<span style="font: 7pt "Times New Roman";"> </span>In Cognos 10 the drill destination report will be searched for query item named after the <i style="mso-bidi-font-style: normal;">Dimension Name. <b style="mso-bidi-font-weight: normal;"> </b></i>In this case ‘Date of Record’ that value will be used as the left side of the condition</div><div class="MsoListParagraphCxSpLast" style="margin-left: .25in; mso-add-space: auto; mso-list: l2 level1 lfo3; text-indent: -.25in;">5.<span style="font: 7pt "Times New Roman";"> </span>In Cognos 10 the generated fragment will contain a start and end date. These will modify the sql to become Date of Record >= START and Date of Record < END. In this case [Date of Record] >= ‘5/1/2005’ and [Date of Record] < ‘5/31/2005’. Depending on the level of the time dim at the time of the drill, a different set of to and from dates are created.</div><div class="MsoNormal"><br />
</div><div class="MsoNormal">So when we drill through we can see this in the captured sql:<br />
<div style="font-family: "Courier New",Courier,monospace;"><span style="font-size: x-small;"><br />
</span></div><blockquote style="font-family: "Courier New",Courier,monospace;"><span style="font-size: x-small;">where "Product13"."PRODUCT_NAME"=N'TrailChef Water Bag' and "Order_header10"."ORDER_DATE">=to_date('2005-05-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS') and "Order_header10"."ORDER_DATE"<( to_date('2005-05-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS') + INTERVAL '1' DAY ) and <span style="color: #38761d;">"Country9"."Country"='Mexico' </span></span></blockquote>And we get a result set of orders for the month of May 2005 for the TrailChef Water Bag from Mexico. Dang. Cool.<br />
<br />
</div><div class="MsoNormal"> Next time I'll talk about some issues I discovered in working with these 'features.'</div><br />
<div class="separator" style="clear: both; text-align: center;"></div>RecoveringBIAdminhttp://www.blogger.com/profile/18059710955267360533noreply@blogger.com0tag:blogger.com,1999:blog-6240601383990100002.post-87767400540930938162011-07-13T06:52:00.000-07:002011-07-13T06:52:19.564-07:00Attending the Tufte Course in Chicago.<div class="separator" style="clear: both; text-align: center;"><a href="http://www.edwardtufte.com/tufte/graphics/vdqi_bookbottom.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="191" src="http://www.edwardtufte.com/tufte/graphics/vdqi_bookbottom.gif" width="320" /></a></div><br />
I'm attending the Edward Tufte course coming up here pretty soon. I'm excited about this Tufte is an interesting figure in the world of data. His books deal with the presentation of data and visualization in a very smart and beautiful way. A nerd AND an artist. Hopefully I'll get some good ideas about data visualization and won't fall asleep like at most conferences.<br />
<br />
<a href="http://www.edwardtufte.com/tufte/courses">http://www.edwardtufte.com/tufte/courses</a>RecoveringBIAdminhttp://www.blogger.com/profile/18059710955267360533noreply@blogger.com3tag:blogger.com,1999:blog-6240601383990100002.post-75486705079429773872011-07-11T11:51:00.000-07:002011-07-11T12:04:33.409-07:00Are you BI Curious? (Business Intelligence)<a class="h2 title" href="http://businessintelligencecurious.tumblr.com/post/7500479726/welcome"></a> <br />
Hello, I’m a Business Intelligence developer and have been for several years. I’ll use this blog to post some best practices and interesting examples. There’s not a lot of good information out there on some techniques so hopefully this will be a good resource.<br />
<br />
I’m currently doing a lot of projects in Cognos 8.4.1, Cognos 10 and Oracle so that will be the focus.<br />
<br />
Here’s some pages I took inspiration from:<br />
<a href="http://unofficialcognostraining.blogspot.com/">http://unofficialcognostraining.blogspot.com/</a><br />
<a href="http://cognosandme.blogspot.com/">http://cognosandme.blogspot.com/</a><br />
<a href="http://www.biprofessional.net/">http://www.biprofessional.net/ </a>RecoveringBIAdminhttp://www.blogger.com/profile/18059710955267360533noreply@blogger.com0