Thursday, December 8, 2022

Quick tip - Finding out your EPM Cloud Infrastructure Datacentre

This is a quick tip on how to find out whether your EPM cloud running instance is running on OCI Classic or OCI Gen2 datacentre.


The answer is quite simple: find out by viewing your instance's activity reports. The activity report will include a header "Cloud Infrastructure" and it'll state whether it is "OCI Classic" or "OCI (Gen2)".






There is another way, cheeky one I must add, to find out and it is simply when you login to your environment:


OCI Gen2 login screen will look like this:



And OCI Classic login screen will look like this:



This should save you some time next time you are wondering whether you are on Classic on GEN2.


Until next time.


Friday, September 9, 2022

EPCM - A workaround for deleting scheduled jobs

I have found a workaround that enables me to delete scheduled jobs in Enterprise Profitability and Cost Management (EPCM). Check my last post for more details about the error itself.


Here is the error to begin with.




As you can see above, I cannot simply delete the job straight away (this is still a bug as of the date of this post), so what I need to do is create an LCM export for that job, modify the xml file, and re-import the file again.

1. Export the LCM job definition 







2. Export the LCM definition and download the file locally



3.Edit the XML file and change the end dates to a past date


This is the original XML file

In snippet format:
<?xml version='1.0' encoding='UTF-8'?><Scheduler><job name="Compact Outline" type="23"><jobParam name="DefaultQuartzJob:jobApplication" type="java.lang.String" value="FsnEPCM"></jobParam><jobParam name="DefaultQuartzJob:jobClassName" type="java.lang.String" value="com.hyperion.planning.schedulejobs.CubeCompactionScheduleJob"></jobParam><jobParam name="DefaultQuartzJob:jobCreateDate" type="java.util.Date" value="1662724800000"></jobParam><jobParam name="DefaultQuartzJob:jobIdentity" type="java.lang.String" value="epm_default_cloud_admin"></jobParam><jobParam name="DefaultQuartzJob:jobObjectName" type="java.lang.String" value="Compact Outline FsnEPCM.PCM_CLC"></jobParam><jobParam name="DefaultQuartzJob:jobObjectType" type="java.lang.Integer" value="23"></jobParam><jobParam name="DefaultQuartzJob:jobTrigger" type="com.hyperion.calcmgr.scheduler.triggers.DailyTrigger" value="[Daily] [Starts: Fri Sep 09 12:00:00 GMT 2022] [No End Time] [Cron: 0 0 22 1/1 * ? * Australia/Sydney]"></jobParam><jobParam name="DefaultQuartzJob:jobUserInputName" type="java.lang.String" value="Compact Outline"></jobParam><jobParam name="DefaultQuartzJob:origStartTime" type="java.util.Date" value="1662724800000"></jobParam><jobParam name="DefaultQuartzJob:timeZone" value="Australia/Sydney"></jobParam><jobParam name="Job Name" type="java.lang.String" value="Compact Outline FsnEPCM.PCM_CLC"></jobParam><jobParam name="appName" type="java.lang.String" value="FsnEPCM"></jobParam><jobParam name="dbName" type="java.lang.String" value="PCM_CLC"></jobParam><jobParam name="jobObjectKey" type="java.lang.String" value="23"></jobParam><jobParam name="physicalAppName" type="java.lang.String" value="AFsnEPCM"></jobParam><jobParam name="reviewData" type="java.util.LinkedHashMap"><property name="Job Type">Compact Outline</property><property name="Job Name">Compact Outline FsnEPCM.PCM_CLC</property></jobParam><jobParam name="reviewDetails" type="java.util.LinkedHashMap"><property name="Name">Compact Outline</property><property name="Job Type">Compact Outline</property><property name="Job Name">Compact Outline FsnEPCM.PCM_CLC</property></jobParam><trigger type="Daily" origStartDate="1662724800742"></trigger></job></Scheduler>


This is the modified XML file





