Showing posts with label eScript. Show all posts
Showing posts with label eScript. Show all posts

February 14, 2020

How caching work in Siebel?

In any online transaction processing system like CRM most of the processing time is taken in finding the right record in database. No matter what database optimization technique you implement, your db processing time would be the highest among the time spent in web server and application server.
Siebel Database

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.

June 17, 2016

Scriptless Challenge : How to constrain association list applet dynamically?

Association applet let's you associate records from an existing list of records. Unlike pick applets these association list applets doesn't have any out of the box way of constraining records.

Consider scenario: When opportunity type is internal, system should only show internal marketed products for opportunity in product association list applet and for opportunity type external system should show only external marketed products. Products are marked as internal and external by product type field.

Challenge: According to oracle there is no other way then scripting on web load of association applet to filter the records. Script can look something like following. And it works flawlessly.

Can you suggest any script less alternative?

function WebApplet_Load ()
{
var BO;
var ParentBC;
var BC;
var AccountId;
BO = TheApplication().ActiveBusObject();
ParentBC = BO.GetBusComp("Opportunity");
if(ParentBC.Name = "Opportunity")
{
    AccountId = ParentBC.GetFieldValue ("Account Id");
    BC = this.BusComp();
    with (BC)
    {
        ClearToQuery();
        ActivateField("Account Id");
        SetSearchSpec ("Account Id", AccountId);
        ExecuteQuery();
    }
}
ParentBC = null;
BC = null;
BO = null;
}


June 01, 2016

EAI JSON Converter - v2 (No Java)

I published EAI JSON Converter business service based on Siebel Java business service back in 2013, and many people seemed to like it and implemented it. See the old post here. It was great to see that code getting implemented in production by many people. Surprisingly equal number of people faced difficulty in implementing the Java business service which is required to get EAI JSON Converter working.

Thus I started working towards removing dependency on JAVA business service and created complete eScript based solution as ver2 of EAI JSON Converter business service.
Generate JSON in Siebel without Java


This service will have the same methods and arguments, and will outputs similar JSON string and property set as previous version did but without the need of JDK. It is complete plug and play service, just copy paste the code and start using the service.

function CreateJSON(Inputs){
/*********
Created By: Jim
Support: http://howtosiebel.blogspot.com
*********/
    var str,j;
    var propName = "";
    var propVal = "";
   
    str = "{";
   
    propName = Inputs.GetFirstProperty();   
   
    //Type and value
    if(Inputs.GetValue() != null && Inputs.GetValue() != ""){
        str = str + '"' + Inputs.GetType()  + '"' + ":"  + '"' + Inputs.GetValue() + '"';   
        if(propName != "") str= str + ",";
    }
   
   
    //Properties
    while (propName != "") {
        propVal = Inputs.GetProperty(propName);
        str = str + '"' + propName +  '"' + ":" + '"' +propVal + '"';
        propName = Inputs.GetNextProperty();
        if(propName != "") str = str + ",";
       
    }
    propName = Inputs.GetFirstProperty();
    if(propName != "" && Inputs.GetChildCount()> 0)str = str + ",";
   
    //Loop for child
    if(Inputs.GetChildCount()> 0){
    if(Inputs.GetChildCount()> 1)str = str + '"Object"' + ":" + "{";
    for (var i = 0; i < Inputs.GetChildCount(); i++){
            j = Inputs.GetChild(i);
            str = str + '"' + j.GetType() + i + '"' + ":" + CreateJSON(j);// + ",";
            if(i+1<Inputs.GetChildCount()) str =str + ",";
    }
    if(Inputs.GetChildCount()> 1)str = str + "}";
    }
    str = str + "}";
    return str;   
}
Hope the code is self explanatory. Feel free to edit it for your implementation. I have tested the output and validated for RFC4627.

Creating JSON string from property set was easy I traversed through the property set using out of the box Siebel methods and created the string. Creating propset from JSON proved difficult, I am still working on solution for interpreting JSON and converting it into property set, I have made some progress will post it as soon as it is working satisfactorily.

If you want to contribute in nobel cause then contact me via comments below and don't forget to plus one this post on Google. All comments are welcome.

February 28, 2016

Dynamically change start-up view for group of users

Requirement: To have a different start-up view for certain group of users in application.

Siebel sets start-up view of all the users using Application property which is a static view and the only way default view can be changed is by end user by updating user preferences. 

Solution: To make the view dynamic and override the user preferences following script can be added to Application_Start event of Application to redirect all the users to a specific view based on their responsibility.  These views can be used to show statuary information or terms and conditions.

Script queries Employee BC for logged in user and search for specific responsibility and executes a go to view if specific responsibility is found. Similar script can be used to change other part of the application. Feel free to share in comments below if you have come across similar behavior in your implementation.

var EmployeeBO = TheApplication().GetBusObject("Employee");
var EmployeeBC = EmployeeBO.GetBusComp("Employee");
var userResp;
with (EmployeeBC)
{
ActivateField("Login Name");
ActivateField("Responsibility");
var UserName = TheApplication().LoginName();
SetSearchSpec("Login Name", TheApplication().LoginName());
ExecuteQuery(ForwardOnly);
if(FirstRecord()){
userResp = GetFieldValue("Responsibility");
}
return (CancelOperation);
}
if( userResp == ""){
{
TheApplication().GotoView("");
}else{
return (ContinueOperation);
}


Hope it helps