The session will discuss a library of solutions implemented at clients for transferring between applications in separate pods. Each configuration has its own merits and use case. The four main categories that will be discussed are -
1. Trickle Feed - uses a combination of inter-pod REST API connection, data management load rule, groovy scripting and scheduled EPM Automate job on a jump server to pick-up the files from source and push to target.
2. Focused On-save Push - pushes an intersection from source to target using inter-pod REST API connection, data management load rule and groovy scripting.
3. Scheduled Push- uses a combination of windows or Linux job, inter-pod REST API connection, groovy scripting, data management load rule and EPM Automate commands to extract and push data en masse from source to target.
4. Json Extract and Load - uses a combination of groovy scripting and inter-pod REST API connection to extract and push an intersection on-save.
The audience will walk-away with learnings and understanding of inter-pod configurations, mainly for EPM Cloud planning applications. Snippets of code will form the "gold dust" takeaway from the session.
1 of 42
More Related Content
nter-pod Revolutions: Connected Enterprise Solution in Oracle EPM Cloud
4. VATSAL GAONKAR
> Summary
> Product Manager – Enterprise Planning; Oracle ACE
> Over 15 years of Enterprise Performance Management (EPM) experience across on-
premises, cloud, and hybrid deployments
> Design, Development, and Deployment roles across approx. 60 projects over the years
> EPM Cloud Credentials – EPBCS Certified; Design and deployments for Enterprise Planning
and Profitability apps; EPM Cloud automation; EPM Cloud Data Integration
> Speaker at Oracle / Hyperion conferences: HUGMN, DCOUAG, OAUG, ODTUG and
OpenWorld
> Contact:
> Email: vatsal.gaonkar@alithya.com
> twitter: @dieselvat
5. ALITHYA IS YOUR TRUSTED ADVISOR
2400
employees
3000+
projects
375+ ERP/EPM
Cloud projects
23+
years
NASDAQ
ALYA
225+ Oracle
consultants
7 Oracle
ACEs
1000+
clients
Enterprise Applications Application Services Business Strategy Data & Analytics
Enterprise Resource Planning (ERP/SCM)
Human Capital Management (HCM)
Enterprise Performance Management (EPM)
Customer Relationship Management (CRM/CXM)
Cloud Infrastructure Migration
Cloud Enterprise Services
Digital Applications Development
Legacy Systems Modernization
Quality Assurance
Strategic Consulting
Digital Transformation
Enterprise Architecture
Organizational Performance
Business Intelligence
Data Governance
Modern Data Architecture
Artificial Intelligence
Machine Learning
6. TRANSFORMATION = BUILDING A CONNECTED ENTERPRISE
CONNECTED BUSINESS PROCESSES
TRADITIONAL
CHALLENGES
Reduce Costs
Seamless Collaboration
Informed Strategic
Decisions
Improved Operational
Performance
Happier
Customers
Improved Margins &
Revenues
One Source of
the Truth
TRANSFORM AND
CONNECT
Operations
Marketing
Sales
Finance
HR IT
Connect all
planning
Close with
confidence
Reinvent
analytics
and
reporting
Outperform with
intelligence
Align
enterprise
data
Hidden Costs &
Overhead from Manual
Processes
Inability to Flex Work
Lack of Transparency
for Decision Making
Time Wasted on Non-
Value Add Activities
Less Time to Focus on
what’s most important
Lots of Data; Little
Information
Siloed Data &
End User ETL
12. LABOR TO FINANCIALS CONFIGURATION
WFRPT FINRPT
Labor Financials
Department labor
model changes
Report & Analyze by
Jobs and Employees
Department Financial
planning
Department Income
Statement
Trickle Feed
Focused On-Save
Scheduled Push
Extract and Load
13. INTER-POD REVOLUTIONS: CONFIGURATIONS
Trickle
Feed
Focused On-
Save
Scheduled
Push
Extract and
Load
✓ Calculation
Manager Rules
✓ Data Management
✓ Groovy Business
Rules
✓ EPM Automate &
Scheduler
✓ Every 5 mins for
small sets of data
✓ Right click push
from the form
✓ Data Management
✓ Groovy Business
Rules
✓ On Demand from the
data form
✓ Data
Management
✓ Groovy Business
Rules
✓ EPM Automate &
Scheduler
✓ Every 15 mins for
all data
✓ Groovy Business
Rules
✓ Import, Clear &
Export data slices
✓ On-save
intersections working
like @XWRITE
14. POLL 2
Do you use or are planning on designing an multi-pod EPM Cloud
implementation?
19. POLL 3
What is your expertise level with Groovy Scripting?
20. GROOVY (RUN ON SAVE)
/*RTPS: {Entity} {L_Scenario}, {L_Year} */
def varYear = rtps.L_Year.toString()
def varScenario = rtps.L_Scenario.toString()
def curEntity - rtps.Entity.toString()
// Capture Jobs and Employees whose data changed
operation.grid.dataCellIterator.each { DataCell cell ->
if(cell.edited) {
List JobList << cell.getMemberName("Job")
List EmployeeList << cell.getMemberName("Employee")}}
// Generate the calc script to calculate for edited Jobs and Employees
List povmbrs = operation.grid.pov
String curVersion = povmbrs.find {it.dimName =='Version'}.essbaseMbrName
String FixString = """ "${JobList.join('", "')}","${EmployeeList.join('", "')}", “$varYear”, "$curVersion",
"$curEntity" """
String calcScript = """FIX($FixString)
FIX("$varScenario")
%Template(name:="Calc Workforce Expenses",application:="EPBCS",plantype:="OEP_WFP",dtps:=())
ENDFIX
DATACOPY "$varScenario" TO "TrickleFeed";
ENDFIX"""
println("The following calcscript was run: n $calcScript")
Cube wfmaincube = operation.application.getCube(“OEP_WFP”)
Wfmaincube.executeCalcScript(calcScript.toString())
21. GROOVY (RUN ON SAVE)
Cube wfmaincube = operation.application.getCube("OEP_WFP")
// Define Grid
DataGridDefinitionBuilder wfmaincubegridbuilder = wfmaincube.dataGridDefinitionBuilder()
// Suppression in grid definition
wfmaincubegridbuilder.setSuppressMissingBlocks(true)
wfmaincubegridbuilder.setSuppressMissingRows(true)
// Create POV, Row and Columns for the grid
wfmaincubegridbuilder.addPov(['Version','Scenario','Property'],[['OEP_Working'],['TrickleFeed'],['OWP_Expe
nse Amount']])
wfmaincubegridbuilder.addColumn(['Years','Period'],[[‘&OEPPlanYr’],['ILvl0Descendants("YearTotal")']])
wfmaincubegridbuilder.addRow(['Job','Employee','Entity','Account’],[['ILvl0Descendants(“OWP_Total
Jobs")'],['ILvl0Descendants(“OWP_Total Employees")'], curEntity,
['ILvl0Descendants("Salary_Accounts")','ILvl0Descendants("Hour_Stats")']])
//Build the grid using the definition
DataGridDefinition wfmaincubegriddefinition = wfmaincubegridbuilder.build()
// Load the grid and set to Edited cells
DataGrid wfmaincubeGrid = wfmaincube.loadGrid(wfmaincubegriddefinition,false)
// Iterate through the grid get to Entity, Employee and Job intersections to set them as Edited
wfmaincubeGrid.dataCellIterator().each{
it.setEdited(true)
}
22. GROOVY (RUN EVERY 5 MINS THROUGH AUTOMATION)
// Get Edited cells
wfdataloadcubeGrid.dataCellIterator.each { DataCell cell ->
if(cell.edited) {
List entities << cell.getMemberName("Entity")
}
String entitiesDM = "${entities.join('", “’)}”
//Run data integration with source filters override
HttpResponse<String> jsonResponse = operation.application.getConnection(“WFRPT_FINRPT_DM").post()
.header("Content-Type", "application/json")
.body(json(["jobType" : "INTEGRATION", "jobName" : “TrickleFeed_Rule", "periodName" :
"{$DataRuleStartPeriod}{$DataRuleEndPeriod}", "importMode" : "REPLACE", "exportMode" :
“REPLACE_DATA", "sourceFilters" : ["Entity":$entitiesDM ]])).asString()
//Mark Cell Unedited in Trickle Feed
DataGrid wfUneditcubeGrid = wfmaincube.loadGrid(wfUneditcubegriddefinition,false)
wfUneditcubeGrid.dataCellIterator().each{
it.setEdited(false)
}
23. CONSIDERATIONS
23
> Automate: Server or Object Store for Schedule/ Automation
> Automate: EPM Automate commands understanding
> TrickleFeed Scenario member
> EPM Connections for REST API
> For contention issues: Back-up with 15 min job
> DM: Clear Region
25. CONFIGURATION/ DESIGN
Planning:
Save on
Form OR
Right Click
Action Menu
Groovy:
Uses data
form context
to call DM
Connection/
REST:
Call DM Rule
DM:
Run Inter-
pod Data
sync
DM:
Clear Region
at Target
Planning:
Target data
updated
WFRPT
FINRPT
26. GROOVY (RUN ON SAVE OR FROM ACTION MENU)
// Get all entities to push on save or on right click
/*RTPS: {Entity}*/
Cube wfmaincube=operation.application.getCube(“OEP_WFP”)
Dimension EntityDim=operation.application.getDimension(“Entity”,wfmaincube)
def EntityList = EntityDim.getEvaluatedMember(“@Relative(rtps.Entity.toString,0)”,wfmaincube)
String entitiesDM = "${EntityList.join('", “’)}”
// Get start and end periods for the data load rule from the scenario
def StartYear = operation.application.getDimension('Scenario').getMember(‘Budget').toMap()["Start
Year"].toString().substring(2)
def EndYear = operation.application.getDimension('Scenario').getMember(‘Budget').toMap()["End
Year"].toString().substring(2)
def StartPeriod = operation.application.getDimension('Scenario').getMember(‘Budget').toMap()["Start
Period"].toString()
def EndPeriod = operation.application.getDimension('Scenario').getMember(‘Budget').toMap()["End
Period"].toString()
String DataRuleStartPeriod = "$StartPeriod"+"-"+"$StartYear"
String DataRuleEndPeriod = "$EndPeriod"+"-"+ "$EndYear“
// Use Data Management REST API connection
HttpResponse<String> jsonResponse = operation.application.getConnection(“WFRPT_FINRPT_DM").post()
.header("Content-Type", "application/json")
.body(json(["jobType" : "INTEGRATION", "jobName" : “Focused_OnSave", "periodName" :
"{$DataRuleStartPeriod}{$DataRuleEndPeriod}", "importMode" : "REPLACE", "exportMode" :
“REPLACE_DATA", "sourceFilters" : ["Entity": "$entitiesDM"]])).asString()
27. CONSIDERATIONS
27
> DM: Clear Region
> DM: Multiple invocation of the same rule not allowed
> EPM Connections for REST API
> Planning: Make it an admin function
30. EPM AUTOMATE (RUN ON SCHEDULE)
REM Run Business Rule
call epmautomate runbusinessrule “WFRPT_FINRPT_Interpod” “plantype=OEP_WFP” “RTP_StartPeriod=Jan-
20” “RTP_EndPeriod=Dec-20”
REM Run Rule set
call epmautomate runRuleset “WFRPT_FINRPT_Interpod_Ruleset” “RTP_StartPeriod=Jan-20”
“RTP_EndPeriod=Dec-20”
31. GROOVY (RUN FROM EPM AUTOMATE COMMAND)
// Get start and end periods for the data load rule from run-time prompts
/* RTPS: {RTP_StartPeriod} {RTP_EndPeriod}*/
def String DataRuleStartPeriod = rtps.RTP_StartPeriod.getEnteredValue()
def String DataRuleEndPeriod = rtps.RTP_EndPeriod.getEnteredValue()
// Use Data Management REST API connection
HttpResponse<String> jsonResponse = operation.application.getConnection("WFRPT_FINRPT_DM").post()
.header("Content-Type", "application/json")
.body(json(["jobType" : "DATARULE", "jobName" : “Scheduled_Push", "startPeriod" :
"$DataRuleStartPeriod", "endPeriod" : "$DataRuleEndPeriod", "importMode" : "REPLACE", "exportMode" :
"REPLACE_DATA"])).asString()
32. CONSIDERATIONS
32
> Automate: Server or Object
Store for Schedule/
Automation
> Automate: EPM Automate
commands understanding
> EPM Connections
> DM: Fully defined Clear
Region or Business Rule
> Planning: Data delay at
target, but clean cut of data
at all times
33. JSON EXTRACT AND LOAD
Export, Clear and Import data slices on save
34. CONFIGURATION/ DESIGN
Planning:
Save on
Form
Groovy/
JSON:
Source data
slice Export
grid
Connection/
REST:
Call Planning
Export data
slice
Groovy/
JSON:
Create
target data
slice clear
Connection/
REST:
Call Planning
to Clear
data slice
Groovy/
JSON:
Import grid
using Export
grid
WFRPT
FINRPT
Connection/
REST:
Call Planning
to Import
data slice
Planning:
Specific
intersection
updated