In snippet format
<?xml version='1.0' encoding='UTF-8'?><Scheduler><job name="Compact Outline" type="23"><jobParam name="DefaultQuartzJob:jobApplication" type="java.lang.String" value="FsnEPCM"></jobParam><jobParam name="DefaultQuartzJob:jobClassName" type="java.lang.String" value="com.hyperion.planning.schedulejobs.CubeCompactionScheduleJob"></jobParam><jobParam name="DefaultQuartzJob:jobCreateDate" type="java.util.Date" value="1662724800000"></jobParam><jobParam name="DefaultQuartzJob:jobIdentity" type="java.lang.String" value="epm_default_cloud_admin"></jobParam><jobParam name="DefaultQuartzJob:jobObjectName" type="java.lang.String" value="Compact Outline FsnEPCM.PCM_CLC"></jobParam><jobParam name="DefaultQuartzJob:jobObjectType" type="java.lang.Integer" value="23"></jobParam><jobParam name="DefaultQuartzJob:jobTrigger" type="com.hyperion.calcmgr.scheduler.triggers.DailyTrigger" value="[Daily] [Starts: Thu Sep 08 13:00:17 GMT 2022] [Ends: Thu Sep 08 13:00:17 GMT 2022] [Cron: 17 0 23 1/1 * ? * Australia/Sydney]"></jobParam><jobParam name="DefaultQuartzJob:jobUserInputName" type="java.lang.String" value="Compact Outline"></jobParam><jobParam name="DefaultQuartzJob:origStartTime" type="java.util.Date" value="1662724800000"></jobParam><jobParam name="DefaultQuartzJob:timeZone" value="Australia/Sydney"></jobParam><jobParam name="Job Name" type="java.lang.String" value="Compact Outline FsnEPCM.PCM_CLC"></jobParam><jobParam name="appName" type="java.lang.String" value="FsnEPCM"></jobParam><jobParam name="dbName" type="java.lang.String" value="PCM_CLC"></jobParam><jobParam name="jobObjectKey" type="java.lang.String" value="23"></jobParam><jobParam name="physicalAppName" type="java.lang.String" value="AFsnEPCM"></jobParam><jobParam name="reviewData" type="java.util.LinkedHashMap"><property name="Job Type">Compact Outline</property><property name="Job Name">Compact Outline FsnEPCM.PCM_CLC</property></jobParam><jobParam name="reviewDetails" type="java.util.LinkedHashMap"><property name="Name">Compact Outline</property><property name="Job Type">Compact Outline</property><property name="Job Name">Compact Outline FsnEPCM.PCM_CLC</property></jobParam><trigger type="Daily" endate="1662642017034" origStartDate="1662642017034"></trigger></job></Scheduler>




4. Finally, import the updated LCM file


Once the file is imported, you will see the updated "Repeats" and "Scheduled End Time"  for the scheduled job.


Depending on whether you have selected an end date in the past, or not, the job will be updated to reflect the new end date and once it passes that date, the job will be completely removed from the scheduler.













Saturday, September 3, 2022

EPCM BUG - Error deleting scheduled jobs

So I came across this error in EPCM that is stopping me from deleting scheduled jobs. 


As of the creation date of this post, I'm unable to delete or edit a created scheduled job in EPCM, so until there is a fix for this, I suggest you do not create scheduled jobs in the interim and look for other workarounds (server side schedules, task manager in another pod etc).


This is the error message I'm getting while attempting to delete the job.





I have create an SR with and they have replicated the same issue in-house (this means it is a bug), I will update this post when I have more information.

Wednesday, August 3, 2022

Quick tip - Groovy rule validates successfully but fails to run

 This is a quick post about accessing Calc Manager rules properties using groovy class Rule.


I have the following script that validates just fine.



But if I try to run the rule I get the following error message:


The issue is caused by the rule not being deployed to the Planning tables:


The solution is simple. Deploy the run the rule again!




Monday, July 18, 2022

Enterprise Profitability and Cost Management (EPCM) - REST API - Calculate Model

 I found a typo in the Calculate Model REST API  in EPCM documentation that made go around in circles for a couple of hours trying to figure out what exactly is the problem! I already got in touch with the Oracle team in charge of the documentation and they are going to update the documentation at some point, so this post is about navigating such issues in the futures.


So the doco says the parameters (jobType and jobName) are required and their values must be "Calculate Model"



However, when I first tried to use this API using the exact same information, I got the following error:

"A job with name Calculate Model and type Calculate Model was not found. Try again with a valid job name and type"




Here comes the going around in circles bit, I'm following the exact instructions provided in the documentation so I thought there must be a typo somewhere, so what is the best way to find out the issue? EPM Automate commands is the correct answer, I know there is "calculateModel" epm automate command so I thought I will run the command, analyse the logs, and search for the correct parameter values.

After doing so, I found out the correct parameter values for jobName and jobType is "Calculation", not "Calculate Model" as per the screenshot below:

So I updated my REST request and replaced "Calculate Model" with "Calculation" and, Voila! it worked like a charm!








Enterprise Profitability and Cost Management (EPCM) - Quick Tips - The Rule Model does not exist for selected POV.

 This is another quick tip about an ambiguous error I came across while implementing EPCM for a client of mine. The error stopped me from calculating the model and it just says "The rule Model does not exist for selected POV" (which is not extremely helpful if you ask me).



Luckily, the solution is straight forward after I ran the Model Validation" and it turned out to be a renamed member that is no longer referenced in the rule.



And this is the error you will see when you edit the specified rule.




Finally, just update the rule and point to the renamed member and that's about it, you are good to go!

Enterprise Profitability and Cost Management (EPCM) - Quick Tips - NullPointerException

 I came across this very generic error while implementing EPCM for a client of mine and as you can see, the error is not informative. the error popped out while selecting ruleset range and all rules options only.






