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.

June 23, 2016

Just one Elastic applet?

Oracle introduced wonderful elastic list applets with IP16,  this feature shrinks list applet size if there are no or less records needs to be displayed. However this doesn't always looks nice, specially in MVG applets and pick applets.
Default Elastic Applets in IP16
 
This feature can be turned off by setting "Enable Elastic Grid" system preference, but it is turned off for entire application. That makes me think is there any way we can make only one applet as elastic applet?  Answer is yes :)

Neel on Siebel Unleashed published beautiful trick to back port elastic applets into IP15. Absolutely splendid! This trick can be extended to make only few applets Elastic. 

To make all list applets Elastic add following in custom CSS file:
.ui-jqgrid-bdiv{max-height:340px !important; height:auto !important;}
To make only one applet Elastic (After turning of the system preference) add following CSS :
div[title="Line Items List Applet"] div.ui-jqgrid-bdiv { height: auto !important}

By preceding another div selector to the CSS rule we can instruct browser to apply CSS style only if applet name is : "Line Items List Applet". One can use this trick to change other UI attributes for specific applets and apply different styling.


Happy Styling :)

June 21, 2016

Siebel Tools and Windows 10

Those who have been following blog closely would know from my latest demo video that I have been using windows 10 and Siebel IP16 for experimentation.

One can easily install Siebel Tools and client on windows 10 and run it on Oracle XE with Sample database, however Siebel IP16 being a new release it has some quirks which are not very developer friendly.

Here are some problems that I get everytime:

1. All workflows by default are not valid :(
Workflow simulator will error out straight away even if there is nothing wrong with workflow. Validator might say workflow is not fully connected.
Workflow simulation on Windows 10

What's the fix? Just edit the workflow once and move around workflow steps. And then simulate again, this time it will work just fine.

2. Tools wont boot and authentication subsystem will reject your login.
An internal error has occurred within the authentication subsystem for the Siebel application. Please contact your system administrator for assistance.(SBL-DAT-00565)
SBL-DAT-00565

Oracle XE is either crashed or booting up just give it few minutes have a coffee or something.


3. Dedicated client wont start
A system error occurred trying to start the command 'siebel.exe /c "C:\Siebel\16.0.0.0.0\Client\BIN\enu\scomm.cfg" /b "C:\Program Files (x86)\Mozilla Firefox\firefox.exe" /u SADMIN /p SADMIN /d SAMPLE_XE /h'.(SBL-DEV-00127)
Cant start dedicated client.

Just run tools as administrator and you will be fine.

Hope it helps.

My current setup includes: Windows 10, Siebel IP16, Oracle XE, Oracle Virtual Box containing : Windows 2008 Server which is hosting  > MSSQL Server + IIS + Siebel Server IP16.

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 16, 2016

How to hide disabled buttons in Siebel Open UI?

With IP 15 and 16 Open UI themes have inclined towards bigger controls and more blank space on page, which is not bad thing but too much of it is making UI cluttered specially on small screens.

To fix this issue one can hide all disabled controls and all the white space around it. this can be done by simply adding following CSS and Open UI framework takes care of the rest.

button.appletButtonDis {
    display: none;
}

Further on to hide disabled menu items add :

li[aria-disabled=true]{
    display: none;
}

Siebel adds these classes and attributes to all the buttons on all applets and menus including new/query/delete icons to show them as disabled. Thus this change effects the entire application.

This post is contributed by esteem reader from down under via siebel-developers slack community. Register today to read more discussion like this.

June 06, 2016

Siebel Admin [Cheat Sheet]

I see many Siebel consultants(including me) searching web everytime to get correct syntax for Siebel server manager commands.

Although the syntax is so simple we still somehow manage to forget it :) I have created this cheat sheet from list of commands which I use day in day out. List contains command to increase log levels, shutdown startup components, creating components, starting server manager.

Feel free to download and print one for your desk.Download Here

Hopefully no more searching for commands to increase log level of siebel components :) cheers!

June 03, 2016

Siebel Integration Interview Questions - JMS Transport

This article only covers Siebel integration interview questions related to EAI JMS Transport , see Siebel EAI Interview Questions for other Integration interview questions.

