Wednesday, December 29, 2010

Session TimeOut

An idle mind is Devil's workshop...an orphaned session is inefficient resource allocation...

"SessionTimeout" is one of the parameters in the eapps.cfg that is more to do with competent usage rather performance. This specifies the time in seconds when the session times out in case of inactivity. The larger the value the longer it takes for the orphaned session to timeout. Orphaned sessions are undesirable beacuse they occupy AOM task slots preventing other users to use that slot.

There are instances when session never times out despite setting this parameter. Following parameters should be kept in mind before setting SessionTimeout parameter.

1 - "Application Message Bar Update Interval"

This parameter is used in Message Broadcasting feature. The value of this parameter should be set to greater than the SessionTimeout parameter.

2 - "Alarm Manager Load Frequency"

The "Alarm Manager Load Frequency" system preference determines how frequently the calendar alarm queries the server for alarm-enabled appointments. The value for this should be set to value greater than the Session Timeout Parameter.

3 - "PushKeepAliveTimer" and "ChannelCleanupTimer"

"PushKeepAliveTimer" is basically used in CTI configurations. The Value for this parameter in the Communication profile should be greater than SessionTimeout .

4 - CommReqTimeout(CTI)

This parameter is used in Communication toolbars. The value of this parameter should be less than the SessionTimeout parameter.

5 - Connidletime

This parameter helps session manager to close connections based on the time the connection remains idle. It is used in conjunction with third party load balancer. The value of this parameter should be greater than the session timeout parameter.

It is always better to specify the SessionTimeout parameter to a value which satisfies own requirement. This avoids dangling sessions and thus efficient resource allocation.

Have a great active year ahead...


Monday, December 13, 2010

"IS UPDATED" in Workflow Policy

Statuary Warning: This is not for the old horses.

My romantics with siebel goes on and so Siebel mysteries. Newbies better be careful while using "IS UPDATED" condition in the workflow policies. It can lead to undesirable/wrong results. Lets consider below problem statement.

"Any service request which is not worked within 2 hours of assignment, i.e. Assigned status , should be escalated."

The obvious solution which comes in mind is to configure workflow policy with duration and Owner Id update condition.


Unfortunately it didn't work for me. The issue when using "IS UPDATED" criteria in combination with Workflow duration is that criteria is considered only at the time of the first update by the user. Until the configured policy duration has completed, all subsequent updates to the record are discarded by Workflow Policy Manager. As a result at any point of time only one record is available in "S_ESCL_STATE" table for this policy. At the end of the configured duration, Workflow Policy Manager looks at the other configured criteria on the policy. If they evaluate to true policy Action is fired. If they do not evaluate as configured, then the record is discarded and the next time the record is updated a new record will is inserted into S_ESCL_REQ and subsequently, S_ESCL_STATE for the duration. At times, this may result in undesirable behavior as follow.

Lets consider we assign a SR to user A at 7:00 AM. As per our configured policy it should be escalated at 9:00 AM if status is "Assigned". User A works on this request and again re-assigns request to user B at 7:30. Now ideally escalation should happen at 9:30 AM and not at 9:00 AM. But if we check "S_ESCL_STATE" table there will be only one record for this policy with END_TM set to 9:00 AM. If user B doesn't work on this request till 9:00 then this request will be escalated resulting in unwanted escalation.

There are multiple workarounds for the above mentioned issue.

a) Workflow Batch processing
b) Batch workflow policies

One potential solution could be to maintain "Last Assigned" date field and set this to current timestamp whenever assignment/re-assignment is happening. Use this date in the searchspec to find records which are in assigned status for more than 2 hours. Create workflow Process Batch Manager RCR with following parameters:

SearchSpec: [Last Assigned] < (Timestamp() - 0.084)
WorkFlow: SR Escalation Workflow

This will process all records which are in Assigned status for more than 2 hours.


Tuesday, December 7, 2010

DVM on drilldown

Recently we encountered a scenario which involved certain validations on drilldown. The go to solution was to invoke DVM on drilldown method. Lets consider a basic example of SR list applet where we need to perform certain validations when user clicks on SR-Number. Following steps are required to achieve desirable.

