SlideShare a Scribd company logo
1 of 87
Download to read offline
ODTUG • KScope18 Slide 1
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
WHY IS GROOVY AND
PBCS
SO
GAME CHANGING
ODTUG • KScope18 2
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
• Starbucks on us
• Questions and Answers
» We will answer questions throughout the
presentation
» Bring questions with your name/email/phone
number up to the front at the end of the
presentation and I will make sure they get
answered
HOUSEKEEPING
WELCOME
KYLE GOODFRIENDHuron Consulting / Oracle EPBCS Implementation Specialist
Professional and Personal
• BBA, concentration in Finance
• College professor for 5 years
• Started consulting in 2008
• 100% self taught (technology)
• Worked with Huron since 2013
(via ADI Strategies)
• Created In2Hyperion and the
Essbase Excel Ribbon
• Started the Columbus Hyperion
Customer Community
(CHCC.In2Hyperion.com)
• Love playing ice hockey, scuba
diving, and rescue dogs
• Have a beautiful wife that I drive
nuts
• Raising a son that is a walking
medical deductible
Planning and Essbase
• Worked with Hyperion since
1997
• Started learning Groovy in
August of 2017
• Worked with the cloud since
2015
• Hold certification in Hyperion
Planning, PBCS, and EPBCS
• Hold specialization in Pre-
Sales, Sales, and Support for
both Planning and Essbase
• Also a Microsoft Certified
Professional
ODTUG • KScope18 Slide 4
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
HOW TO CONTACT KYLE
kyle@in2hyperion.com
www.in2hyperion.com
kgoodfriend@huronconsultinggroup.com
ODTUG • KScope18
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) 5
Sign up at
www.in2hyperion.com
to receive blog
updates through email
STAYING CONNECTED
IN2HYPERION
Join the LinkedIn
In2Hyperion Group
www.linkedin.com/
groups/4010770
LINKEDIN GROUP
ODTUG • KScope18 6
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
PRESENTATION PROGRESSION
01
GROOVY INTRODUCTION
What is Groovy
02
GROOVY AND PBCS
How does groovy benefit an
implementation
03
LEARNING CURVE
What to expect if you are not a
Groovy or Java programmer
04
FEATURE DEEP DIVE
Benefits, demos, and code reviews
05
07
LEARNING AS YOU GO
Don’t make the same mistakes I
made
06
GROWING PAINS
A new product, new integration,
watchout for these gotchas
08 RESOURCES
Where to go to get help
09 WRAPPING UP
Where to go from here
ODTUG • KScope18 7
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
THERE IS MORE
The opportunities are endless
GROOVY INTRODUCTION
Groovy has a lot to offer and the journey starts here
ODTUG • KScope18
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 8
FLAVORS OF GROOVY
RELATED TO PBCS
Groovy can be used to access the API to
do all kinds of things, including
automation, system backups, and user
communication. This discussion will focus
on the ability to access Groovy INSIDE the
calculation manager only.
ODTUG • KScope18 9
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
Seamlessly and
transparently
integrates and
interoperates with Java
and any third-party
libraries
BENEFITS OF GROOVY
SMOOTH JAVA
INTEGRATION
Closures, builders,
runtime &compile-time
meta-programming,
functional
programming, type
inference, and static
compilation
POWERFUL
FEATURES
Concise, readable and
expressive syntax, easy
to learn for Java
developers
FLAT LEARNING
CURVE
Web development,
reactive applications,
concurrency /
asynchronous / parallelism
library, test frameworks,
build tools, code analysis,
GUI building
VIBRANT AND RICH
ECOSYSTEM
ODTUG • KScope18 10
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
Great for writing
concise and
maintainable tests,
and for all your build
and automation tasks
BENEFITS OF GROOVY
SCRIPTING AND
TESTING GLUE Apache Groovy is a powerful, optionally typed
and dynamic language, with static-typing and
static compilation capabilities, for the Java
platform aimed at improving developer
productivity thanks to a concise, familiar and
easy to learn syntax. It integrates smoothly with
any Java program, and immediately delivers
powerful features to your application, including
scripting capabilities, Domain-Specific Language,
authoring, runtime and compile-time meta-
programming and functional programming.
WHAT IS GROOVY
Flexible & malleable
syntax, advanced
integration &
customization
mechanisms, to integrate
readable business rules in
your applications
DOMAIN-SPECIFIC
LANGUAGES
ODTUG • KScope18 11
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
IMPACT TO
PBCS
DESIGN
AND
OPTIONS
AVAILABLE
• Java development is fast-tracked and
maintenance is simplified
• Developers get much of the functionality of
the Java API
• The knowledge required to construct complex
functionality is far less with Groovy
• PBCS is built with Groovy so it’s going to be a
part of the product roadmap
• Within PBCS
» Access to use groovy to interact with the user
» Customize commands sent to the Essbase
IMPACT TO THE
IMPLEMENTATION
How does addition of Groovy impact an
implementation
ODTUG • KScope18 13
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
IMPACT TO
BUILD
• Performance will improve
• Input validation will improve data input
• Developers will have a learning curve
• Timeline will increase
» Growing knowledge
» Additional functionality
WHAT YOU NEED TO KNOW
DEMONSTRATION
ODTUG • KScope18 15
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
GROOVY AND PBCS
Who can use it and in what capacity can it be used
ODTUG • KScope18
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 16
• ePBCS and PBCS+1 have access to create
Groovy calculations
• Groovy calculations open up the Java API and
provide a user experience never before
available
• Have access to use groovy to interact with
the user and customize commands sent to
the PBCS
There is currently no expectation that Oracle will make
Groovy Calculations available in future on-premise releases
GROOVY
AVAILABILITY AND
LICENSING
ODTUG •
KScope18 17
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM -
04:30 PM)
FUNCTIONAL OVERVIEW
Proactive User Input Validation
Users are promptedfor input frequently for
things like employee, project, capex, and
product properties. This data canbe validatedprior to any business logic to ensure consistent
andvaliddata input.
Proactive Data Validation
User input canbe validatedandcaninterrupt
the data formsave proactively. For example, if
anemployee is not fully allocated, the formwill
not save until it is 100%.
Selective Data Synchronization
Data between input and reporting applications can
be near real-time because synchronization is
isolated to only the edited or effected data. It can
now be executed on form save due to performance
improvements.
Selective Business Logic Execution
Users cannowsee significantly improved
performance ondata forminput because the
business logic canbe isolatedto only what has
beenchangedor effected.
Access to Java Functions
Logic that couldn't be completed, or wasn't
because of performance issues cannowbe
accessedandexecutedat lighteningspeed. Developers nowhave access to functions
fromthe Java API.
Real-Time Consolidated Reporting
Data betweenapplications, like workforce,
capital, anda consolidatedP&L canbe
synchronizedinreal-time without timely data
consolidations.
FUNCTIONAL OVERVIEW
Execute CalculationLogic onASO
Prior to the availability of Groovy, business logic
onASOwas not available. Now, all logic that
exists inBSOdatabases is available throughthe
Java API andcanbe executeddirectly inASO.
Advanced FormTraffic Lighting
Simple andextremely complex color coding can
be addedto forms onloadandonsave. The
possibilities are endless andare completely
customizable.
CustomLogging
Developers have complete control over what is
loggedfor review. User information, POV
selections, timing, anddata that has changed,
are just a sample of what canbe logged.
CustomUser Errors
Custommessages in an infinite number of
languages canbe displayedinprompts and
addedtocells tocommunicate changes, rule
violations, anderrors.
Interaction with Strategic Modeling
Data movement to and from Strategic
Modeling can be done in real-time on form
save.
PERFORMANCE
IMPROVEMENTS
The speed and agility that Groovy provides in
customizing calculations introduces consolidated real-
time reporting
ODTUG • KScope18 20
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
REAL WORLD USER EXAMPLE (SPEED &
FUNCTIONALITY)
99%IMPROVEMENT 98% 99%
Reporting includes all updates from
detailed modules (product, Capex,
workforce, and similar modules) and
is included in
real time as changes are made
Consolidated Reporting
Reporting includes all updates from
detailed modules (product, Capex,
workforce, and similar modules) at
scheduled intervals
users have to wait to see
consolidated information
Groovy eliminates the need to
consolidate the BSO cube and
copies data directly from the
ASO cube at a consolidated
level
.2 Seconds
Dimensions are consolidated
and copied to the P&L model
82.9 Seconds
Consolidated P&L
Product detailed dimensions
are consolidated and moved
to the P&L model
Groovy selects only the cells
that where edited and copies
only what changed to the
reporting model
1.0 Seconds
All data on the form is
synchronized
14.5 Seconds
Smart Push
Data synchronizes to the
reporting cube for analysis
01
0110
0001
01101
Groovy selects only edited
cells and executes the logic
on only products and periods
that changed
0.3 Seconds
All products on the form are
calculated
26.1 Seconds
Business Logic
Growth rates are entered at
total product breakouts and
allocated to the detailed level
With the inclusion of Groovy
and access to the Java API,
more customization can be
integrated to maximum
performance and achieve real
time consolidated reporting
Submit
Planner Input
User submits updates to the
Gross Profit model at a
detailed product level that
exists at a more granular level
than in the P&L model
ODTUG • KScope18 21
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
Reporting includes all updates from
detailed modules (product, Capex,
workforce, and similar modules) and
is included in
real time as changes are made
Consolidated Reporting
Reporting includes all updates from
detailed modules (product, Capex,
workforce, and similar modules) at
scheduled intervals
users have to wait to see
consolidated information
REAL WORLD PROCESS EXAMPLE (SPEED &
FUNCTIONALITY)
Automated Process
Administrative processes are
executed to run all business
logic and model
synchronizations
The entire data set is
consolidated and moved to
the P&L model
12.0 Seconds
Dimensions are consolidated
and copied to the P&L model
663.6 Seconds
Global Consolidation
Global product consolidations are
often required to catch all changes
and completed during
maintenance windows
99% 99%
ODTUG • KScope18 22
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
REAL-TIME
CONSOLIDATED
REPORTING
Idenfity the candidates that will benefit using Groovy
Calculations
ODTUG •
KScope18
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM -
04:30 PM)
24
SHOULD YOU CONSIDER
GROOVY?
SHOULD
YOU
CONSIDER
GROOVY AS
AN OPTION
NEW
IMPLEMENTATIONS
• On-premise implementations that want better
performance
• PBCS implementations that have performance
issues because of
» Large dimensions
» Complex calculations
» Detailed planning input
» Lack of real-time reporting
• Implementations that need more complex user
input validation
• Applications that want proactive data validation
SHOULD
YOU
CONSIDER
GROOVY AS
AN OPTION
EXISTING
IMPLEMENTATIONS
• Have complex models
• Have large dimensions
• Require data input validation
• Require real-time consolidated reporting
SO, WHO SHOULD CONSIDER GROOVY?
ODTUG • KScope18
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) 27
THE LEARNING CURVE
For those who have Groovy or Java backgrounds, this
should be easy. For the rest of us, there is a learning
curve.
ODTUG • KScope18
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 29
EXPERTISE NEEDED
Intuitive Developers
Groovy may be built on Java, but Java developers are not
required to successfully implement Groovy into PBCS.
Experienced developers who have knowledge within PBCS
and understand that basic functionality with scripting will
be able to use Groovy training materials and global rules to
build an application with groovy that fits a clients
performance needs. It only takes a little groovy knowledge
to exponentially improve ePBCS performance.
Visionary Managers
Managers who can understand, interpret, and plan the
execution of requirements with Groovy will build
exceptional applications. Managers will communicate how
Groovy fills performance gaps that existed prior to its
release and help clients understand why Groovy is a
necessary element of any planning application.
ODTUG • KScope18 30
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
THREE
ASPECTS
TO LEARN
• PBCS API (methods and properties available to
interact with PBCS)
• Groovy (Open source development language)
• Middle ground (the overlap)
Growth of PBCS API Growth of Groovy
Productivity
FEATURE DEEP DIVE
Ready, set, go! Take it all in. This is where things get
really Groovy.
ODTUG • KScope18
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 32
CHANGING
NAMES TO
PROTECT
THE
INNOCENT
• The application is a replica of live application
• Size of the application is twice the size of BBG
• The volume of metadata is the same
• The metadata has been changed to protect the
innocent
• The data has been altered
ODTUG • KScope18
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 34
REAL-TIME CONSOLIDATED REPORTING
REAL-TIME
CONSOLIDATED
REPORTING
Detailed
App
Consolidated
P&L
Detailed
App
Consolidated
P&L
NON GROOVY
• All dimensions need to be
consolidated
• Movement from ASO is not possible
• Movement is batched and scheduled
WITH GROOVY
• NO BSO consolidation is required
• Data can be transferred from ASO
• Movement is executed on form
save
REAL-TIME
CONSOLIDATED
REPORTING
DATA FLOW
PART 1
• Intra-model (GP) data movement
User Enters
Data
Data Saved
to BSO
Business
Logic Runs
Smart Push
to ASO
Consolidated
Data
These objects are all physical artifacts in the Planning application
1. The user submits changes to the data in a data form
2. The data is stored in the BSO database
3. The appropriate business logic is executed on the respective POV
4. A Smart Push is executed to move the updated data to the ASO database
5. The data is available at consolidated levels
* In the sample application, this application includes breakouts that the P&L
cube does not have (Product, Order Method, and Delivery Channel)
REAL-TIME
CONSOLIDATED
REPORTING
DATA FLOW
PART 2
• Inter-model data movement
Virtual forms can be created to simulate a data retrieve and data submission
1. A virtual form is dynamically created on the POV to retrieve data from the
GP ASO database to pull consolidated data at the dimensions that don’t
exist in the P&L database.
2. Virtual forms is dynamically created on the POV to submit data to the P&L
ASO and BSO databases
3. Data from the form in step 1 is copied to the forms in step 2 and submitted
to both P&L cubes
* No consolidation calculations are required
P&L ASO
Database
Consolidated
GP Retrieve
P&L BSO
Database
P&L
Connection
Virtual Artifacts Physical Artifacts
DEMONSTRATION
ODTUG • KScope18 38
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
We will kickstart the feature deep-dive with a real world process that
encompasses many of the things we are going to discuss in detail,
including
• Data input validation
• Traffic lighting
• Custom Essbase calculations
• Customized data copies / smart pushes
• Eliminations of the need for consolidations via GridBuilder
processing
ODTUG • KScope18
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 39
TRAFFIC LIGHTING
TRAFFIC
LIGHTING
• Interact with users
• Draw attention to important data
• Indicate possible issues by thresholds
• Show required inputs
• Highlight variances and other critical metrics
BENEFITS
TRAFFIC
LIGHTING
• Set background colors
• Set cell tool tips
• Add validation without throwing errors – act
like warnings
• Add validation and stop form from saving
OPTIONS
TRAFFIC
LIGHTING
DataGrid curDataGrid = operation.grid
def iColor = 16746496
def sValidateTo = curDataGrid.getCellWithMembers('Input').data
/* can add destCell && to the if and it will ignore the null columns
*/
operation.grid.dataCellIterator('Avg_Price/Case','Input').each
{ DataCell destCell = it.crossDimCell('Initialize')
if(it.data.round(2) != destCell.data.round(2)) {
println it.data.round(2)
println destCell.data.round(2)
it.setBgColor(iColor)}
}
operation.grid.dataCellIterator('Regular_Cases','Input').each{
DataCell destCell = it.crossDimCell('Initialize')
if(it.data.round(2) != destCell.data.round(2)) {
println it.data.round(2)
println destCell.data.round(2)it.setBgColor(iColor)
}
}
operation.grid.dataCellIterator('Net_Sales','Input').each{
DataCell destCell = it.crossDimCell('Initialize')
if(it.data.round(2) != destCell.data.round(2)) {
println it.data.round(2)
println destCell.data.round(2)
it.setBgColor(iColor)
}
}
operation.grid.dataCellIterator("GP_Level_2","Input").each
{
DataCell destCell = it.crossDimCell('Initialize')
if(it.data.round(2) != destCell.data.round(2)) {println it.data.round(2)
println destCell.data.round(2)
it.setBgColor(iColor)
}
}
CODE REVIEW
operation.grid.dataCellIterator("Case_Growth",'Input').each
{
DataCell destCell = it.crossDimCell('Initialize')if(it.data.round(2) != destCell.data.round(2)) {
println it.data.round(2)
println destCell.data.round(2)
it.setBgColor(iColor)
}}
operation.grid.dataCellIterator('Sales_Growth','Input').each
{
DataCell destCell = it.crossDimCell('Initialize')if(it.data.round(2) != destCell.data.round(2)) {
println it.data.round(2)
println destCell.data.round(2)
it.setBgColor(iColor)}
}
operation.grid.dataCellIterator("GP_2_%_Diff",'Input').each
{ DataCell destCell = it.crossDimCell('Initialize')
if(it.data.round(2) != destCell.data.round(2)) {
println it.data.round(2)
println destCell.data.round(2)
it.setBgColor(iColor)}
}
ODTUG • KScope18
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 43
DYNAMIC ESSBASE CALCULATIONS
DYNAMIC
ESSBASE
CALCULATIONS
• Improve performance
• Improve user experience
BENEFITS
EXAMPLE
DYNAMIC
ESSBASE
CALCULATIONS
Legacy Business Rule
• Provides the ability to
pass the POV
(Page/Header) to a
business rule to isolate
what is calculated
• Executes on all rows and
columns regardless of the
state of the data
Groovy Calculation
• Can access the same
POV and can
dynamically change
business logic based on
selections
• Can identify the
changed cells and alter
the business logic based
on results
DYNAMIC
ESSBASE
CALCULATIONS
// Set variables and loop through edited cells
Set<String> periods = []
Set<String> products = []
operation.grid.dataCellIterator({DataCell cell -> cell.edited},
MemberNameType.ESSBASE_NAME).each { DataCell cell ->
periods << cell.periodName
products << cell.getMemberName("Product")
}
// Exit the script it no cells were edited
if(products.size() == 0) {
println("No edited cells found!")
return
}
// Construct the calculation script to be sent to Essbase
String calcScript = """
Fix("${povMemberNames.join('", "')}",
"${periods.join('", "')}",
"${products.join('", "')}")
"Revenue"(
"Revenue" = ”Avg_Price" * "Units";)
EndFix;"""
// Print the script to the log
println("The following calc script was executed by
$operation.user.fullName: n $calcScript")
// Return the calculation script to be executed
return calcScript.toString()
CODE REVIEW
ODTUG • KScope18
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 47
FILTERED DATA MAPS
FILTERED
DATA
MAPS
• Improve speed of data movements
• Miminize possible threasholds for clearing
target before loading
• Minimize possible threasholds in size of data
• Eliminate need to run in background
• Give user feedback on completion
BENEFITS
FILTERED
DATA
MAPS
// Get POV
String sCompany =
operation.grid.getCellWithMembers().getMemberName("Company")
String sMaterialGroup =
operation.grid.getCellWithMembers().getMemberName("Material_Group")
String sChannel =
operation.grid.getCellWithMembers().getMemberName("Channel")
String sAccount =
operation.grid.getCellWithMembers().getMemberName("Account")
// Get list of vendors that have been edited
def lstVendors = []
operation.grid.dataCellIterator({DataCell cell -> cell.edited}).each{
lstVendors.add(it.getMemberName("Vendor"))
}
// Convert collection to comma delimited string
String strVendors = """"${lstVendors.unique().join('","')}""""
// Execute a filtered data map based on the POV and edited vendors
if(lstVendors)
operation.application.getDataMap("GP Form Push").execute
(["Company":sCompany,"Channel":'ILvl0Descendants(Channel)’,
"Material_Group":'ILvl0Descendants(Material_Group)’,
"Vendor":strVendors,
"Scenario":"OEP_Plan",
"Version":"OEP_Working",
"Years":"&v_BudYear",
"Source":"Input",
"Currency":'"USD","Local"'],true)
CODE REVIEW
ODTUG • KScope18
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 50
GRID BUILDERS
GRID
BUILDERS
• Move data from ASO to BSO
• Include mappings when pushing data from BSO
to ASO
• security issues with Data Maps/Smart Pushes
also exist
• Perform calculations outside of Essbase
• Performance improvements over Data
Maps/Smart Pushes
• Write directly to ASO (bypass BSO and Essbase
calculations)
BENEFITS
CODE
REVIEW
GRID
BUILDERS
I will be doing a 20-30 minute deep dive on the
GridBuilder methods
Last Minute ODTUG Kscope18 Planning
Souvenirs You Will ACTUALLY Use!
June 14th
, 9:30 - 11:00 a.m.
Southern Hemisphere II, Fifth Level
ODTUG • KScope18
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 53
CUSTOMIZED LOGS
BENEFITS • Completely customizable
» User who executed it
» Execution times
» POV
» Dynamic calculation sent to Essbase
• Unlimited possibilities
CUSTOMIZED LOGS
EXAMPLE Log messages :
****************************************************
Time taken for allocation and consolidation = 0 secs
Total Time = 0.001 secs
****************************************************
data push running for
"v30000400030001","v30000400030002","v30000400060001","v30000401630001","v300004000
80004","v30000400080002","v30000400080001"
****************************************************
Time taken for data push = 2.051 secs
Total Time = 2.051 secs
****************************************************
POV:
[FY17, OEP_Forecast, OEP_Working, BILB, Tot_Channel, Total_Material_Group,
Tot_Source, Tot_Vendor, MTD]
ROWS HEADER:
[[Regular_Cases], [Net_Sales], [Cost_of_Sales_without_Samples], [Gallonage_Tax],
[Depletion_Allowance_Manual_Chargeback], [Gain_Loss_Inv_Reval],
[Supplier_Commitments], [Supplier_Spend_Non_Committed], [Samples], [GP_NDF],
[GP_BDF], [GP_Contract_Amortization], [Sample_Adjustment]]
COLUMNS:
[Jan, Jan, Feb, Feb, Mar, Mar, Apr, Apr, May, May, Jun, Jun, Jul, Jul, Aug, Aug,
Sep, Sep, Oct, Oct, Nov, Nov, Dec, Dec]
[Local, USD, Local, USD, Local, USD, Local, USD, Local, USD, Local, USD, Local,
USD, Local, USD, Local, USD, Local, USD, Local, USD, Local, USD]
Total number of cells accepted: 312
Total number of cells rejected: 0
First 100 rejected cells: []
Total number of cells accepted: 312
Total number of cells rejected: 0
First 100 rejected cells: []
****************************************************
Time taken copy to fin = 0.48 secs
Total Time = 2.531 secs
****************************************************
CUSTOMIZED LOGS
CODE
REVIEW
def startTime = currentTimeMillis()
def procTime = currentTimeMillis()
def elapsed=(currentTimeMillis()-startTime)/1000
Calendar calendar = Calendar.getInstance()
calendar.setTimeInMillis(currentTimeMillis())def now = calendar.getTime()
def dtstmp = now.format("MM/dd/yyyy")
elapsed=(currentTimeMillis()-procTime)/1000
procTime = currentTimeMillis()println "****************************************************"
println "Time taken for allocation and consolidation = $elapsed secs"println "Total Time = " + (currentTimeMillis()-startTime)/1000 + " secs"
println "****************************************************"
[Code Removed]String strVendors = """"${lstVendors.unique().join('","')}""""
println "data push running for " + strVendors[Code Removed]
elapsed=(currentTimeMillis()-procTime)/1000
procTime = currentTimeMillis()
println "****************************************************"
println "Time taken for data push = $elapsed secs"println "Total Time = " + (currentTimeMillis()-startTime)/1000 + " secs"
println "****************************************************"[Code Removed]
println "POV:"
println povmbrs*.essbaseMbrNameprintln ""
println"ROWS HEADER:"
println rowmbrs.headers*.essbaseMbrName
println ""
println"COLUMNS:"
println colmbrs[0]*.essbaseMbrName
println colmbrs[1]*.essbaseMbrNameprintln ""
println ""
[Code Removed]println("Total number of cells accepted: $status.numAcceptedCells")
println("Total number of cells rejected: $status.numRejectedCells")println("First 100 rejected cells: $status.cellsRejected")
finCube.saveGrid(grid)
println("Total number of cells accepted: $rstatus.numAcceptedCells")
println("Total number of cells rejected: $rstatus.numRejectedCells")println("First 100 rejected cells: $rstatus.cellsRejected")
rfinCube.saveGrid(rgrid)
elapsed=(currentTimeMillis()-procTime)/1000
procTime = currentTimeMillis()println "****************************************************"
println "Time taken copy to fin = $elapsed secs"
println "Total Time = " + (currentTimeMillis()-startTime)/1000 + " secs"
println "****************************************************"
CUSTOMIZED LOGS
ODTUG • KScope18
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 57
RUN TIME PROMPTS
RUN TIME
PROMPTS
• Conditional execution
» Confirm long process or processes that clear or
reset data
» Confirm what processes will be executed
• Validate input before RTP use
» Check for special characters
» Verify start and end dates
BENEFITS
DEMONSTRATION
ODTUG • KScope18 59
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
RTP Validation has huge impacts on system perceptions.
It can stop invalid data from being entered and confirm
expectations before long running processes
• WFP Data input (validate name, start and term dates)
• Execute global consolidations
RUN TIME
PROMPTS
/*RTPS: {RTP_Push},{RTP_Clear},{RTP_Name} */
if(rtps.RTP_Push.getEssbaseValue() == "1"){
operation.application.getDataMap("GP Form Push").execute(
["Company":"ILvl0Descendants(Company)",
"Channel":"ILvl0Descendants(Channel)",
"Material_Group":"ILvl0Descendants(Material_Group)",
"Vendor":"ILvl0Descendants(Vendor)",
"Scenario":"OEP_Plan",
"Version":"OEP_Working",
"Years":"&v_BudYear",
"Source":"ILvl0Descendants(Source)",
"Currency":'"USD","Local”’],
rtps.RTP_Push.getEssbaseValue().toBoolean()
)
def isValid = true
def specialCh = ['!','@',']','#','$','%','^','&','*']
for (int i=0; i<specialCh.size; i++) {
if(rtps.RTP_Name.getEnteredValue().contains(specialCh[i]))
isValid=false
}
if(isValid == true)
{
}
CODE REVIEW
RUN TIME
PROMPTS
/*RTPS: {RTP_Description} */
// Define Message Bundle
def mbUs = messageBundle([
"validation.SpecialChar":"Only alphanumeric characters are permitted"])
def mbl = messageBundleLoader(["en" : mbUs])
def isValid = true
// Define the list characters NOT allowed
def specialCh = ['!','@',']','#','$','%','^','&','*']
for (int i=0; i<specialCh.size(); i++) {
if(rtps.RTP_Description.toString().contains(specialCh[i]))
isValid = false
}
if(isValid == false)
{
throwVetoException(mbl, "validation.SpecialChar",
rtps.RTP_Description)
}
CODE REVIEW
ODTUG • KScope18
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 62
DATA FORM VALIDATION
DATA
FORM
VALIDATION
• Improve the reliability of the data entered
• Proactively fix errors before they become
problems
• Educate users on the fly
• Stop users from entering any data until it
validates
• Improve validity of budgets
BENEFITS
DEMONSTRATION
ODTUG • KScope18 64
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
Interractive data validation on forms can improve user
input and eliminate data issues before they exist
• WFP Data input (ensure correct data is entered to
correspond to the employee selections)
• Gross Profit Spreading (make sure adjustments to
monthly volumes aren’t adjusted outside
predetermined thresholds)
• New Products (improve consistency with data input)
EXAMPLE
DATA
FORM
VALIDATION
• Any validation that can be done using member
names, hierarchies or math is possible
• Example
» The GP Level 2 % has to be between -10% and 30%.
» The Regular Cases CANNOT have one month that is more than 50%
of the total cases.
» If Regular Cases is entered, a corresponding Average Price per Case
is required.
NEW PRODUCT EXAMPLE
DATA
FORM
VALIDATION
def BackErrColor = 16755370 //Red
def BackWarnColor = 16756480 //Orange
operation.grid.dataCellIterator('Regular_Cases','Jan','Feb','Mar','Apr'
,'May','Jun','Jul','Aug','Sep','Oct','Nov','Dec').each {
// Check cases
def CaseTotal = it.crossDimCell('Jan').data +
it.crossDimCell('Feb').data + it.crossDimCell('Mar').data +
it.crossDimCell('Apr').data + it.crossDimCell('May').data +
it.crossDimCell('Jun').data + it.crossDimCell('Jul').data +
it.crossDimCell('Aug').data + it.crossDimCell('Sep').data +
it.crossDimCell('Oct').data + it.crossDimCell('Nov').data +
it.crossDimCell('Dec').data
println "$it.MemberNames $it.data $CaseTotal"
if(it.data / CaseTotal > 0.5 ) {
println "warning"
it.addValidationError(BackErrColor, "Cases for a single month can't
be more than 50% of the total year cases.", false)
}
if(it.data != 0 && (it.crossDimCell("Avg_Price/Case_Inp").data == 0
|| it.crossDimCell("Avg_Price/Case_Inp").data == '#Missing'))
it.crossDimCell("Avg_Price/Case_Inp").addValidationError(BackErrColor,
"A price is required when cases are entered.", false)
}
operation.grid.dataCellIterator('GP_2_%_Inp','Jan','Feb','Mar','Apr','M
ay','Jun','Jul','Aug','Sep','Oct','Nov','Dec').each {
// Check cases
println "$it.MemberNames $it.data"
if(it.data > 0.3 || it.data < -0.1 ) {
println "invalid"
it.addValidationError(BackErrColor, "GP2 has to be between -10% and
30%.", false)
}
}
CODE REVIEW - NEW PRODUCT
EXAMPLE
DATA
FORM
VALIDATION
• Example Adjustments can be made to any
month
»The net change has to be 0
»No change can push the number to a
negative number
PHASING EXAMPLE
DATA
FORM
VALIDATION
def BackErrColor = 16755370 //Red
operation.grid.dataCellIterator({DataCell cell ->
cell.edited}).each {
// Check cases
def CaseTotal = it.crossDimCell('Jan').data +
it.crossDimCell('Feb').data + it.crossDimCell('Mar').data +
it.crossDimCell('Apr').data + it.crossDimCell('May').data +
it.crossDimCell('Jun').data + it.crossDimCell('Jul').data +
it.crossDimCell('Aug').data + it.crossDimCell('Sep').data +
it.crossDimCell('Oct').data + it.crossDimCell('Nov').data +
it.crossDimCell('Dec').data
if(it.data + it.crossDimCell('OEP_Working').data < 0.0)
{
def change = it.data + it.crossDimCell('OEP_Working').data
it.addValidationError(BackErrColor, "Your adjustment forces
the new cases to be a negative volume. Increase your
adjustment by $change", false)
}
else
{
if(CaseTotal != 0.0 && it.data != 0.0) {
println "net change is not 0 - $it.MemberNames"
it.addValidationError(BackErrColor, "Adjustments must not
have a full year impact. Currently, the data would change
by $CaseTotal.", false)
}
}
}
CODE REVIEW - PHASING
THERE IS MORE
We covered the biggest bang for your buck. The
opportunities to improve applications doesn’t stop
there. When you leave here, take a look at some of the
other things that make the inclusion of Groovy into
PBCS special.
ODTUG • KScope18
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 69
MORE
STUFF
THAN YOU
CAN SHAKE
A STICK AT
• Query metadata
• Localized messages
• Smartlist integration
• Modularized code
• Customized logging
• Clearing ASO data
OTHER POSSIBILITIES
THINKING OUTSIDE THE BOX
ODTUG • KScope18
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) 71
With Groovy, business
logic can be written
and executed, with
results stored in ASO
BUSINESS LOGIC CAN BE EXECUTED IN ASO VIA
GROOVY
BUSINESS LOGIC
Allocation logic can be
processed in Groovy
with the results stored
in ASO
ALLOCATIONS
Data can be loaded to
ASO, but has minimal
calculation logic
ASO LIMITATIONS
Currency exchange
rates can be accessed
and used to calculate
and store USD
equivalents
FX RATES
ODTUG • KScope18 72
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
ACCESS TO
JAVA
FUNCTIONS
• Java functions are available. These can
introduce opportunities to do things never
before available or improve on functions in
Essbase that introduce performance
degradation.
» Math
» Strings
» If/Then logic
» Mapping
» Comparisons
GROWING PAINS
Released in June, and just now being included in a
larger volume of implementations, there are still some
issues/bugs that are causing complications with going
live.
ODTUG • KScope18
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 74
GROWING
PAINS
• 9 months into use
• Just starting to be heavily used/globally tested
• Current Issues
» Groovy rules included in rulesets do not execute
from an action menu in Smart View
• Edited cells do not stay edited with Groovy
validation rules executed before save in Smart
View
• The data in hidden columns/rows is not
accessible in a Groovy rule in Smart View (will
return a null pointer error)
GROWING
PAINS
• Groovy documentation shows methods that
are not accessible
• Many documented methods are still private
and not available
» Substitution variable
» Get content of rule
HOW TO
GET WHAT
YOU WANT
• Open a ticket immediately
» Call 1-800-223-1711
» Press 1 and enter your SR number
» Press 2 to speak with a manager
do not press 1 to speak with Engineer, this will likely result in going
straight to Voicemail
» Tell the Support Hub the critical impact you are facing
» Request a Duty Manager callback ASAP
» Repeat request level 2, then level 3, to level n, until you get what you
want
• Some helpful tips:
» Speak with the support hub manager
» Describe the impact, include key project milestones at risk and
communicate what you need for progress
» If your issue is CRITICAL you should ALWAYS make a request for a duty
manager call back.
» If you ask for a duty manager call back, wait 30-60 minutes until you
receive the call and reiterate the problem
» Be strategic with your request
» Don't just say you need to escalate - describe the impact and
communicate what you need for progress
» Keep in mind, your SR will NOT appear in an "escalated" state unless
you negotiate this with a duty manager
WORKING WITH SUPPORT
LEARNING AS YOU GO
There is a lot to be excited about. There are times when
you forge ahead at lightening speeds. There are other
times when you may want to think before you run.
ODTUG • KScope18
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 78
WALK
BEFORE
YOU RUN
• Develop standards and be consistent
» Getting POV members
» Looping through edited rows
» Variable definition
• As soon as code is identified to be used in
multiple rules, modularize it
• When you get stuck, identify the issue as
something related to the PBCS API vs. Groovy
and research a solution appropriately
• Data can be moved with Data Maps and Grid
Builders and a strategic decision on which
should be used should be made before
implementation
SUGGESTIONS FROM EXPERIENCE
WALK
BEFORE
YOU RUN
• GridBuilder has a cell limit (pre-suppression) of
500,000
• You will see better performance with getting cell
content using CrossDimCell vs.
getCellWithMembers
• Use functions (e.g. IDecendants) to build your grids
when possible, as it is faster than adding all rows
and suppressing
• GridBuilder uses GridDefinitonBuilder, so it can be
slower in bigger grids. GridDefinitionBuilder is
faster because you specify the dimensions for each
member
• Favor the use of .withCloseable{} when building,
loading, saving, a grid. Better memory
management.
UNDOCUMENTED FINDS
RESOURCES
Everybody needs help. Here is where to start
ODTUG • KScope18
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 81
GETTING
HELP
There are a lot of great books, articles and videos about Groovy listed here:
http://groovy-lang.org/learn.html
In particular, I would like to highlight the following two books:
https://www.manning.com/books/groovy-in-action-second-edition
https://pragprog.com/book/vslg2/programming-groovy-2
The following course on Udemy is very affordable and can be a useful asset:
https://www.udemy.com/apache-groovy/learn/v4/overview
They can also start by going over the “Language Specification” section in the
following document is also useful:
http://groovy-lang.org/documentation.html
Oracle EPBCS Groovy documentation:
http://docs.oracle.com/cloud/latest/epm-common/GROOV/
http://www.in2hyperion.com
MORE
EXAMPLES
AT
• My Adventures inGroovy Calculations -
Part 1
• Part 2: Data Validation
• Part 3: Acting OnEditedCells
• Part 4: RunTime Prompts
• Part 5: Accessing RunTime Prompts
• Part 6: Converting a POV into a Fix
• Part 7: Validating RunTime Prompts
• Part 8: Customizing Data Maps andSmart
Pushes
• Part 9: Groovy andPBCS is Game
Changing inLouisville
• Part 10: Validating FormData
• Part 11: Accessing Metadata Properties
• Part 12: Learning andTesting Groovy
Outside of PBCS
• Part 13: Returning Errors (Data Forms)
• Part 14: Returning Errors (Data Form
Cells)
• Part 15: Returning Errors (RTP Edition)
addenhancement andother bug report
GROOVY SERIES
• Part 16: Ignore FormSave WhenNo Data
Has BeenEdited
• Part 17: Force Cell Comments
• Part 18: Real Time Data Movement
(Setting The Stage)
• Part 19: Real Time Reporting Webinar
withBreakthruBeverage Group
• Part 20: Groovy On-Premise vs. GroovyCloud
• Part 21: Real Time Data Movement
(Getting Groovy)
• Part 22: Looping ThroughMember
Descendants
• Part 23: Is the POV a level 0 member?
• Part 24: Getting Member Properties?
• Part 25: The DataGridBuilders
• Part 26: Interacting withSmart Lists
• Part 27: Using Maps inGroovy as lookup
Tables
WRAPPING UP
I hope you enjoyed the show, but we aren’t quite done
yet.
ODTUG • KScope18
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 84
WRAPPING
UP
• Write down a question and drop it off up front
and I will answer it at in2hyperion.com
• Please be gentle when you fill out a survey
LAST BUT NOT LEAST
APPENDICES
ODTUG • KScope18
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 86
CREATING
YOUR FIRST
GROOVY
SCRIPT
• Open Rules in PBCS and create a new rule
• Change the dropdown box from Designer to
Edit Script
• Change the Script type dropdown box from
Calc Script to Groovy Script
ODTUG • KScope18 Slide 88
Why Groovy is Game Changing
Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)

More Related Content

What's hot

OATUG Forum - Utilizing Groovy and Data Maps for Instantaneous Analysis betw...
OATUG  Forum - Utilizing Groovy and Data Maps for Instantaneous Analysis betw...OATUG  Forum - Utilizing Groovy and Data Maps for Instantaneous Analysis betw...
OATUG Forum - Utilizing Groovy and Data Maps for Instantaneous Analysis betw...Alithya
 
Oracle PPM Cloud Deployment, Made Easy
Oracle PPM Cloud Deployment, Made EasyOracle PPM Cloud Deployment, Made Easy
Oracle PPM Cloud Deployment, Made EasyMatthew Bezuidenhout
 
The Wright Move – A Continued Journey to the Oracle EPM Cloud
 The Wright Move – A Continued Journey to the Oracle EPM Cloud The Wright Move – A Continued Journey to the Oracle EPM Cloud
The Wright Move – A Continued Journey to the Oracle EPM CloudAlithya
 
Empowering Users with Analytical MDX
Empowering Users with Analytical MDXEmpowering Users with Analytical MDX
Empowering Users with Analytical MDXAlithya
 
Oracle Hyperion Planning Best Practices
Oracle Hyperion Planning Best PracticesOracle Hyperion Planning Best Practices
Oracle Hyperion Planning Best PracticesIssam Hejazin
 
Odoo 13 project management
Odoo 13 project managementOdoo 13 project management
Odoo 13 project managementPlanetOdoo
 
Oracle EBS R12.2 - Deployment and System Administration
Oracle EBS R12.2 - Deployment and System AdministrationOracle EBS R12.2 - Deployment and System Administration
Oracle EBS R12.2 - Deployment and System AdministrationMozammel Hoque
 
Automating Security Management in PBCS!
Automating Security Management in PBCS!Automating Security Management in PBCS!
Automating Security Management in PBCS!Dayalan Punniyamoorthy
 
Simple Odoo ERP auto scaling on AWS
Simple Odoo ERP auto scaling on AWSSimple Odoo ERP auto scaling on AWS
Simple Odoo ERP auto scaling on AWSJulien Lecadou,MSc.
 
Loading Smartlists into PBCS using FDMEE
Loading Smartlists into PBCS using FDMEELoading Smartlists into PBCS using FDMEE
Loading Smartlists into PBCS using FDMEERay Février
 
FDMEE Taking Source Filters to the Next Level
FDMEE Taking Source Filters to the Next LevelFDMEE Taking Source Filters to the Next Level
FDMEE Taking Source Filters to the Next LevelFrancisco Amores
 
EPM, ERP, Cloud, and On-Premise: All Integration Options Explained
EPM, ERP, Cloud, and On-Premise:  All Integration Options ExplainedEPM, ERP, Cloud, and On-Premise:  All Integration Options Explained
EPM, ERP, Cloud, and On-Premise: All Integration Options ExplainedJoseph Alaimo Jr
 
EBS 12.1 and 12.2 strategy-roadmap-given
EBS 12.1 and 12.2 strategy-roadmap-givenEBS 12.1 and 12.2 strategy-roadmap-given
EBS 12.1 and 12.2 strategy-roadmap-givenBerry Clemens
 
Oracle ERP Implementation_Genpact_V7.pptx
Oracle ERP Implementation_Genpact_V7.pptxOracle ERP Implementation_Genpact_V7.pptx
Oracle ERP Implementation_Genpact_V7.pptxAshokKumar705948
 
Redesigning Hyperion Planning - Is going from Block Storage (BSO) to Aggregat...
Redesigning Hyperion Planning - Is going from Block Storage (BSO) to Aggregat...Redesigning Hyperion Planning - Is going from Block Storage (BSO) to Aggregat...
Redesigning Hyperion Planning - Is going from Block Storage (BSO) to Aggregat...finitsolutions
 
No more unknown members! Smart data load validation for Hyperion Planning usi...
No more unknown members! Smart data load validation for Hyperion Planning usi...No more unknown members! Smart data load validation for Hyperion Planning usi...
No more unknown members! Smart data load validation for Hyperion Planning usi...Rodrigo Radtke de Souza
 
Google Workspace (formerly G Suite) vs Microsoft 365 – Which is better for yo...
Google Workspace (formerly G Suite) vs Microsoft 365 – Which is better for yo...Google Workspace (formerly G Suite) vs Microsoft 365 – Which is better for yo...
Google Workspace (formerly G Suite) vs Microsoft 365 – Which is better for yo...Reshmi Menon
 

What's hot (20)

Uae absence whitepaper
Uae absence whitepaperUae absence whitepaper
Uae absence whitepaper
 
OATUG Forum - Utilizing Groovy and Data Maps for Instantaneous Analysis betw...
OATUG  Forum - Utilizing Groovy and Data Maps for Instantaneous Analysis betw...OATUG  Forum - Utilizing Groovy and Data Maps for Instantaneous Analysis betw...
OATUG Forum - Utilizing Groovy and Data Maps for Instantaneous Analysis betw...
 
Oracle PPM Cloud Deployment, Made Easy
Oracle PPM Cloud Deployment, Made EasyOracle PPM Cloud Deployment, Made Easy
Oracle PPM Cloud Deployment, Made Easy
 
The Wright Move – A Continued Journey to the Oracle EPM Cloud
 The Wright Move – A Continued Journey to the Oracle EPM Cloud The Wright Move – A Continued Journey to the Oracle EPM Cloud
The Wright Move – A Continued Journey to the Oracle EPM Cloud
 
Empowering Users with Analytical MDX
Empowering Users with Analytical MDXEmpowering Users with Analytical MDX
Empowering Users with Analytical MDX
 
Oracle Hyperion Planning Best Practices
Oracle Hyperion Planning Best PracticesOracle Hyperion Planning Best Practices
Oracle Hyperion Planning Best Practices
 
Odoo 13 project management
Odoo 13 project managementOdoo 13 project management
Odoo 13 project management
 
Oracle EBS R12.2 - Deployment and System Administration
Oracle EBS R12.2 - Deployment and System AdministrationOracle EBS R12.2 - Deployment and System Administration
Oracle EBS R12.2 - Deployment and System Administration
 
Automating Security Management in PBCS!
Automating Security Management in PBCS!Automating Security Management in PBCS!
Automating Security Management in PBCS!
 
Simple Odoo ERP auto scaling on AWS
Simple Odoo ERP auto scaling on AWSSimple Odoo ERP auto scaling on AWS
Simple Odoo ERP auto scaling on AWS
 
Loading Smartlists into PBCS using FDMEE
Loading Smartlists into PBCS using FDMEELoading Smartlists into PBCS using FDMEE
Loading Smartlists into PBCS using FDMEE
 
FDMEE Taking Source Filters to the Next Level
FDMEE Taking Source Filters to the Next LevelFDMEE Taking Source Filters to the Next Level
FDMEE Taking Source Filters to the Next Level
 
EPM, ERP, Cloud, and On-Premise: All Integration Options Explained
EPM, ERP, Cloud, and On-Premise:  All Integration Options ExplainedEPM, ERP, Cloud, and On-Premise:  All Integration Options Explained
EPM, ERP, Cloud, and On-Premise: All Integration Options Explained
 
EBS 12.1 and 12.2 strategy-roadmap-given
EBS 12.1 and 12.2 strategy-roadmap-givenEBS 12.1 and 12.2 strategy-roadmap-given
EBS 12.1 and 12.2 strategy-roadmap-given
 
Oracle ERP Implementation_Genpact_V7.pptx
Oracle ERP Implementation_Genpact_V7.pptxOracle ERP Implementation_Genpact_V7.pptx
Oracle ERP Implementation_Genpact_V7.pptx
 
8 legal structures
8   legal structures8   legal structures
8 legal structures
 
Redesigning Hyperion Planning - Is going from Block Storage (BSO) to Aggregat...
Redesigning Hyperion Planning - Is going from Block Storage (BSO) to Aggregat...Redesigning Hyperion Planning - Is going from Block Storage (BSO) to Aggregat...
Redesigning Hyperion Planning - Is going from Block Storage (BSO) to Aggregat...
 
Maximo 7.6.0.8
Maximo 7.6.0.8Maximo 7.6.0.8
Maximo 7.6.0.8
 
No more unknown members! Smart data load validation for Hyperion Planning usi...
No more unknown members! Smart data load validation for Hyperion Planning usi...No more unknown members! Smart data load validation for Hyperion Planning usi...
No more unknown members! Smart data load validation for Hyperion Planning usi...
 
Google Workspace (formerly G Suite) vs Microsoft 365 – Which is better for yo...
Google Workspace (formerly G Suite) vs Microsoft 365 – Which is better for yo...Google Workspace (formerly G Suite) vs Microsoft 365 – Which is better for yo...
Google Workspace (formerly G Suite) vs Microsoft 365 – Which is better for yo...
 

Similar to Why Groovy is Game Changing

October 2018 ODTUG Webinar - Getting Started with Groovy in EPBCS
October 2018 ODTUG Webinar - Getting Started with Groovy in EPBCSOctober 2018 ODTUG Webinar - Getting Started with Groovy in EPBCS
October 2018 ODTUG Webinar - Getting Started with Groovy in EPBCSKyle Goodfriend
 
ODTUG Getting Groovy with ePBCS
ODTUG Getting Groovy with ePBCSODTUG Getting Groovy with ePBCS
ODTUG Getting Groovy with ePBCSKyle Goodfriend
 
Top-Down and BottomS-Up Planning at Breakthru Beverage Group
Top-Down and BottomS-Up Planning at Breakthru Beverage GroupTop-Down and BottomS-Up Planning at Breakthru Beverage Group
Top-Down and BottomS-Up Planning at Breakthru Beverage GroupKyle Goodfriend
 
Curious Coders Java Web Frameworks Comparison
Curious Coders Java Web Frameworks ComparisonCurious Coders Java Web Frameworks Comparison
Curious Coders Java Web Frameworks ComparisonHamed Hatami
 
Week #1 Training ACEM.pptx
Week #1 Training ACEM.pptxWeek #1 Training ACEM.pptx
Week #1 Training ACEM.pptxShivamJha793068
 
GraphQL research summary
GraphQL research summaryGraphQL research summary
GraphQL research summaryObjectivity
 
Exploring Google APIs with Python
Exploring Google APIs with PythonExploring Google APIs with Python
Exploring Google APIs with Pythonwesley chun
 
Your Roadmap for An Enterprise Graph Strategy
Your Roadmap for An Enterprise Graph Strategy Your Roadmap for An Enterprise Graph Strategy
Your Roadmap for An Enterprise Graph Strategy Neo4j
 
DevOpsGuys FutureDecoded 2016 - is DevOps the Answer
DevOpsGuys FutureDecoded 2016 - is DevOps the AnswerDevOpsGuys FutureDecoded 2016 - is DevOps the Answer
DevOpsGuys FutureDecoded 2016 - is DevOps the AnswerDevOpsGroup
 
Blog xseo Google Algorithm Changes For May
Blog xseo Google Algorithm Changes For MayBlog xseo Google Algorithm Changes For May
Blog xseo Google Algorithm Changes For MayXSEO
 
Draftkings: Launching w/ Confidence at Scale, FutureStack17 NYC
Draftkings: Launching w/ Confidence at Scale, FutureStack17 NYCDraftkings: Launching w/ Confidence at Scale, FutureStack17 NYC
Draftkings: Launching w/ Confidence at Scale, FutureStack17 NYCNew Relic
 
[AI] ML Operationalization with Microsoft Azure
[AI] ML Operationalization with Microsoft Azure[AI] ML Operationalization with Microsoft Azure
[AI] ML Operationalization with Microsoft AzureKorkrid Akepanidtaworn
 
Trouble with Performance Debugging? Not Anymore with Choreo, the AI-Assisted ...
Trouble with Performance Debugging? Not Anymore with Choreo, the AI-Assisted ...Trouble with Performance Debugging? Not Anymore with Choreo, the AI-Assisted ...
Trouble with Performance Debugging? Not Anymore with Choreo, the AI-Assisted ...WSO2
 
YouTube Trending Video Dashboard
YouTube Trending Video DashboardYouTube Trending Video Dashboard
YouTube Trending Video DashboardIRJET Journal
 
Introductory Session.pdf
Introductory Session.pdfIntroductory Session.pdf
Introductory Session.pdfGDSCPUP
 

Similar to Why Groovy is Game Changing (20)

18.11 texas user group
18.11 texas user group18.11 texas user group
18.11 texas user group
 
October 2018 ODTUG Webinar - Getting Started with Groovy in EPBCS
October 2018 ODTUG Webinar - Getting Started with Groovy in EPBCSOctober 2018 ODTUG Webinar - Getting Started with Groovy in EPBCS
October 2018 ODTUG Webinar - Getting Started with Groovy in EPBCS
 
ODTUG Getting Groovy with ePBCS
ODTUG Getting Groovy with ePBCSODTUG Getting Groovy with ePBCS
ODTUG Getting Groovy with ePBCS
 
Top-Down and BottomS-Up Planning at Breakthru Beverage Group
Top-Down and BottomS-Up Planning at Breakthru Beverage GroupTop-Down and BottomS-Up Planning at Breakthru Beverage Group
Top-Down and BottomS-Up Planning at Breakthru Beverage Group
 
Curious Coders Java Web Frameworks Comparison
Curious Coders Java Web Frameworks ComparisonCurious Coders Java Web Frameworks Comparison
Curious Coders Java Web Frameworks Comparison
 
Apache pig
Apache pigApache pig
Apache pig
 
Week #1 Training ACEM.pptx
Week #1 Training ACEM.pptxWeek #1 Training ACEM.pptx
Week #1 Training ACEM.pptx
 
Week #1 Training.pptx
Week #1 Training.pptxWeek #1 Training.pptx
Week #1 Training.pptx
 
GCCP.pptx
GCCP.pptxGCCP.pptx
GCCP.pptx
 
GraphQL research summary
GraphQL research summaryGraphQL research summary
GraphQL research summary
 
Exploring Google APIs with Python
Exploring Google APIs with PythonExploring Google APIs with Python
Exploring Google APIs with Python
 
Your Roadmap for An Enterprise Graph Strategy
Your Roadmap for An Enterprise Graph Strategy Your Roadmap for An Enterprise Graph Strategy
Your Roadmap for An Enterprise Graph Strategy
 
DevOpsGuys FutureDecoded 2016 - is DevOps the Answer
DevOpsGuys FutureDecoded 2016 - is DevOps the AnswerDevOpsGuys FutureDecoded 2016 - is DevOps the Answer
DevOpsGuys FutureDecoded 2016 - is DevOps the Answer
 
Blog xseo Google Algorithm Changes For May
Blog xseo Google Algorithm Changes For MayBlog xseo Google Algorithm Changes For May
Blog xseo Google Algorithm Changes For May
 
Draftkings: Launching w/ Confidence at Scale, FutureStack17 NYC
Draftkings: Launching w/ Confidence at Scale, FutureStack17 NYCDraftkings: Launching w/ Confidence at Scale, FutureStack17 NYC
Draftkings: Launching w/ Confidence at Scale, FutureStack17 NYC
 
[AI] ML Operationalization with Microsoft Azure
[AI] ML Operationalization with Microsoft Azure[AI] ML Operationalization with Microsoft Azure
[AI] ML Operationalization with Microsoft Azure
 
Trouble with Performance Debugging? Not Anymore with Choreo, the AI-Assisted ...
Trouble with Performance Debugging? Not Anymore with Choreo, the AI-Assisted ...Trouble with Performance Debugging? Not Anymore with Choreo, the AI-Assisted ...
Trouble with Performance Debugging? Not Anymore with Choreo, the AI-Assisted ...
 
Karthik raja r task 8
Karthik raja r task 8Karthik raja r task 8
Karthik raja r task 8
 
YouTube Trending Video Dashboard
YouTube Trending Video DashboardYouTube Trending Video Dashboard
YouTube Trending Video Dashboard
 
Introductory Session.pdf
Introductory Session.pdfIntroductory Session.pdf
Introductory Session.pdf
 

More from Kyle Goodfriend

Improve The Planner Experience With Groovy
Improve The Planner Experience With GroovyImprove The Planner Experience With Groovy
Improve The Planner Experience With GroovyKyle Goodfriend
 
Using REST with EPM Cloud Planning
Using REST with EPM Cloud PlanningUsing REST with EPM Cloud Planning
Using REST with EPM Cloud PlanningKyle Goodfriend
 
Things you didn't know you could do with groovy
Things you didn't know you could do with groovyThings you didn't know you could do with groovy
Things you didn't know you could do with groovyKyle Goodfriend
 
Take groovy to places you never thought were possible
Take groovy to places you never thought were possibleTake groovy to places you never thought were possible
Take groovy to places you never thought were possibleKyle Goodfriend
 
Accelerators at Accelytics
Accelerators at AccelyticsAccelerators at Accelytics
Accelerators at AccelyticsKyle Goodfriend
 
CHCC 2017 Q1 Event Overview
CHCC 2017 Q1 Event OverviewCHCC 2017 Q1 Event Overview
CHCC 2017 Q1 Event OverviewKyle Goodfriend
 
Top Down and Bottom Up Planning at Breakthru Beverage Group Follow Up
Top Down and Bottom Up Planning at Breakthru Beverage Group Follow UpTop Down and Bottom Up Planning at Breakthru Beverage Group Follow Up
Top Down and Bottom Up Planning at Breakthru Beverage Group Follow UpKyle Goodfriend
 
Top Down and Bottom Up Planning at Breakthru Beverage Group
Top Down and Bottom Up Planning at Breakthru Beverage GroupTop Down and Bottom Up Planning at Breakthru Beverage Group
Top Down and Bottom Up Planning at Breakthru Beverage GroupKyle Goodfriend
 
Ohio Valley Oracle Application User Group
Ohio Valley Oracle Application User GroupOhio Valley Oracle Application User Group
Ohio Valley Oracle Application User GroupKyle Goodfriend
 
Create Unlimited Custom Spreads for Driver Based Planning
Create Unlimited Custom Spreads for Driver Based PlanningCreate Unlimited Custom Spreads for Driver Based Planning
Create Unlimited Custom Spreads for Driver Based PlanningKyle Goodfriend
 
Automating Hyperion Planning Tasks
Automating Hyperion Planning TasksAutomating Hyperion Planning Tasks
Automating Hyperion Planning TasksKyle Goodfriend
 
Driving Accountability Through Disciplined Planning at Abercrombie & Fitch
Driving Accountability Through Disciplined Planning at Abercrombie & FitchDriving Accountability Through Disciplined Planning at Abercrombie & Fitch
Driving Accountability Through Disciplined Planning at Abercrombie & FitchKyle Goodfriend
 
Supercharge PBCS with PowerShell
Supercharge PBCS with PowerShellSupercharge PBCS with PowerShell
Supercharge PBCS with PowerShellKyle Goodfriend
 

More from Kyle Goodfriend (13)

Improve The Planner Experience With Groovy
Improve The Planner Experience With GroovyImprove The Planner Experience With Groovy
Improve The Planner Experience With Groovy
 
Using REST with EPM Cloud Planning
Using REST with EPM Cloud PlanningUsing REST with EPM Cloud Planning
Using REST with EPM Cloud Planning
 
Things you didn't know you could do with groovy
Things you didn't know you could do with groovyThings you didn't know you could do with groovy
Things you didn't know you could do with groovy
 
Take groovy to places you never thought were possible
Take groovy to places you never thought were possibleTake groovy to places you never thought were possible
Take groovy to places you never thought were possible
 
Accelerators at Accelytics
Accelerators at AccelyticsAccelerators at Accelytics
Accelerators at Accelytics
 
CHCC 2017 Q1 Event Overview
CHCC 2017 Q1 Event OverviewCHCC 2017 Q1 Event Overview
CHCC 2017 Q1 Event Overview
 
Top Down and Bottom Up Planning at Breakthru Beverage Group Follow Up
Top Down and Bottom Up Planning at Breakthru Beverage Group Follow UpTop Down and Bottom Up Planning at Breakthru Beverage Group Follow Up
Top Down and Bottom Up Planning at Breakthru Beverage Group Follow Up
 
Top Down and Bottom Up Planning at Breakthru Beverage Group
Top Down and Bottom Up Planning at Breakthru Beverage GroupTop Down and Bottom Up Planning at Breakthru Beverage Group
Top Down and Bottom Up Planning at Breakthru Beverage Group
 
Ohio Valley Oracle Application User Group
Ohio Valley Oracle Application User GroupOhio Valley Oracle Application User Group
Ohio Valley Oracle Application User Group
 
Create Unlimited Custom Spreads for Driver Based Planning
Create Unlimited Custom Spreads for Driver Based PlanningCreate Unlimited Custom Spreads for Driver Based Planning
Create Unlimited Custom Spreads for Driver Based Planning
 
Automating Hyperion Planning Tasks
Automating Hyperion Planning TasksAutomating Hyperion Planning Tasks
Automating Hyperion Planning Tasks
 
Driving Accountability Through Disciplined Planning at Abercrombie & Fitch
Driving Accountability Through Disciplined Planning at Abercrombie & FitchDriving Accountability Through Disciplined Planning at Abercrombie & Fitch
Driving Accountability Through Disciplined Planning at Abercrombie & Fitch
 
Supercharge PBCS with PowerShell
Supercharge PBCS with PowerShellSupercharge PBCS with PowerShell
Supercharge PBCS with PowerShell
 

Recently uploaded

Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your BudgetHyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your BudgetEnjoy Anytime
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Artificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraArtificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraDeakin University
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAndikSusilo4
 

Recently uploaded (20)

Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your BudgetHyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Artificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraArtificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning era
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & Application
 

Why Groovy is Game Changing

  • 1. ODTUG • KScope18 Slide 1 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
  • 2. WHY IS GROOVY AND PBCS SO GAME CHANGING ODTUG • KScope18 2 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
  • 3. • Starbucks on us • Questions and Answers » We will answer questions throughout the presentation » Bring questions with your name/email/phone number up to the front at the end of the presentation and I will make sure they get answered HOUSEKEEPING WELCOME
  • 4. KYLE GOODFRIENDHuron Consulting / Oracle EPBCS Implementation Specialist Professional and Personal • BBA, concentration in Finance • College professor for 5 years • Started consulting in 2008 • 100% self taught (technology) • Worked with Huron since 2013 (via ADI Strategies) • Created In2Hyperion and the Essbase Excel Ribbon • Started the Columbus Hyperion Customer Community (CHCC.In2Hyperion.com) • Love playing ice hockey, scuba diving, and rescue dogs • Have a beautiful wife that I drive nuts • Raising a son that is a walking medical deductible Planning and Essbase • Worked with Hyperion since 1997 • Started learning Groovy in August of 2017 • Worked with the cloud since 2015 • Hold certification in Hyperion Planning, PBCS, and EPBCS • Hold specialization in Pre- Sales, Sales, and Support for both Planning and Essbase • Also a Microsoft Certified Professional ODTUG • KScope18 Slide 4 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
  • 5. HOW TO CONTACT KYLE kyle@in2hyperion.com www.in2hyperion.com kgoodfriend@huronconsultinggroup.com ODTUG • KScope18 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) 5
  • 6. Sign up at www.in2hyperion.com to receive blog updates through email STAYING CONNECTED IN2HYPERION Join the LinkedIn In2Hyperion Group www.linkedin.com/ groups/4010770 LINKEDIN GROUP ODTUG • KScope18 6 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
  • 7. PRESENTATION PROGRESSION 01 GROOVY INTRODUCTION What is Groovy 02 GROOVY AND PBCS How does groovy benefit an implementation 03 LEARNING CURVE What to expect if you are not a Groovy or Java programmer 04 FEATURE DEEP DIVE Benefits, demos, and code reviews 05 07 LEARNING AS YOU GO Don’t make the same mistakes I made 06 GROWING PAINS A new product, new integration, watchout for these gotchas 08 RESOURCES Where to go to get help 09 WRAPPING UP Where to go from here ODTUG • KScope18 7 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) THERE IS MORE The opportunities are endless
  • 8. GROOVY INTRODUCTION Groovy has a lot to offer and the journey starts here ODTUG • KScope18 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 8
  • 9. FLAVORS OF GROOVY RELATED TO PBCS Groovy can be used to access the API to do all kinds of things, including automation, system backups, and user communication. This discussion will focus on the ability to access Groovy INSIDE the calculation manager only. ODTUG • KScope18 9 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
  • 10. Seamlessly and transparently integrates and interoperates with Java and any third-party libraries BENEFITS OF GROOVY SMOOTH JAVA INTEGRATION Closures, builders, runtime &compile-time meta-programming, functional programming, type inference, and static compilation POWERFUL FEATURES Concise, readable and expressive syntax, easy to learn for Java developers FLAT LEARNING CURVE Web development, reactive applications, concurrency / asynchronous / parallelism library, test frameworks, build tools, code analysis, GUI building VIBRANT AND RICH ECOSYSTEM ODTUG • KScope18 10 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
  • 11. Great for writing concise and maintainable tests, and for all your build and automation tasks BENEFITS OF GROOVY SCRIPTING AND TESTING GLUE Apache Groovy is a powerful, optionally typed and dynamic language, with static-typing and static compilation capabilities, for the Java platform aimed at improving developer productivity thanks to a concise, familiar and easy to learn syntax. It integrates smoothly with any Java program, and immediately delivers powerful features to your application, including scripting capabilities, Domain-Specific Language, authoring, runtime and compile-time meta- programming and functional programming. WHAT IS GROOVY Flexible & malleable syntax, advanced integration & customization mechanisms, to integrate readable business rules in your applications DOMAIN-SPECIFIC LANGUAGES ODTUG • KScope18 11 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
  • 12. IMPACT TO PBCS DESIGN AND OPTIONS AVAILABLE • Java development is fast-tracked and maintenance is simplified • Developers get much of the functionality of the Java API • The knowledge required to construct complex functionality is far less with Groovy • PBCS is built with Groovy so it’s going to be a part of the product roadmap • Within PBCS » Access to use groovy to interact with the user » Customize commands sent to the Essbase
  • 13. IMPACT TO THE IMPLEMENTATION How does addition of Groovy impact an implementation ODTUG • KScope18 13 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
  • 14. IMPACT TO BUILD • Performance will improve • Input validation will improve data input • Developers will have a learning curve • Timeline will increase » Growing knowledge » Additional functionality WHAT YOU NEED TO KNOW
  • 15. DEMONSTRATION ODTUG • KScope18 15 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
  • 16. GROOVY AND PBCS Who can use it and in what capacity can it be used ODTUG • KScope18 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 16
  • 17. • ePBCS and PBCS+1 have access to create Groovy calculations • Groovy calculations open up the Java API and provide a user experience never before available • Have access to use groovy to interact with the user and customize commands sent to the PBCS There is currently no expectation that Oracle will make Groovy Calculations available in future on-premise releases GROOVY AVAILABILITY AND LICENSING ODTUG • KScope18 17 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
  • 18. FUNCTIONAL OVERVIEW Proactive User Input Validation Users are promptedfor input frequently for things like employee, project, capex, and product properties. This data canbe validatedprior to any business logic to ensure consistent andvaliddata input. Proactive Data Validation User input canbe validatedandcaninterrupt the data formsave proactively. For example, if anemployee is not fully allocated, the formwill not save until it is 100%. Selective Data Synchronization Data between input and reporting applications can be near real-time because synchronization is isolated to only the edited or effected data. It can now be executed on form save due to performance improvements. Selective Business Logic Execution Users cannowsee significantly improved performance ondata forminput because the business logic canbe isolatedto only what has beenchangedor effected. Access to Java Functions Logic that couldn't be completed, or wasn't because of performance issues cannowbe accessedandexecutedat lighteningspeed. Developers nowhave access to functions fromthe Java API. Real-Time Consolidated Reporting Data betweenapplications, like workforce, capital, anda consolidatedP&L canbe synchronizedinreal-time without timely data consolidations.
  • 19. FUNCTIONAL OVERVIEW Execute CalculationLogic onASO Prior to the availability of Groovy, business logic onASOwas not available. Now, all logic that exists inBSOdatabases is available throughthe Java API andcanbe executeddirectly inASO. Advanced FormTraffic Lighting Simple andextremely complex color coding can be addedto forms onloadandonsave. The possibilities are endless andare completely customizable. CustomLogging Developers have complete control over what is loggedfor review. User information, POV selections, timing, anddata that has changed, are just a sample of what canbe logged. CustomUser Errors Custommessages in an infinite number of languages canbe displayedinprompts and addedtocells tocommunicate changes, rule violations, anderrors. Interaction with Strategic Modeling Data movement to and from Strategic Modeling can be done in real-time on form save.
  • 20. PERFORMANCE IMPROVEMENTS The speed and agility that Groovy provides in customizing calculations introduces consolidated real- time reporting ODTUG • KScope18 20 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
  • 21. REAL WORLD USER EXAMPLE (SPEED & FUNCTIONALITY) 99%IMPROVEMENT 98% 99% Reporting includes all updates from detailed modules (product, Capex, workforce, and similar modules) and is included in real time as changes are made Consolidated Reporting Reporting includes all updates from detailed modules (product, Capex, workforce, and similar modules) at scheduled intervals users have to wait to see consolidated information Groovy eliminates the need to consolidate the BSO cube and copies data directly from the ASO cube at a consolidated level .2 Seconds Dimensions are consolidated and copied to the P&L model 82.9 Seconds Consolidated P&L Product detailed dimensions are consolidated and moved to the P&L model Groovy selects only the cells that where edited and copies only what changed to the reporting model 1.0 Seconds All data on the form is synchronized 14.5 Seconds Smart Push Data synchronizes to the reporting cube for analysis 01 0110 0001 01101 Groovy selects only edited cells and executes the logic on only products and periods that changed 0.3 Seconds All products on the form are calculated 26.1 Seconds Business Logic Growth rates are entered at total product breakouts and allocated to the detailed level With the inclusion of Groovy and access to the Java API, more customization can be integrated to maximum performance and achieve real time consolidated reporting Submit Planner Input User submits updates to the Gross Profit model at a detailed product level that exists at a more granular level than in the P&L model ODTUG • KScope18 21 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
  • 22. Reporting includes all updates from detailed modules (product, Capex, workforce, and similar modules) and is included in real time as changes are made Consolidated Reporting Reporting includes all updates from detailed modules (product, Capex, workforce, and similar modules) at scheduled intervals users have to wait to see consolidated information REAL WORLD PROCESS EXAMPLE (SPEED & FUNCTIONALITY) Automated Process Administrative processes are executed to run all business logic and model synchronizations The entire data set is consolidated and moved to the P&L model 12.0 Seconds Dimensions are consolidated and copied to the P&L model 663.6 Seconds Global Consolidation Global product consolidations are often required to catch all changes and completed during maintenance windows 99% 99% ODTUG • KScope18 22 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
  • 24. Idenfity the candidates that will benefit using Groovy Calculations ODTUG • KScope18 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) 24 SHOULD YOU CONSIDER GROOVY?
  • 25. SHOULD YOU CONSIDER GROOVY AS AN OPTION NEW IMPLEMENTATIONS • On-premise implementations that want better performance • PBCS implementations that have performance issues because of » Large dimensions » Complex calculations » Detailed planning input » Lack of real-time reporting • Implementations that need more complex user input validation • Applications that want proactive data validation
  • 26. SHOULD YOU CONSIDER GROOVY AS AN OPTION EXISTING IMPLEMENTATIONS • Have complex models • Have large dimensions • Require data input validation • Require real-time consolidated reporting
  • 27. SO, WHO SHOULD CONSIDER GROOVY? ODTUG • KScope18 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) 27
  • 28. THE LEARNING CURVE For those who have Groovy or Java backgrounds, this should be easy. For the rest of us, there is a learning curve. ODTUG • KScope18 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 29
  • 29. EXPERTISE NEEDED Intuitive Developers Groovy may be built on Java, but Java developers are not required to successfully implement Groovy into PBCS. Experienced developers who have knowledge within PBCS and understand that basic functionality with scripting will be able to use Groovy training materials and global rules to build an application with groovy that fits a clients performance needs. It only takes a little groovy knowledge to exponentially improve ePBCS performance. Visionary Managers Managers who can understand, interpret, and plan the execution of requirements with Groovy will build exceptional applications. Managers will communicate how Groovy fills performance gaps that existed prior to its release and help clients understand why Groovy is a necessary element of any planning application. ODTUG • KScope18 30 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
  • 30. THREE ASPECTS TO LEARN • PBCS API (methods and properties available to interact with PBCS) • Groovy (Open source development language) • Middle ground (the overlap) Growth of PBCS API Growth of Groovy Productivity
  • 31. FEATURE DEEP DIVE Ready, set, go! Take it all in. This is where things get really Groovy. ODTUG • KScope18 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 32
  • 32. CHANGING NAMES TO PROTECT THE INNOCENT • The application is a replica of live application • Size of the application is twice the size of BBG • The volume of metadata is the same • The metadata has been changed to protect the innocent • The data has been altered
  • 33. ODTUG • KScope18 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 34 REAL-TIME CONSOLIDATED REPORTING
  • 34. REAL-TIME CONSOLIDATED REPORTING Detailed App Consolidated P&L Detailed App Consolidated P&L NON GROOVY • All dimensions need to be consolidated • Movement from ASO is not possible • Movement is batched and scheduled WITH GROOVY • NO BSO consolidation is required • Data can be transferred from ASO • Movement is executed on form save
  • 35. REAL-TIME CONSOLIDATED REPORTING DATA FLOW PART 1 • Intra-model (GP) data movement User Enters Data Data Saved to BSO Business Logic Runs Smart Push to ASO Consolidated Data These objects are all physical artifacts in the Planning application 1. The user submits changes to the data in a data form 2. The data is stored in the BSO database 3. The appropriate business logic is executed on the respective POV 4. A Smart Push is executed to move the updated data to the ASO database 5. The data is available at consolidated levels * In the sample application, this application includes breakouts that the P&L cube does not have (Product, Order Method, and Delivery Channel)
  • 36. REAL-TIME CONSOLIDATED REPORTING DATA FLOW PART 2 • Inter-model data movement Virtual forms can be created to simulate a data retrieve and data submission 1. A virtual form is dynamically created on the POV to retrieve data from the GP ASO database to pull consolidated data at the dimensions that don’t exist in the P&L database. 2. Virtual forms is dynamically created on the POV to submit data to the P&L ASO and BSO databases 3. Data from the form in step 1 is copied to the forms in step 2 and submitted to both P&L cubes * No consolidation calculations are required P&L ASO Database Consolidated GP Retrieve P&L BSO Database P&L Connection Virtual Artifacts Physical Artifacts
  • 37. DEMONSTRATION ODTUG • KScope18 38 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) We will kickstart the feature deep-dive with a real world process that encompasses many of the things we are going to discuss in detail, including • Data input validation • Traffic lighting • Custom Essbase calculations • Customized data copies / smart pushes • Eliminations of the need for consolidations via GridBuilder processing
  • 38. ODTUG • KScope18 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 39 TRAFFIC LIGHTING
  • 39. TRAFFIC LIGHTING • Interact with users • Draw attention to important data • Indicate possible issues by thresholds • Show required inputs • Highlight variances and other critical metrics BENEFITS
  • 40. TRAFFIC LIGHTING • Set background colors • Set cell tool tips • Add validation without throwing errors – act like warnings • Add validation and stop form from saving OPTIONS
  • 41. TRAFFIC LIGHTING DataGrid curDataGrid = operation.grid def iColor = 16746496 def sValidateTo = curDataGrid.getCellWithMembers('Input').data /* can add destCell && to the if and it will ignore the null columns */ operation.grid.dataCellIterator('Avg_Price/Case','Input').each { DataCell destCell = it.crossDimCell('Initialize') if(it.data.round(2) != destCell.data.round(2)) { println it.data.round(2) println destCell.data.round(2) it.setBgColor(iColor)} } operation.grid.dataCellIterator('Regular_Cases','Input').each{ DataCell destCell = it.crossDimCell('Initialize') if(it.data.round(2) != destCell.data.round(2)) { println it.data.round(2) println destCell.data.round(2)it.setBgColor(iColor) } } operation.grid.dataCellIterator('Net_Sales','Input').each{ DataCell destCell = it.crossDimCell('Initialize') if(it.data.round(2) != destCell.data.round(2)) { println it.data.round(2) println destCell.data.round(2) it.setBgColor(iColor) } } operation.grid.dataCellIterator("GP_Level_2","Input").each { DataCell destCell = it.crossDimCell('Initialize') if(it.data.round(2) != destCell.data.round(2)) {println it.data.round(2) println destCell.data.round(2) it.setBgColor(iColor) } } CODE REVIEW operation.grid.dataCellIterator("Case_Growth",'Input').each { DataCell destCell = it.crossDimCell('Initialize')if(it.data.round(2) != destCell.data.round(2)) { println it.data.round(2) println destCell.data.round(2) it.setBgColor(iColor) }} operation.grid.dataCellIterator('Sales_Growth','Input').each { DataCell destCell = it.crossDimCell('Initialize')if(it.data.round(2) != destCell.data.round(2)) { println it.data.round(2) println destCell.data.round(2) it.setBgColor(iColor)} } operation.grid.dataCellIterator("GP_2_%_Diff",'Input').each { DataCell destCell = it.crossDimCell('Initialize') if(it.data.round(2) != destCell.data.round(2)) { println it.data.round(2) println destCell.data.round(2) it.setBgColor(iColor)} }
  • 42. ODTUG • KScope18 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 43 DYNAMIC ESSBASE CALCULATIONS
  • 44. EXAMPLE DYNAMIC ESSBASE CALCULATIONS Legacy Business Rule • Provides the ability to pass the POV (Page/Header) to a business rule to isolate what is calculated • Executes on all rows and columns regardless of the state of the data Groovy Calculation • Can access the same POV and can dynamically change business logic based on selections • Can identify the changed cells and alter the business logic based on results
  • 45. DYNAMIC ESSBASE CALCULATIONS // Set variables and loop through edited cells Set<String> periods = [] Set<String> products = [] operation.grid.dataCellIterator({DataCell cell -> cell.edited}, MemberNameType.ESSBASE_NAME).each { DataCell cell -> periods << cell.periodName products << cell.getMemberName("Product") } // Exit the script it no cells were edited if(products.size() == 0) { println("No edited cells found!") return } // Construct the calculation script to be sent to Essbase String calcScript = """ Fix("${povMemberNames.join('", "')}", "${periods.join('", "')}", "${products.join('", "')}") "Revenue"( "Revenue" = ”Avg_Price" * "Units";) EndFix;""" // Print the script to the log println("The following calc script was executed by $operation.user.fullName: n $calcScript") // Return the calculation script to be executed return calcScript.toString() CODE REVIEW
  • 46. ODTUG • KScope18 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 47 FILTERED DATA MAPS
  • 47. FILTERED DATA MAPS • Improve speed of data movements • Miminize possible threasholds for clearing target before loading • Minimize possible threasholds in size of data • Eliminate need to run in background • Give user feedback on completion BENEFITS
  • 48. FILTERED DATA MAPS // Get POV String sCompany = operation.grid.getCellWithMembers().getMemberName("Company") String sMaterialGroup = operation.grid.getCellWithMembers().getMemberName("Material_Group") String sChannel = operation.grid.getCellWithMembers().getMemberName("Channel") String sAccount = operation.grid.getCellWithMembers().getMemberName("Account") // Get list of vendors that have been edited def lstVendors = [] operation.grid.dataCellIterator({DataCell cell -> cell.edited}).each{ lstVendors.add(it.getMemberName("Vendor")) } // Convert collection to comma delimited string String strVendors = """"${lstVendors.unique().join('","')}"""" // Execute a filtered data map based on the POV and edited vendors if(lstVendors) operation.application.getDataMap("GP Form Push").execute (["Company":sCompany,"Channel":'ILvl0Descendants(Channel)’, "Material_Group":'ILvl0Descendants(Material_Group)’, "Vendor":strVendors, "Scenario":"OEP_Plan", "Version":"OEP_Working", "Years":"&v_BudYear", "Source":"Input", "Currency":'"USD","Local"'],true) CODE REVIEW
  • 49. ODTUG • KScope18 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 50 GRID BUILDERS
  • 50. GRID BUILDERS • Move data from ASO to BSO • Include mappings when pushing data from BSO to ASO • security issues with Data Maps/Smart Pushes also exist • Perform calculations outside of Essbase • Performance improvements over Data Maps/Smart Pushes • Write directly to ASO (bypass BSO and Essbase calculations) BENEFITS
  • 51. CODE REVIEW GRID BUILDERS I will be doing a 20-30 minute deep dive on the GridBuilder methods Last Minute ODTUG Kscope18 Planning Souvenirs You Will ACTUALLY Use! June 14th , 9:30 - 11:00 a.m. Southern Hemisphere II, Fifth Level
  • 52. ODTUG • KScope18 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 53 CUSTOMIZED LOGS
  • 53. BENEFITS • Completely customizable » User who executed it » Execution times » POV » Dynamic calculation sent to Essbase • Unlimited possibilities CUSTOMIZED LOGS
  • 54. EXAMPLE Log messages : **************************************************** Time taken for allocation and consolidation = 0 secs Total Time = 0.001 secs **************************************************** data push running for "v30000400030001","v30000400030002","v30000400060001","v30000401630001","v300004000 80004","v30000400080002","v30000400080001" **************************************************** Time taken for data push = 2.051 secs Total Time = 2.051 secs **************************************************** POV: [FY17, OEP_Forecast, OEP_Working, BILB, Tot_Channel, Total_Material_Group, Tot_Source, Tot_Vendor, MTD] ROWS HEADER: [[Regular_Cases], [Net_Sales], [Cost_of_Sales_without_Samples], [Gallonage_Tax], [Depletion_Allowance_Manual_Chargeback], [Gain_Loss_Inv_Reval], [Supplier_Commitments], [Supplier_Spend_Non_Committed], [Samples], [GP_NDF], [GP_BDF], [GP_Contract_Amortization], [Sample_Adjustment]] COLUMNS: [Jan, Jan, Feb, Feb, Mar, Mar, Apr, Apr, May, May, Jun, Jun, Jul, Jul, Aug, Aug, Sep, Sep, Oct, Oct, Nov, Nov, Dec, Dec] [Local, USD, Local, USD, Local, USD, Local, USD, Local, USD, Local, USD, Local, USD, Local, USD, Local, USD, Local, USD, Local, USD, Local, USD] Total number of cells accepted: 312 Total number of cells rejected: 0 First 100 rejected cells: [] Total number of cells accepted: 312 Total number of cells rejected: 0 First 100 rejected cells: [] **************************************************** Time taken copy to fin = 0.48 secs Total Time = 2.531 secs **************************************************** CUSTOMIZED LOGS
  • 55. CODE REVIEW def startTime = currentTimeMillis() def procTime = currentTimeMillis() def elapsed=(currentTimeMillis()-startTime)/1000 Calendar calendar = Calendar.getInstance() calendar.setTimeInMillis(currentTimeMillis())def now = calendar.getTime() def dtstmp = now.format("MM/dd/yyyy") elapsed=(currentTimeMillis()-procTime)/1000 procTime = currentTimeMillis()println "****************************************************" println "Time taken for allocation and consolidation = $elapsed secs"println "Total Time = " + (currentTimeMillis()-startTime)/1000 + " secs" println "****************************************************" [Code Removed]String strVendors = """"${lstVendors.unique().join('","')}"""" println "data push running for " + strVendors[Code Removed] elapsed=(currentTimeMillis()-procTime)/1000 procTime = currentTimeMillis() println "****************************************************" println "Time taken for data push = $elapsed secs"println "Total Time = " + (currentTimeMillis()-startTime)/1000 + " secs" println "****************************************************"[Code Removed] println "POV:" println povmbrs*.essbaseMbrNameprintln "" println"ROWS HEADER:" println rowmbrs.headers*.essbaseMbrName println "" println"COLUMNS:" println colmbrs[0]*.essbaseMbrName println colmbrs[1]*.essbaseMbrNameprintln "" println "" [Code Removed]println("Total number of cells accepted: $status.numAcceptedCells") println("Total number of cells rejected: $status.numRejectedCells")println("First 100 rejected cells: $status.cellsRejected") finCube.saveGrid(grid) println("Total number of cells accepted: $rstatus.numAcceptedCells") println("Total number of cells rejected: $rstatus.numRejectedCells")println("First 100 rejected cells: $rstatus.cellsRejected") rfinCube.saveGrid(rgrid) elapsed=(currentTimeMillis()-procTime)/1000 procTime = currentTimeMillis()println "****************************************************" println "Time taken copy to fin = $elapsed secs" println "Total Time = " + (currentTimeMillis()-startTime)/1000 + " secs" println "****************************************************" CUSTOMIZED LOGS
  • 56. ODTUG • KScope18 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 57 RUN TIME PROMPTS
  • 57. RUN TIME PROMPTS • Conditional execution » Confirm long process or processes that clear or reset data » Confirm what processes will be executed • Validate input before RTP use » Check for special characters » Verify start and end dates BENEFITS
  • 58. DEMONSTRATION ODTUG • KScope18 59 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) RTP Validation has huge impacts on system perceptions. It can stop invalid data from being entered and confirm expectations before long running processes • WFP Data input (validate name, start and term dates) • Execute global consolidations
  • 59. RUN TIME PROMPTS /*RTPS: {RTP_Push},{RTP_Clear},{RTP_Name} */ if(rtps.RTP_Push.getEssbaseValue() == "1"){ operation.application.getDataMap("GP Form Push").execute( ["Company":"ILvl0Descendants(Company)", "Channel":"ILvl0Descendants(Channel)", "Material_Group":"ILvl0Descendants(Material_Group)", "Vendor":"ILvl0Descendants(Vendor)", "Scenario":"OEP_Plan", "Version":"OEP_Working", "Years":"&v_BudYear", "Source":"ILvl0Descendants(Source)", "Currency":'"USD","Local”’], rtps.RTP_Push.getEssbaseValue().toBoolean() ) def isValid = true def specialCh = ['!','@',']','#','$','%','^','&','*'] for (int i=0; i<specialCh.size; i++) { if(rtps.RTP_Name.getEnteredValue().contains(specialCh[i])) isValid=false } if(isValid == true) { } CODE REVIEW
  • 60. RUN TIME PROMPTS /*RTPS: {RTP_Description} */ // Define Message Bundle def mbUs = messageBundle([ "validation.SpecialChar":"Only alphanumeric characters are permitted"]) def mbl = messageBundleLoader(["en" : mbUs]) def isValid = true // Define the list characters NOT allowed def specialCh = ['!','@',']','#','$','%','^','&','*'] for (int i=0; i<specialCh.size(); i++) { if(rtps.RTP_Description.toString().contains(specialCh[i])) isValid = false } if(isValid == false) { throwVetoException(mbl, "validation.SpecialChar", rtps.RTP_Description) } CODE REVIEW
  • 61. ODTUG • KScope18 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 62 DATA FORM VALIDATION
  • 62. DATA FORM VALIDATION • Improve the reliability of the data entered • Proactively fix errors before they become problems • Educate users on the fly • Stop users from entering any data until it validates • Improve validity of budgets BENEFITS
  • 63. DEMONSTRATION ODTUG • KScope18 64 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Interractive data validation on forms can improve user input and eliminate data issues before they exist • WFP Data input (ensure correct data is entered to correspond to the employee selections) • Gross Profit Spreading (make sure adjustments to monthly volumes aren’t adjusted outside predetermined thresholds) • New Products (improve consistency with data input)
  • 64. EXAMPLE DATA FORM VALIDATION • Any validation that can be done using member names, hierarchies or math is possible • Example » The GP Level 2 % has to be between -10% and 30%. » The Regular Cases CANNOT have one month that is more than 50% of the total cases. » If Regular Cases is entered, a corresponding Average Price per Case is required. NEW PRODUCT EXAMPLE
  • 65. DATA FORM VALIDATION def BackErrColor = 16755370 //Red def BackWarnColor = 16756480 //Orange operation.grid.dataCellIterator('Regular_Cases','Jan','Feb','Mar','Apr' ,'May','Jun','Jul','Aug','Sep','Oct','Nov','Dec').each { // Check cases def CaseTotal = it.crossDimCell('Jan').data + it.crossDimCell('Feb').data + it.crossDimCell('Mar').data + it.crossDimCell('Apr').data + it.crossDimCell('May').data + it.crossDimCell('Jun').data + it.crossDimCell('Jul').data + it.crossDimCell('Aug').data + it.crossDimCell('Sep').data + it.crossDimCell('Oct').data + it.crossDimCell('Nov').data + it.crossDimCell('Dec').data println "$it.MemberNames $it.data $CaseTotal" if(it.data / CaseTotal > 0.5 ) { println "warning" it.addValidationError(BackErrColor, "Cases for a single month can't be more than 50% of the total year cases.", false) } if(it.data != 0 && (it.crossDimCell("Avg_Price/Case_Inp").data == 0 || it.crossDimCell("Avg_Price/Case_Inp").data == '#Missing')) it.crossDimCell("Avg_Price/Case_Inp").addValidationError(BackErrColor, "A price is required when cases are entered.", false) } operation.grid.dataCellIterator('GP_2_%_Inp','Jan','Feb','Mar','Apr','M ay','Jun','Jul','Aug','Sep','Oct','Nov','Dec').each { // Check cases println "$it.MemberNames $it.data" if(it.data > 0.3 || it.data < -0.1 ) { println "invalid" it.addValidationError(BackErrColor, "GP2 has to be between -10% and 30%.", false) } } CODE REVIEW - NEW PRODUCT
  • 66. EXAMPLE DATA FORM VALIDATION • Example Adjustments can be made to any month »The net change has to be 0 »No change can push the number to a negative number PHASING EXAMPLE
  • 67. DATA FORM VALIDATION def BackErrColor = 16755370 //Red operation.grid.dataCellIterator({DataCell cell -> cell.edited}).each { // Check cases def CaseTotal = it.crossDimCell('Jan').data + it.crossDimCell('Feb').data + it.crossDimCell('Mar').data + it.crossDimCell('Apr').data + it.crossDimCell('May').data + it.crossDimCell('Jun').data + it.crossDimCell('Jul').data + it.crossDimCell('Aug').data + it.crossDimCell('Sep').data + it.crossDimCell('Oct').data + it.crossDimCell('Nov').data + it.crossDimCell('Dec').data if(it.data + it.crossDimCell('OEP_Working').data < 0.0) { def change = it.data + it.crossDimCell('OEP_Working').data it.addValidationError(BackErrColor, "Your adjustment forces the new cases to be a negative volume. Increase your adjustment by $change", false) } else { if(CaseTotal != 0.0 && it.data != 0.0) { println "net change is not 0 - $it.MemberNames" it.addValidationError(BackErrColor, "Adjustments must not have a full year impact. Currently, the data would change by $CaseTotal.", false) } } } CODE REVIEW - PHASING
  • 68. THERE IS MORE We covered the biggest bang for your buck. The opportunities to improve applications doesn’t stop there. When you leave here, take a look at some of the other things that make the inclusion of Groovy into PBCS special. ODTUG • KScope18 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 69
  • 69. MORE STUFF THAN YOU CAN SHAKE A STICK AT • Query metadata • Localized messages • Smartlist integration • Modularized code • Customized logging • Clearing ASO data OTHER POSSIBILITIES
  • 70. THINKING OUTSIDE THE BOX ODTUG • KScope18 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) 71
  • 71. With Groovy, business logic can be written and executed, with results stored in ASO BUSINESS LOGIC CAN BE EXECUTED IN ASO VIA GROOVY BUSINESS LOGIC Allocation logic can be processed in Groovy with the results stored in ASO ALLOCATIONS Data can be loaded to ASO, but has minimal calculation logic ASO LIMITATIONS Currency exchange rates can be accessed and used to calculate and store USD equivalents FX RATES ODTUG • KScope18 72 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)
  • 72. ACCESS TO JAVA FUNCTIONS • Java functions are available. These can introduce opportunities to do things never before available or improve on functions in Essbase that introduce performance degradation. » Math » Strings » If/Then logic » Mapping » Comparisons
  • 73. GROWING PAINS Released in June, and just now being included in a larger volume of implementations, there are still some issues/bugs that are causing complications with going live. ODTUG • KScope18 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 74
  • 74. GROWING PAINS • 9 months into use • Just starting to be heavily used/globally tested • Current Issues » Groovy rules included in rulesets do not execute from an action menu in Smart View • Edited cells do not stay edited with Groovy validation rules executed before save in Smart View • The data in hidden columns/rows is not accessible in a Groovy rule in Smart View (will return a null pointer error)
  • 75. GROWING PAINS • Groovy documentation shows methods that are not accessible • Many documented methods are still private and not available » Substitution variable » Get content of rule
  • 76. HOW TO GET WHAT YOU WANT • Open a ticket immediately » Call 1-800-223-1711 » Press 1 and enter your SR number » Press 2 to speak with a manager do not press 1 to speak with Engineer, this will likely result in going straight to Voicemail » Tell the Support Hub the critical impact you are facing » Request a Duty Manager callback ASAP » Repeat request level 2, then level 3, to level n, until you get what you want • Some helpful tips: » Speak with the support hub manager » Describe the impact, include key project milestones at risk and communicate what you need for progress » If your issue is CRITICAL you should ALWAYS make a request for a duty manager call back. » If you ask for a duty manager call back, wait 30-60 minutes until you receive the call and reiterate the problem » Be strategic with your request » Don't just say you need to escalate - describe the impact and communicate what you need for progress » Keep in mind, your SR will NOT appear in an "escalated" state unless you negotiate this with a duty manager WORKING WITH SUPPORT
  • 77. LEARNING AS YOU GO There is a lot to be excited about. There are times when you forge ahead at lightening speeds. There are other times when you may want to think before you run. ODTUG • KScope18 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 78
  • 78. WALK BEFORE YOU RUN • Develop standards and be consistent » Getting POV members » Looping through edited rows » Variable definition • As soon as code is identified to be used in multiple rules, modularize it • When you get stuck, identify the issue as something related to the PBCS API vs. Groovy and research a solution appropriately • Data can be moved with Data Maps and Grid Builders and a strategic decision on which should be used should be made before implementation SUGGESTIONS FROM EXPERIENCE
  • 79. WALK BEFORE YOU RUN • GridBuilder has a cell limit (pre-suppression) of 500,000 • You will see better performance with getting cell content using CrossDimCell vs. getCellWithMembers • Use functions (e.g. IDecendants) to build your grids when possible, as it is faster than adding all rows and suppressing • GridBuilder uses GridDefinitonBuilder, so it can be slower in bigger grids. GridDefinitionBuilder is faster because you specify the dimensions for each member • Favor the use of .withCloseable{} when building, loading, saving, a grid. Better memory management. UNDOCUMENTED FINDS
  • 80. RESOURCES Everybody needs help. Here is where to start ODTUG • KScope18 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 81
  • 81. GETTING HELP There are a lot of great books, articles and videos about Groovy listed here: http://groovy-lang.org/learn.html In particular, I would like to highlight the following two books: https://www.manning.com/books/groovy-in-action-second-edition https://pragprog.com/book/vslg2/programming-groovy-2 The following course on Udemy is very affordable and can be a useful asset: https://www.udemy.com/apache-groovy/learn/v4/overview They can also start by going over the “Language Specification” section in the following document is also useful: http://groovy-lang.org/documentation.html Oracle EPBCS Groovy documentation: http://docs.oracle.com/cloud/latest/epm-common/GROOV/ http://www.in2hyperion.com
  • 82. MORE EXAMPLES AT • My Adventures inGroovy Calculations - Part 1 • Part 2: Data Validation • Part 3: Acting OnEditedCells • Part 4: RunTime Prompts • Part 5: Accessing RunTime Prompts • Part 6: Converting a POV into a Fix • Part 7: Validating RunTime Prompts • Part 8: Customizing Data Maps andSmart Pushes • Part 9: Groovy andPBCS is Game Changing inLouisville • Part 10: Validating FormData • Part 11: Accessing Metadata Properties • Part 12: Learning andTesting Groovy Outside of PBCS • Part 13: Returning Errors (Data Forms) • Part 14: Returning Errors (Data Form Cells) • Part 15: Returning Errors (RTP Edition) addenhancement andother bug report GROOVY SERIES • Part 16: Ignore FormSave WhenNo Data Has BeenEdited • Part 17: Force Cell Comments • Part 18: Real Time Data Movement (Setting The Stage) • Part 19: Real Time Reporting Webinar withBreakthruBeverage Group • Part 20: Groovy On-Premise vs. GroovyCloud • Part 21: Real Time Data Movement (Getting Groovy) • Part 22: Looping ThroughMember Descendants • Part 23: Is the POV a level 0 member? • Part 24: Getting Member Properties? • Part 25: The DataGridBuilders • Part 26: Interacting withSmart Lists • Part 27: Using Maps inGroovy as lookup Tables
  • 83. WRAPPING UP I hope you enjoyed the show, but we aren’t quite done yet. ODTUG • KScope18 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 84
  • 84. WRAPPING UP • Write down a question and drop it off up front and I will answer it at in2hyperion.com • Please be gentle when you fill out a survey LAST BUT NOT LEAST
  • 85. APPENDICES ODTUG • KScope18 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM) Slide 86
  • 86. CREATING YOUR FIRST GROOVY SCRIPT • Open Rules in PBCS and create a new rule • Change the dropdown box from Designer to Edit Script • Change the Script type dropdown box from Calc Script to Groovy Script
  • 87. ODTUG • KScope18 Slide 88 Why Groovy is Game Changing Wed, Jun 13, 2018 (03:30 PM - 04:30 PM)