HFM Express Adapter

The HFM Express Adapter is a universal adapter for all versions of Oracle (Hyperion) Financial Management until version 11.1.2.4. The main difference with the existing HFM Adapter is that the HFM Express Adapter does not rely on the Data Extraction module of Financial Management (also known as Extended Analytics). Instead it extracts data and metadata by directly connecting to the relational database underlying HFM (SQL Server or Oracle). Also, the configuration and execution of the data extraction process has been simplified.

The Adapter can be started from the (non-web based) Design Studio tool.

Prerequisites

If the relational database underlying HFM is an Oracle database, then ODAC must be installed on the CXO Cockpit Application Server. We tested version 11.2 Release 5 (11.2.0.3.20), but newer versions will also work.

Creation of a HFM Express Source System adapter

Creation can be part of the creation of a new CXO-Cockpit application or the creation of a Source System within an existing application. In both cases the following wizard will appear:

  • Select 'Use Backend System Adapter'
  • Select Adapter 'Hfm Express'
  • Enter a name (usually the name of the underlying HFM application), then press Next
  • If SQL Server Analysis Services runs on another server than the SQL Server used for the CXO Databases, then in the next screen you can override this:

    This option is rarely used 
  • Press Next / Next / Finish

After finishing, two more databases have been created:

  • cxo_fact_<name>: the database that will hold the extracted data and dimension information. At creation of the source system it will contain some sample data not related to the HFM application yet
  • cxo_hfmexpressstaging_<name>: a database that will be used to store the specifications of the data-extraction process. Also, during extraction it will act as a temporary storage for the raw data-extracts.

Also an Analysis Services OLAP Database will have been created (name = <name>), initially containing sample data. 

Connecting to HFM

You can open the Source System adapter console by pressing the button Integration Settings in the above window.

 In the first tab, enter the connectivity details to the HFM database:

  • DB Type: We support 2 Database Types: SQL Server and Oracle.

    Settings for SQL Server:

  • SQL Server: The SQL Server is the SQL Server instance where the HFM data are stored. Note: as a rule this is not the same database-server as used for the CXO-Cockpit databases.Consult your HFM System Administator to get these specs.
  • Database: The name of the HFM database (usually something like FM, HFM, HYPPROD, ...)
  • Application: The name of the HFM application from which we want to extract.
  • Windows Authentication:
    • Check the box if you want to access the HFM database by Windows Authentication: Note that not only the user of the Design Studio ('you') should be authenticated, but also the Windows account that is used as a Service account for the CXO-Cockpit services. Data extractions are carried out by our Agent Service:



      The Windows account(s) must have read-rights on the HFM database.

    • If you want to use a SQL Server account: enter a  username / password. Also this account can be a read-only user.

    Settings for Oracle:



    For an Oracle connection a TSN configuration is required on the CXO Cockpit application server:



    Consult your Oracle DBA for more details.

 

ICP Specifications

In this dialog you can also set two parameters related to HFM Intercompany (ICP) transactions:

  • Extract ICP Details: check this box if you want to report on ICP transactions. Note that this may result in a lot more data records and will slow down the extraction and transformation process.
  • Aggregate ICP Entities: this is a reflection of a setting within HFM named ICPEntitiesAggregationWeight. Checking the box is equivalent to a weight of 1.0 (this is most widely used). Un-checking means 0.0.

Retrieve HFM Meta-data

In order to setup the extraction (creating Load Sets and Subsets) we first need to retrieve a local copy the HFM Meta-data (the dimension specifications).

This can be done by pressing the button 'Get Metadata' and then wait (few seconds to couple of minutes) until the following dialog appears:
 

Note that copying the metadata has to be done each time the dimensions of HFM has changed (added / removed / moved members of a dimension)

Create a Calendar

After retrieving the meta-data for the first time, we still have to perform one manual step: fill a table in the cxo_hfmexressstaging_... database with the specifications of the calendar.

We have prepared the script in a Stored Procedure sp_create_calendar. Select the stored procedure:
, then do a right mouse click and select Modify:

 