1 - Create a DVM rule set with name "Test Orchestration". Add desired rules as per validation requirement.

2 - Create User Property on the SR business component with following values:

Name: Named Method 1
Value:"SRDrill", "INVOKESVC", "Service Request", "Data Validation Manager", "Validate", "'Rule Set Name'", "'Test Orchestration'", "'Enable Log'", "'Y'", "'Object Id'", "[Id]"

3 - Navigate to SR list applet and edit server side script. Add following code in PreInvokeMethod event :
if (MethodName == "Drilldown")
this.BusComp().InvokeMethod("SRDrill");

The key here is if any of the validation fails execution will stop and drilldown will not happen. Data Validation Manager business service returns true/false based on whether validations are passed successfully or not.

Monday, November 22, 2010

Launching a Workflow Process from a Business Component

One way to replace business component scripting with more declarative configuration is by using Siebel Workflow. A workflow process can perform many of the same operations that you can configure with eScript. If you want to execute a workflow when a BusComp field is updated, you can invoke it from scripting in the SetFieldValue event of the business component. There is, however, the option of using business component user properties for a completely declarative solution.

An example of using the applet version of the Named Method n user property to invoke a workflow process can be found in Siebel Bookshelf. The same user property is available for business components. An example of a named method declaration follows:

User Property Name: Named Method 1
User Property Value: "MyInvokeWFMehod", "INVOKESVC", "Employee", "Workflow Process Manager", "RunProcess", "'ProcessName'", "'The Do Something Cool Workflow Process'", "'WorkPhone'", "[Work Phone Number]", "'Login'", "[Login Name]", "'RowId'", "[Id]"

In this example, "MyInvokeWFMehod" is the name I give to the named method. "Employee" is the name of the business component. "The Do Something Cool Workflow Process" is the name of the workflow process. After the workflow process name, a series of name-value pairs are additional parameters passed to the workflow. "WorkPhone" and "Login" are process properties of the workflow process. Each process property name can be followed by a bracketed field name or business component expression. "RowId" is a method argument of the Workflow Process Manager business service that passes its value to the "Object Id" process property of the workflow.

Please note that parameter names and literals must be in quotes, despite the fact that the user property arguments are already in quotes, which results in the strange syntax of "'Literal Value'".

Another user property is also usually required to invoke the named method, unless the named method is already invoked by the business component itself. To invoke the named method upon a field being updated, use the On Field Update Invoke n user property. For example:

User Property Name: On Field Update Invoke 1
User Property Value: "Work Phone Number", "Employee", "MyInvokeWFMehod"

When the "Work Phone Number" field of the "Employee" business component is updated, the "MyInvokeWFMehod" named method is invoked, which calls the "RunProcess" method of the "Workflow Process Manager" business service, which acts as a proxy for the "Workflow Process Manager" server component, which executes the "The Do Something Cool Workflow Process" process, using values passed from the business component directly into workflow process properties.

In summary, use the On Field Update Invoke n business component user property together with the Named Method n business component user property and your own workflow process for a completely non-scripted way to add complex logic to the event of updating a business component field.

Tuesday, November 9, 2010

ORA-03135: connection lost contact

November started with blues. I recently encountered very strange issue with the custom workflow components. I am not underrating the term strange here but i am in habit of landing into these troubles frequently. My workflows were failing on server intermittently with error log suggesting

ObjMgrLog Error 1 000000044ccc6f90:0 2010-10-31 11:27:23 (oracon.cpp (3255)) SBL-DBC-00108: An error has occurred preparing a Sql statement.
SQLParseAndExecute Execute 5 000000044ccc6f90:0 2010-10-31 11:27:23 ORA-03135: connection lost contact

I was not sure what was causing this failure as there was no issue in the workflow as it was working fine in other environment. The more concerning factor was that there was no specific pattern for the failure of this workflow. But the best part with siebel is regardless of issue your luck never runs out. I found similar post on the siebel support[ID 762888.1] and resolution was to set the below parameter on the custom workflow process manager component level:

Name:OM-Model Cache Maximum parameter
Value: 0

We monitored our workflows for some time and bingo they started running again in good shape. But the change in this parameter comes with disclaimer regarding performance check.

