January 19, 2020

How to calculate age from date of birth using calculated fields?

Hi Readers,

This is a new series, where I will show you how things are done in Siebel and how the same thing can be done in Salesforce. Will leave the decision upto you to tell me which one is easier and which one is better.

Step 1: Create first calculated field to output date in YYYYMMDD Field Type: DTYPE_NUMBER
    ToChar(Today(),’YYYY’) + ToChar(Today(),’MM’) + ToChar(Today(), ‘DD’)
Step 2: Create second calculated field to convert birth date field in YYYYMMDD  : Field Type: DTYPE_NUMBER
    ToChar([Date Of Birth], ‘YYYY’) + ToChar([Date Of Birth], ‘MM’) + ToChar([Date Of Birth], ‘DD’) 
Step 3 : Create another field to use the fields created above as : Field Type: DTYPE_TEXT
    The Under Age flag : IIf(([Step1] – [Step2]) < “180000”, “Y”, “N”)

We are doing these three steps mainly because :
  1. Siebel does not have good list of functions supported in calculated fields. 
  2. Siebel does not have data type conversion in calculated fields. 
Lets don't refer to invoke service method due to its own complication and performance issues it can cause.


In Salesforce if you have to do this activity, you just need one formula field with following calculation.

IF( NOT( ISBLANK( Birthdate ) ) ,
  IF( DATE( 2000 , MONTH( Birthdate ) , DAY( Birthdate ) ) <= DATE( 2000 , MONTH( TODAY() ) , DAY( TODAY() ) ),
     YEAR (Today()) - YEAR ( Birthdate ),
     YEAR (Today()) - YEAR ( Birthdate ) -1 ),
  null)


Learn more about list of functions available in Siebel here: https://docs.oracle.com/cd/B40099_02/books/ToolsDevRef/ToolsDevRef_Operators8.html

and Full list of salesforce functions are here: https://help.salesforce.com/articleView?id=customize_functions.htm&type=5


January 16, 2020

State of Siebel in 2020?

Hello Readers,

It has been a while since I have posted on this blog. I have moved on from Siebel the second time. Still see some of my friends working in Siebel and keep getting furious.

Just wondering what are my readers are doing in 2020? Please take some time out and let us know the actual state of Siebel this year.


Live results





