EPM

The times they are a-changin’

Collaborate ’16 has come and gone. I was fortunate enough to be able to join in on Monday of the conference for the OAUG Hyperion SIG meeting. As part of the conference, I was able to join a couple of road map sessions and speak directly with Oracle EPM marketing folks; it is clear that we are in the midst of change.

To be clear, I do not mean to directly equate today’s technological shift with the political, social, and cultural upheavals of the early 1960s. To do so would be a slap in the face to the many heroes of the time, especially those that gave their lives for equality. Bob Dylan created an anthem of change and expressed his feelings in generalities that can fit many circumstances. That is what makes his song relevant for so many even today.

I was recently watching a webcast replay by Joe Aultman, a guy who I really respect and consider a friend, about Essbase and whether it belongs under the control of IT or the business. Joe gave this presentation live during KScope 15 for those lucky enough to be there. During the presentation, Joe went through an excellent history of Essbase.  He spoke about how it started as a tool that was sold to Finance and sat on a server under someone’s desk at many companies. How exciting those early days were.

I have been working with Hyperion directly for more than ten years. Before that, I worked closely with the Hyperion Enterprise administrator and he showed me a few things so I could back him up. We ran Enterprise on a Citrix server, but we pretty much had full control of the box with very little IT intervention at all. It was fantastic! Thankfully we didn’t ever need a whole lot of help with that environment.

About a year later when I started with Essbase, a co-worker showed me how to install Essbase 6.5.4 on my desktop so that I could play with an outline to replace that old Enterprise application. Our installation in production was version 9.3.1, though. We had IT to manage our servers now. I had to practically beg to get a batch script scheduled on the server for nightly backups of our data.

With the complexities of the EPM System today it’s hard to imagine anyone implementing Essbase without IT support. With Oracle’s EPM and BI Cloud Services, what’s old is new again. Departmental applications can once again flourish as the Enterprise Planning Cloud and the upcoming Essbase Cloud Service offerings reduce the rigidity of IT and allow the business to control their applications.

There is no doubt that Oracle is making a strong push for customers to join the cloud revolution. That push is strong enough to make infrastructure consultants like me who are heavily reliant on the on-premises software model take notice. So, what is an infrastructure person to do? Diversify.

Luckily, I started in Hyperion with an application background. I learned Essbase inside and out at Wells Fargo Home Mortgage, then I went into consulting and learned Planning, FDM, ODI, infrastructure, OBIEE, enough to be dangerous in HFM, FDMEE, etc. I think the real sweet spot for developers like me is in data integration. The technology will keep changing, but we are always going to need to move data from one application into another.

As the underlying technology changes, this blog must also change to reflect the current trends and hopefully help anyone who stumbles across this site. Honestly, this blog was never about one particular thing. While I have primarily focused on infrastructure, there are a lot of areas in the EPM and BI world to be explored.

Come gather ’round people
Wherever you roam
And admit that the waters
Around you have grown
And accept it that soon
You’ll be drenched to the bone
If your time to you
Is worth savin’
Then you better start swimmin’
Or you’ll sink like a stone
For the times they are a-changin’.

-Bob Dylan, The Times They Are a-Changin’, 1964

RedCloud

CDF Series Part 3: Creating CDFs

If the prebuilt CDFs from Oracle that we discussed last time don’t meet your needs, it is also possible to create your own Custom Defined Function. Using a Java integrated development environment (IDE) is the simplest method for beginners, although it is possible to create a JAR using nothing more than a text editor and command line interface with Java.  There are several IDEs available for Java; however, I prefer to use Oracle’s JDeveloper as it makes doing this work very easy.

JDeveloper

JDeveloper makes Java development and deployment to JARs very easy. I am currently using JDeveloper 11.1.1.9 because it is compatible with both Java 1.6 and 1.7.  The EPM System 11.1.2.4 is shipped with Java 1.6, so using some version of Java 6 will prevent any errors due to incompatible code.