Friday, October 29, 2010

Skype - Siebel Custom Integration

Want to call one of your contacts/prospects in Siebel without a lot of manual effort? now you can...
Here are a few simple steps of how you could integrate Skype with your siebel application.

Thank you Bernard for sharing this!

Configuration Steps - (for this example I am going to use the contacts applet)

Step 1: Create a custom Business service called 'OS Skype Integration' and assign it to a locked project.

place the below code in the PreCanInvokeMethod event of the Business Service

function Service_PreCanInvokeMethod (MethodName, &CanInvoke)
{
    if(MethodName == "GetField")
    {
        CanInvoke="TRUE";
        return(CancelOperation);
    }
    else if(MethodName == "TransformToSkype")
    {
        CanInvoke="TRUE";
        return(CancelOperation);
    }
    else
    {
        return(ContinueOperation);
    }
}


place the below code in the PreInvokeMethod event of the Business Service
function Service_PreInvokeMethod (MethodName, Inputs, Outputs)
{
    try
    {
        switch (MethodName)
        {
            case "GetField":
                this.GetField(Inputs, Outputs);
                return (CancelOperation);
              
            case "TransformToSkype":
                this.TransformToSkype(Inputs, Outputs);
                return (CancelOperation);      
              
            default:
                return (ContinueOperation);
        }
    }
    catch(e)
    {
        TheApplication().RaiseErrorText(e.toString());
    }
    finally
    {
    }
}
Now that the two methods are defined and ready for use, lets define the logic inside them


Create two new functions as below -

GetField: This method as you can see will get the properties set by the Browser script in the Contact List Applet and will make them available in the Input Property Set of the Business Service.


function GetField(Inputs, Outputs)
{
    var sfield = Inputs.GetProperty("fieldname");
    var sId = Inputs.GetProperty("Id");
    var boName = Inputs.GetProperty("boName");
    var bcName = Inputs.GetProperty("bcName");
    var bo = TheApplication().GetBusObject(boName);
    var bc = bo.GetBusComp(bcName);
    bc.ClearToQuery();
    bc.SetViewMode(AllView);
    bc.ActivateField(sfield);
    bc.SetSearchSpec("Id", sId);
    bc.ExecuteQuery(ForwardOnly);
    if (bc.FirstRecord())
    {
        var svalue = bc.GetFieldValue(sfield);
           Outputs.SetProperty("fieldvalue",svalue);
    }
    else
    {
        Outputs.SetProperty("fieldvalue","");
    }
}


TransformToSkype: This method contains the main string used to make the call. The string includes the Skype exe path and teh Phone Number of the call recipient/Siebel Contact.


So, the string being passed would look something like this "C:\Progra~1\Skype\Phone\skype" /callto:+14152065351. This string is passed to the browser script for execution.

NOTE 1: The target customer base for the Client where I implemented this was for US only, thats why the '+1'. If you wish to make it more general you could check the Country of the contact and derive the country code based on that.

NOTE 2: You could also simply use 'callto:+14152065351' in the below script skiping an extra step(Step2 - Creating the LOV) - Thanks Ranjith for pointing that out.

function TransformToSkype(Inputs, Outputs)
{
    var sWorkphone = Inputs.GetProperty("PhoneNum");
    var sFirst = sWorkphone.charAt(0);
    var sSkypeNum="";
    var sLOVText = TheApplication().InvokeMethod("LookupValue","OS_SKYPE_PATH","Path");
    if(sFirst!="+")
    {
        sSkypeNum = "\"" + sLOVText + "\"" + " /callto:+1" + sWorkphone;
    }
    else
    {
        var sLast = "\n"
        var sSubstr = Clib.strstr(sWorkphone, sLast);
        var sRtn = sWorkphone.replace(sSubstr, "");
        //sSkypeNum = "skype:" + sRtn + "?Call";
        sSkypeNum = "\"" + sLOVText + "\"" + " /callto:" + sRtn;
    }
    Outputs.SetProperty("SkypeNum",sSkypeNum);
}


Step2: Create an LOV as seen in the below screenshot - This would contain the .exe path of Skype.









