OneStream is an extremely flexible platform and has really been making a name for itself in the CPM (Corporate Performance Management) market. In addition to everything that the software can do out-of-the-box, at Finit we can customize your application to meet a wide range of complex business requirements. The limits of OneStream's flexibility is based more on the boundaries of consultants' / administrators' imagination and rule building abilities than any real constraints which exist within OneStream itself. Inside OneStream XF there are a variety of modules where rules/calculations can reside and there is ample opportunity for configurations to extend your system's functionality. Types of rules which exist are:
Member Formulas
Business Rules
Transformation Rules
Confirmation Rules
Join us for an explanation of the fundamental principles around creating efficient process and business rules and scripts within OneStream as we focus on:
Minimizing processing time
Decreasing manual application maintenance
Data storage
Script development
Additionally, we will explain Data Buffers / Eval Buffers, and then introduce some of the new functionality that has been developed for the 3.7 release of OneStream XF.
3. The Finit Family
Slide 3
Fully aligned with
our clients, not just
bottom line $
No debt or external
ownership
Work with Finit
employees, no
subcontractors
Compensation
based on CLIENT
SATISFACTION
PRIVATELY
OWNED
CLIENT
SATISFACTION
NO
SUBCONTRACTORS
DEBT FREE
4. Finit Values
Slide 4
Our values on which we ask you to provide consultant feedback:
• Approach & Collaboration
• Integrity & Honesty
• Client Betterment
• Self Betterment
• Colleague Betterment
• Finit Betterment
• Work Effectiveness
• Impact & Innovation
• Proactiveness
& Passion
Service Solutions Betterment
5. Finit Customer Success
Slide 5
Our values, culture, and approach to
becoming a trusted advisor to our
customers has led to
100% customer success
for every Finit client (250+) and for every
Hyperion and OneStream project (800+)
8. Upcoming OneStream Webinar
Slide 8
Friday August 19th
Creative Solutions for Cash Flow & FX Analysis
through Dashboards
Presented by Jay Hampton & Christine Ong-Estrada
9. About the Presenter
Slide 9
Aaron Bolshoun
(abolshoun@finit.com)
Certification/Education
• MBA - Business Information
Technology, University of Denver
• BA - Northwestern University
• HFM Certified
Experience
• 3 years with OneStream
• 10 years with HFM
• 10 years with FDM
• 10 years of EPM / CPM
Implementation experience
14. Types of Formula Efficiency
Slide 14
Different Types of Formula “Costs”:
1. Efficient Processing
2. Efficient Maintenance
3. Efficient Storage
4. Efficient Script Creation
15. Efficient Processing
Slide 15
Preferred Methodology
1. Can I do this without any formulas? Is it possible to produce result
via metadata attributes and hierarchy?
(Account type and/or Aggregation Weight)
• No impact to processing
2. Can I build this as a Dynamic Calculation?
• No impact to consolidation time, but takes time to calculate
in memory when a report is run.
3. Can I build this as a Member Formula (Formula Pass)?
• Stored in database, so increases consolidation time,
but no impact to report generation.
4. Can I build this as a Business Rule?
• Stored in database, so increases consolidation time,
but no impact to report generation.
16. Dynamic vs. Stored Calculations
Slide 16
Dynamic Calculation
Formula Pass
17. Dynamic Calculation vs. Member Formula
Slide 17
Dynamic
Calculation
Member
Formula
No Impact Consolidation Time Much Slower
Much Slower Report Generation No Impact
Unnecessary Consolidation Required
Can use Formula Pass or
Dynamic Calc in Source
Use with other
formulas
Can use Formula Pass
in Source
Data must already be
consolidated if source
contains a Formula Pass
Dependencies
Must assign Formula
Pass 1-16 accordingly
Do not aggregate Aggregation Aggregate naturally
18. Efficient Processing
Slide 18
• From the XF Design and Reference Guide:
“Consolidation performance is directly impacted by
the volume and complexity of Stored Calculations.
Careful consideration should be given to each Stored
Calculation since …. a large amount of data being
written to the Cube would negatively impact
Consolidation performance …. The quantity of
stored numbers is the most important factor when
optimizing Consolidation performance.”
19. Member Formula vs. Business Rule
Slide 19
• Member Formulas will always perform better than
Business Rules: Member formulas are multi-
threaded (parallel) while Business Rules run
sequentially (serial)
• Some logic, like custom Consolidation or Member
Lists, must occur within a Business Rule—API vs.
BRAPI
20. Efficient Maintenance
Slide 20
• We need to build all logic with the understanding that we
will eventually hand it over to someone else to maintain
• We need to make troubleshooting easier
• Formulas should be as dynamic as possible
• Use Comments!!!!
• HFM vs. OneStream: With great flexibility comes great
complexity! Where exactly does that logic reside?
• HFM: It’s in the rules file.
• OneStream:
• Member Formulas (on Account, Entity, Flow, UD’s, etc.)
• Business Rules
21. Lists of Formulas by Formula Pass
Slide 21
Grid View
Formula List Dashboard
22. Formula for Calculation Drill-Down
Slide 22
• Entering a formula in the Formula for Calculation Drill Down property
allows drilling on calculated Scenario, Account, Flow and UD members
23. Efficient Storage
Slide 23
• Storage isn’t free—it has costs associated
• Every Stored Member creates a record which takes up
storage space in the database when data is consolidated
• Be Specific: much more efficient to write to one specific
member instead of all of them
24. Efficient Storage: Data Explosion
Slide 24
• OneStream warns upon consolidation about a formula
that will cause data explosion:
API.Data.Calculate
• Tips to Avoid Data Explosion
• Use same level of detail on target (left side of =) as on the source
(right side of =)
• Do not use #All in Stored Member formulas
Formula Result
“A#Profit = A#Sales” No Data Explosion
“A#Profit:U2#Cust1 = A#Sales * 1.05” No Data Explosion
“A#Profit = A#Sales:U2#Cust1” Some Data Explosion
“A#Profit = 2.0” Large scale data explosion
25. Efficient Script Creation – Script Editor
Slide 25
• Color Coding:
• VB is blue
• API is black
• Strings are red
• Comments are green
• IntelliSense
• Integrated Script Library with filter:
• No need to “re-invent the wheel” – use existing code as starting point
(GolfStream as a reference)
• OneStream Script Editor provides many tools to simplify the process:
26. Efficient Script Creation – Rule Snippets
Slide 26
• Sample code for common calculations that integrates
with Script Editor is available in the XF MarketPlace
• Common Account formulas (e.g. Current Ratio)
• Formula for Calc Drill Down
• Writing to Error Log
• Confirmation Rules
• Member Lists
• Eval
• Many more & list
continues to grow!
27. TroubleShooting & Optimization: Logging
• api.LogMessage(message, detail) and
api.LogError(errorLevel, description)
• Consolidate with Logging provides visibility into all
calculations that run and how long each one takes
• Entries are logged in Task Activity Log
Slide 27
31. Data Cell vs. Data Unit vs. Data Buffer
Slide 31
• Data Cell
• One number uniquely represented by
a Cube and 18 dimension members
• Data Unit
• All data for a single:
Cube, Entity, Parent, Cons, Scenario,
Time
• E.g., Calculate one Entity/Period
1 Data Unit
• Data Buffer
• A subset of data in a Data Unit
• E.g., A#Salary contains numbers for all
Cost Centers
Data Unit
Dimensions
Account-type
Dimensions
32. Data Unit Concepts
Slide 32
Stored Formulas run for an entire Data Unit
Cube and 5 Data Unit dims are known
Valid: If api.Pov.Entity.Name.XFEqualsIgnoreCase(“CO”) Then
Account-type dims can be anything
Not Valid: If api.Pov.Account.Name … or If api.Pov.UD1.Name …
Conditional logic requires Eval
Avoid using api.Data.Calculate in a loop (performance)
APIs
api.Data.Calculate (easiest to use)
Eval (most flexibility)
api.Data.GetDataBuffer (legacy cell-level processing)
33. Eval Buffer Example
Slide 33
• api.Data.Calculate("A#Bonus = A#Salary *
Eval(A#BonusLevel)", AddressOf
OnEvalDataBuffer)
• Bonus by Cost Center using BonusLevel and Eval
• Order of Operations
• A#Salary – Data Buffer is retrieved from storage
• A#BonusLevel – Data Buffer is retrieved from storage
• Eval evaluates and modifies the BonusLevel Data Buffer
• Data Buffer Math creates a new Data Buffer
• A#Bonus - The new Data Buffer is stored
36. Eval Filtering – Method 2
Slide 36
• Eval Filters the new Data Buffer:
• For example:
api.Data.Calculate("A#Bonus = Eval(A#Salary * 0.05)”,
AddressOf OnEvalDataBufferFilter)
• Generates the same result as Method 1
39. Convert Unbalanced
Slide 39
• AddUnbalanced, SubtractUnbalanced,
MultiplyUnbalanced, and DivideUnbalanced
• Used to avoid data explosion when varying level of
Account-Type dimensions are required in a formula
• Valid:
api.Data.Calculate("A#6050 = A#5000 * A#3000")
• Bad Idea:
api.Data.Calculate("A#6050 = A#5000 * A#3000:O#Top")
api.Data.Calculate("A#6050:O#All = A#5000:O#All * A#3000:O#Top")
40. Convert Unbalanced
Slide 40
• Instead, use new Convert Unbalanced functions:
api.Data.Calculate("A#6050 =
MultiplyUnbalanced(A#5000, A#3000:O#Top,
O#Top)")
• First two parameters are Data Buffers to be
multiplied (or added or subtracted or divided)
• Third parameter is the Account Type dimension
member that will always be used with first
parameter, without causing data explosion.
41. Get Data Buffer Using Formula
Slide 41
• Allows use of an entire math function to calculate
a final data buffer:
• Syntax: Dim objDataBuffer As DataBuffer =
api.Data.GetDataBufferUsingFormula(formula,
scriptMethodType,
changeIdsToCommonIfNotUsingAll,
expressionDestinationInfo, onEvalDataBuffer,
userState)
• For example:
Dim myDataBuffer As DataBuffer =
api.Data.GetDataBufferUsingFormula("A#Sales – A#Costs")
42. Get Data Buffer Using Formula Variables
Slide 42
• After creating a data buffer variable, it can be named as a
Formula Variable and then reference inside api.Data.Calculate
or inside other calls to api.Data.GetDataBufferUsingFormula.
• This provides a lot of flexibility and it can even improve
performance because you can calculate a data buffer once and
re-use the variable multiple times instead of recreating it.
• For example:
Dim myDataBuffer As DataBuffer =
api.Data.GetDataBufferUsingFormula("A#Sales – A#Costs")
api.Data.FormulaVariables.SetDataBufferVariable
("myDataBuffer", myDataBuffer, False)
api.Data.Calculate("A#Profit = A#5000 + $myDataBuffer")
43. Get Member Names from ID’s
Slide 43
• Allows identification of Member Names when
looping:
• For example:
For Each sourceCell As DataBufferCell In
myDataBuffer.DataBufferCells.Values
Dim accountName As String =
sourceCell.DataBufferCellPk.GetAccountName(api)
Dim ud1Name As String =
sourceCell.DataBufferCellPk.GetUD1Name(api)
Next
44. Log Contents of Data Buffer
Slide 44
• Allows logging of Data Buffer contents for
Debugging
• Third parameter indicates number of records to be
logged.
• For example:
myDataBuffer.LogDataBuffer(api, "MyDataBuffer Output", 1000)
46. Thank You for Attending!
Slide 46
Today’s Presenter:
Aaron Bolshoun
abolshoun@finit.com
General Questions:
Greg Barrett
gbarrett@finit.com
Copy of the slides or
Recording:
Email us for a copy of the slides or a
link to the recording
insights@finit.com
Past webinars:
www.finit.com/webinars
Follow us on Twitter for
updates:
@Finit_Solutions