...
The HFM Express Adapter is a universal adapter for extracting meta-data and data from 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 The Adapter can be managed by the Source System Manager. You need to be an Admin user within CXO.
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 6 (11.2.0.34.200), but newer versions will may 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:
...
- 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 TNS configuration is required on the CXO Cockpit application server:
Consult your Oracle DBA for more details. - 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:
...
- 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
*turning ICP aggregation off will load the ICP hierarchy.
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).
...
- Load Set for a full data refresh. When executing this 'Base' load set (of which you can only have one!):
- All data in the CXO Cockpit fact-database is cleared;
- All dimension tables are cleared;
- The dimension tables in the fact-database are built up again
- The requested data-selection is extracted from HFM;
- 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:- No extractions have been done yet
- Data in the past have changed
- New HFM metadata have been loaded
- 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).
- 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.
...
Tree-selection mode is the preferred mode because it requires the least amount of maintenance. For instance, if in HFM accounts are added or deleted they are automatically selected for CXO if their root node is selected.
WYSIWYG mode (mode 2)
(WYSIWYG mode is added for legacy reasons)
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.
...
- 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 labelllabel:
Custom Dimensions
The same logic as the Account dimension applies to selecting members from Custom dimensions:
...
You can add an Incremental Load Set by pressing the '+' button and then Edit the name of the Load Set. By definition, each Load Set added to the Base is considered to be an Incremental Load Set. Note that an Incremental Load Set cannot be split into Subsets anymore.
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
...
Before changing anything in this table:
- Never change any cell of the av_name column
- Do not change any of the grey-marked cells at all
- Strictly follow the description below
...
1 = True
0 = False
...
1 = True
0 = False
...
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:
...
To run an incremental extraction, select the Incremental Load Set and press 'Extract'.
Real-time synchronization
An Incremental Load Set can also be synchronized with a fixed interval. First Enable the Synchronization by checking the box:
Then set the required synchronization interval. Press Save to save the settings.
To start the Real Time Synchronization press the 'Synchronize' button. The system will now check each time-interval if something has changed within HFM (given the dimension context of the Load Set) and automatically retrieve the updated data. The cube (a special incremental partition) will be processed automatically.
System Variables
In table 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
Before changing anything in this table:
- It is advised to only change an application_variable if there is a very good reason for that
- Never change any cell of the av_name column
- Strictly follow the description below
- Don't touch the application_variable fields that are not listed below (ask the CXO team for their meaning).
Name | Description and options | Possible values |
---|---|---|
FilterSourceData | To 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 |
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 | UseCustomRollupForAccounts | Technical setting. Set to 0. | UseCustomRollupForCustomDimensions | Technical setting. Set to 0. | WYSIWYGModeForCustomDimensions | 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) | WYSIWYGModeForAccountDimension | See 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)
...
WYSIWYGModeForCustomDimensions | As mentioned above, Custom dimensions (A01, A02, ... in CXO) can be generated in two ways.
| 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) Recommended value: 0 |
WYSIWYGModeForAccountDimension | See WYSIWYGModeForCustomDimensions (and the description of the Account dimension) | Recommended value: 0 |
UnaryOperatorsInAccountDimension | New parameter since 6.2. It is highly recommended to set this to value 0 (False). This is the default value for version 6.3.2. For older versions it should be set to 0 manually. When set to False, this parameter ignores the Unary Operator field of the Account dimension in CXO. That means that all numbers are always rolled up with a '+' in the parent accounts. During the extraction process 'Negative' accounts are multiplied by -1 to ensure correct values for the parent accounts. Omitting Unary Operators makes the dimension faster (from an MDX perspective). The only reason to set / keep this parameter to 1 is when in the HFM chart of accounts members of type FLOW are accumulated in parent members with type EXPENSE. For versions lower than 6.3.2, setting/keeping this parameter to False (0) must be accompanied by removing the following (yellow marked) tag from the XMLA definition of the Account dimension (ACC) (right-click the dimension, select script dimension as / alter / to new query window and press F5 after removal): For version 6.3.2 or higher this is not needed | Recommended value: 0 |
UnaryOperatorsInEntityDimension | New parameter since 6.2. It is highly recommended to set this to value 0 (False). This is the default value for version 6.3.2. For older versions it should be set to 0 manually. Like with Accounts, when set to False we ignore the Unary Operator of the Entity Dimensions and do a simple roll-up of Entities in their parents. In cases where this will lead to a wrong value on parent-level, we put a compensation value on the parent entity. This is also done to speed up the query times. For versions lower than 6.3.2, setting/keeping this parameter to False (0) must be accompanied by removing the following (yellow marked) tag from the XMLA definition of the Entity dimension (ENT) (right-click the dimension, select script dimension as / alter // to new query window and press F5 after removal): For version 6.3.2 or higher this is not needed. | Recommended value: 0 |
fetchSizeOracleQueries | This is a technical setting with a default value of 0 (= don't use). The parameter can be set to a value > 0 (typically 500,000 or 1,000,000) to break the data-extraction in smaller pieces. This can be useful if data is extracted from a cloud-server with an Oracle database or in case the CXO application server has limited RAM. It can also be used for (remote) SQL Servers: in that case the parameter quantifies that no of records copied in one copy-action. | In case of on-premise database server: Recommended value: 0 In case of cloud-based database server and failing or extremely slow extraction: Recommended value: 500,000 - 1,000,000 |
UseTabLock | When set to 1: the tables in the hfmexpressstaging and fact databases are proactively locked before updating or writing data. This may boost performance. Ignore this by setting the value to 0. | Recommended value: 1 |
multiPeriod | When set to 1: for one Scenario / Year combination all to be extracted periods are retrieved with a single query. This can considerably boost the extraction speed. A potential - but unlikely - drawback is because bigger data-objects are loaded in memory, CXO application servers with limited RAM (8 Gb) can slow down. When set to 1, periods will be extracted one by one. | Recommended value: 1 |
Cube Calculations for YTD and Periodic View
The following Cube-calculations are required for the proper calculation of YTD and Periodic views.
These Cube-calculations should replace the existing definitions of YTD and Periodic. For new applications YTD and Periodic can be defined as embedded Cube-calculations in the Cube. For existing applications this depends:
- If YTD / Periodic are defined as Cube-calculations in the Repository (i.e. maintained via the Designer) then you are obliged to do this again;
- Otherwise, replace the existing definition of YTD / Periodic within the cube.
YTD
case when [ACC].[ACC].CurrentMember.Properties('Rate')
then 1
else -1
end
*
CASE WHEN
[ACC].[ACC].CurrentMember.Properties('Sec Class')
THEN
[VIW].[VIW].[YTD_Input]
else
case
when [ACC].[ACC].CurrentMember.Properties('Is ICP')
then SUM([ACC].[ACC].CurrentMember.Children,[VIW].[VIW].[YTD_vsFlow])
else SUM([ACC].[ACC].CurrentMember.Children,[VIW].[VIW].[YTD_vsBalance])
end
end
Periodic
CASE WHEN
IsEmpty (LookupCube("XchgRate","(" + MemberToStr([CAT].[CAT].CurrentMember) + ", " + MemberToStr([YER].[YER].CurrentMember) + ", " + MemberToStr([PER].[PER].CurrentMember) + ")"))
THEN
NULL
ELSE
CASE WHEN [ACC].[ACC].CurrentMember.Properties('Is ICP')
THEN
[VIW].[VIW].[YTD]-([VIW].[VIW].[YTD], [PER].[PER].PrevMember)
ELSE
[VIW].[VIW].[YTD]
END
END
Note that the condition 'IsEmpty...' can also be replaced by the condition that is currently in use to prevent Periodic calculations in periods beyond the last period of a category
The following 'helper' cube-calcs must be defined as embedded cube-calcs
YTD_vsFlow
CASE WHEN
[ACC].[ACC].CurrentMember.Properties('Is ICP')
THEN [VIW].[VIW].[YTD_Input]
ELSE
-[VIW].[VIW].[YTD_Input]
END
YTD_vsBalance
CASE WHEN
[ACC].[ACC].CurrentMember.Properties('Is ICP')
THEN -[VIW].[VIW].[YTD_Input]
ELSE
[VIW].[VIW].[YTD_Input]
END
Advanced topic: Default Members
The Custom dimensions (Custom1, Custom2, ...) often have default values like '[None]', or certain movements that appear in any schedule. Often, these Default Members are used multiple times in various alternative hierarchies. In general, you should avoid selecting these members multiple times within a Load Set, but sometimes these copies are really needed.
In these cases, the Default Members can be entered in a table named defaultMembers:
In this example the Custom 1 (= Analytical Dimension 1) contains multiple occurrences of Adv and OpenAdj and Custom 4 contains multiple occurrences of [None]. By entering them in this table, they will not be duplicated in the OLAP Cube and this can save a lot of records (and also reduces the time needed for processing the Cube).
When doing this, you must create embedded cube-calculations in the CXO-cube to make sure that missing copies of Default Members are replaced by a reference to the existing one. These cube-calculations must be defined within no or rarely used dimensions. For example, to account for multiple members in the Custom1 dimension we could define a 'default' member within the Custom 10 (A10) dimension. For Custom 4 (in the above example) we can 'abuse' the unused A09 dimension.
The cube-calculation within the A10 dimension, intended to check the default members in A01 is:
create member currentcube.[A10].[A10].[Default]
as
case when [A01].[A01].CurrentMember.Properties("Has Custom Rollup")
THEN [A10].[A10].[[None]]] + SUM(StrToSet([A01].[A01].CurrentMember.Properties("Custom Rollup")),[A10].[A10].[[None]]])
else
[A10].[A10].[[None]]]
end
, VISIBLE = 0 , ASSOCIATED_MEASURE_GROUP = 'Cxo Fact' ;
The cube-calculation within the A09 dimension to check the default members in A04 is:
create member currentcube.[A09].[A09].[Default]
as
case when [A04].[A04].CurrentMember.Properties("Has Custom Rollup")
THEN [A09].[A09].[[None]]] + SUM(StrToSet([A04].[A04].CurrentMember.Properties("Custom Rollup")),[A09].[A09].[[None]]])
else
[A09].[A09].[[None]]]
end
, VISIBLE = 0 , ASSOCIATED_MEASURE_GROUP = 'Cxo Fact' ;
Now, do make sure that these Cube-calculations are entered in the StoredCubeCalculations table in the fact-database and are used as values for the @A##_Total variables within the CXO application.