Question 1: When should JMS be used over web services in Siebel integration requirement?

Answer: JMS queues are based on store and forward guaranteed delivery mechanism. That means source system sends the message to middleware which holds the message in queue until Siebel server reads it thus message is never lost.

However on other side web services doesn't have retry mechanism in architecture. In case of heavy load or server unavailability message can be lost if source system can't resend it. Benefit of using web services is that they are faster to develop, setup and maintain.

Question 2: How does JMS integration works in Siebel?

Answer : Siebel has JMS receiver server component which can pull XML messages from JMS queue for data transfer. For JMS components to get messages from JMS server Siebel needs to have JAVA installed on Siebel server.

Question 3 : What is the difference between queue and a topic of JMS?

Answer: Queue is is implementation of first in first out data structure, and can be used only between one source and one consumer. Once XML message is consumed by consumer it is deleted from the queue.


Topics also have queue like store and forward mechanism but with the difference that they do not delete XML messages immediately after it has been read, the same message can be read by another consumer (application). Thus well suited for 1 to many integration scenario.

Questions 4 : What steps are involved in JMS component setup in Siebel?

Answer:  Siebel JMS setup involves minimum three items :
- Setup of JVM (Java) subsystem
This tells where is Java files and server details of JMS server.
- Setup of JMS subsystem
This contains queue or topic information
- Setup of receiver component
This component pulls XML messages from JMS server mentioned in JVM sub system from queue mentioned in JMS subsystem.

Question 5: What is jndi.properties file? What it is necessary?

Answer: Java subsystem required for JMS integration required JMS server location information such IP address and port. This information is kept in jndi.properties file in Siebel filesystem.
It looks something like this: https://docs.oracle.com/javase/jndi/tutorial/beyond/env/src/jndi.properties

Questions 6: what kind of logging is available for JMS transport?

Answer:  EAI JMS Transport  provides two logging methods, first one is the traditional Siebel logs which can be turned on by increasing log level of receiver component.

Second type of logs are Java logs which generated by Java virtual machine installed on Siebel server , they can get turned on by setting VMOptions in Java subsystem.

See more Siebel EAI Interview Question

[Download] EAI JSON Converter v2

Pleased to bring you the complete EAI JSON Converter v2. It happened a lot sooner than I expected.
Siebel EAI JSON Converter

Below is the code which converts JSON string to property set. The heart of the code is eval statement, which converts the JSON string into eScript Object. 
Siebel eval statement

Remaining code is just the recursive traversing to convert object into property set. I have tested the code for couple JSON strings, it passed everytime with flying colours every time. Feel free to change the code as required. 

You can download the complete sif from git hub. https://github.com/Jimjson/eScript-based-EAI-JSON-Converter-


EAI JSON Converter Demo: 

How to force shutdown siebel server < 2ms

This is in continuation to my earlier post on How to shutdown Siebel server in less than 5 secs

And is suggested by a reader of this blog, who seems to be even more impatient than me(in a good way), and had automated the step to query Siebel server and step to use task kill command to bring down Siebel server as mentioned on my earlier post.

Final batch file looks something like : 

FOR /F "tokens=3" %%A IN ('sc queryex siebel_service_name  ^| findstr "PID"') DO (SET pid=%%A)
IF "!pid!" NEQ "0" (
taskkill /pid %pid% /f 
)


taskkill /im siebmtshmw.exe /f
taskkill /im siebmtsh.exe /f
taskkill /im siebsess.exe /f
taskkill /im siebprocmw.exe /f
taskkill /im siebproc.exe /f
Once executed with admin privileges, it brings down Siebel server at very instant. I have tested this, and it works beautifully.
Memory Release

Why this is faster than usual way? 
Usual way of bringing down service does memory cleanup and waits for long running processes to complete, gives some time to gracefully complete the tasks I think it copies the log files around as well.

However this batch file just pulls the trigger and knock down the server in one shot. There is a risk of data corruption, use it at your own risk!


If you have done something like this with Siebel which is not recommended but saves you time then please share it with us in comments section below.

June 01, 2016

Siebel EAI Interview questions - Web services