The following script will appear:

 

This script can be used to define various calendars. To generate a calendar with a Half Year / Quarter / Month layout:

  • select the first block ('truncate ...') and press F5. This will clear the current calendar table.
  • then select all lines in the 2nd block and press F5
  • you can then close the window. Ignore the requests for saving.

In the comment-area you can see an alternative calendar: only a Quarter level and the months abbreviated to 3 characters. Of course, you are free to change the layout, for example to accommodate a broken fiscal year.

To create the right calendar, check the structure of the Period dimension in the HFM application. For example, for the COMMA application it is:

 

There are a few rules attached to this script:

  • The Period ID should be a continuous series 1, 2, 3, ...
  • The Parent ID for the root level (Year) is always -1. For the other members it should define the hierarchy (e.g., all months in Quarter 1 have Parent ID = 4)
  • The Frequency for the Year level is always 2, and for each additional level the frequency increases by 1. That's why the Frequency for the months is 5 for a layout that includes a Half Year level and 4 for a layout with Quarters only.
  • The Unit of Time: Y = year, H = Half Year, T = Trimester, Q = Quarter, M = Month, W = Week, D = Day.

Note that creation of the calendar is a one-time action and does not require any maintenance.

Load Sets

The Load Sets determine the combination of Scenarios, Years and Periods that will be extracted from HFM.

There are two types of Load Sets:

  1. Load Set for a full data refresh. When executing this 'Base' load set (of which you can only have one!):
    1. All data in the CXO Cockpit fact-database is cleared;
    2. All dimension tables are cleared;
    3. The dimension tables in the fact-database are built up again
    4. The requested data-selection is extracted from HFM;
    5. This new data is transformed and copied to the fact-database in portions of one Scenario / Year / Period combination.

      A full extraction only needs to be done when:
      1. No extractions have been done yet
      2. Data in the past have changed
      3. New HFM metadata have been loaded
      4. You want to make an alternative selection from the HFM dimensions (more / less details from the Entity dimension, Account dimension, more Scenarios. In fact any action that requires rebuilding of the dimensions in the CXO-Cockpit application).
         
  2. Incremental Load Sets: these can be used to quickly replace a slice of data usually one Scenario, one Year and one Period. The CXO dimensions are not refreshed. Incremental Load Sets can be executed manually but can also be used for Real-Time Synchronization.

Base Set and Subsets

A Base Load Set (type 1) looks like:

A Base Load Set can have several Subsets. During an extraction these Subsets will be executed sequentially in the order in which they are entered. Each Subset has its own combination of Scenario(s), Year(s) and Periods. Since they are all done within one data-extraction action they should not overlap.

Usually, the first Subset (named 'Base' in this example, but you can use any name) extracts the history of the Actual numbers. In this case we extract the Actual numbers for all months of 2006 (note that 2007 is the current reporting-year in this Comma application).

An important rule for the Period dimension is that you only select periods that belong to the native frequency of the selected Scenario: The Actual scenario is a monthly scenario, hence we only select months.

Let's add another Subset named CurAct (the actuals for current year):

  Press the '+' and then rename the Subset in the Edit box:    Then press Save:  

Now for this Subset we select Scenario = Actual, Year = 2007 and Period = Jan, Feb:

This perfectly illustrates why Subsets are useful: for 2007 we are only interested in two months (February being the current reporting month), while for 2006 (the history) we want all periods.

We also make a special Subset for the Budget scenario: two full years:

 

Other HFM dimensions

To complete a Base Load Set we must also select at least one member from each of the other HFM dimensions.

Value

A typical selection from the Value dimension is:

This will extract each Entity in it's own currency and all Entities in USD (provided the Entities are translated into USD within HFM).

Include the [None] member if you want to report on / use Currency Conversion rates.

Note that we will not extract 'XXX Total' itself (in CXO simply called 'XXX'): always the underlying 'XXX' (in CXO represented as 'XXX Input') and 'XXX Adjs' members are extracted. In the example of 'USD Total', in CXO we will see:

If only the total level is needed, we can pre-aggregate the values and in that way flatten the dimension (saves records and an extra hierarchy). This is governed by a system variable. See section System Variables. 

Note that - opposite to the older adapter versions - the HFM Value dimension is not stored in the VAL dimension of CXO anymore but in the GAP dimension. The reason is that the VAL dimension is a flat dimension not allowing parent-child structures. This should be kept in mind in migrations.

Avoid selecting [Contribution Total]

If you do not need [Contribution Total] or one of it's components, it is highly recommended to not select this Value. It will almost duplicate the number of records in the database

Entity

When selecting members from the Entity dimensions you should expand the tree to the level you want to include. For example:

In this example, in HFM more levels exist, but we deliberately decided to leave out details. It is not needed to expand to a fixed level. We could have decided to only expand EastRegion further.

It is also possible to skip a parent node. Suppose we don't want to have UnitedStates as an intermediate node in CXO, then we can de-select it:

This would move EastRegion and WestRegion one level up, making them children of Geographical.

From a functional perspective you should not do this is you selected [Contribution Total] in the Value dimension, because that selection only reports correct numbers if the parent-child structure is equal to the original.

To get Currency rates in CXO, also include Entity [None] in the selection.

Account

Selecting members from the Account dimension can be done in two different ways:

  1. Selecting a node automatically means that you select the entire sub-tree below that node;
  2. WYSIWYG ('What You See Is What You Get ') mode. That means if you select a parent node but you do not expand it, then we will consider that node as a base-node in the CXO Account dimension.

The selection mode is governed by a System Variable (see section System Variables)

Tree selection mode (mode 1)

You can recognize this mode by the red font of the selected entities. In this example, the selection of NetProfit implies that we get this account as well as all it's descendants all the way down to the base level.

Note that NetProfit is selected twice (green circles). In this case it doesn't make sense, but it can be that you implicitly select it twice because NetProfit is copied under one of the other selected nodes. The way how this kind of duplication is handled is explained below where we describe the System Variable PreAggregateAccounts

Further note that OtherInfo is expanded because we do not want all members under that node. Unchecked members, like Rates, are not included.

.

A fragment of the resulting dimension in CXO  looks like:

WYSIWYG mode (mode 2)

In this mode we use black font. Similar to the Entity dimension, the resulting Account dimension in CXO exactly looks the way you expanded the selection.

This then would be an unrealistic selection:

because it would mean that in CXO we e.g. only select NetProfit and none of the accounts determining this account. A more realistic selection (for NetProfit) would be:

resulting in:

General

Irrespective of the selected mode, best practice is to avoid multiple occurrences of members in the selection. This will slow-down the Processing of the OLAP database and/or the report queries. In doing that you should always realize that we extract all details under a certain parent node: even if you did not select duplicate members they can be there implicitly among the descendants of selected nodes.

Opposite to the Entity dimension:

  • It is not allowed to skip parent-nodes


     
  • It is risky to skip certain sibling nodes: unlike with Entities, the aggregation of child accounts into parent accounts is done within the OLAP layer of CXO. If you deliberately skip siblings then the numbers on higher levels may be incorrect.



    In this example, the Sales account is excluded, which means that TotalRevenues doesn't have a correct value. Sometimes you can use your knowledge of the underlying system to de-select a child. For example, it could be that you know for sure that SalesReturns will never contain any amount. In that case it's permitted to skip it.

    Another condition that allows for skipping siblings is that he parent (and grandparents) is either not used or is a so-called Group Label. For example, 'Otherinfo' is a group labell:

Custom Dimensions

The same logic as the Account dimension applies to selecting members from Custom dimensions:

 

You can now Extract the Base Load Set.

System Variables

In the application_variables table of the cxo_hfmexpressstaging_... database a number of settings is stored that determine some aspects of the process of data-extraction and dimension build-up. Some values in this table can be changed by IT and / or the Dba

Right-click the table and choose Edit:

 

Before changing anything in this table:

  1. Never change any cell of the av_name column
  2. Do not change any of the grey-marked cells at all
  3. Strictly follow the description below

 