Step 3: Lock the 'Contact List Applet' and create three custom buttons as shown in the screenshot.(Note: The 'InvokeMethod property for the Skype buttons should be same as the ones in the script')
Make sure the buttons are clickable by using the CanInvokeMethod Applet User property.











You could also get more creative and use a 'Skype Toolbar' in Siebel. Like I have and call the business service from the Command Invoked. The Script would change in that case.(The Browser script from the applet would then be required on the Business Service)

 









Step 4:  Place the below script in the browser script evet Applet_PreInvokeMethod of the contact list applet.

code:
function Applet_PreInvokeMethod (name, inputPropSet)
{
    if(name=="Skype" || name=="SkypeCell" || name=="SkypeHome")
    {
        try
        {
            var serv = theApplication().GetService("OS Skype Integration");
            var inp = theApplication().NewPropertySet();
            var outs = theApplication().NewPropertySet();
            inp.SetProperty("Id", this.BusComp().GetFieldValue("Id"));
            switch(name)
            {
                case "Skype":
                    inp.SetProperty("fieldname","Work Phone #");
                    break;
                case "SkypeCell":
                    inp.SetProperty("fieldname","Cellular Phone #");
                    break;
                case "SkypeHome":
                    inp.SetProperty("fieldname","Home Phone #");
                    break;
            }
            inp.SetProperty("boName", this.BusObject().Name());
            inp.SetProperty("bcName", this.BusComp().Name());
            outs = serv.InvokeMethod("GetField",inp);  
            var svalue = outs.GetProperty("fieldvalue");
           
            inp = null;
            inp = theApplication().NewPropertySet();
            inp.SetProperty("PhoneNum",svalue);
            outs = null;
            outs = theApplication().NewPropertySet();
            outs = serv.InvokeMethod("TransformToSkype",inp);
            svalue="";
            svalue = outs.GetProperty("SkypeNum");
           
            //calls the ActiveXObject and passes the Skype exe path allong with the phone number of the contact

            var wsh = new ActiveXObject("WScript.Shell");
            var oExec = wsh.Exec(svalue);
            wsh=null;
            return ("CancelOperation");
        }
        catch(e)
        {
            alert ("Error Applet_PreInvokeMethod : " + e.toString());
        }
        finally
        {
            inp=null;
            outs=null;
            serv=null;
        }
    }
    return ("ContinueOperation");
}


This script will call the 'OS Skype Integration' and pass the respective Phone numbers for transformation if required.

Step 5: Since we are invoking the Business service from the browser level. The Business service will have to be registered as a client business sevice in the Application User Props
















Step 6: Compile all objects you modified.

Step 7: Compile the browser scripts by using Genb or should I say UltraGenB(A cool new utility created by Jason Le of Impossible Siebel)


Query on any contact in the Contact List Applet and hit one of the buttons....and there you have it...TRING TRING!!!

























Happy Calling!!



Wednesday, October 20, 2010

DVM - Length Restriction

Things can be real stinging when something works perfectly on your local and crashes on server. Recently i dated an error of database nature, which i always dread. "Error retrieving next record from the database (SBL-DBC-00104)" was constantly coming on server when we did query on our applet. It was working perfectly fine on my local machine. Server logs were not of much help as it constituted same error.
Things are not always what we see.After some hunting i discovered that issue was because of "Text Length Override" user property which was recently added. We wanted to restrict user with certain character limit in description field but there were existing records in that table where count of characters was greater than the limit which we gave in the user property for Description. So eventually the option of using this user property was ruled out as this Table was common across mulitple BusComps. Once again DVM came to the rescue. We created rule set with expression including Length function. Below expression was used for evaluation and DVM was triggered using Runtime events.

Length Check: IIf([Description] IS NOT NULL,Len([Description])<=1000,'Y')

The lifeline here is the Len function which returns the length of the given field.DVM support multiple functions which could be of immense use in real time scenarios. We will discuss more of DVM in future posts.

Data Validation Manager - Count

Siebel always give multiple ways to achieve desired solution. Recently we got a requirement which could be accomplished using different methods. We approached solution using "Data Validation Manager".

Problem Statement: User should not be able to Approve request if there is any activity associated in Open State.