And after a lot of digging I found out this issue was caused by new rules that were never calculated before and in order to work around it, I ran the rule individually (as a single rule processing range) and the error never popped up again.


I don't know if you are going to experience this issue or not, but if you do, the solution is simple. just run and calculate the new rules at least one time as "SIGNLE RULE" before selecting ALL RULES or RANGE option.




Monday, April 11, 2022

Groovy and Essbase Cloud APIs - Part 3

 In my previous post, I showed you how to setup Essbase API working directory and create a simple Groovy script. In this post, I will explain what the script is doing and how to run it.

First, I'm defining an Essbase connection and a cube to connect to

def essServer  = IEssbase.Home.create(IEssbase.JAPI_VERSION

                  .signOn(user,pwd, false, null, "http://localhost/essbase/japi", "localhost")

             

def cube = essServer.getApplication("Sample").getCube("Sample"))

Define a member selection query on Cost Centre dimension and get all members.

def mbrSelection = cube.openMemberSelection("About to perform member selection"

    mbrSelection.executeQuery("Cost Centre", IEssMemberSelection.QUERY_TYPE_DESCENDANTS, IEssMemberSelection.QUERY_OPTION_MEMBERSONLY,"Cost Centre", "", ""))

Get the members returned from the query, find all members with aliases that match the passed argument and print them all.

def mbrs = mbrSelection.getMembers()

def mbr = mbrs.getAll()

def searchResult = mbr.findAll{(it.getAlias(null) == null) ? "" : it.getAlias(null).toLowerCase().contains((args.length == 0 ) ? "" : args[0])}.each{println it.name+" : "+it.getAlias(null)})


Now I just have create a .groovy file in the same working directory and save the script.

To run the script, I just need to run it and pass the alias I want to search for.

For example, search for all cost centres with aliases that contain "ope".

groovy helloEssbaseCloud.groovy "ope"



As you can see, the script works without any issues. You can now use Groovy to work with Essbase Cloud APIs instead of Java.

Groovy and Essbase Cloud APIs - Part 2

 In my previous blog, I showed you how to install Groovy on Linux using SDKMAN.

The second step is to create a working directory to put all of Essbase API files and groovy scripts in one place. By default, you need oracle user to access the API files, so I’m going to copy them into a directory under opc user which I’m going to use to run my Groovy scripts.

The API files are located under /u01/oracle/essbase/common/EssbaseJavaAPI/*

I’m going to need three jar files

1.      ess_japi.jar

2.      ess_es_server,jar

3.      ojdl.jar

To copy the files, I will run the following commands:

sudo cp /u01/oracle/essbase/common/EssbaseJavaAPI/lib/ess_japi.jar /home/opc/EssbaseJAPI/ess_japi.jar

sudo cp  /u01/oracle/essbase/common/EssbaseJavaAPI/lib/ess_es_server.jar /home/opc/EssbaseJAPI/ess_es_server.jar

sudo cp  /u01/oracle/essbase/common/Essbase/jlib/ojdl.jar  /home/opc/EssbaseJAPI/ojdl.jar

 The next step is to define CLASSPATH variable.

export CLASSPATH=”/home/opc/EssbaseJAPI/ess_japi.jar: /home/opc/EssbaseJAPI/ess_es_server.jar: /home/opc/EssbaseJAPI/ojdl.jar”


 Create a Groovy Script

The final step is to create the Groovy script, run the script and test it but first I need a use case.

I want to search the Sample application outline for members based on alias descriptions, not member names. The standard outline search feature available via the simplified interface is not going to do the job for me as shown next:






So, I’m going to write a simple Groovy script to search the outline based on member aliases. Here is the code:

I've intentionally used "def" to define untyped variables just to highlight the Groovy nature of the code, I personally like to declare the data type for better readability. For example, instead of "def cube" I would type "IEssCube cube



In my next post, I will explain the code and show you how to run it.


Thanks

Groovy and Essbase Cloud APIs - Part 1

 This post is a quick tip about using Groovy to work with Essbase Cloud Java APIs for those who prefer to code in Groovy instead of Java for whatever reason (in my case I just prefer the simplified Groovy syntax). Everything I’m about to demonstrate here applies to any Java API, be it Essbase on-premise or OCI etc.

For this demo purposes, I will be using OCI marketplace Essbase 21c deployment.

Install Groovy

The first step is to set up Groovy on the Essbase instance, there are many ways you can install Groovy but I prefer the Software Development Kit Manager (SDKMAN). To install using SDKMAN do the following:
  1. Login to Essbase instance using opc user via SSH (using PuTTy, VSCode, PS etc)
  2. Initialise and prepare the environment by typing


Finally, install Groovy








Groovy is now installed and GROOVY_HOME is set.


In the second part we will configure Essbase working directory and show how to use Groovy with Essbase Java APIs.