Thursday, August 21, 2014

Siebel Open UI - Back to School Series

Honestly, it has been a while since this time of the year meant 'back to school' for me. However, in my life - personally and professionally - school has never ended (and hopefully never will, just keep on learning).

This is essentially true when you make a living with enterprise IT systems such as Siebel CRM. As we all know, Siebel CRM reached a new evolutionary step with Siebel Open UI. On this blog, we have been spreading the news about Open UI from the beginning and as we are getting close to the 100th post on this topic, it seems worthwhile to pause, take a step back and look at the big picture.

A big picture...
In the following weeks we will look at several aspects of Siebel Open UI from a 'back to school' perspective. The main topics of the series are as follows:

  • Understand the Open UI architecture
  • What Open UI does for you (and what not)
  • Why you should learn CSS and JavaScript now
  • To script or not to script? Guess what!
  • A 'Hello World' physical renderer (and presentation model)

...and here is where you can join in. I am inviting all dear readers of Siebel Essentials to submit your requests for 'big picture' articles. Please find the comments and put your topics in. Please refrain from "I am trying to implement a whacky 3rd party plugin and fifteen hidden buttons and this is the error message I got" type of requests. There are plenty of posts on this and other blogs that deal with the nifty details of Open UI.

The series is intended to give you high-level but precise big-picture information, so that everyone benefits, whether they are already Open UI 'aces' or newbies.

have a nice day


Monday, August 18, 2014

From the Archives: Siebel Query Language And Julian Functions

Time for another 'blast from the past'. From August 2008, the below article covers the all-time favorite query language that is SQL, but not the SQL you think of now.


Romeo and Julia(n)?

About the Siebel Query Language

First of all, it abbreviates to SQL which is kind of funny, of course it has nothing to do with SQL.
Just like you can get more out of a spreadsheet application like Excel when you are familiar with its internal functions and syntax, you can get much more out of Siebel CRM if you are familiar with the Siebel Query Language.

Where is it used?

The answer to this question is very interesting, it is used almost everywhere when you define expressions. It is available in both Siebel Tools and the Siebel Web Client and since version 8.0 both the developement environment and the Web Client (that one since 7.0) sport an expression designer.

Expression Designer in the Siebel Web Client
click to enlarge

Expression Designer in Siebel Tools (since 8.0)

Here is a probably complete list of areas where you can use the Siebel Query Language:

Siebel Web Client
  • Predefined Queries
  • Conditional Expressions for Personalization Rules
  • Conditional Expressions for Runtime Events
  • Data Validation Manager rules
  • Data Map Editor
  • [Update] iHelp branching expressions

Siebel Tools
  • Calculated fields
  • Pre-default and post-default values for fields
  • Field Validation property
  • User properties
  • Expressions in Siebel Workflow and UI Tasks

Where is the reference?

The Siebel Query Language is documented in the Personalization Administration Guide of the Siebel Bookshelf.

An example:

The following is an example for a predefined query. The task is to filter the list of contacts so that it displays only persons that have their birthday in the current month.

Working with date fields can be tricky and you just can't type something like *June* in a date field. This is where the date functions, also known as julian functions come into play.

Our first choice would be the JulianMonth() function. This function takes a date field as a parameter and returns the julian number of the current month which is for example 80660 for August 2008. So the nerds among you will have quickly calculated this back and month #1 is of course January of 4713 BC.

If we want to query for persons who have their birthday in the current month, then the JulianMonth() function alone is not helpful because the return value for August 1968 is different from August 2008, so we need a way to extract the month number (1-12) from the date. This can be accomplished by multiplying the julian year number (6721 for 2008) by 12 and subtracting it from the julian month number.

So the equation is: # of current month = JulianMonth(Today()) - JulianYear(Today())*12

This equation will be the base for our query in Siebel CRM. So basically if we want to match the Birth Date field of a Contact with the # of current month, the query goes as follows:

JulianMonth([Birth Date])-JulianYear([Birth Date])*12 = JulianMonth(Today()) - JulianYear(Today())*12

Creating the predefined query:

Usually you can enter even complex queries directly in any control or list column of the applet (in query mode) but there are restrictions in field length and data type. So here is a way that always works.

Navigate to the Contacts List and save the current query (even an empty query would do).

click to enlarge

Navigate to Site Map -> Administration - Application -> Predefined Queries and retrieve your previously saved query.

Replace anything that might be between the two double quotes after 'Contact'.Search = with
JulianMonth([Birth Date])-JulianYear([Birth Date])*12 = JulianMonth(Today()) - JulianYear(Today())*12