The software can be downloaded from the Oracle Technology Network. For just programming Essbase CDFs, select the Oracle JDeveloper Java Edition download. Unzip the downloaded files to the C:\ drive for simplicity, and it will create a C:\jdeveloper folder. At the first startup, point JDeveloper to a JDK installation.  The Oracle EPM JDK can be used at C:\Oracle\Middleware\jdk160_35 to ensure compatibility.  Any Java 6 JDK could be used and later versions are recommended due to security vulnerabilities in the lower Java 6 releases.

Next we need to create a generic Java project and add a new Java Class.  Here we will enter our code.  When writing a Java CDF that may be called using the RUNJAVA method, we need to add in an additional parameter to the “main” method.  Typically in Java programming the main method only accepts a String array (String[]) called “args”.  With Custom Defined Functions, we must accept a calculator context parameter as well as our String[] args. The main method description will appear similar to:

public static void main(com.hyperion.essbase.calculator.Context ctx, String[] args) {
   doSomething();
}

By adding the calculator context to our Java Class, JDeveloper will give errors as it is unable to find the definition for the context object. In order to properly compile our Java Class into a JAR, we must first make JDeveloper aware of the context object that is part of the Essbase server in a file called Essbase.jar.  To add Essbase.jar into the Classpath for our code, right-click the project in JDeveloper and select Project Properties… as shown below:

Jdev1

Next, navigate to the Libraries and Classpath option of the Project Properties and click the Add JAR Directory button.  Browse to the Essbase.jar file and click Select.  If done properly, your screen will be updated showing the Essbase.jar file as a Classpath entry as shown here:

Jdev2

To deploy our Class to a JAR, we must first create a deployment profile in JDeveloper.  To create a deployment profile, right-click the project, select Deploy >> New Deployment Profile… as shown below:

Jdev3

In the New Gallery dialog box, select Deployment Profiles then select JAR File in the right pane like this:

Jdev4

In the Create Deployment Profile – JAR File dialog box, enter a name for the Deployment Profile.  This will become the name of your JAR file.

Jdev5

In the JAR Options dialog box, select the checkbox to Include Manifest File (META-INF/MANIFEST.MF) and browse to select the main class.

Jdev6

Next, to deploy our Class to a JAR file, simply right-click on the project again and navigate to Deploy >> ProfileName, then click the Finish button to deploy the Class to a JAR file.

Jdev7

Now that we have our JAR file, the next steps are to copy the JAR to our Essbase server and register the function in EAS or by using MAXL.

RegisterCDF

After restarting Essbase, we should then be able to use our new code in an Essbase calculation script:

SET UPDATECALC OFF;
"Budget" = @CREATEBLOCK("New York"->@RELATIVE("Product",0));
FIX ("New York", "Sales", "Budget",@RELATIVE("Product",0))
"Jan"(
  @INT(@Random()*100)+1;
)
ENDFIX
AGG (Product, Market);

 

CDF Tips for Java Developers

Custom Defined Functions should be programmed using static methods in Java.  These classes typically are not be overridden and are used as utility classes, so using static methods is the best practice.

CDF methods can accept any number of parameters. These parameters may use any of the following data types:

  • boolean
  • byte
  • char
  • hyperion.essbase.calculator.CalcBoolean
  • float, double
  • lang.String
  • short, int, long
  • arrays of any of these types

The CalcBoolean object is defined in the Essbase.jar file and is equivalent to the Essbase calculator’s Boolean function and has values of TRUE, FALSE, or #Missing.

Any return values to Essbase can be void, or any of the above data types. Returned data is mapped to an Essbase-specific data type.  String return values are mapped to a String. Boolean return values are mapped to the CalcBoolean data type.  Any other return value is mapped to a double data type.

CDFs must start with the @ symbol, the rest of the name can contain letters, numbers, or the following symbols: @, #, $, and _.  CDF names must not include spaces.

If multiple users can run the same CDF at a time, the variables can be shared and overwritten.  For thread safety, I have used the synchronized attribute on methods in Java with success.