Question 1: What is the difference between outbound and inbound web services?

Answer: Inbound web services are hosted/served by Siebel and is invoked by external application to send data or to query data from Siebel.
Siebel Inbound Web Service

Outbound web services are web services which are hosted by external applications like SAP or Middle-ware and is invoked by Siebel workflows/business services to send or query data from external system.
Siebel Outbound Webservice


Question 2: What is WSDL?

Answer: WSDL stands for Web Service Definition Language. It's a standard for describing web service end point, it contains information about what all methods external system can call and what are input and output arguments for the service.
For Inbound web services Siebel dev team needs to provide WSDL, which is created from Adminstration Integration> Inbound Webservices view.
For outbound web-services external system like a billing system provides WSDL which is imported into Siebel.
Generate WSDL in Siebel

Question 3 : How WSDL is imported into Siebel?

Answer : Siebel inputs WSDL in two steps. Firstly WSDL is imported into Siebel tools which creates proxy business service and IOs for arguments.
WSDL Import in Siebel Tools

Second step involves creating web service end point in Administration integration> outbound web service which is done by imported by xml generated in first step.

Question 4 : What is filter business service in Siebel?

Answer: Filter business service is a custom business service which can be configured to be invoked at web service invocation just before or after actual workflow call. This service is used to handle custom soap headers of web service .

Question 5: What is SOAP Message? Which version of SOAP is supported by Siebel ?

Answer : SOAP Stands for Simple Object Access Protocol it is a XML format which exchanged by web services, SOAP 1.1 is supported by Siebel.

Question 6: When would you recommend using web services over queue based integration?

Answer: Web services should be used when business process can not wait for response from external system. For example : Order can not proceed without checking the inventory and user cannot wait before submitting order.

Question 7: What is the difference between EAI HTTP Transport and web services?

Answer : Web services is a HTTP based standard which uses WSDL to describe structure of input and output arguments and methods which can be invoked on server.
HTTP Transport can also be use to transfer data in and out if Siebel server however there is no description of input and output data structure and types.

Question 8: Can workflow be published as inbound web services?

Answer: Yes workflow and business service both can be published as web service in  Siebel.

Question 9: What is proxy business service in Siebel? and How does proxy BS works internally in Siebel?

Answer : Proxy business services are business services in Siebel which are created for each WSDL import in Siebel tools. Proxy business service converts in the input arguments into SOAP message and invokes HTTP transport to send data to external system.


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.

May 25, 2016

Guide to resolve Generic SSA NOTOK error message. SBL-DAT-00472

SBL-DAT-00472: Generic SSA NOTOK error message.

SSA NOTOK Error in Siebel

This error occurs in Siebel when there is some fundamental configuration mistake, like syntax errors or missing workflows or incorrect joins are configured. This error can be very difficult to fix, as it leaves very thin trace behind and there is no indication to start with. When I faced this error I narrowed it down by going through the most common reasons of this error and started to rule them out one by one.

Following is the list which I followed from various support web articles.


1. Deleted Workflows

Runtime events that are created automatically by workflow deployment have row id of workflow specified on them, and if that workflow does not exist in system then run time event can throw this error. To debug this turn on the personalisation logs and narrow down which runtime event is causing the trouble.

2. Explicit Joins on 1:1 tables

Someone has created explicit join based on 1:1 extention table and name of the join is same as the table name. For example table S_SRV_REQ1_FNX is extension table of S_SRV_REQ, so one should not create join in Service request BC with table S_SRV_REQ1_FNX to avoid getting this error.

3. Calculated Fields

This is the most common cause of this error. Any syntax mistake in calculation or calculation which compares a two different data types can result into SSA NOTOK Error.
For example following calculation will cause this error :
IIf ([Status] = 1, 10, 0)
This because the status field is DTYPE_TEXT and it is compared to integer value.

In my case I had a field in BC with syntactically incorrect calculation. Which was easy to find as it popped up as first thing in BC validation.


4. BC field Validations

This is another place where calculated fields can be referred and could cause this error. This might not error out every time as calculation might not be evaluated in all conditions. So do check field level validations as well when trying to fix this issue.