So finally it looks like this:

click to enlarge

In the Household Contact view you can enter some birth dates and run your test in the contact List. I have added the Birth Date field to the Contact List Applet to verify.

List of contacts with a birth date in August
click to enlarge

have a nice day


Thursday, August 14, 2014

Siebel Open UI: As it Happened

If you follow the evolution of Siebel CRM (and this blog), you sure haven't missed Open UI. The latest patch set for IP 2013 bears the number 10 which makes it only 2 months to go for a full year since the last Innovation Pack. Sure you know that IP 2014 is in the making and there will be a lot to tell the round table as soon as it is generally available.

In the meantime, we witness that IP 2013 and Open UI get some good coverage inside and outside Oracle. Today I would like to point out some interesting blogs, articles and news on Open UI - just as it happened. Kudos to all people who are willing to sacrifice some of their private time to share these valuable tidbits of information to make Open UI a success.

Blogs of Note

I am glad that the blogosphere is steadily picking up Open UI. You should bookmark Oracle's Jeroen Burgers blog "Oracle Implementation Advisor". He recently published great articles such as on smooth view transitions and worked with fellow blogger Neel from Siebel Unleashed on enabling the scroll wheel for list applets.

Our good friend Richard Napier from On Demand Education has - in his very own humorous ways - recently documented the Mobile Disco Client with blog posts and videos.

Jason from Impossible Siebel was one of the first to blog about Siebel Open UI and his articles never leave out the prickly technical details - and challenges.

But it's not all fun and games. Rightfully so, problems with Open UI must be pointed out as well, just as Oli recently did on his Siebel Tech blog.

Oracle partner companies like boxfusion consulting or ec4u are specializing and blogging on Open UI as well.

Of course there are even more people contributing to the growing field of Open UI knowledge such as Prasanth from the dedicated Siebel Open UI blog.

If you feel missed out and want your blog listed here or in the Siebel Essentials blogroll, please find the comments.

Update: Please welcome Shiv and his Siebel & Open UI blog to the community.

Oracle Community

With more and more projects and consultants ramping up on Open UI, the Oracle Community (aka forums) is quickly growing into an interesting resource for all things Open UI.

My Oracle Support

For those among us who have access to My Oracle Support, we can feast on the latest alerts, newsletters, service requests and the Open UI Info Center.

have a nice day


Monday, August 11, 2014

Siebel CRM Patchset 10 for Innovation Pack 2013 is Available

Last week, Oracle made the latest patch set / available for download on My Oracle Support.

As with other patch sets, this one contains a lot of bugfixes for HI, SI and Open UI applications and is of course cumulative.

As usual, the patch set comes with a "Read Me" link which leads you to the accompanying detail information which also contains descriptions of the resolved issues.

(All links require a valid account for My Oracle Support)

have a nice day


Thursday, August 07, 2014

Let's Give Incentive Compensation a HUG

This humble writer is currently in the student seat and enriching his training portfolio with Oracle Sales Cloud: Incentive Compensation (formerly known as Fusion Incentive Compensation).

As usual, I like to start a learning path with a H.U.G. (Hopefully Useful Graphic). Here it is without further ado.

In the diagram we can discern many entities which compose the data model for Oracle Sales Cloud Incentive Compensation. Let's quickly describe each of them:

Compensation Plan: This is the overall container. Most importantly, we assign participants (commission/bonus recipients) directly or indirectly - using roles - to the compensation plan.

Plan Component: A compensation plan contains at least one plan component. This reusable entity defines the overall logic of the calculation. The logic is defined within the following reusable entities.

  • Performance Measure: This reusable entity allows us to define the basis for the bonus or commission payment. For example, this is where we define the attainment goals for each period and the credit categories which are used to classify transaction for a specific payment.
  • Rate Table: The other main building block of a plan component are rate tables. Imagine rate tables as lookup tables. For example, when a salesperson has achieved 70% of the sales quota in the period, the rate table defines how many percent (or total pay) the sales rep will receive in commission or bonus.

The following screenshot shows an example performance measure and its goal definitions for each period.

Click to enlarge.
Expression: Calculations for Incentive Compensation can become quite complex. The Expression entity allows compensation plan admins to define a formula once and reuse it across the data model.

Classification Rule: When a revenue transaction is processed, it needs to be "classified" in order to determine whether the transaction will incur additional payments for the salesperson. This logic is stored in the classification rules.