Soln: A little configuration and DVM rule was good enough to run business.

a) Create a MVL in SR bc using with following Values

Name: Open Activity
Destination BC: Action
Destination Link: Service Request/Action
Type Field: Status
Type Value: Open

Compile BC.

b) Navigate to Application - Data Validation. Create a new rule set based on the BO Service Request. Go to Rules Tab. Create a new rule with following values.

Sequence: 1
Name: Open Check
Expression: Count("Open Activity") = 0
Business Component: Service Request
Apply To: Current Record
Return Code:

The key here is the name of the MVL."Count" function is directly used in the evaluation with MVL name. The best part is it doesn't require creation of calculate field in BC. Moreever DVM rules also require field used in expression to be exposed on applet or force active. They truly say everything positive comes with its own inbuilt negativity. But here the direct use of function in DVM comes as relief and also helps in keeping check at performance.

We will discuss more functions and expressions which could be used in the DVM rulesets till then happy commenting.

Thursday, October 14, 2010

UMF - Reloaded

Welcome back to the next (!last) post in UMF series. In this we will discuss how we can capture responses and perform actions from the popup applet. It basically involves two steps:

1 - Creation of business service with different methods which needs to be invoked on selecting responses from message applet.Create a new business service "ResponseService". Add three Methods to this BS:
AddInfo
AssignRequest
OpReq

function Service_PreInvokeMethod (MethodName, Inputs, Outputs)
{
switch(MethodName)
{
case "AssignRequest":
fnAssignReassign(Inputs, Outputs);
return(CancelOperation);
case "AddInfo":
fnAddInfo(Inputs, Outputs);
return(CancelOperation);
case "OpReq":
fnOpReq(Inputs, Outputs);
return(CancelOperation);
}
return(ContinueOperation);
}
The best part is entire payload of the message is passed to the response thus allowing us to use them in response functions.

2 - Now its time to map the business service and methods to the responses. Navigate to Administration - Order Management -> Message Types. Query for "Testing UMF" message. Go to responses tab and map the corresponding Business service and Method to the respective response record.


Once all changes are done. Click on the Popup button and look out for the magic. UMF can be impressive alternate for browser script.

Wednesday, October 6, 2010

Unified Messaging Service Framework: Wealth of Messages

Many times we have resorted to browser scripts for displaying message and based on the input given have decided steps to follow but with the introduction of UMS the dependency on the browser script can be avoided. We can do wonders with the UMS framework which can really help in orchestration of system.

UMS is highly used in Order Management however Siebel is kind enough to allow us to use this for any other standard BO. However we need certain level of customization and scripting to achieve this. The main advantage of this framework is to invoke popup applets from workflow. I was not sure whether it was possible or not but as they say absence of evidence is not evidence of absence. A more than little help from support web and universal buddy Google made it. The details of Unified Messaging Service is available in OrderManagement guide. Here we will try to construct and invoke message from Service Request List Applet. It will display snapshot of Service Request which will help SR agent to work upon certain actions. Make sure you are working on SIA application. This goes in three steps:

1 - Creation of Message Type to be displayed.

a ) Navigate to Administration- Order Management -> Message Types.Create new record with following fields:

Name: Testing UMF
Display Mode: Active
Group:Internal Error Message
Title: Testing UMF
Short Text: Testing UMF
Full Text: Status: [Status]
Account: [Account]
Deparment: [Department]
Product: [Product]


b ) Navigate to Payload Tab. Define input payload fields as below:
Status
Account
Department
Product
These parameters will be replaced to actual values at runtime.


c ) Navigate to Response Tab this will hold the business service and method name to be invoked on clicking responses. Create following record in Response applet.

Sequence: 1
Name: Assign\ReAssign
Business Service: ResponseService // We will write this business service in later steps. Initially it can be left blank.
Method: AssignRequest

Sequence: 2
Name: Additional Information
Business Service: ResponseService
Method: AddInfo

Sequence: 3
Name: Opinion Request
Business Service: ResponseService
Method: OpReq

Now our Message set is done. Its time to invoke this message from applet. We will keep business service null for time being.

