Data forms that have rules on them run when a user saves a form, regardless of whether the form has edited data. Sometimes this is by design, to let a user run a calculation. But, most of the time, it is an accident. There is no reason to use system resources and have the user wait for a calculation to finish when it doesn’t need to be executed. Read more
Tag Archive for: oracle
If you haven’t heard, we now have the ability to execute REST API within a calculation script. Not only does that mean we can interact with other environments and do things in calculations we couldn’t do before, we also have the ability to interact with any provider that has REST. You could pull current prices for products from Amazon. You could see how many open box items there are at area Best Buy stores. You could pull in currency rates. That doesn’t even touch on the things like DM processes, metadata updates, and application refreshes. You can even send emails!
Importing data directly into PBCS can be done in two ways. There is a planning format and an Essbase format. Yes, it can be loaded through Data Management, but this is focused on explaining the direct import process, the formats, and the benefits to each. Read more
I am really excited to get to go to Seattle this year for KScope19. I was on the selection committee and I think we have a record number of new speakers. If you haven’t signed up and still have an opportunity to go, get out there and do it. Please stop by our booth and introduce yourself or say hello. Read more
I don’t normally write up monthly updated, but this month there are a number of intriguing changes/updates/enhancements that are important to know. Some may change existing processes. This is not an exhaustive list, but these are things I think all of us should take note of. Read more
I am currently working on a migration of on-premise to cloud project (going GREAT by the way). One of the things we are working on is the change with the data integration. One of the processes loads the number of working days to the application from a source that provides it. “Why not use Groovy,” I ask? It turns out to be a great question. Read more
I can’t tell you how many times I have been at a client and they wanted to replicate eliminations at the first common parent like HFM, or some other consolidations system. Maybe there is a good way to do this, but I could never find an efficient and effective way to accomplish it with Essbase calculations. Well, that is history. This is yet another example of how to solve an historically complex problem very simply. Read more
To date, we have talked about the performance improvements Groovy introduces, as well as the creative validation we can add. One thing that hasn’t been covered yet is the ability to add functionality to make the input easier for a planner. Replicating changes through the months, resetting the values back to the defaults, and many other concepts can be developed to make the user’s lives easier. Read more
Manipulating dates is not something you may think is that useful, but there are a number of things that we have done in the past that are slow performing in Essbase, and others that were not possible or you may not have ever thought of. This is going to walk visitors through ways to manipulate dates for all kinds of uses. Hopefully it inspires some ideas for you to make your application a little more polished. Read more
There has not been alot of troubleshooting discussed in the adventures series. Just like with most coding languages, you can gracefully handle errors resulting from actions (like divide by 0) and return descriptive information to the users and administrators in the job console. There are several benefits that I see.
- As previously stated, since the error is accounted for, the user doesn’t get a message that shows a failure with no context.
- The error object will provide more information about what happened and what should be done to fix it in the future.
- Predefined actions can take place since the error doesn’t interrupt the script, like returning an error message that tells the user to contact the administrator with an action
Error Handling Introduction
Try / catch / finally is a concept most development languages have. Conceptually, you “try” some group of commands and “catch” any errors that might happen. If you “catch” an error, you account for it by doing something. “Finally,” you perform any closing actions.
try { def arr = 1/0 } catch(Exception ex) { println ex.toString() println ex.getMessage() println ex.getStackTrace() }finally { println "The final block" }
In this case, ex.toString() prints
java.lang.ArithmeticException: Division by zero
ex.getMessage() prints
Division by zero
and ex.getStackTrace()
[java.math.BigDecimal.divide(Unknown Source), org.codehaus.groovy.runtime.typehandling.BigDecimalMath.divideImpl(BigDecimalMath.java:68), org.codehaus.groovy.runtime.typehandling.IntegerMath.divideImpl(IntegerMath.java:49), org.codehaus.groovy.runtime.dgmimpl.NumberNumberDiv$NumberNumber.invoke(NumberNumberDiv.java:323), org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56), org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48), org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113), org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125), ConsoleScript11.run(ConsoleScript11:2), groovy.lang.GroovyShell.runScriptOrMainOrTestOrRunnable(GroovyShell.java:263), groovy.lang.GroovyShell.run(GroovyShell.java:387), groovy.lang.GroovyShell.run(GroovyShell.java:366), groovy.lang.GroovyShell.run(GroovyShell.java:170), groovy.lang.GroovyShell$run$0.call(Unknown Source), groovy.ui.Console$_runScriptImpl_closure18.doCall(Console.groovy:1123), groovy.ui.Console$_runScriptImpl_closure18.doCall(Console.groovy), sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method), sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source), sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source), java.lang.reflect.Method.invoke(Unknown Source), org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:98), groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325), org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294), groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:989), groovy.lang.Closure.call(Closure.java:415), groovy.lang.Closure.call(Closure.java:409), groovy.lang.Closure.run(Closure.java:496), java.lang.Thread.run(Unknown Source)]
The script in the final block is also written out. It is intended for cleanup and tasks that run at the end of a script regardless of whether there is an error or not.
Handling Errors Uniquely
The catch command can be replicated to handle errors uniquely. Let’s expand on the example above. Assume the variable is coming from an RTP or cell value. The following has a catch for a specific error. The java.lang.ArithmeticException is equal to the output of ex.toString(). There are probably thousands of errors, if not more. The easiest way for me to grab these is to use the ex.toString() and see what it produces. I have no desire to remember or learn them all!
The following will do something different for the divide by zero error than all other errors.
try { def denominator = 0 println 1/denominator } catch(java.lang.ArithmeticException ex) { println ex.getMessage() println "an action should be taken to account for the error" } catch(Exception ex) { println ex.toString() println ex.getMessage() println ex.getStackTrace() } finally { println "The final block" }
Finishing Up
This requires a little more effort, but once you get used to doing this, it can be reused. I hear the argument that if you account for every possible situation, you don’t need to error trap. That is true, and if you are smart enough to account for everything that can go wrong, don’t include this in your Groovy calculation. I would argue that simple calculations probably don’t need this level of error handling, but more complex logic might be a candidate. The example above could obviously be handled with an if statement, but put it in context. It is used to illustrate the concept of try / catch / finally.