User Interface and Oracle BI Integration

The compensation plan administration is implemented in a nicely structured work area in Oracle Sales Cloud (see above screenshot).

End users - individual salespersons and their managers - can view information about their and their team's compensation using dashboards which are driven by Oracle Business Intelligence.

The above screenshot shows the 'My Team's Compensation' dashboard which nicely demonstrates the data visualization prowess of Oracle BI within Fusion Applications *err* Sales Cloud.


Oracle Sales Cloud Incentive Compensation cannot deny its ERP heritage. Stemming from the Oracle eBusiness Suite offering, it has found its place in the Sales Cloud (former Fusion CRM) product line. Regarding extensibility, Flexfields (the extensibility vehicle for all non-CRM product lines) are used rather than Application Composer.

More Information 

For more information on Oracle Sales Cloud Incentive Compensation, here are some resources:

have a nice day


Monday, August 04, 2014

Oracle BI 11g: Verifying Logical Table Sources in Analyses

Inspired by a nice instance of the Oracle BI 11g Build Repositories class I delivered last week as an LVC, I decided to share a little trick with you.

What if we could verify the name of the logical table source in Answers (aka "Analysis Editor")? For example, when you create multiple table source for aggregates or partitioned data, it is important to verify your implementation.

I found the following procedure to be quite helpful with that.

Create a new logical column that displays the name of the logical table source.

Within your logical dimension or fact, create a new logical column and map it (physically) in each table source. As the expression use a string identifying the logical table source. Just as in the screenshot below.

Click to enlarge.
In the above example I specified 'LTS2 F2 Revenue Aggregate' (the exact name of the LTS) as the constant value for the new column. This specific LTS is mapped to an aggregate fact table at the quarter level. In the other logical table sources, I do the same but of course using the name of the respective LTS.

Next, I exposed the new column in a separate presentation table, just to make it easier to control the visibility of these 'developer tools'.

After deploying the RPD, we can now expose the 'LTS column' in our analyses.

Click to enlarge.
The above analysis shows the revenue per quarter (within the boundaries of the aggregate table) and the LTS column proves that the LTS for the aggregate table is used.

Next is the same analysis after a drill down to the month level (not available from the aggregate table).

As we can see, the LTS column displays the name of the LTS that maps to the detail table.


Knowing which LTS(s) are used while testing OBIEE is adding more Intelligence to your BI.

have a nice day


Thursday, July 31, 2014

Oracle BI 11g: I Don't Like Mondays

To be honest, I like Mondays. And it's Thursday. But it made such a catchy title ;-)

This article will show you how to hide Oracle BI 11g Presentation Layer objects on Mondays, hence the title.

Introduced in OBI (or so), we can define a conditional expression to control whether a presentation layer object (Subject Area, Presentation Table, Presentation Column) should be visible to the end user or hidden.

The property is called Hide object if. As per the documentation, we can use the field in three ways.

  • Enter a constant: 0 (zero) will display the object. Any non-zero value will hide the object.
  • Use a variable: Initialize a (session) variable and use it in the expression. Again, if the variable value is 0 (zero), the object will be visible, otherwise it will be hidden.
  • Provide a comparison: You can use a limited set of functions and operators to evaluate conditions. For example, the following expression will be 'true' (or non-zero) when the current day is a Monday.

DayOfWeek(Current_Date) = 2

The Current_Date function returns the current date and the DayOfWeek function extracts the number of the weekday (starting at 1 for Sunday, hence 2 for Monday).

In the above screenshot, you can see that I entered the expression for the Products presentation table. It obviously was a Monday because in Answers (aka 'Analysis Editor') the table is actually not visible.


The Hide object if expression allows Oracle BI developers to construct conditional logic to hide presentation layer objects.

have a nice day


Monday, July 28, 2014

Siebel Nostalgia: 5 Years Ago