2 - Add the required BC's in the Service Request business object including "UMF Active Message Virtual BusComp", "UMF File Handler","UMF Passive Message Virtual BusComp".Navigate to Service Request List Applet. Add a button on the list applet with method as "Popup". Open script editor for this and add below script. This script will create message hierarchy at runtime to be invoked on button click.

if(MethodName == "Popup")
{
// Local declaration
var obj_UMS; // Business Service "Unified Messaging Service"
var obj_Inputs_PS; // Property Set used as inputs for UMS business service
var obj_Outputs_PS; // Property Set used as outputs for UMS business service
var obj_MessageList_PS; // Property Set used to construct the list of messages to be sent to UMS business service
var obj_Message_PS; // Property Set used to construct the message to be sent to UMS business service
var obj_Payload_PS; // Property Set used to construct the list of payload-value pairs be sent to UMS business service
var str_ErrMsg; // Used to create error message strings

// Variables initialization
obj_UMS = TheApplication().GetService("Unified Messaging Service");
obj_Inputs_PS = TheApplication().NewPropertySet();
obj_Outputs_PS = TheApplication().NewPropertySet();
obj_MessageList_PS = TheApplication().NewPropertySet();
obj_Message_PS = TheApplication().NewPropertySet();
obj_Payload_PS = TheApplication().NewPropertySet();
obj_Payload_PS.SetType("Payload");
//Creating Paload
obj_Payload_PS.SetProperty("Business Component","Service Request");
obj_Payload_PS.SetProperty("Status",this.BusComp().GetFieldValue("Status"));
obj_Payload_PS.SetProperty("Account",this.BusComp().GetFieldValue("Account"));
obj_Payload_PS.SetProperty("Department",this.BusComp().GetFieldValue("Department"));
obj_Payload_PS.SetProperty("Product",this.BusComp().GetFieldValue("Product"));
// Build message property set
obj_Message_PS.SetType("Message");
obj_Message_PS.SetProperty("Score", "100");
obj_Message_PS.SetProperty("Message Id", this.BusComp().GetFieldValue("Id"));
obj_Message_PS.SetProperty("Message Type", "Testing UMF");
obj_Message_PS.SetProperty("Display Mode", "Active");
obj_Message_PS.AddChild(obj_Payload_PS);

// Build message list property set
obj_MessageList_PS.SetType("Message List");
obj_MessageList_PS.AddChild(obj_Message_PS);
obj_Inputs_PS.SetProperty("Source", "SR Messages");
obj_Inputs_PS.AddChild(obj_MessageList_PS);

// Submit message to the unified messaging service
obj_UMS.InvokeMethod("AddMessages", obj_Inputs_PS, obj_Outputs_PS);
return (CancelOperation);
}

we can also write a business service and call that business service from workflow and invoke that workflow on button click. After compilation on button click following popup will appear.

The next important step is to capture responses and define appropriate actions. We will cover this in the next post till then stay tuned.

Tuesday, September 28, 2010

Generating unique numbers in DataMap

Sometimes data coming in inbound integration from external system cannot be uniquely identified.Similar scenario struck me and was forced to generate unique number at siebel side. One of the option was to parse incoming XML and add unique identifier using Scripting or XSL. Another option was to use "SIS OM PC Service" business service in datamaps and the generated output row_id could be used as user key during the insertion. In the field map following expression is used:
InvokeServiceMethod("SIS OM PC Service", "Get Next RowId","Test='123'" ,"RowId")

However the enigma was not ended here. Further twist was error "Access denied to invoke business service 'SIS OM PC Service' for search specification 'InvokeServiceMethod("SIS OM PC Service", "Get Next RowId","Test='123'" ,"RowId")'" . After some hunting on the support web i realised this security issue. In order to use any business service with InvokeMethod we need to define that business service at following places:

1 - Mobile Web client/Dedicated client: In CFG we need to define following parameter
[Siebel]
BusinessServiceQueryAccessList = SIS OM PC Service

2 - Web Client: We need to define this in Parameter "Business Service Query Access" at enterprise or component level where it is being used.
Name:Business Service Query Access
Value:SIS OM PC Service

Help in need is help indeed thus any help on generation of unique numbers in siebel during inbound are really welcome.