Many things have happened since I last posted.
Siebel unleashed vanished :(

via GIPHY

No more posts on Impossible Siebel :(

via GIPHY

No more posts on Siebel Mantra :(

via GIPHY

And such a once a wonderful blogging community just vanished.

I have stopped reading siebelhub.com,  hope it is doing great. I hope you all are doing great. Would love to read your comments and connect.





 -Jim

December 21, 2016

Gift yourself salesforce skills this holiday season!

Either you are seasoned Siebel developer or just starting struggling with Siebel, I am sure learning salesforce would have crossed your mind. No doubt Siebel is the best full fledged CRM product out there, but there is no harm is learning new stuff.

I have set a challenge for myself to learn salesforce this holiday season and seriously try for salesforce consulting job roles in the new year. I want to invite all How To Siebel readers to join me in journey and learn salesforce together.
Salesforce Unleashed

I am going to learn salesforce by myself by going through trail head and online tutorials, and going to share my progress on my new blog
http://salesforce-unleashed.blogspot.com 

To make it easy please follow my latest posts :
How to get started with salesforce
Screen cast of earning first trail head badge.
Question and Answers

At last I will leave you with a quote from Dr Seuss



And recommend you to come and follow me on my new Salesforce Unleashed blog and keep up with my salesforce learning plan.

Override windows idle timeout!

As a Siebel Consultant you must have come across windows machines with extremely short idle timeout. I guess I am not the only one who hates to type in password again and again, situation becomes worst when machine logs off or gets powered off due to idle session timeout!!

Out of frustration, I started to hunt for a solution. Keep in mind I don't have privileges to change setting on the OS.

December 12, 2016

How to hide an applet conditionally in Siebel Open UI??

While working on Siebel Open UI - UX improvement projects numerous times we need to access data through PM and PR layer without showing data to user.
For such requirements you just wish if it was possible to have applet in view with all the required fields and methods you need, but just shouldn't show up on UI.


Well that is possible, there are two ways to handle this on the client side.

December 08, 2016

How to find the siebel log files using command line?

While working on Siebel projects you must have come across numerous occasions where you need to find specific log with specific error or any one user name or any one xml value which is causing trouble.



Usually this type of task involve tedious task of opening all the log files during the time duration one by one. 

November 11, 2016

Date Manipulation in Siebel eScript

We have seen how to manipulate date values in Siebel Workflows. In this post we will see how can we work with date variables in Siebel eScript and use them to work with date fields.

I am not the author of these functions, It is just collection of useful functions that I have implemented in few projects. Please feel free to share your coding tricks for date variables in comments below.

Date Functions in Siebel eScript
Date Functions in Siebel eScript

How to add days to a date?


function AddToDate(sourceDate, nDays, nHours, nMinutes, nSeconds, nsign)
{
   // sourceDate  :  Date object
  // nDays, nHours , nMinutes , nSeconds  :  Integer numbers
  // nsign : Can have two values : 1 or ­1
  //             1 indicates to ADD to the sourceDate
  //            ­1 indicates to SUBTRACT from the sourceDate
  // Returns : A date object, after adding/subtracting
  // ndays,hNours,nMinutes
  //          and nseconds to the sourceDate.
  var retDate = sourceDate;
  retDate.setDate(retDate.getDate()+nsign*nDays);
  retDate.setHours(retDate.getHours()+nsign*nHours);
  retDate.setMinutes(retDate.getMinutes()+nsign*nMinutes);
  retDate.setSeconds(retDate.getSeconds()+nsign*nSeconds);
  return (retDate);
}

 How to find difference of days between two dates?

function DiffDays(date1, date2)
{// date1 : Date object
// date2 : Date object
// Returns : Number of days between date1 and date2
return ((date2.getTime()­ - date1.getTime())/(1000*60*60*24));
}

How to convert date object to String?

function DateToString(dDate)
{
  // dDate  :  Date object
  // Returns : A string with the format "mm/dd/yyyy" or "mm/dd/yyyy
hh:mm:ss"
  var sMonth = ToString(dDate.getMonth() + 1);
  if (sMonth.length == 1) {sMonth = "0" + sMonth;}
  var sDay = ToString(dDate.getDate());
  if (sDay.length == 1) {sDay = "0" + sDay;}
  var sHours = ToString(dDate.getHours());
  if (sHours.length == 1) {sHours = "0" + sHours;}
  var sMinutes = ToString(dDate.getMinutes());
  if (sMinutes.length == 1) {sMinutes = "0" + sMinutes;}
  var sSeconds = ToString(dDate.getSeconds());
  if (sSeconds.length == 1) {sSeconds = "0" + sSeconds;}
  if (sHours == "00" && sMinutes == "00" && sSeconds == "00")
    return (sMonth +"/"+  sDay +"/" + dDate.getFullYear())
  else
    return (sMonth +"/"+  sDay +"/" + dDate.getFullYear() +"
"+sHours+":"+sMinutes+":"+sSeconds);

}

  How to convert String to Date Object?


function StringToDate(sDate)
{
  // sDate  :  A string with the format "mm/dd/yyyy" or "mm/dd/yyyy
hh:mm:ss"
  // Returns : a Date object
  var ArDateTime = sDate.split (" ");
  var  ArDate = ArDateTime[0];
  var  splitDate = ArDate.split ("/");
  var nDay = ToNumber(splitDate[1]);
ar nMonth = ToNumber(splitDate[0]);
  var nYear = ToNumber(splitDate[2]);
  if (ArDateTime.length == 1)
     return (new Date(nYear, nMonth­1 , nDay))
  else
  {  var ArTime = ArDateTime[1];
      var splitTime = ArTime.split(":");
      if (splitTime[0]=="00" && splitTime[1]=="00" && splitTime[2]=="00"
)
            return (new Date(nYear, nMonth­1 , nDay))
      else
      {
            var nHours     = ToNumber(splitTime[0]);
            var nMinutes   = ToNumber(splitTime[1]);
            var nSeconds = ToNumber(splitTime[2]);
            return (new Date(nYear,nMonth­1,nDay, nHours, nMinutes,
nSeconds))
      }
   }
}

How to find records created in past 5 days? 

var dToday = new Date();
var FiveDaysAgo =  AddToDate(today,5,0,0,0,­1);
var bo = TheApplication().GetBusObject("Service Request");
var bc = bo.GetBusComp("Service Request");
bc.ActivateField("Description");
bc.ClearToQuery();
bc.SetViewMode(AllView);
bc.SetSearchSpec ("Created", ">= " + "'" + DateToString(FiveDaysAgo)
+ "'");
bc.ExecuteQuery();
TheApplication().RaiseErrorText(bc.CountRecords());

How to compare two dates?

function CompareDates(dte_from,dte_to)
{
/* Function to compare two dates.. will return 1 if dte_from is greater than dte_to else will return 0 */
var myM = ToInteger(dte_from.getMonth()+1);
var myD = ToInteger(dte_from.getDate());
var myY = ToInteger(dte_from.getFullYear());
var toM = ToInteger(dte_to.getMonth()+1);
var toD = ToInteger(dte_to.getDate());
var toY = ToInteger(dte_to.getFullYear());
if ((myY < toY)||((myY==toY)&&(myM < toM))||((myY==toY)&&(myM==toM)&&(myD < = toD)))
 {
  return(0);
 }
else
{
  return(1);
}
}

How to find if date is a future date?


function IsFutureDate(mydate)
{
/*
 *  Function to check if a date is greater than today
 *  Returns 0 if Current Date is larger
 *  1 if Passed Variable is larger
*/

var istoday = new Date();   
var myM = ToInteger(mydate.getMonth()+1);
var myD = ToInteger(mydate.getDate());
var myY = ToInteger(mydate.getFullYear());
var toM = ToInteger(istoday.getMonth()+1);
var toD = ToInteger(istoday.getDate());
var toY = ToInteger(istoday.getFullYear());
if ((myY < toY)||((myY==toY)&&(myM < toM))||((myY==toY)&&(myM==toM)&&(myD < = toD)))
 {
  return(0);
 }
else
{
  return(1);
}
}

** Code is provided for conceptual purpose only, please test the code explained throughly before implementing in production environment.

July 09, 2016

How to add delay in Siebel eScript/Workflow?

Disclaimer: Ideally you should never have to create delay in Siebel, you must be doing something absolutely wrong or something amazingly innovative if you have to add delay in Siebel script or Siebel workflows.
How to add some delay in Siebel Script?

Let's assume for some(god forbid) reason you need to create delay of some seconds in Siebel escript or workflow, then how will you do it? 

Siebel provides sleep step in workflows that can be used to create delay for interactive workflows, but there is no way (documented) to create delay for service workflows or in scripts. Let's see what workarounds do we have.

Solution 1: User operating system timeout in script. 

Siebel can invoke operating system commands by Clib.system function, these functions wait till time command is successfully completed by operating system. 
Clib.System("timeout 2"); // Two second delay in windows hosted environment

or 
Clib.system("sleep 2"); // Two second Linux hosted environment.

This instruction will call operating system timeout command to create delay and Siebel will wait for command to finish and only after the specified time Siebel will continue with rest of the code. 

Solution 2:  Use EAI File Transport service to read an non existent file and with FileSleepTime parameter to create delay.

This will cause Siebel to wait for file for at least time specified before timing out, an then proceed with workflow. Make sure you use exception branch in for this step to proceed.

Solution 3:  Use asynchronous server request business service to execute subprocess at specified time in future. 
This solution doesn't garuntee the execution on that time, but works perfectly fine incase there is some degree of tolerance.

July 07, 2016

How to customize siebel error messages?


With IP14 Oracle has provided ErrorObjectRenderer.js to replace browser based dialogs with jQuery based dialogs. Problem with browser based dialogs is that users can accidently disable them. Thus it is not a good place to show error messages or important instructions to the user. 
Standard alert()
However jQuery based dialogs always shows up on the screen and user have to click ok always to get past them.
jQuery Dialog

Lets see how we can achieve the same functionality in IP13.  

Open UI framework uses browser alert() function to popup error messages. In Javascript it is possible to override any function including browser native functions like alert and change it according to the business needs.

Simplest way to override alert is to define a function alert() in your code, this will force your browser to call your custom function all the time whenever Siebel calls alert() instead of browser's native function. .

function alert(str){
 $("<div id='my_error'>" + str + "</div>").dialog({
               modal: true,
                buttons: [{ id: "btn-accept",
                    text: "Ok",
                    click: function () { $(this).dialog("close"); }               
                }]
            });
}

Just add the above code in post load file and job done, after executing this code all the error messages will shown in jQuery dialog which will always pop-up. See it in action on codepen

Happy alerting ! 
This is trick is shared by avid reader TJ, please share your tips and tricks in comments below.

July 03, 2016

WebServices Performance Tuning



Recently I have been working on high traffic and highly available web service which is hosted by Siebel. I was asked to improve performance of it. I checked all the places for any performance degradation clues, there was hardly any, all queries were on indexed columns and thin BC's were used, there was no fat whatsoever.

With all the logs and spool generation my focus went to these two problems. 

1. Before every web service call Siebel was requesting file system to write read user preference file which was taking fair bit of time due to contention at file system. You might see following in logs, if user preference file is corrupted.



ObjMgrLog Debug 5 0 2016-06-29 06:50:56 SharedFileReader: \SiebelFS\userpref\EAIUSER&Siebel Sales Enterprise.spf: Open iteration 0 failed. errcode = 2.


This file read was absolutely unnecessary, luckily there was a way to turn off by setting "OM - Save Preferences" to FALSE for EAI object manager. This will make all logins to avoid looking up for user preference file.

2. Another useless transaction I noticed was with database. It was when Siebel tries to update the last login date on S_USER record. 
In logs you can see queries like these:

UPDATE SIEBEL.S_USER SET
LAST_LOGIN_TS = :7,
MODIFICATION_NUM = :8,
LAST_UPD_BY = :9,
LAST_UPD = :10,
DB_LAST_UPD = current_date,
DB_LAST_UPD_SRC = :11
WHERE
ROW_ID = :12 AND MODIFICATION_NUM = :14;
This can also be turned off in recent Siebel versions by setting DisableLastLoginTS = TRUE 

Its a new parameter introduced by Oracle, you can read more about this parameter on oracle support 1665762.1

Hope it helps. If you have come across any such parameter which can improve performance then please share it in comments below.