Any passwords or other properties that may need changed can be stored in a *.properties file in the %EPM_ORACLE_HOME%\products\Essbase\EssbaseServer\java\udf directory for global or server-wide functions or they can be placed in the %EPM_ORACLE_INSTANCE%\EssbaseServer\essbaseserver1\app\ApplicationName directory.  Your methods can then use the *.properties file as a resource and read the values at runtime.  This is a better method than saving passwords directly in your Java code.

Custom Defined Functions open Essbase calculations up to a world of possibilities. There are several prebuilt options from Oracle that may meet any needs outside the traditional Essbase calculator engine. If the existing prebuilt code does not solve your specific need, custom code can easily be implemented to solve almost any calculation need in Essbase.

CDF Series Part 2: Prebuilt CDFs

Oracle has given Essbase administrators several different prebuilt CDFs that can be used anytime they are needed. There are three main locations for prebuilt CDFs: Oracle’s Sample Code site, Calculation Manager, and Hyperion Planning.

Oracle Sample Code

Located at (http://www.oracle.com/technetwork/indexes/samplecode/essbase-sample-522117.html), Oracle’s Sample Code site offers eight different downloads containing several CDFs.  These downloads contain precompiled JAR files, the necessary MaxL statements to register the CDFs, and usually a sample calculation to show how to use the CDFs.  The eight downloads are:

  • Financial Functions: Calculates loan maturity, principal and interest payments, and interest rates
  • Export Functions: The main function used in this CDF was replaced by the DATAEXPORT Essbase calculator function
  • Email Functions: Sends emails during calculations to alert administrators or users
  • Date Functions: Includes various functions to work with dates, some are epoch date format and some are YYYYMMDD format
  • Data Functions: Allows retrieval of external data from files or the Internet
  • Counter Functions: Counts the number of passes through an outline during a calculation for tuning purposes
  • Logging Functions: Logs messages to a specified file, replaced by @CalcMgrLog and @CalcMgrLogText functions
  • String Functions: Manipulates text fields, many of these functions are also available in @CalcMgr* text functions

Calculation Manager CDFs

Beginning with Calculation Manager 11.1.2.3.502 and up, many prebuilt Custom Defined Functions are automatically deployed to the Essbase server and ready for use. Version 11.1.2.4 of Calculation Manager includes 67 prebuilt functions.  Many of these functions are for text and date manipulation.  The date functions are primarily for use in Capital Expenditure and Workforce Planning applications using the YYYYMMDD date format, but can be used in any application that stores dates using that format.

In addition to the text and date functions, there are six miscellaneous functions that can be useful in a variety of situations.  The six miscellaneous functions are:

  • @CalcMgrExecuteEncryptMaxLFile – allows the execution of an encrypted MaxL file.
  • @CalcMgrExecuteMaxLScript – streams MaxL code to the Essbase kernel for immediate execution
  • @CalcMgrLog – writes messages to a specified text file, can include data from Essbase for validations
  • @CalcMgrLogText – writes text-only messages to a specified text file
  • @CalcMgrMDXDataCopy – using MDX queries, this function can select a range of data blocks in one application and copy the data to a target application
  • @CalcMgrMDXExport – using MDX queries, this function exports data to a file quickly without the ugly formatting of a traditional MDX export

Some of these functions are not properly registered after applying the patch.  The errors can be fixed by editing the essfunc.xml file in the %EPM_ORACLE_HOME%\EssbaseServer\essbaseserver1\java directory. The following edits need to be made to have all of the CDFs registered properly:

  • @CalcMgrGetCurrentDate
    • Change getCurrentDate(int) to getCurrentDate()
  • @CalcMgrIndexOf
    • Change indexOf(String,int) to indexOf(String,String,int)
    • Change @CalcMgrIndexOf(text, beginIndex) to @CalcMgrIndexOf(text, searchString, beginIndex)
  • @CalcMgrLastIndexOf
    • Change lastIndexOf(String,int) to indexOf(String,String,int)
    • Change @CalcMgrLastIndexOf(text, beginIndex) to @CalcMgrLastIndexOf(text, searchString, beginIndex)
  • @CalcMgrSubstring
    • Change substring2(String,int,int) to substring(String,int,int)
    • Change @CalcMgrSubstring2(text, startIndex, endIndex) to @CalcMgrSubstring(text, startIndex, endIndex)
  • @CalcMgrMDXExport
    • Change hyperion.calcmgr.common.cdf to com.hyperion.calcmgr.common.cdf.MDXExport

Hyperion Planning CDFs

Hyperion Planning also comes with several prebuilt CDFs.  In version 11.1.2.4, Planning contains 23 CDFs available for use in both Calculation Manager rules and in Essbase calculation scripts. When attempting to use these rules in Calculation Manager, the parameter definitions are not descriptive, as shown in the picture below:

CalcMgr Functions

To get a better feel for the parameters for each @Hsp* function, view their definitions in Essbase Administration services as shown below:

EAS Function

Next time we will cover creating our own CDFs from scratch.

Introduction to CDFs

I attended a Matt Milella presentation several years ago about CDFs and always wanted to use one.  A couple of years ago, I was in a bind at a client who needed very specific to an Essbase extract for integration with SAP, and I actually had a chance to write one from scratch.  It’s not very often that you are faced with such a problem, but it’s great to know that Oracle has given us the tools to handle almost any situation.

Introduction to Custom Defined Functions

The Essbase calculator engine is use in Block Storage Option (BSO) and hybrid aggregation applications. There are 160 built-in calculator functions. BSO databases are known for their superior calculation ability due to these functions; however, occasionally there is a need for additional functionality not covered by the calculator engine or built-in functions. In these instances, Custom Defined Functions can be used to extend the calculator engine.

Custom Defined Functions (CDFs) are Java classes written to interact with the Essbase calculator. CDFs allow data, metadata, or both to be passed from the calculator engine into Java.  Data or metadata can then be returned to the calculator engine. CDFs harness the power of Java, so they are able to call any outside process.

CDFs open a world of possibilities through the use of Java.  They can be used to: submit MaxL commands dynamically from within a calculation, interact with the server operating system, do complex calculations not available with the existing calculator functions, or even fetch data from the Internet. These functions may be deployed at the server-level and available for use by all applications, or at the individual application level.

Java code is compiled into a Class file. Classes must then be packaged into a Java Archive file, also known as a JAR. The JAR file is then placed on the Essbase server in the %EPM_ORACLE_HOME%\products\Essbase\EssbaseServer\java\udf directory for global or server-wide functions or they can be placed in the %EPM_ORACLE_INSTANCE%\EssbaseServer\essbaseserver1\app\ApplicationName directory for an application-level CDF.  When using global CDFs, the udf.policy in the %EPM_ORACLE_HOME%\products\Essbase\EssbaseServer\java directory must be updated to allow Essbase access to the custom code.  A line can be added to the end of the udf.policy file as follows:

grant codeBase "file:${essbase.java.home}/../java/udf/yourCDF.jar" {   
   permission java.security.AllPermission;
};

Next, the CDF must be registered with Essbase.  This can be done in Essbase Administration Services (EAS) by selecting Edit >> Functions on your Essbase server, or within MaxL. To register the @JsendMail function, the MaxL code would look like:

create or replace function '@JechoString' as 
'com.oracle.essbase.cdf.StringFunctions.echoString(String[])' 
spec '@JechoString(strArray)' 
comment 'Echoes back all arguments passed to the function.  To pass an array of arguments use @List(comma delimited list)'

Essbase picks up new Custom Defined Functions on startup.  When creating new global CDFs, the Essbase service must be stopped and restarted to recognize the new function.  When creating application specific CDFs, restarting the application is sufficient. When developing new CDFs, it is recommended to begin with application level functions during the initial testing as it is easier to stop and restart at the application level than restart the Essbase service.

As the application starts, messages are written to the application’s Essbase log about the functions. When creating new functions, check the Essbase application log to verify that the function is registered successfully. Any messages other than a successful registration indicate changes are needed to the CDFs registration in EAS. When a function is registered properly the following message is displayed in the log:

[Wed May 20 10:14:34 2015]Local/Sample///10636/Info(1200445) 
External [GLOBAL] function [@JechoString] registered OK

Once defined properly and registered with Essbase, Custom Defined Functions may typically be run in two ways.  The first method of running a CDF is similar to a typical Essbase calculator function.  When running a CDF using this method, it must be placed inside a calculation member block.  This option calls the Java methods directly from inside the Class file. If the CDF definition was setup “with property runtime” in MaxL, or with the “Runtime” box checked in EAS, the CDF will execute for all members of the calculation.  The amount of blocks impacted by the CDF can be limited with a FIX statement. A typical calculation script using the first option for running a CDF is:

FIX ("New York", "Sales", "Budget",@RELATIVE("Product",0))
"Jan"(
    @INT(@Random()*100)+1;
)
ENDFIX

The second option to run a CDF is using the RUNJAVA command.  This method of running a CDF executes only once and calls the “main” method of a Java class.  The Custom Defined Function must be written properly to accept this method of calling it. Using the RUNJAVA command does not require that a CDF be registered in EAS or by MaxL. A typical RUNJAVA command is:

RUNJAVA com.hyperion.calcmgr.common.cdf.MaxLFunctions
  true -D C:\\Scripts\\BatchCalc.mxl
  678870187,2425911017
  050927985109683855112314385651
  7592008210957166529169707423014313885401;

That’s all for this week, next time we will talk about prebuilt CDFs from Oracle that we can use right away. Later, we will cover how to write your own CDF (assuming some level of Java coding experience)/

Running Essbase 11.1.2.x in the foreground

For many years, the conventional wisdom was that if your Essbase server was failing to start, you should run it in the foreground to see any messages that might be displayed to the console, but not logged into the Essbase.log file. With the pre-11.1.2.x versions, this was usually quite simple. In fact, if you had your environment variables set right, all you needed to do is type in ‘essbase’ at a command prompt regardless of what directory and your Essbase server would start before your eyes.

According to the Essbase Database Administrator’s Guide (dbag), it states that the ability to run Essbase in the foreground is no longer supported as of version 11.1.2.2.100. With the 11.1.2.x versions and their more complicated directory structure (some static files stored in …Oracle/Middleware/EPMSystem11R1/products…. and some files stored in …Oracle/Middleware/user_projects/epmsystem1/…); starting Essbase in the foreground can be challenging if you don’t use this simple hack.

If we open a command prompt and navigate to the …/Oracle/Middleware/EPMSystem11R1/products/Essbase/EssbaseServer/bin directory and type in ‘essbase’, you will likely see a message about an improper ESSBASEPATH, or maybe a message about the Locale.

In later versions, Essbase needs to reference files from different folders.  We have two options, we can either set up the proper environment variables or we can do what Oracle has done with their ESSCMD and ESSMSH executables.  I like to hijack the “startEsscmd.cmd” script that is installed with the Essbase Client in …/Oracle/Middleware/EPMSystem11R1/products/Essbase/EssbaseClient/bin directory.

Simply save a copy of the “startEsscmd.cmd” script as “startEssbase.cmd”.  Edit the new “startEssbase.cmd” script and change the “%ARBORPATH%\bin\ESSCMD.exe %*” line to “%ARBORPATH%\bin\ESSBASE.exe %*”. Then, save the startEssbase.cmd file and when you double-click it in Windows, Essbase will run in that window. Now you can use those old school Essbase commands in the foreground and rebuild the Essbase.sec file if absolutely necessary.

Of course, this is unsupported and with the advances in Essbase, it’s probably not even necessary since Essbase runs much better now than it did in the 9.3.x and early 11.1.1.x days.  The only time I have had to do this is when the Essbase.sec is corrupted beyond repair, but starting in version 11.1.2.2, I believe, Essbase tries to create a new Essbase.sec file automatically if it’s missing. It’s not very often that these steps are needed, but I wanted to document them just in case anyone is running on an old version out there. If you are on EPM version 11.1.2.2 or older, please consider an upgrade. I know a guy that can help with that.

Essbase fragmentation head-scratcher

With the release of Essbase 11.1.2.3.500, there was an interesting entry in the readme that caused some chatter on Network54.  The readme states:

The INPLACEDATAWRITE setting in essbase.cfg enables or disables in-place data writing.

Prior to this release, each time a data block was updated, it was written to a new disk location. With this release, for Exalytics, Essbase enables in-place data writing.

In-place data writing means that when updates occur, the data block can be written to the same location, as long as the compressed size of the data block fits in its original location on the disk.

In-place data writing can help reduce data fragmentation and lower the need for frequent restructuring of database. It also reduces the need for frequent index updates, resulting in improved performance.

Merely updating a single value of a cell in a single block causes that block to be written to the end of the page file? This made long-time developers scratch their heads because many of us believed that updating values in a block did not cause fragmentation. If submitting data causes fragmentation, imagine how bloated our Planning databases must be. No wonder we hear recommendations to restructure nightly during a planning cycle.

Glenn Schwartzberg said that yes, that’s how he understood it to work.  Edward Roske said there was no way submitting data cause fragmentation.  Cameron Lackpour didn’t believe it either until he did some testing and found that the ESSCMD GETDBSTATS command reported fragmentation after updating a single cell of Sample.Basic. Dan Pressman commented that he had seen the same behavior with compression turned off – BSO writes to the end of the .pag file when blocks are updated.

Test 1:

I tested this out on an 11.1.2.4.000, non-Exalytics sandbox. In Excel, I retrieved a single block of one of our sample cubes (not Sample.Basic, this was a larger demo cube). The page dimensions of my worksheet listed a single level-0 member from each Sparse dimension of the cube. Accounts were on my rows and January was my column dimension (both were level-0 Dense members).

With that sheet, I wrote a macro to do the following:

  • Update each data cell of the grid to a randomly generated number
  • Submit the data for the block back to Essbase
  • Call a MaxL script to stop and restart the Essbase application to flush the cache
  • Loop back to the top, iterating 250 times

While I ran the macro, I (im)patiently watched the database directory to see if the database’s essn.ind or essn.pag files would grow.  As we all know, if there is fragmentation that happens each time the block is submitted back to Essbase, the .pag file should see some growth – especially over 250 iterations. For complete transparency, this database is using the bitmap compression type that is the default for BSO applications.

After 250 iterations of changing the same block and stopping/restarting the application there was no essn.pag file growth. The GETDBSTATS results show the following:

  • Average Clustering Ratio: 0.4431846
  • Average Fragmentation Quotient: 0.8091218

That leads me to believe there is a little bit of fragmentation, so I cleared the cube and loaded in a level-0 extract of the data and ran a calculation.  After that, I ran GETDBSTATS again and found the following:

  • Average Clustering Ratio: 0.5117247
  • Average Fragmentation Quotient: 0.6745301

Test 2:

My next test was to do the same loop except I added in a quick aggregation step after the data was submitted. This time, as the macro ran, I could plainly see the essn.pag file growing every 5-6 loops of the code. The Average Clustering Ratio and Average Fragmentation Quotient also grew as the calculations ran.

What does all of this mean?

Conclusion:

My conclusion is that the documentation on INPLACEDATAWRITE is a little misleading. Essbase without the INPLACEDATAWRITE does NOT write a block to the end of the .pag file if a block is updated. Blocks may be updated all day long by submitting data to them without expanding your .pag files. Fragmentation is caused when a data block is brought into the calculator engine. This is where INPLACEDATAWRITE does its magic on Exalytics machines and allows those blocks to be compressed and returned to their original location in the .pag file, thus preventing fragmentation.

What about the Fragmentation Quotient? Well, in the DBAG, it mentions that the Fragmentation quotient can be high and not indicate a need to defragment since free space in the .pag is created in 8MB chunks. I observed this to be true during Test 2 where excess free space was added to the .pag file and the file would only grow after 5-6 loops of the submit data/calc/stop/start routine. My thought is that an Average Fragmentation Quotient less than 1 (<1%) is essentially no fragmentation at all. After a single calculation script I began to see that Average Fragmentation Quotient above 1 (1.884844). By nature Essbase has some degree of fragmentation all of the time as it’s .pag file is always a little bit bigger than the actual size of the data contained therein. As long as the .pag file isn’t growing and the Average Fragmentation Quotient is less than 1%, I’m counting that as no fragmentation by submitting data to a block.

Calculation Manager 11.1.2.4.002

As I posted the other day, Caclulation Manager 11.1.2.3.505 was released.  Not only did it include the fixes to the CDF declarations, it also contained some new CDFs we haven’t seen before.  Well, Calculation Manager 11.1.2.4.002 was released on Monday (patch number 20830325) and contains the same fixes as 11.1.2.3.505.

This version of Calculation Manager contains the new CDFs as well as fixes the issues with the CDF registration.  I think it’s great that the Calculation Manager team continues to crank out new CDFs for us to use.  Beyond that, I am very impressed that they have caught up the 11.1.2.3.50x Calc Manager to the 11.1.2.4.002 version.  It would be very simple for them to say that the new CDFs will only be added to the latest release, but they have kept the 11.1.2.3 version up-to-date.  Kudos to Oracle and the Calculation Manager product team!

Calculation Manager 11.1.2.3.505

On Tuesday, 6/9, Calculation Manager patch set update 11.1.2.3.505 was released. I have previously written about the errors in the CDF registration and how to fix those. I am very happy to report that all of the CDFs are now registered properly in 11.1.2.3.505. Not only that, but there are some new CDFs to report with this version of Calculation Manager as well. Calculation Manager 11.1.2.3.505 is a patch set update now available on My Oracle Support as patch number 20968612.

New Functions in Calc Manager 11.1.2.3.505:

@CalcMgrPadText (text,length,padText,append) – Fills the text with a padding text before or after the text to make up the length.

  • @CalcMgrPadText(“01″,5,”0”,@_true) = 01000
  • @CalcMgrPadText(“01″,5,”0”,@_false) = 00001

@CalcMgrMatches(text, regExpr, ignoreCase) – Returns true, if the first substring of this string that matches the given regular expression. For regular expression, please refer to java docs for java.util.regex.Pattern.

  • @CalcMgrMatches(“AsSeT”, “(Asset|Liability|Income|Expense|Equity)”, @_false) = true
  • @CalcMgrMatches(“CAT”, “c*”, @_true) = true

@CalcMgrFindFirst(text, regExpr, ignoreCase) – Find the first substring of this string that matches the given regular expression. For regular expression, please refer to java docs for java.util.regex.Pattern.

  • @CalcMgrFindFirst(“We are searching for a string in this sentence.”, “string”, @_false) = “string”
  • @CalcMgrFindFirst(“Can’t find this STRING anywhere”, “string”, @_true) = “Can’t find this STRING anywhere”

@CalcMgrFindLast(text, regExpr, ignoreCase) – Find the last substring of this string that matches the given regular expression. For regular expression, please refer to java docs for java.util.regex.Pattern.

  • @CalcMgrFindFirst(“acatamaranbatarang”, “ran?”, @_false) = “rang”

@CalcMgrDoubleFromString(text) – Returns a double.

  • @CalcMgrDoubleFromString(“12.54”) = 12.54(Double)
  • @CalcMgrDoubleFromString(“test”) = 0.0(Double)

@CalcMgrGetCurrentDateTime() – Returns the current date and time in the YYYYMMDDHHMMSS format.

  • @CalcMgrGetCurrentDateTime() = 20140101143001

@CalcMgrGetCustomDateTime(year,month,day,hour,min,sec) – Returns the custom date and time in the YYYYMMDDHHMMSS format.

  • @CalcMgrGetCustomDateTime(2015,06,11,21,27,01) = 20150611212701

@CalcMgrGetDateTimePart(date,date_part_ex) – Returns the Year/Month/Week/Day/DayOfYear/Weekday/Hour/Minute/Second as a number from date.

  • Options for the date_part_ex parameter are: Year, Month, DayofMonth, WeekOfYear, WeekOfMonth, DayOfYear, Hour, Minute, or Second.  These are Strings passed and the capitalization does not matter.
  • @CalcMgrGetDatePart (20141230052736, Hour) = 05
  • @CalcMgrGetDatePart (20141230125430, mInUtE) = 54

@CalcMgrMesssageFormat(text,parameters) – Creates a String with the given pattern and uses it to format the given arguments.

  • This one is interesting, it accepts the parameters to basically create a dynamic string that can be used in messages. You might pass those messages to a custom log file or even into an email for your administrators.

EPM Compact Deployment issue in 11.1.2.4

A compact deployment in EPM is when there are multiple Java Web Applications deployed to a single WebLogic Managed Server called EPMServer0.  A compact deployment is part of Oracle’s standard deployment documentation for EPM; however, I do not recommend it for production systems.  The compact deployment is an option for development or sandbox environments as it reduces the memory (RAM) requirements for the EPM system.  That means that you can size a development environment smaller than your production environment if you use the compact deployment.  There are some trade-offs in going this route, so do your homework to make an educated decision before using compact deployment.

This is a fairly minor issue with a quick fix.  I found on my laptop installation of EPM that my icons were not displaying in Shared Services when attempting to assign filter access to a user.  My colleague, Kenneth Staudt, pointed me to a Knowledge Base article on Oracle’s support site that described the issue exactly.  The instructions on KB article 1612768.1 are for 11.1.2.3.003 and later; however, the folders are a little different in 11.1.2.4.

If you run into this issue, copy the “ui_themes” folder from …\Oracle\Middleware\user_projects\domains\EPMSystem\servers\EPMServer0\tmp\servers\EPMServer0\tmp\_WL_user\SHAREDSERVICES_11.1.2.0\nth7gv\war to …\Oracle\Middleware\user_projects\domains\EPMSystem\servers\EPMServer0\tmp\servers\EPMServer0\tmp\_WL_user\WORKSPACE_11.1.2.0\rj8acj\war.  After that, restart your EPMServer0 Managed Server and you should now have the icons in the Access Control screen.

Oracle Critical Patch Update – April 2015

Oracle’s quarterly Critical Patch Update came out last week on April 14, 2015. There were two Hyperion products listed this quarter that require patches to fix the security vulnerabilities: Hyperion BI+ (Reporting and Analysis) and Smart View.

Hyperion BI+

There are patches available for Hyperion BI+ in the 11.1.2.3.x and 11.1.2.2.x code lines, which is consistent with Oracle’s Lifetime Support policy. The patch for the 11.1.2.3.x code line is the 11.1.2.3.506 Patch Set Update (PSU) for the Reporting and Analysis Framework (patch number 20029854). The patch for the 11.1.2.2.x code line is the 11.1.2.2.500 PSU for the RA Framework (patch number 18659116). Interesting enough, is that the 11.1.2.2.500 PSU has been available for 9+ months and fixes the vulnerabilities just uncovered this quarter. Hopefully if you are on 11.1.2.2.x, you have already patched to 11.1.2.2.500 for BI+.

Smart View

The Smart View vulnerability is patched in Smart View 11.1.2.5.400 (patch number 20327649).  This goes along with the theory that you should keep up with the Smart View releases. We need to get in the habit of thinking of Smart View like the apps on an iPhone; they often update automatically and you always have the most recent version. Why? By keeping up with the technology, you get the latest bug fixes and security updates as well as any new features.