Want to know The Truth About CPM?

24 September 2012

Oracle Open World Essbase/EPM meetup


Introduction

I know many (some?  one or two?) of you are coming to OOW, or will be in the Bay Area vicinity next week.

We (Tim Tow and I) are hosting an Essbase/EPM meetup at Specchio-Ristorante at 8 pm, Tuesday 2 October.

What’s it all about, Alfie?

What's it going to be about?  Agenda tbd, but I hope you enjoy improvisational situations because that's exactly what it's going to be.

What I would expect:
  • Networking
  • Knowledge sharing
  • Completely legal drugs in liquid form at the cash bar.  No, not antipsychotics in liquid suspension, but I do believe Specchio has a liquor license.  OTOH, if it's a really trying conference, I may be drinking coffee.  Or thinking maybe Risperdal might be an option.  It might be that good of a conference.  We shall see.   Once upon a time, I worked for the company that invented that drug.  No, I am not a pharmacologist.  I did however replace their IRI Express (soon to become Oracle OLAP Server) instance with Essbase.  :)
  • Hanging out with like-minded people.  Which I suppose is pretty darn close to Networking, so I think I am done with the listing of benefits.

There's only room for 50, and Tim and I have both rsvp'd, so that means 48 slots are open as of this writing.

Here’s the gen

Here's the meetup invitation:
http://www.meetup.com/Oracle-Open-World-Essbase-EPM-meetup/events/83903872/

And the restaurant's web site:
http://www.ristorantespecchio.com/about/

I hope you can make it -- it should be a lot of fun.

09 September 2012

A simple 23 step guide to Books, Batches, and Bursting in Hyperion Financial Reports

Introduction to the guide

I was asked in in this thread over on the Network54 Essbase board to post a guide to Hyperion Financial Reports batch bursting I wrote a while back.  I’m happy to share what I came up with but first a couple of caveats:
  • I have redacted identifying information from the screenshots.  It’s usually pretty obvious where this has happened.  
  • If you have questions about this, go ahead and make comments but unfortunately, I can’t reproduce the environment I did this one because:
    • I wrote this for EPM 11.1.2.0 (so an almost two year old release).  I have no idea if the defects/bugs/weirdness/obvious-stuff-that-I-am-too-dense-to-see have been resolved or not in 11.1.2.1 and 11.1.2.2.  Mercifully, I have not been called upon to do more with batches since writing this document.
    • Some of the issues I encountered were, I think, caused by a less-than-perfect installation.  I could rant on and on about how bad it was but it would bore everyone, even me.  At the time, I asked someone I know in infrastructure what he thought it would take to resolve all of the issues (oh, I had a working issues list).  The reply?  “I wouldn’t touch that with a 40 foot barge pole.  If I were to come in, I would insist on a complete reinstallation on a clean box.”  In other words, nuke and pave.  I mention this not to reflect the frustration we application developers encounter when an install is bad, but to note that some of the general weirdness may be because the software wasn’t “right”.
  • I wrote this in the form of a step-by-step tutorial.  I never did find one on the web – I thought for sure there would be one but my google-fu failed me.  Maybe there’s one now, but I sort of doubt it.
  • Contrary to what I wrote in that thread, doing all of this is not 23 steps, but instead:
    • 24 steps (23 to create + 1 to view) to create that scheduled batch
    • 6 steps to import a bursting file (and yes, I explain what a bursting file is) into Workspace
    • 6 more steps to applying the bursting file into the batch scheduler
    • Although I am somewhat math-challenged, that means this is a 36 step process.  It's almost the 39 Steps.

And with that out of the way, enjoy.    

Background

Briefly, there are six kinds of Financial Reports documents typically encountered in a Planning implementation:
  1. Financial Reports – the base Essbase/Planning report
  2. FR Books – collections of FRs using, where applicable, a common POV to drive all reports within a book
  3. FR Batches – Objects that contain reports and books.  A batch can contain a single report, multiple reports, a single book, multiple books, mixes of reports and books, etc.
  4. FR Scheduled Batches – Scheduler (Workspace has its own, reports-only scheduler) of FR Batches and their Books and reports.  Scheduled objects can get written to Workspace folders, zip files, and emails.
  5. Burst batching – A way to parameterize scheduled batches and overload single dimension selections (only one dimension can be bursted and yes that is a strange word for it) with either manually selected members or members driven through imported burst files.
  6. Bursting files – These are comma-delimited files used to drive burst batching