5. Run-time events or DVMs

Another place I would look for would be RTE and DVMs as they also use Siebel query language to identify records and validate things and any syntax goof up can cause this error to popup.

Another place you might get this error is while generating sample XML for BIP reports, this happens because application is not able to find the folder location specified in component parameter for XMLPReportDataDir .



Please feel free to share and discuss your experiences with this error in comments below.

April 29, 2016

7 Siebel Tools hacks every developer should know!

These are my favorite Siebel Tools tricks that I use day in day out. I thought of sharing this before good old Siebel tools is made completely obsolete by new "Siebel Composer". Would be good to compare this with composer features in future when it is fully developed and available.

Repository search

This is Siebel tools inbuilt search feature. It can be used to find all objects with specific keyword in entire repository. I use it to find the use of profile attributes in scripts or in calculated fields, search spec etc... Pretty neat.
To start search go to Tools> Search Repository
Enter keyword and click Search Now


It's not super fast but it's best way to be sure.

Alternative of genbscript.exe

I still meet few developers who run genbscript every time after compiling srf. There is much easier way to generate browser scripts available.

Scripting options

As shown above, one can configure tools to update browser scripts automatically after every compile.

Add multiple objects to one sif file. 

There is no need to create separate sif file for each object. After adding one object just leave the archive window aside and go to object explorer to pick another object and add to save archive.


Siebel sif files.

Create list of values from tools

Yes, One can create list of values from Siebel Tools. For this menu to appear your login needs to have Siebel administrator responsibility. I love this interface, it is so much better than Siebel client.


Compare objects 

Siebel Tools provide unique way of comparing objects, its not limited to comparing objects with a sif file. Once can compare two similar objects like two business components or applets in same repository or a different repository.

Compare objects in Siebel Tools

Copy items from one object to other

This is one of the neat hidden feature of Siebel tools. While comparing two objects one can use this feature to copy some objects from one object to other.

Button to copy items from one object to other
 As shown on press of button one can copy fields from one BC to other.

Bookmarks!

This is one of my favorite hack. I bookmark all the objects of projects that I am working on, it makes really easy to navigate back an forth without typing.

To bookmark any object list just open the bookmark pane and click the plus sign. And double click on the list to find the objects again, no typing required!

Siebel Tools Bookmark icons
Siebel Tools Bookmarks in Action
Shown above is my current bookmark list. I have bookmarked Order BCs(thin and thick :)), Quote BCs, and custom business services.

Some bonus keyboard shortcuts :


F7 to compile all objects
Cntrl + F7 compile single object
Alt + H + R about record
F5 starting Siebel dedicated client
Shift + F5 restarting Siebel dedicated client


Please +1 this post if you like this post and would like to see more like this in future.

March 27, 2016

Scenario based Interview Questions - Part 3

This is the third post in series of Scenario based Interview Questions . I would highly recommend you to read the first two parts of this series.

 Scenario based interview questions Config - Part 1
Scenario based interview questions Workflows - Part 2

If you like the questions and would like to see more like this, then please +1 this post on google.




Interview with Yvette Francino

Recently I came across a very talented IT Manager Yvette Francino, unlike any another project manager blogging is one of her passions. She has worked as manager for Siebel Projects and have been working in Agile from a quite a long time, she has spent time in coaching teams for Agile. I took opportunity for asking hers some questions regarding Agile and she kindly shared some very useful resources which can help new team members to get started with Agile.

Here is the interview.

Question : Please shed some light on your experience with Siebel. Were you a Siebel developer?

Yvette: I was a development manager at Sun Microsystems from 1999-2009. For a short time around 2000, I managed a team that was using Siebel. I took the training, but didn't have much more hands-on experience than that.

Question : As almost every Siebel project suffers from scope creeps and effort overruns due to un-planned tech issues. Do you feel Agile is not suited for Siebel Projects?

Yvette: Projects that typically suffer from scope creep are the ones that are best suited for Agile methodologies. The more you don't know up front (which is true of most software projects), the better suited an empirical model, such as Agile, is because it allows you to let your requirements evolve and become refined over time as you learn more.


Question: What are the most important things without which you will never run an Agile project?