NameDescription and optionsPossible values
DeleteZeroRecordsWhen set to 1, all records in the HFM database with Data = 0 will be skipped (and hence becomes NULL / Empty in the CXO reports). When set to 0, also records with Data = 0 will be extracted. Only do this if there are not too many zeros in the HFM database (e.g., as a result of automatic load of data) and you really want to distinguish between 0 and NULL.

1 = True

0 = False

FilterSourceDataTo get the raw data from HFM, queries are constructed that get the data and dimension information from the right tables of the HFM database. If FilterSourceData is set to 0, we only apply a simple filter for including or excluding ICP details, but no filter for the Entities. Entities are then filtered once the raw data is stored in the CXO staging database. When FilterSourceData = 1 then we explicitly filter by Entity already within the raw-data query (WHERE EntityId in ....). In general, if more than ~30% of the entities is selected for inclusion ion CXO it is better to set FilterSourceData = 0 because the huge WHERE clause will slow-down the query. If less than ~30% is to be included then set FilterSourceData = 1.

1 = True

0 = False

 

IncludeInputValues

When set to 0, the Value-dimension (stored in the CXO GAP dimension will be flat:
 

When set to 1, the original hierarchy will be retained:

Only set IncludeInputValues = 1 if you need the Adjs detail

1 = True

0 = False

PreAggregateAccounts

As explained earlier, selections from the Account Dimension are usually done on a high level (the root node, or a few levels lower). All descendants of a selected node are then selected as well. A potential danger of this approach is that complete substructures might be repeated while you don't see them in your selection. For example, a node like NetProfit can have a lot of descendants and each time this node is used in other KPI's potentially all these descendants are duplicated as well, resulting in a lot of duplicate fact records in the cube:

 

By setting PreAggregateAccounts = 1 we will pre-aggregate the 2nd occurrence of NetProfit and give it the name ...NetProfit:

 

From a data point of view, NetProfit and ...NetProfit are 100% equal. However, drilling into the Descendants of ...NetProfit is not possible.

The advantage of this approach is that it keeps the Account dimension smal(ler) and it generates less records in the cube. The disadvantage is that if you drill into e.g. OtherInfo you will never reach members like InterestInc(Exp).

1 = True

0 = False

StoreParentEntity

When set to 1 the entity-names will always be stored as a combination of parent.child:

This variable must be set to 1 when the value [Contribution Total] is selected and the Entity selection contains duplicates. Note that if you change this setting, entity lists already created in CXO might get invalid.

1 = True

0 = False

UseCustomRollupForAccountsTechnical setting. Set to 0. 
UseCustomRollupForCustomDimensionsTechnical setting. Set to 0. 
WYSIWYGModeForCustomDimensions

As mentioned above, Custom dimensions (A01, A02, ... in CXO Cockpit) can be generated in two ways.

  1. WYSIWYG mode: WYSIWYG stands for What You See Is What You Get. It means that the A0# dimension will exactly follow the expand and collapse actions in the Dimension Member selection screen. In other words, if the selection and expansion is as follows:
      then the resulting CXO dimension looks like:

  2. Tree Selection mode (if in this mode, you will see the selected members in red): if you select a member, you automatically select all the descendants, unless you explicitly deselect some of them. In this mode the same selection and resulting CXO dimension is:

     

 

0 = do not apply to any custom dimension

Comma separated list of Custom dimensions you want to see in WYSIWYG mode (e.g., 1,3,4,7)

WYSIWYGModeForAccountDimensionSee WYSIWYGModeForCustomDimensions (and the description of the Account dimension) 

 

Technical preparations

-- create CC_PERIOD table

[Contribution Total]

-- when StoreParentEntity = 0 and each entity appears only once → [Contribution Total] just acts as any other Value (GAP)

-- when StoreParentEntity = 1 then, to get the right data you have to select the Entity (ENT) in combination with the right Parent (FLO). To automate that we have stored the parent-name (just the name, so not as parent.child) on the UDA1 property of the entity dimension.