It has become a habit of mine to provide you with some 'blasts from the past' from time to time. This is not because I have grown lazy (believe me, there's a lot of writing these days ;-) but to serve the 'younger' generation of Siebel Essentials followers who might not have had the opportunity to read all the posts (does anyone ever scroll down that far to the blog archive?).

5 years can make a big difference in the IT world and there's much that becomes obsolete. But when I was looking for a nice article from July 2009, I had a hard time deciding which one I should elicit for a re-post.

So I thought I let you pick and choose from a list of well-ripened articles from the summer of 2009 and let you decide which you like best. I picked the ones which are still relevant today (most probably).
happy reading


Thursday, July 24, 2014

Asynchronous Business Service Invocation in Siebel Open UI

With Innovation Pack 2013, the Siebel Open UI API provides the possibility to invoke business service methods (and methods in general) asynchronously.

This is documented (here too) and my friend Neel from Siebel Unleashed was the first to blog about this exciting feature.

Today I would like to share with you how I put this new feature to good use. Do you remember the "Sortable Screen Tabs" series from last summer (has it really been one year already)?

Recently, I was revisiting the code and the way it invoked the business service which modifies the Tab Layout data. This is the "original" code to instantiate and invoke the service.

var oSvc = SiebelApp.S_App.GetService("AHA Tab Layout Service");
var inPS = SiebelApp.S_App.NewPropertySet();
var outPS = SiebelApp.S_App.NewPropertySet();
inPS.SetProperty("sTabs", tabarray.toString());
outPS = oSvc.InvokeMethod("SetTabLayout", inPS);

When I look at the above code today, I must confess it is pretty traditional. The code wouldn't be any different in a browser script from 2002, and even in eScript, the concept is the same albeit with some minor differences.

My latest code version looks like this:

var oSvc = SiebelApp.S_App.GetService("AHA Tab Layout Service");
var inPS = SiebelApp.S_App.NewPropertySet();
inPS.SetProperty("sTabs", arrTabs.toString());
//nothing new until here, but where's the output PS?
   var config = {async:true,scope:this,selfbusy:true};
   //wait a minute, what's this?
   oSvc.InvokeMethod("SetTabLayout", iPS, config); //but how?

Needless to say, it still works but the user can continue to work even while the business service is still running. The new and exciting stuff is the configuration object which we can use to pass runtime information to the Open UI proxy layer which sends the AJAX request to the server.

This config object has the following properties (Bookshelf documentation here):

  • async: this is the magic one. When set to true, the invocation will be done asynchronously, allowing us to continue with the remaining code immediately. When set to false, we will have to wait (synchronous invocation) until the service returns.
  • scope: set to 'this' always (so says bookshelf).
  • selfbusy: display the 'busy cursor' on the screen (false) or not (true).

As you can see I used the above properties in my code to invoke the business service method asynchronously without displaying a 'busy cursor' so end users do not notice anything.

Call Back Later

But the goodness does not stop here. My example business service does not return anything. But what if you have to pick up the output property set and process it? Clap your hands for the callback functions.

Let's have a look at the following config object:

var config = {};
config.async = true;
config.scope = this;
config.cb = function(){
   var outPS = arguments[2];
   if (outPS!== null){
      //parse output property set

The cb ('callback') property defines a function which will be invoked when the method invocation is complete. For business service method invocations we can pick the output property set from the arguments array (it's the third array item, hence the [2] index).

And there's even more...

For error handling, use the errcb property (similar to cb) to specify a function which will be invoked when the AJAX call fails.

The documentation also mentions an opdecode property but is pretty stumm about what it does exactly (decode or not decode the AJAX reply).

Finally, there's the mask property which (when selfbusy is set to false) allows us to control the screen masking during the method invocation.


Applet methods, business service methods, you name it. The Siebel Open UI framework is truly innovative and allows developers to gain complete control over what happens when.

have a nice day


Monday, July 21, 2014

BI Publisher Advanced RTF Techniques

Whenever I have the opportunity of teaching BI Publisher, be it the "stand-alone" BI Publisher Fundamentals class or the Siebel BI Publisher Reports class, I especially enjoy the chapters on RTF Templates.

As an extra service to my students (and now to the greater public), I have put together a simple RTF template which showcases more advanced RTF template techniques. This file and other hopefully useful examples are available here.

Ever wanted to have a BIP report with table of contents?

When you download the archive and open it, you might want to start with the BI Publisher Advanced Template Formatting.rtf file and open it in MS Word. If you have BI Publisher Desktop (aka Template Builder for Word) installed, you can load the sales.xml sample file and start generating previews (see the PDF output above).

The RTF file contains several examples and explanations such as:
  • Table of contents / bookmarks
  • Sub-templates for header and footer (uses the HeaderFooter.rtf file which must be reachable)
  • Working with shapes
  • Checkboxes
  • Conditional formatting
  • Page totals
  • Dynamic Excel output
  • Variables
The archive also contains example output files in case you don't have access to BI Publisher Desktop. In addition, you will find several other example files in the archive.

Make sure you also check out the splendid BI Publisher tutorials and other resources which I compiled here.

have a nice day