Yvette: Agile training for everyone, including management, is important, so that everyone has a common understanding of the processes they are using. Retrospectives, in which the teams regularly assess what worked well, what could be better, and what they want to do differently in the next iteration are also important so the team continually improves.


Question: How to plan for project with relatively un-known area of development? Do you recommend any special technique?

Yvette: Again, the more unknowns there are, the better it is to use an Agile methodology so that learning more is part of the process. There are techniques called "spikes" that allow development teams to do "time-boxed stories" to allow them to learn more about the unknown area.  They could do a small proof of concept or prototype, for example, to discover more and reduce the level of uncertainty.

Question : After so much experience do you feel Agile is actually more expensive than SDLC methodologies?

Yvette:  It depends on a lot of things. It can be expensive to change all your tooling and processes, so if the organization is heavily invested in traditional methodologies, it can be quite expensive to change. On the other hand, studies show that Agile projects are more successful than traditional Waterfall projects, and, obviously, unsuccessful projects are very costly.

Question: Please share a conflicting situation you had on project and how did you gone about resolving it.

Well, in the Agile world, one common conflict might be disagreement about how long it might take to code something (or how many "story points" a user story is). One way to resolve this is to maybe have a "spike" story (as described above), or to make the story smaller so there are less unknowns.  (A "story" is a small unit of working code or what might thought of is a "requirement" that results in working code.)


Do you have any or recommend cheat sheet/mantra for Agile projects for newbies?

Yvette: There are so many Websites and classes available that it's hard to recommend one. Scrum is the most common methodology by far, and the Scrum Guide is available for free. I also think Mike Cohn is a great teacher and there are online courses available from his site, Front Row Agile. You might also check The Agile Alliance for resources. It would be good, though, if teams were learning from the same courses or resources, though, since there can be quite a bit of variation in opinions, terminology, and Agile methodologies.

I would recommend all Agile newbies to download the scrum guide and refer Agile Alliance to get your head around the buzz words of Agile.
Thanks Yvette for your time!!

March 24, 2016

How to shutdown Siebel server in < 5 seconds?

Getting late for lunch date with girlfriend and damn Siebel server won't stop. Ever been in such situation??

Well I have been. This is my actual story, don't worry I am not going tell stories about my partner, it's about our favorite Siebel server which sometimes won't come down for good 10 or more minutes, don't expect anything for starting up.

Before I tell you the trick how I made it to my date on time, let me warn you about the repercussions. It's highly dangerous way of shutting down the siebel server, don't try this in important environments, use it only if you have no regards for your employer. And be aware that this could corrupt your installation or cause data corruption.  But hey! do partners care? if you kept them waiting, you will have to face the music for entire year or more.

For the siebel people in love, this is what you have to do to get to your date on time:
  1. Open command prompt on Siebel server host(I have tried this windows host only).Get the process id (PID) of Siebel server by running this query:

    sc queryex siebelservicename
  2. And then run following queries in exact sequence by replacing PID found in output of above statement :
    taskkill /f /pid 10116
    taskkill /im siebmtshmw.exe /f
    taskkill /im siebmtsh.exe /f
    taskkill /im siebsess.exe /f
    taskkill /im siebprocmw.exe /f
    taskkill /im siebproc.exe /f
Voila ! Siebel server is down . If you are successful you will see memory getting free faster than ever, srf will  be available for update and you can start the Siebel server the way you like.
Siebel Server memory consumption
And will see output like:

Shutdown Siebel server by command line

If you like this post and would like to see more like this, then please plus one this blog.

March 22, 2016

How to use Siebel Product Configurator API in Workflow?

What is Product Configurator API? 
Siebel product configurator API is bunch of Siebel business services and methods which allows to add order item under a root customizable product which complies with rules and validations defined in product model.

It is much more cryptic and complex if one starts with the bookshelf.

@renjith shared this beautiful document on slack community.This example explains how we can invoke Siebel Configurator API in correct sequence to add line items in an order.
Product Configurator API in Workflow
In this example, workflow first creates new order and a order line item for root customizable product using Siebel Operation Step. And then it invokes Remote Complex Object Instance service(API) methods to add line item under the root customisable product.