How to create a Scheduled Batch in Workspace 11.1.2.0

It’s just a simple 23 step procedure to define a scheduled batch.

Creating a book


1)  After creating a FR report, create a FR book by logging into Workspace and clicking on the Explore button.  Then select File->New->Document,.
2)  Select “Collect Reports into a book”
3)  Pick the report you want to incorporate into the book.  Books commonly contain more than one report but that is not a requirement.

4) Move the report(s) over to the right hand list box and when complete, click “Finish”.
5) The data sources in the report(s) will show up in the book.  These will be driven by the book’s POV.  
6) If you wish to get rid of the book’s table of contents, deselect it as shown below.
7) To force the save of the book, close the document; you will be prompted to save the book.
8) Save the book to whatever name and location you desire.
9) This book will be used in the batch.

Creating a batch


10) Go to File->New->Document again, but this time select “Batch Reports for Scheduling”.
11) Batches can be just a single or multiple books and reports.  To see them in the file selector, use the dropdown at the bottom to toggle between the different kinds of base documents.
12) Move the object you want to put into the batch over to the right.
13) Again, close the document to force a save action.
14) Save the batch.

Scheduling a batch

Creating the scheduled batch

15) Schedule the batch by going to the Navigate->Batch Scheduler menu.
16) In the Batch Scheduler screen, right click and select “New Scheduled Batch”.  This will launch the scheduled batch wizard.
17) Name the batch.  You can make the batch a one-tme affair by selecting “Delete Scheduled Batch Entry from Scheduler if Completed Successfully”.  Do not do this as creating a batch is fairly painful, as you may have noticed.  Click on Next to move to the next step.
18) Select the batch you want.  In this example, it’s “Batch for XXXXXXXXXXX”.  After entering the name, click on Next to move to the next step.
19) You will be prompted to log in to both FR and Essbase with an administrator id.  I do not recommend a specific userid like CameronTheConsultant as these ids get terminated.  

Selecting members for data connections

20) Individually select the connections (the All option doesn’t work, see Oracle Support ID 1097787.1) and select (usually) identical cost centers for each data source.
21) There’s a big bug in FR batches – as far as I can observe, when the scheduled batch is edited the Selected Members appear to be defined (and are shown in the Select Members text box) but are not.  The only way around this bug is to select the individual data connections and click on the Copy Members button to reapply the Cost Center members.

I have also found that clicking on the Preview Bursting List button for a given data source will deselect the selected members for the other data source.  To make sure both data sources are selected, click on the Copy Members button for both data sources and do not use the Preview Bursting List.

Click on Next to move to the next screen.

Defining where the batch output goes

22) Select “Export as PDF” and “Export to an external directory”.  Click on Next to run the batch.
23) A confirmation dialog box will appear.
 

Reviewing the output 

24) The external directory FRExport1, as defined through the FRConfig.cmd utility on the Financial Reports server, corresponds to \\yourservername\f$\FRExport1.  The output structure is as below.



Bursting files in scheduled batches

Bursting files are comma delimited files used to externally drive batch bursting member selections.  Given the bugs in FR batch scheduling, bursting files also provide a way to quickly and consistently select members in the Bursting Options.
For Oracle’s take on the bursting file parameters see:  http://download.oracle.com/docs/cd/E17236_01/epm.1112/fr_webuser/scheduler_wizard_fr.html

Bursting file fields

dimension_dimensionname

In the CCRpt example, the column name is dimension_Cost Center.  Within the field, the member values are the cost center numbers.  Per the documentation, member names must match on case.  Only one dimension per burst batching file can be defined.

subfolder_name

The name of the folders underneath the main one defined in the batch schedule.  The CCRpt example uses <<FinancialReportingObjectName()>>-<<MemberAlias()>> which passes the name of the book and the member alias from the dimension_dimensionname column into the sub folder name.  Other valid tags are <<MemberName()>>, <<BatchPovMember(DataSrcName,DimName)>>, <<BatchPovAlias(DataSrcName, DimName)>>, <<FinancialreportingObjectDescription()>>, and <<Date(“format”)>>.

