OneStream has really made a splash since being formally introduced in 2012. Finit Solutions partnered early with OneStream to gain insight into a next generation tool designed by the original creators of HFM and FDM. As of June, 2015 Finit Solutions is involved with 15 OneStream implementations including the very first OneSteam XF client. In the past 3 years we have gained knowledge working with clients on their projects which may be useful to other clients. In this session, we will dig in to a variety of solutions to improve, enhance, and simplify your OneStream implementation or administration. We will go through:
Creating member lists (like all IC accounts), without Business Rules (using where clauses)
Using VB.Net Math functions (like ABS) to simplify confirmation rules
Truly blank rows in a cube view
Pulling Exchange rates into the cube, so they can be used in cube view/ quick view.
Cross-cube calculations
Loading data to "BeforeAdj"
Importing a Matrix Excel file thru workflow
Force Translate to reporting currency (using 3.5 Auto Translation Currencies functionality)
Control which entities are subject to confirmation rules
Pulling Beginning Balances from a different scenario
Presenter: Phil Brosnan
2. www.finitsolutions.com
- 2 -
Finit Overview
• Founded in 2002
• 75+ employees in 20+ states, 14 dedicated to the OneStream practice
– Mostly CPAs, MBAs
– We have extensive CPM product and financial reporting backgrounds
• 50+ Planning / Essbase Clients
• 80+ HFM Clients
– Managed several of the largest EPM projects in the U.S.
– Including the largest roll-out of HFM in North America
• 15 OneStream Clients
– Lead the implementation of the first 3 live OneStream customers
• AAA Life (Consolidation & Budgeting), Guardian and Henniges
• Market Leader in ARM/FCM
• World Leader in FDM implementations and custom solutions
3. www.finitsolutions.com
- 3 -
• We make and deliver personalized financial
reporting solutions and experiences.
– By listening, questioning, and analyzing
– By building relationships
…not company to company, but person to person.
– We are Makers and Doers
WHY is Finit Here?
4. www.finitsolutions.com
- 4 -
We Run Finit like a Family
• Invest in our employees
• All owners actively involved in the business
• No debt or external owners
– Prioritize the customer, not profitability
• Long term stability
– Hire employees, not subcontractors
• Compensation model based on client
satisfaction
HOW do we achieve our beliefs?
7. www.finitsolutions.com
- 7 -
About the Presenter
Phil Brosnan
(pbrosnan@finitsolutions.com)
2+ Years of OneStream experience
• Led the first live Enterprise to
OneStream project
17+ years in Automotive Finance
• Traditional roles: Cost Accountant to
Finance Director
• System implementations: MfgPro, SAP,
EssBase, Global HFM (1,200+ users).
Based in Detroit
8. www.finitsolutions.com
I didn’t know you could do that!
Cool pieces of OneStream functionality you might
not be using (but should).
Phil Brosnan – Finit Solutions
9. www.finitsolutions.com
- 9 -
Objectives
• Many presentations are awesome, but don’t give
you anything tangible to implement in your App.
This presentation
• See 10 pieces of OneStream functionality
• Learn a couple things you didn’t know
• Take at least one tangible item back to your
project.
10. www.finitsolutions.com
- 10 -
Problem
• You need a list of certain members:
– All IC Entities, IC Accounts, foreign entities, etc…
• You can make Business Rules for Member lists,
but they are moderately complicated.
1. Easy member lists
11. www.finitsolutions.com
- 11 -
Solution
• .where member expansion is super-easy.
• Almost limitless when combined with Text fields
– E#Root.base.where(Currency <> USD)
– E#Root.descendants.where(IsIC = True)
– UD1#Top.base.where(Text1 = HR)
– .where((Text1 = HR) and (Text2 contains Blue))
• User defined dims have 8 text fields (use them!)
1. Easy member lists
13. www.finitsolutions.com
- 13 -
Problem
• Confirmation rules that need to validate both
positive and negative variances
• Can be a little complicated:
If args.ConfirmationRuleArgs.DisplayValue > 100 Then
Return False ‘Fail
Else If args.ConfirmationRuleArgs.DisplayValue < -100 Then
Return False ‘Fail
Else
Return True ‘Pass
2. Using VB.Net Math functions
14. www.finitsolutions.com
- 14 -
Solution
• Use VB.Net Math functions to simplify rules:
If Math.Abs(args.ConfirmationRuleArgs.DisplayValue)>100
• Math.Abs Returns the absolute value of a number.
• Math.Max Returns the larger of two numbers.
• Math.Round Returns a rounded number
• Math.Sign Returns the sign of the value
• Many others as well
2. Using VB.Net Math functions
15. www.finitsolutions.com
- 15 -
Usage
• The Math functions are just the tip of the VB.NET
iceberg.
• Lots of resources available on line:
– http://www.microsoftvirtualacademy.com/training-
courses/vb-fundamentals-for-absolute-beginners
– http://www.dotnetperls.com/keyword-vbnet
– Just Google it.
2. Using VB.Net Math functions
17. www.finitsolutions.com
- 17 -
Solution
• You could set white text on a white background,
or mess with Row height/padding/etc…
• Easier is to use the “Transparent” color
• Can be used on just the text, or both the text and
background.
3. Truly blank rows in a cubeview
18. www.finitsolutions.com
- 18 -
Usage
• Works in CubeView, Report, and Excel (mostly).
• Credit to Michelle Johnson at Graco for this one!
3. Truly blank rows in a cubeview
19. www.finitsolutions.com
- 19 -
Problem
• Exchange rates are stored outside the cube.
• Can’t report on exchange rates in a Cube View.
• There is an XFGet…, but not end-user friendly.
4. Pull Exchange Rates into Cube
20. www.finitsolutions.com
- 20 -
Solution
• Create Dynamic Calc formula to pull exchange
rates into the cube.
• Actual Formula is in the appendix
4. Pull Exchange Rates into Cube
22. www.finitsolutions.com
- 22 -
Problem
• Two separate cubes:
– Main Cube and Sales Analysis or HR or Project cubes
• How do you link key accounts across the cubes?
– Net Sales and Std Cost for the Sales Analysis Cube
– Headcount and Salary expense for an HR cube
5. Cross-cube calculations
23. www.finitsolutions.com
- 23 -
Solution
• Cross-cube calculations:
CB#Main:A#Headcount = CB#HR:A#TotalHeads
• Normal formula rules apply:
– If a dimension is left out of the formula (ie: flow or
UD2 above), it runs for every member of that dim.
– So, if your dims are different in the 2 cubes, make sure
you pick that up in your formula.
CB#Sales:A#CustSales:UD1#noCustomer =
CB#Main:A#NetSales:UD1#TopCostCenter
5. Cross-cube calculations
24. www.finitsolutions.com
- 24 -
Usage
• See “50100 – Health Ins” from Golfstream
5. Cross-cube calculations
Houston Houston Heights New York
Cube Account
GolfStream 50200 - Base 100,000 100,000 100,000
Drivers Health 11% 11% 8%
GolfStream 50200 - Base 11,000 11,000 8,000
25. www.finitsolutions.com
- 25 -
Problem
• You want to give users a starting point:
– Copying from a prior forecast as a starting point
– Loading a headcount file from HR
– Loading prior year as the start point for Budget
• But, you want users to be able to change data
– And you want to track the changes.
6. Loading data to O#BeforeAdj
26. www.finitsolutions.com
- 26 -
Solution
• Use O#BeforeAdj for the data entry form
• Form will show the baseline data (in O#Import)
• When the user changes the value, Onestream
squeezes the difference into O#Forms
6. Loading data to O#BeforeAdj
27. www.finitsolutions.com
- 27 -
6. Loading data to O#BeforeAdj
Type into BeforeAdj member
Difference saved to
Forms member
Data previously copied into
Import member from other
scenario
Import 1000
Forms -
BeforeAdj 1000
Typed 1200 into BeforeAdj
Import 1000
Forms -
BeforeAdj 1200
200
1
2
3
Squeeze diff
to Forms
29. www.finitsolutions.com
- 29 -
Problem
• You want to load an excel budget template into
OneStream thru workflow (not XFSetCell).
• The file has 12 columns (one per month).
– Or, cost centers in columns
– Or, segments in columns
– Or, accounts in columns, etc…
7. Load Matrix Excel file thru WF
30. www.finitsolutions.com
- 30 -
Solution
• Matrix Load file
• Multiple columns in the xfd range.
• Amounts are in the matrix’d columns, not in Amt.
7. Load Matrix Excel file thru WF
A# IC# T#:[]:[]:[2015M1] T#:[]:[]:[2015M2] T#:[]:[]:[2015M3]
GrossSales None 100.00 200.00 300.00
31. www.finitsolutions.com
- 31 -
Usage
• Demo an Excel file, with the xfd range
• There are examples in the Reference Document
7. Load Matrix Excel file thru WF
32. www.finitsolutions.com
- 32 -
Problem
• The main hierarchy has foreign entities rolling to a
foreign parent:
• But, you want to see PlantA and PlantB in USD.
8. Auto translate to a currency
North America (USD)
Mexico Legal (MXN)
Mexico PlantA (MXN)
Mexico PlantB (MXN)
33. www.finitsolutions.com
- 33 -
Solution
• The old way would be to force translate, or
• Create an alt hierarchy to trigger the translation
• But in 3.5, use “Auto Translation Currencies”
8. Auto translate to a currency
Mexico_in_USD (USD)
Mexico PlantA (MXN)
Mexico PlantB (MXN)
35. www.finitsolutions.com
- 35 -
Problem
• You want to limit (or extend) the entities that
have confirmation rules run.
• Example: Balance Sheet only balances at the Legal
entity level, not at every entity (plants).
9. Control confirmation entities
36. www.finitsolutions.com
- 36 -
Solution
• Workflow Calculation Definitions also control
confirmations
1. Will consolidate and also confirm
2. Will consolidate, but won’t confirm
3. Won’t consolidate, but will confirm
9. Control confirmation entities
38. www.finitsolutions.com
- 38 -
Problem
• Where do Beginning Balances come from?
• OneStream always pulls from the same scenario
– 14 Budget rolls to 15 Budget to 16 Budget, etc…
• BUT, what if that’s not what you want?
10. BegBal from a different scenario
Scenario
Jan-14
…
Dec-14
Jan-15
…
Sep-15
Oct-15
Nov-15
Dec-15
Jan-16
…
Dec-16
Jan-17
…
Dec-17
Actual
Q3 Forecast
Budget '15 Budget from '14 Actual 16 Bud from Fcst 17 Bud from Bud
39. www.finitsolutions.com
- 39 -
Solution
• Custom Business Rule that can be called from any
member formula.
• Custom Business Rule that can be called from
Cube Views and Quick Views.
• Copy of the BR is in a separate file.
• Simple maintenance (In the Scenario text field)
2014=Actual, 2015=Forecast, 2016=Budget
10. BegBal from a different scenario
41. www.finitsolutions.com
- 41 -
Business Rule
• The Business Rule to run this functionality is
available from Fint.
• Please contact anyone on the Sales team for a
copy
– Jeremy Bulman (jbulman@finitsolutions.com)
– Joe Mizerk (jmizerk@finitsolutions.com)
– Greg Barrett (gbarrett@finitsolutions.com)
10. BegBal from a different scenario
42. www.finitsolutions.com
- 42 -
Business Rule
• The Business Rule to run this functionality is
available from Fint.
• Please contact anyone on the Sales team for a
copy
– Jeremy Bulman (jbulman@finitsolutions.com)
– Joe Mizerk (jmizerk@finitsolutions.com)
– Greg Barrett (gbarrett@finitsolutions.com)
44. www.finitsolutions.com
- 44 -
Dim viewMember As ViewMember = ViewMember.GetItem(api.Pov.View.MemberPk.MemberId)
If viewMember.IsAnnotationType Then
'Return an empty string if this is a text-based dataCell.
Return ""
Else
Dim destCurrId As Integer = api.Pov.Cons.MemberPk.MemberId
If destCurrId = Currency.USD.Id Then
Return 1.0
Else
Dim rateType As FxRateType = api.FxRates.GetFxRateTypeForRevenueExp() 'AverageRate
'Dim rateType As FxRateType = api.FxRates.GetFxRateTypeForAssetLiability() 'ClosingRate
Dim cubeId As Integer = api.Pov.Cube.CubeId
Dim timeId As Integer = api.Pov.Time.MemberPk.MemberId
Dim sourceCurrId As Integer = Currency.USD.Id
Dim rate As Decimal = api.FxRates.GetCalculatedFxRate(rateType, cubeId, timeId, sourceCurrId,
destCurrId)
Return rate
End If
End If
The EndRate formula would be the same, except pulling the rate type for
AssetLiability.
AvgRate formula
45. www.finitsolutions.com
- 45 -
Call from inside a Member Formula:
If api.Time.IsFirstPeriodInYear() Then
Dim priorScenarioBR As New OneStream.BusinessRule.Finance.PriorScenario.MainClass
Dim priorScenario As String = priorScenarioBR.FindPriorScenario(si, api, args, _
api.Pov.Scenario, api.Pov.time)
api.Data.Calculate("F#BegBalMth=F#EndBal:S#" & priorScenario & ":T#PovPrior1“)
Else
api.Data.Calculate("F#BegBalMth=F#EndBal:T#PovPrior1")
End If
Call from inside a CubeView member filter:
T#PovPriorYearM12:getdatacell("BR#[PriorScenario,|POVScenario|,|PovYear|]")
T#PovPriorYearM12:getdatacell("BR#[PriorScenario,Budget,2015]")
The Business Rule is available. Contact the Finit Sales team for details.
PriorScenario business rule