Product Model used for demo :
Siebel Product Model
 Business Service executed in sequence are:

  1. ISS Copy Service :: Load EAI
  2. Remote Complex Object Instance :: LoadInstance
  3. Remote Complex Object Instance :: CreateSession
  4. Remote Complex Object Instance :: SyncInstance
  5. Remote Complex Object Instance :: UnloadInstance

Level of simplicity and details shown in the document is just awesome. Hats off to @renjith!!

Download the document from here. If document has been helpful, then please plus one this post to let @renjith know.

If you have similar articles and would like to share with all viewers then please let me now in comments below. I will be more than happy to share.

March 14, 2016

Scenario based Interview Questions - Part 2

This is the second post in series of Scenario based Interview Questions . I recommend you to read first post of this series where we discussed Siebel Configuration Interview Questions before going through this post.

If you like the questions and would like to see more like this, then please +1 this post on google.

March 10, 2016

Scenario based Interview Questions - Part 1

Long ago an avid reader of the blog requested me to post some scenario based interview questions, and sent some good samples as well. I asked the same on siebel-developers slack community and got some really good answers. This is a three post series so stay tuned for next two posts.


If you like the questions and would like to see more like this, then please +1 this post on google, and don't forget to share your answer in comments below.

March 06, 2016

Is siebelhub.com down?

Is siebelhub.com down ? Probably not. I am sure team is working hard to keep it up , by the time you will read it, site will be back up.

Today for siebelhub.com CDN and host keep erroring out every now and then :( You might see following error if that happens.

Server Error:
Siebel-Hub is down?
or Cloud flare :


I know the feeling, when you are in middle of doing something and best siebel resource "Siebelhub" goes down, bummer!

Today I am going to share tricks that I use to view offline sites. It's not specific to siebelhub.com and can be very useful.

Solution 1: Use wayback machine. 
This will be simplest  and the best solution to view any website in past point in time. Way Back Machine has cached copies of nearly all websites in world and copies are available to search quite easily. I found a good cached copy of siebelhub.com on : http://web.archive.org/web/20150130060038/http://www.siebelhub.com/main/blog

Solution 2 : Use chrome's offline mode
Use this solution if you are offline. Like other browsers offline feature is also available from chrome, however it is hidden in chrome://flags . Good part of this is that you can view cached websites from your mobile device as well.


Step 1
Step 2
Step 3
To enable cache views open chrome://flags on any device and enable show saved copy button. After this whenever you are offline you will be presented with an option to view the cached copy from your device. However it is not guaranteed that all the webpages you opened will be available in device cache.

BTW, Do you know chrome has on offline game and it starts when you click on the dinosaur?

Solution 3: Use https://www.httrack.com - Desperate Measure
Don't try this at home. This is an open source tool which copies the whole website to your local pc. and the data is cached on your device for as long as you want.

Hope it helps.

PS: Posted just for the love of information present on siebelhub.com. hats off to guys who built it.

February 28, 2016

SBL-DAT-00501 : Invalid search specification ' < ? > '.


We detected an Error which may have occurred for one or more of the following reasons:
Invalid search specification '<?>'. Please continue or ask your systems administrator to check your application configuration if the problem persists.(SBL-DAT-00501)



invalid search specification <?>
SBL-DAT-00501
This error can come out of the blue moon and can cause some serious time waste and frustration. I learned to resolve it the hard way. In my case it was only occurring in the dedicated client and same srf was working on server perfectly fine.

This is error doesn't mean there is problem in search spec in eScript or MVLs or BCs. It usually occurs when calculated fields is having issues.

Possible reasons for this error:

  1. Any type of syntactical mistake in calculated fields
  2. Presence of carriage return in any calculated fields
  3. Calculated fields declared as DTYPE_TEXT however they are compared in another calculated field as integer.

How to resolve it?

  1. Turn on the siebel logs to level 4 and try the scenario again. And search for the error code in log file. 
  2. Just above the error code you should see the calculated expression which is causing issue. 
  3. Now go to flat tab and search with this calculation to find calculated field. Once culprit is found, BC recompile after change does the job.

Hope it helps.