financial_reporting_object_name

The name of the pdf files.  The same parameters as subfolder_name apply.

group_names

The Shared Services group that runs the batch, by row.  Not used in the CCRpt example.

role_names

The Shared Services role that runs the batch, by row.  Not used in the CCRpt example.

user_names

The Shared Services user name that runs the batch, by row.  Not used in the CCRpt example.

email_list

The SMTP email address that receives the batch pdf output.  Although this is set in the CCRpt example, it does not work because the SMTP configuration was not done during installation.

external_pdf_root

The root of the file output.  This overrides the output from the scheduled batch.

Importing the bursting file to Workspace

For the scheduled batch to read the burst batching file, it must be imported into Workspace.
1) After creating the batch bursting file in Excel and saving the output as a comma delimited file, import the file into Workspace by clicking on the Explore button, navigate to the target folder,  and then the menu File->Import->File and then select the file.
 
2) Click on Browse and select the file.
3) After confirming the file in the File textbox, click on the Next button to move to the Advanced screen.
4) Click on the Next button to move to the Permissions screen.
5) Click on Finish to finish the import process.
6) The file will appear in the target folder.
For your amusement, I have stuck a copy of the file here.  It’s in (as noted) comma-delimited format.

Applying the bursting file into the batch scheduler

1) In the batch scheduler, select the data source, then tick the “Run Batch for multiple members in the dimension”.  Then click on the ellipsis button to import the burst file.
2) Select the burst file – this is the file just imported into Workspace.
3) You will see the comma delimited batch bursting file’s full path.  Click on the “Copy Members” button to apply the values in the batch bursting file to the data source.
4) Once the Copy Members button has been clicked on, the members in the burst batch file will be shown in the Select Members text box.  This comma delimited list of members can be modified by clicking on the magnifying glass.
5) Select the other data source and apply the members by clicking on the “Copy Members” button.  It will look like the members are selected – this is not the case – never be afraid to click on that button.
6) Click on the Next button to continue defining the scheduled batch as defined above.

Conclusion

That was easy, wasn’t it?  :)

Okay, it wasn’t really hard at all, and it is pretty cool functionality.  However, it took me FOREVER and a day to figure out how to do this and I had to reach out to multiple people (in fact an ex-client from my ex-consulting company. Hello! Lisa Abrewczynski and Rholanda Brooks) to get the answer.  What, you think I figure all this stuff out by myself?  If only.  Oh wait, no one thinks that.  Regardless, it was super nice that they both took time to help me out – I am obliged.

And that’s it!  I hope you enjoyed this super short (hah!  25 pages in Word) guide to books, batches, and bursting.


03 September 2012

Stupid Planning Queries #10 -- Query all descendants of a given member

I love it when a plan comes together

No, I am not John “Hannibal” Smith although I will admit to a preternatural love of the A-Team as a teenager.  Ah, youth.  What I specifically love is when one of my rants/diatribes/random collections of words/occasionally semi-brilliant idea inspires other people.  It really is awesome.  And a little scary.

My Spanish buddy (okay, I am stretching a word here, but c’mon, as he is the only person I know in Spain surely he is simultaneously my only-ever-communicated-by-email acquaintance, colleague, BFF, and buddy all at the same time) Francisco Amores Torres had a comment on my Planning security query post.  He wanted to know how to modify the query to show all of the members in a hierarchical security definition (think inclusive descendants).  He (not me) figured this out using a recursive query.  To SQL geeks, this is like breathing, but for most of us EPM practitioners, it is somewhat of a challenge.  Ooooh, I thought, I want to know how to do that.  I inspired him (if an incomplete solution can be thought of as inspiration) and he inspired me.  It’s kind of awesome.

Limiting a Planning dimension query

There are times (I will illustrate a reason why in a few blog posts – this is too involved to do all at once) when you maybe only want some of the members in a Planning dimension query and that’s what Francisco’s query does. You probably can think of some reasons yourself such as:  extracting subsets of dimensions for transfer to other applications, comparing bits of hierarchies across applications, or even (hint) using the results of a limited set of members to populate other queries and limit their scope.