Sunday, September 19, 2010

Launching iHelp with eScript

Hey Folks,

I had a requirement with one of my clients to have a button on a Form Applet that opens the iHelp.

"My Oracle Support" has a few SR's that are related, and I had tried various things including trapping the method calls that are triggered when clicking on the iHelp button on the Toolbar, then repeating them on my custom button but with no luck.

Oracle support seems to confirm you can't Launch iHelp with Script in Siebel 7.7, but doesn't mention Siebel 8.1 (which probably means you can't do it!)

This however is possible through script. You could use the below code on the button to toggle the iHelp from a custom button.

Code:

function WebApplet_PreInvokeMethod (MethodName)
{
    if(MethodName == "LaunchiHelp")
    {
        var
oBS= TheApplication().GetService("Task Assistant UI Service");
        var
psInputs = TheApplication().NewPropertySet();
        var
psOutputs = TheApplication().NewPropertySet();
       
oBS.InvokeMethod("ToggleiHelp", psInputs,psOutputs);
        return (CancelOperation);
    }
}

Your custom button should now function exactly like the iHelp launch button on the toolbar.

Update (thanks to my colleague for sharing this)


I have had to add an update to the code so that it looks like this:

var psInputs = TheApplication().NewPropertySet();
var psOutputs = TheApplication().NewPropertySet();
psInputs.SetProperty("Command", "#14");

var oBS = TheApplication().GetService("Task Assistant UI Service");
oBS.InvokeMethod("ToggleiHelp", psInputs, psOutputs);

Without this parameter there are issues with opening / closing iHelp multiple time from different entities. It results in a Siebel crash and you have to log in again. With the command property it appears to work fine.

Just a word of caution: this command number is likely to be different in different version of Siebel. It is 8.1.1.2 SIA [21215] ENU that I have this working for.

Cheers!

FINS Data Transfer Utilities

The best thing while working on siebel is you are never short of options. Recently we had requirement of updating a Service request from contact. Finally we did that using "EAI Siebel Adapter" business service. However during that time i came across another business service "FINS Data Transfer Utilities" popularly known as DTU business service. As i was not having prior knowledge of it going by the rule of not learning swimming lessons while drowning i decided not to go for it. Lately i have tried to explore this service and trust me it can do wonders.

Here is a sample example update of Service Request from contact. We need to follow below steps in order to understand strength of this business service.

1 - Navigate to Site Map. Go to Administration - Application -> Data Map Administration tab. Create a new Record with following options:

Name: Service Request Test
Source Business Object: Contact
Destination Business Object: Service Request

Here the source business object specifies where data should come and Destination busobject specifies where data should go.

2 -In Data Map Component we specify mapping of the child business component. There needs to be one root business component and other child business component in the map. This is really handy while creating quotes and quote line items from Opportunity. Or any other instance where multiple BC's are under scanner.

Name: SR Update
Source Business Component: Contact
Destination Business Component: Service Request



3 - In Data Map field we specify field to field mapping, data from which source field should go to which destination field. However source/destination field could be of following types based
on our requirement:

Field: BC field
Parameter: Input argument to business service
Expression: combination of BC field or Parameters

The most important thing here is the Key field, which helps in matching source record with destination record during update operation. More of this is given in "siebel finance bookshelf".



4 - Once data map is done, our job is very simple. We need to write a workflow which can call this business service and invoke that workflow on contact write
record. Sample workflow should look like.

Method Invoked is: DataTransfer

Parameters which we have passed are:

Operation - Update : It specifies which operation we need to perform. Values are Insert,Update,Delete and Upsert
InitBO - Contact : Initiator BO
InitBC - Contact : Initiator BC
DataMapObj - Service Request Test : Name of the Data Map
&Status - Closed : Status value we need to set for SR
&SRId - '288-70710' : SR Number for which we need to set status. This could be process property. I have hard coded for testing purpose.


5 - Create a runtime event which invokes this workflow on writerecord of Contact BC. Once reload is done try to see the magic.
This business service is of immense help if used efficiently and can be of real help in scenarios involving update/insert of multiple business components.

Learning Swimming and Siebel.