Wednesday, October 20, 2010

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

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.

Monday, September 13, 2010

Auto-Refresh/Auto-Save

I am pretty sure most of us here are sports buff. Me being an ardent cricket lover used to spend 4-5 hours on cricinfo. Life is really cool when the scoreboard says the latest score automatically in every 2 minutes. It would have been real killing if someone had to manually click on refresh button to get the latest updates or for money matters latest update on stocks every n minute.

One of my friend recently experienced same problem while dealing with service requests. The scenario was to have auto refresh of the SR list applet pool in every 2 minutes so that users can pick request to work on, as requests were coming from some other portal. Once again support web was our alley. A little bit of browser script and deal was done. Following steps were taken to achieve this:

1 - Query applet for which auto-refresh is required. Open Browser Script editor. Jump on the Applet_Load event and put below script:

function Applet_Load ()
{
//To Invoke AutoRefresh function in every 2 minutes
setTimeout("AutoRefresh()", 120000);
}

2 - Create a function "AutoRefresh()" in the general section of applet with following code:

function AutoRefresh()
{
var sApplet = theApplication().FindApplet("Service Request List Applet");
sApplet.InvokeMethod("ExecuteQuery"); // this is used to refresh current applet
// condition that ensures that it happens in the desired view only, if applet is being used in other views
if(theApplication().GetProfileAttr("ActiveViewName") == "Personal Service Request List View")
{
setTimeout("AutoRefresh()", 120000); // this is to invoke the above function recursively
}
}

Similarly Auto-Save functionality could be achieved by using following function:

function AutoSave()
{
var sApplet = theApplication().FindApplet("Service Request List Applet");
sApplet.InvokeMethod("WriteRecord"); // this is used to write Record
setTimeout("AutoSave()", 120000); // this is to invoke the above function recursively
}

The main crux here is standard javascript function which takes two input parameters.

setTimeout(String(Function name), Number(Delay))

Function name - Name of the function to be executed
Delay - Number representing delay in milliseconds before the specified function will be called.

The same could be achieved by having a button on the List applet but then why to go for beans when you can have Cake.


Tuesday, September 7, 2010

Batch Processing

Batch processing is integral part of any development and is must in cases involving escalations,auto-assignments or bulk emailing. Siebel provides multiple ways to do batch processing but one to choose depends on the requirment at hand. Lets consider an escalation scenario which involves SR reassignment to Manager when commit time is reached if it is not closed. The two possible approaches to achieve this are:

1 - Workflow Policies with Batch Mode set to True
2 -Workflow Process Batch Manager component

It can be real dilemma which one to use as they say "you always have choice of selecting action but not the consequence". Both approaches have its own advantages. Lets discuss each of them.

Workflow Policy with Batch Mode

1 - Create a Workflow Policy as following based on "Service Request" object with condition

Status <> Closed
Commit time >= Current

Set the batch mode to True. Specify the action which will run the workflow to reassign SR.

2 - We need to schedule a task on server to execute a batch file or script which executes server manager command lines to execute workmon to run in batch
mode.

Workflow Process Batch Manager

1- Create a Repeating Job for component WorkflowProcess Batch Manager.

2 - Set the SearSpec parameter to "[Status] <> Closed AND [Commit Time] >= Today()"

3 - Set the Workflow Process name to the desired workflow which is used to reassign SR

Technically either of them could be used to perform the desired escalation but me inherently being an follower of KISS(Keep it Short and Simple) principle will go for second option as it is easy to manage Workflow Process batch manager Job as compared to the batch Policies. However, if we have to execute a sequence of action apart from run process then batch workflow policies should be considered. Batch workflow policies are also quite handy in sending consolidated email for multiple requests.

Please feel free to put your thoughts across which one should be used for the cause.