How do you do it?

I needed a really simple example, so I exercised my Google-fu and came up with this pretty easy to read and understand (although it is for two tables instead of one) MSDN article.

One note – this is only possible in SQL Server 2005 and above as CTE (Common Table Expressions) are not in earlier releases.

One other note – in Oracle PL/SQL you use the CONNECT BY clause.   

The example

I am querying just the inclusive descendants of the member alias “USA” from the Planning sample application.  Put in your own anchor to get other hierarchies.  Don’t be scared off by the Table Variable – I just needed to get the full output of the dimension into a temporary location so I could use the CTE technique.  If I were going to call this code again and again I’d change that to temporary table and not populate it after the first pass.

/*
    Purpose:     Illustrate the querying of all descendants from any member
    Modified:    29 July 2012, Cameron Lackpour
    Notes:       Can only run on SQL Server 2005 and up as it uses Common Table 
                 Expressions (CTE)
                 -  I'm sure this can be done in Oracle but I have to 
                    have some semblance of a life.
*/
/*    Set up a Table Variable called @Dimension    */
DECLARE @Dimension TABLE (
    Parent varchar(80),
    Child varchar(80),
    Alias varchar(80)
    )
/*    Populate the Table Variable with the dimension from Planning.    */
INSERT INTO @Dimension(Parent, Child, Alias)
SELECT
   PO.OBJECT_NAME AS 'Parent',
   O.OBJECT_NAME AS 'Child',
   -- Use a SQL Subquery to get aliases.
   -- NB --  The overall SELECT from HSP_MEMBER ensures that members with
   --        and without an alias are selected.
   --        ISNULL puts in zero length string in place of NULL
   ISNULL((SELECT OA.OBJECT_NAME
       FROM HSP_ALIAS A
       INNER JOIN HSP_OBJECT OA
       ON A.MEMBER_ID = O.OBJECT_ID AND
       OA.OBJECT_ID = A.ALIAS_ID), '') AS 'Alias'
FROM HSP_MEMBER M
INNER JOIN HSP_OBJECT O
   ON M.MEMBER_ID = O.OBJECT_ID
INNER JOIN HSP_OBJECT PO
   ON O.PARENT_ID = PO.OBJECT_ID
INNER JOIN HSP_ENTITY E
   ON M.MEMBER_ID = E.ENTITY_ID
-- Entity dimension is ALWAYS DIM_ID 33, but its name
-- can vary, so use the ID
WHERE M.DIM_ID = 33
;
/* Now do a recursive query to get all of the children of a given member's alias.    */
WITH MyDimension (CTEParent, CTEChild, CTEAlias, Level)
AS
(
    -- Anchor member
    SELECT Parent, Child, Alias, 0 AS Level
    FROM @Dimension AS d
    WHERE Alias = 'USA'
    UNION ALL
    --    Recursive query
    SELECT Parent, Child, Alias, Level + 1
    FROM @Dimension as d
    INNER JOIN MyDimension AS m
        ON d.Parent = m.CTEChild
)
SELECT CTEParent, CTEChild, CTEAlias, Level
FROM MyDimension

And that produces

 

Just as promised, only the members that are inclusive descendants of USA.  Enjoy the hack.

P.S.  An alternate way of doing it

I have an email list (this is pretty common in consulting companies) that I use to send out various and sundry tips and tricks.  Would you believe it’s called the Stupid Tricks list?  You should, ‘cause that’s what it’s called.  Think of the recipients as the brave/unfortunate souls who get this stuff first; their reaction often determines if I enlighten/pollute the wider EPM world with whatever idiocy I come up with.  

One of these happy(?) few is fellow Developing Essbase Applications coauthor Gary Crisci.  When I sent out this query, Gary pointed out that he had written a blog post called SQL queries for Essbase developers over a year and a half ago on the same subject but from an Essbase (really a generic data warehouse) perspective.  I encourage you to check it out as he goes over a slew of different hierarchical queries.

Gary delves into:
  • Parent/child Descendants (so similar to the above although not from a Planning perspective)
  • Parent/child to Generations
  • Parent/child to Levels
  • Generations to Parent/child
  • Tagging member properties

I really recommend that you check out his blog as there’s good stuff therein.