Showing posts with label Tricks in Siebel. Show all posts
Showing posts with label Tricks in Siebel. Show all posts

Friday, February 19, 2016

Multi Org support for an Inbound Web Service

Let’s talk about a scenario today.

We have different end-users from India, USA etc logged into the web-portal for placing their orders and from the web portal they can register themselves. We have a “Create Account” Inbound Web Service which is used to create Accounts in Siebel. Whenever a new customer register himself, the web portal sends the information to AIA and then AIA invokes the Siebel’s “Create Account” WS.

The requirement is, if end-user belongs to India then the new Account created in Siebel, should be visible to Siebel users who belongs to “India” organization. If the end-user belongs to USA then the new Account created in Siebel, should be visible to Siebel users who belong to “USA” organization.

(Note: Web Portal is able to identify the Customer and able to send the Organization name to AIA and then AIA will send the Organization tag in inbound XML to Siebel)
<Organization>USA</Organization>
                                    OR
<Organization>India</Organization>

Solution:
Actually there are multiple ways to do it and with the help of Access Control mechanism which Siebel provides OOTB, this can be easily achievable.

Possible Solution 1:
Let’s take an example, there are two users. First one is assigned with the Position let’s say “Position India” and its corresponding Organization is set as “India”.
Second user is assigned with the Position let’s say “Position USA” and its corresponding Organization is set as “USA”.

Now, we all know that, as part of the OOTB solution, all the Account records created by first user on the UI will be visible in “All Contacts” view to all the application users who belong to “India”. Similarly, all the Account records created by second user will be visible in “All Contacts” view to all the application users who belong to “USA”.

The same concept can be used while invoking the Inbound WS. In Siebel, we can create two EAI user Profiles, one belongs to “India” and other one belongs to “USA” and pass-on the user credentials to the source system (AIA). While invoking the inbound WS, source system can use the appropriate login credentials according to the Organization name.

Possible Solution 2:
Siebel application user can hold multiple positions. If you are working in Siebel UI, you can navigate to Tools -> User Preferences -> Change Position view to change the position of the logged-in user. The moment you change the position, the new records that are created after that will hold the visibility according to the position’s organization.

Similarly, the same can be achieved while invoking the inbound WS. Assuming the EAI User profile, that is being used to invoke the inbound WS, will hold multiple positions let’s say 1) “Position India” and 2) “Position USA”.

Create a step in the workflow do the “Change Position”. I am not sure if there is any vanilla BS available to simulate the “Change Position” step that we can perform from UI, so here is the small script would do the task. Assuming “Organization” name is the input argument to the business service method:

function ChangePosition(Inputs, Outputs)
{
var sOrganization = Inputs.GetProperty("Organization");
 var oBO = TheApplication().GetBusObject("Change Position");
 var oBC = oBO.GetBusComp("Change Position");
 with(oBC)
 {
  ClearToQuery();
  ActivateField("Organization");
  SetViewMode(AllView);
  ExecuteQuery();
  var isRecord = FirstRecord();
  while(isRecord)
  {
   if(GetFieldValue("Organization") == sOrganization)
   {
    InvokeMethod("Change Position");
    break;
   }
   isRecord = NextRecord();
  }
 }
 oBC = null;
 oBO = null;
}

After this “Change Position” rest of the workflow execution would continue.



Friday, August 2, 2013

Two Buttons with same Method Invoked = ShowPopup, displaying different popup applets!!

After reading the title of this post, you might have got some idea what the scenario I am going to talk about today. This is the scenario where I have two buttons exposed on the UI and both having the same Method Invoked = "ShowPopup".

Here below is the snapshot:

1.      Create SR        :           this button is being used for displaying “Create SR Popup Applet”.
2.   Create Order  :           this button is being used for displaying “Create Order Popup Applet”.

For configuring this simple requirement, you can have the following configuration:

“Create SR” Button
“Create Order” Button
Method Invoked = ShowPopup
Control User Properties
o   Popup = Create SR Popup Applet
o   Mode = Edit
Method Invoked = ShowPopup
Control User Properties
o   Popup = Create Order Popup Applet
o   Mode = Edit

No Issue till now. This pretty simple configuration would work fine!

But the problem comes in when there is a need to execute few lines of server script when each button is clicked, something like:
            If “Create SR” button clicked then
                        Set the Profile Attribute “NewEntityCreated” to “Service Request
                        Call the web service “X” to retrieve some values from other system.
                        After that display the popup applet : “Create SR Popup Applet”

            If “Create Order” button clicked then
                        Set the Profile Attribute “NewEntityCreated” to “Order Entry - Orders
                        Call the web service “Y” to retrieve some values from other system.
                        After that display the popup applet : “Create Order Popup Applet”

So, now the problem is, both button clicked will invoke the method “ShowPopup” and there is no way to identify which button is actually clicked.

Solution:
To overcome this, we have to have the different “Method Invoked” on each button.

1.      Instead of using “ShowPopup”, invoke the custom method for each button i.e.
a.      Method Invoke for “Create SR” button would be “CreateSR”.
b.      Method Invoke for “Create Order” button would be “CreateOrder”.

2.       Put the server script in PreInvokeMethod of the applet:
if(MethodName == "CreateSR")
            {
TheApplication().SetProfileAttr(“NewEntityCreated”, “Service Request”);
//         Code for calling the Web Service X
//         ……………………………………………………
//         ……………………………………………………
PopupApplet(“Create SR Popup Applet”);
                        return (CancelOperation);
            }
            if(MethodName == "CreateOrder")
            {

TheApplication().SetProfileAttr(“NewEntityCreated”, “Order Entry - Orders”);
//         Code for calling the Web Service Y
//         ……………………………………………………
//         ……………………………………………………
PopupApplet(“Create Order Popup Applet”);
                        return (CancelOperation);
            }
3.      Create a new Function as per below script:

function PopupApplet(strAppletName)
{
var oBSSLM = TheApplication().GetService("SLM Save List Service");
var psInp = TheApplication().NewPropertySet();
var psOut = TheApplication().NewPropertySet();
psInp.SetProperty("Applet Height", "400");
psInp.SetProperty("Applet Mode", "2");                          
psInp.SetProperty("Applet Name", strAppletName);
psInp.SetProperty("Applet Width", "800");
oBSSLM.InvokeMethod("LoadPopupApplet", psInp , psOut);
            }

Limitation of “SLM Save List Service” business service
If there is a requirement to display another popup applet from a button click on a Popup applet, then this business service doesn’t work and you might see the error:
View: <?> does not contain applet: <?>.(SBL-UIF-00401)

So, in this case the only choice is to either use “ShowPopup” method or if you can’t use it because of the scenario explained above (having two buttons with same Method Invoke i.e. ShowPopup) then other option is to use hijack the custom method invoked and invoke the Browser Script (for displaying popup applet) as explained here in earlier post.


Wednesday, July 24, 2013

How to expose a hidden field in Siebel list applet?

This is a very simple requirement that I am talking about today, where on a button click you are required to do a GetFieldValue() of a active BC field, which is NOT exposed on the UI and doesn't have the Force Active property checked. If you try to do that, system prompts an error sayng:

A script failed to get the value for field <field name> because the field was not active.(SBL-EXL-00119)

So the basic solution anybody can tell is, "why don't you expose the field on the applet with HTML Type = Hidden?"

Well, this sounds very simple and works fine also, but ONLY in the form applet. So in a form applet, if you expose a field with HTML Type = "Hidden", then it will not be visible to the user and you can easily do GetFieldValue of that field. But the same thing doesn't work if it is a List Applet, even if HTML Type = Hidden, the list column would be visible.

The only workaround I found was, set the HTML Type = Hidden and instead of exposing the field as the list column, expose it as the control i.e. expose at any empty placeholder where you can expose buttons/labels etc. It works fine.

Wednesday, July 27, 2011

Child Field Read Only depending on Parent Field Value

Sometimes it happens that you get a very simple requirement to implement and in a single glance you say, "Well, this is very easy to implement" and when you actually see the result on the UI after the configuration you have done, you start scratching your head to find out the reason for not getting the result as per the expectation.

Today, I am going to discuss a very simple requirement you might have faced earlier.

Requirement
I have two applet exposed on the UI: 1) Opportunity Form Applet 2) Quote List applet.
Opportunity being the parent applet and quote as the child as per below screen shot.


The simple requirement is to make "Comments" field on Quote List Applet editable, if and only if Sales Stage of Opportunity = Data Entry.

very simple isn't it! Anyone can easily say, go and use "Field Read Only Field" user property at Quote business component and you are done. I reacted to it in the similar manner and followed the below steps:
1. Pull "Sales Stage" value on Quote BC.
2. Create a calc field to set to Y, if Sales Stage = "Data Entry"

3. Create a BC User property, Field Read Only Field based on calc field.



Compile the SRF.

Navigate to Opportuity -> Quote view to verify the results. I created an Opportunity record, set the Sales Stage to "Data Entry" and then created a Quote record. "Comments" field was editable. Then I changed the Sales Stage to "Submitted" and per configuration I was expecting the "Comments" field to be read only, but to my surprise, it was not. Still, I was able to edit the field.


It might happen that change of "Sales Stage" at the Opportunity level is not getting reflected at the quote level. Let me try running a blank query (Alt+Q, then enter) to refresh and now..... yes, "Comments" field get read-only. So, basically the problem is, Quote BC is not aware of the change in Sales Stage at Opportunity level, unless you refresh it.

(Note: this is not the case with "Parent Read Only Field" user property. Change at parent field immediately gets reflected at the child level.
You can refer this post for more details.)

Now, the problem here is to get the Quote list applet refreshed, if some change happens at Opportunity. One might point out that you should have "Immediate Post Changes" as True for "Sales Stage". But, keep in mind that "Immediate Post Changes" will only refresh the fields of the same business component, not of the child BC.

One solution, I can think of is to refresh the Opportunity business component in such a way that it should not loose the record context and consequently, Quote BC will automatically gets refreshed. But, I didn't want to do the scripting on Opportunity WriteRecord event, just to refresh the Quote BC, something like:

function BusComp_WriteRecord ()
{


TheApplication().GetService("FINS Teller UI Navigation").InvokeMethod("RefreshCurrentApplet", TheApplication().NewPropertySet(), TheApplication().NewPropertySet());
}

So, I found a better way to achieve to refresh the Opportunity form applet. Just create the following user property on the Opportunity applet:


Compile the SRF and check the result on the UI. Voila, everything is working as desired now.


.

Friday, July 1, 2011

How to send Email in HTML Format?...... contd

In continuation of the previous post, I found another good way to achieve the requirement of sending email in HTML format and moreover you are required to replace the field values dynamically from business component. So the extra information you need to provide to Outbound Communication Manager is the ROW_ID of the record in context.

Suppose, here below is the Email Template need to send in HTML format:


Here below is the code to achieve it:

var inp = TheApplication().NewPropertySet();
var out = TheApplication().NewPropertySet();
var svc = TheApplication().GetService("Outbound Communications Manager");
inp.SetProperty("CommProfileOverride", "SiebelMantra Profile");
inp.SetProperty("SourceBusObj", "Service Request");
inp.SetProperty("RecipientBusComp", "Service Request");
inp.SetProperty("SourceIdList", "1-B9PGUA");
inp.SetProperty("TestAddress", "siebelmantra@gmail.com");
inp.SetProperty("PackageNameList", "Test");
svc.InvokeMethod("CreateRequest", inp, out);



Here below is the email with necessary SR Number and status:


Siebel makes life "dynamically" colorful, isn't it ;)

Thursday, June 30, 2011

How to send Email in HTML Format?

If you get a requirement to send an email from Siebel, the very simple way is to make use of OOB business service, i.e "Outbound Communications Manager" with the method "SendMessage". Following input parameters would be enough for this purpose:

a) MsgToList
b) MsgSubject
c) MsgBody
d) CommProfile

Here below is the working example for the same:

var inp = TheApplication().NewPropertySet();
var out = TheApplication().NewPropertySet();
var svc = TheApplication().GetService("Outbound Communications Manager");
inp.SetProperty("CommProfile", "SiebelMantra Profile");
inp.SetProperty("MsgToList", siebelmantra@gmail.com);
inp.SetProperty("MsgSubject", "Test Email");
inp.SetProperty("MsgBody", "This is a test email");
svc.InvokeMethod("SendMessage", inp, out);

Here below is the email I received:

So, everything is working as desired, but what if you are required to send a HTML email which contains text with different colors and formatting? Well, one can quickly answer that you can use "MsgHTMLBody" argument in the above code instead of using "MsgBody". Yes, that is correct but the only it got is that you need to pass the complete HTML code as the value to this argument, but wait a minute why to take all this pain when Siebel provides a mechanism to keep the email template in HTML format for you and just need to create it from the UI. Yes, you guessed it right, I am talking about Administration - Communications -> All Templates view.

Just create a new Email Template with :
a) Status = Active
b) HTML Template = True

Now, here below is the small code to make this work:

var inp = TheApplication().NewPropertySet();
var out = TheApplication().NewPropertySet();
var svc = TheApplication().GetService("Inbound E-mail Database Operations");
inp.SetProperty("BusObj", "Comm Package");
inp.SetProperty("BusComp", "Comm Package");
inp.SetProperty("Name", "Test");
inp.SetProperty("QueryFields", "Name");
inp.SetProperty("ValueFields", "Template Text");
svc.InvokeMethod("FindRecord", inp, out);

var inp1 = TheApplication().NewPropertySet();
var out1 = TheApplication().NewPropertySet();
var svc1 = TheApplication().GetService("Outbound Communications Manager");
inp1.SetProperty("CommProfile", "SiebelMantra Profile");
inp1.SetProperty("MsgToList", siebelmantra@gmail.com);
inp1.SetProperty("MsgSubject", "Test Email");
inp1.SetProperty("MsgHTMLBody", out.GetProperty("Template Text"));
svc1.InvokeMethod("SendMessage", inp1, out1);

and when I executed the above code, here below is the email in HTML format I received in my Inbox:

Siebel makes life so colorful, isn't it ;)

Sunday, July 25, 2010

Building Link as a Join??

The very first expression that any Siebelized person would have after reading the title of this post would be, "hey, what is that?? Join and Link are two different objects in Siebel. Join used for building 1-1 and M-1 relationship and link is being used for building 1-M and M-M relationship. So how come you can build a link via join??".......

I knowwww and I am there with you what you just thought and completely agree to this fact too :) but keep in mind you get functionalities working in Siebel by SQLs running in the background on the database and as far as you know how to play with the configuration to achieve desired results (provided it will not result in performance issue) you can do wonders.

Alrightyyyy then, lets see what I got for you today to let you know an interesting fact in Siebel Configuration that can be used to achieve some different kind of requirement. The requirement we got to implement was:

"Create the Account Screen, which has got various sub-tabs like Opportunities, Quote, Assets, Service Requests, Invoices. So this is a kind of Parent-child relationship which is available in Siebel vanilla, nothing new.



But we were asked to provide an ability to query on the Accounts header form applet with a) Opportunity Id b) Quote Id c) Asset Number d) Service Request# e) Invoice#. That means if I have an Asset Number with me and query it on Account form applet in some field, then system should return the corresponding Account record to which this Asset Number is associated with. Similarly for Invoice# and so on. You might be thinking why this ever be a requirement and for what purpose, can't we navigate to Assets screen for query the Asset Number and drilldown from there to Account Screen and similar for other entities? You are right, you can do that as well but in our requirement user want to have the ability to query in a single place.
"

I think the requirement is clear now. The very first solution come to the mind can be achieved by following the below steps:

a. Create MVLs (which in-turn use some "Link") on Account business component.
b. "Use Primary Join" property of these MVLs should be "False".
c. Create MVFs for based on each MVL and expose on Account form applet.
d. Let the user query on any of the MVF and system will return the corresponding Account record.


This is very straightforward solution, but HUGE performance impact. When the view will get loaded, system will run (1 + (Number of MVFs)) queries for each account you will traverse on the UI. Lets try another good option here and create "Join" on the business component instead of "Link".

Here is below what I tried:

a) On Account business component, create following joins (as per the need)

i. Field Name: S_INVOICE
Source Field : ROW Id (Row_id of S_ORG_EXT)
Destination Column : ACCNT_ID (Foreign Key to S_ORG_EXT on S_INVOICE)
Alias : INVOICE

ii. Table Name: S_ASSET
Source Field : ROW Id (Row_Id of S_ORG_EXT)
Destination Column : OWNER_ACCNT_ID (Foreign Key to S_ORG_EXT on S_ASSET)
Alias : ASSET

iii. Table Name: S_OPTY
Source Field : ROW Id (Row_Id of S_ORG_EXT)
Destination Column : PR_DEPT_OU_ID (Foreign Key to S_ORG_EXT on S_OPTY)
Alias : OPTY

b) Now create corresponding join fields:

i. Field Name : Invoice Number
Join : INVOICE
Column : INVC_NUM

ii. Field Name : Asset Number
Join : ASSET
Column : ASSET_NUM

iii. Field Name : Opty Id
Join : OPTY
Column : OPTY_ID

c) Expose the fields on the UI and query for any Invoice#, Asset#, OptyId on the Account form applet and system will bring the Account record for you.


Let's see how it is working on the UI. I queried for Invoice# = "410194-13385102"




and now let's navigate to "All Invoices" view to see if system has returned the right Account or not. And yessss, this is the right account, I can see the Invoice#.




You can try it at your end and the best part is, if you see the SQL spool generated by the system, you will find that only single query is returning the data, not likely the case with MVFs, and there is no performance issue at all.

Wednesday, August 12, 2009

How to do a SetFieldValue on a ReadOnly field on an Applet?

yaa... I know this sounds something interesting so please now stop scratching your head, today I will tell a unique trick by which you can do a SetFieldValue on a field on an applet which is actually displayed as ReadOnly on the UI. Let me reiterate : We want to change the value of a field which is ReadOnly on the Applet, NOT on Business Component. Special Thanks to Amol, my colleague, for bringing this up.

First of all : "Why we need this trick?". Sometimes it happen that for testing purpose Developers/QA people need to set a value in Field but if that is ReadOnly on the applet, what we generally do is just fire a SQL query in the database to set its value and do whatever we want OR you can write a small piece of code in Business Service and simulate it to just solve the purpose temporarily. Here below is a trick by which you can do this without much of effort.

Here below is the screenshot which displayes we have field : "Description" readonly on the UI. And the requirement is set its value to "SiebelMantra".

Here is the solution :
Just copy paste the below text into Address bar :
javascript: alert(theApplication().ActiveBusObject().GetBusComp("Action").SetFieldValue("Description", "SiebelMantra"))

I don't think to explain what we have typed in Address bar, if you already aware how to write browser scripts in Siebel. You can use it further as per your need. Try it !!

.

Thursday, July 30, 2009

How to call "Asynchronous Server Requests" business Service?

Sometimes there is a requirement we need to run few processes that should not stop the user on the screen to go further and do next steps when Siebel is processing something in the background. That is the place when Asychronous processes come into the picture and the solution that Siebel provides for these kind of scenarios is to give a call to "Asynchronous Server Requests" business service.

There are only two ways (that I know my past experience, please add if anyone know more) by which you can call "Asychronous Server Requests" Business Service :

a) Via e-Script : easy way to do that and most people know this.
b) Via Workflow : this is bit tricky
Lets see each one of them in detail. Taken an assumption that you need to invoke a workflow (asynchronously). Assume the workflow name is "Send Email Opportunity Sales Rep", which just sends an email to the Sales Person on the Opportunity and the Input Agrument to the workflow is : "OpptyId" (1-XR45)

Via e-Script :
Here is the piece of code that you can to achieve the above requirement :
var svc = TheApplication().GetService("Asynchronous Server Requests")
var input = TheApplication().NewPropertySet();
var child = TheApplication().NewPropertySet();
var output = TheApplication().NewPropertySet();
input.SetProperty("Component", "WfProcMgr");
child.SetProperty("ProcessName", "Send Email Opportunity Sales Rep");
child.SetProperty("OpptyId", "1-XR45");
input.AddChild(child);
svc.InvokeMethod("SubmitRequest", input, output);
very simple, isn't it. We just need to make sure that the Input Argument of the calling Workflow (Send Email Opportunity Sales Rep) should be the properties of the Child Property Set.

Via Workflow :
Here is the example below in which I have used this and you can accomodate the below two steps in any of the workflow you are using :

Process Properties :
Name : Inputs
Type : Hierarchy

Step1: Set Input Arguments
Business Service : Workflow Utilities
Business Service Method : echo


Step2: Call Asynchronous Service
Business Service : Asynchronous Server Requests
Business Service Method : SubmitRequest


Thats it, you are done. Just to add it here, I tried doing the same stuff with the help of runtime events but it is limitation there and we cannot do that.

.

Friday, July 24, 2009

How to Pass arguments between Workflow & Customize Business Service?

Generally what happens is whenever we create any Customize Business Service, we rarely create "Methods" for it under "Siebel Tools -> Object Explorer-> Business Service -> Business Service Method". What we do is we directly start coding in "Service_PreInvokeMethod" like :
Today I am going to tell you how we can pass arguments of type "String" and "Hierarchy" in the call to Customized Business Service (which don't have any methods specified in "Business Service Method" also don't have any Input/Output arguments specified). If you have worked on the similar requirement earlier, you might be knowing the trick here but for the new people this might be useful.

Lets take the "String" arguments first :


Assuming a requirement to create a workflow where we need to call a customized business service which contains the complex logic and return back the Service Request's status. Please cosider this a requirement for an example here.

Input to Customized Business Service : Service Request Number
Output from Customized Business Service : Status

Here is the Workflow :

So, this seems very simple, right, whatever the "property name" I am setting in the Business Service, the same name should be used in the "Output Argument" of the step.

Lets see what extra need to do in case you are passing a Hierarchy as Input/Output arguments.

Workflow Requirement :
1. Query via EAI Siebel Adapter to get the SiebelMessage for Service Request Number.
2. Pass the Siebel Message as Input Argument to Customized Business Service to update something in it.
3. Get the updated Siebel Message as Output from Customized Business Service.
4. Update the Service Request via EAI Siebel Adapter.


Here is the workflow :


I think you need to try it out at your end to actually understand the trick here. Check it out !!

.

Monday, June 29, 2009

Getting hard time opening DBISQLC ?

Whenever you need to run a query in your Siebel Local database, sometimes it feels bad as we need to follow the below steps everytime :

1. Navigate to SiebSrvr/Bin folder.
2. Open DBISQLC
3. Need to fill in the followig fields in Connection window :
a) Under Login Tab: fill in User Id and Password (in CAPS)
b) Under Database Tab : Click on Browse and locate the SSE_DATA.dbf file.
4. Click on "Ok".

hhmmmm, following the above steps everytime is not a good choice, isn't it?

okayyy.. lets automate this and try to open dbisqlc in just a button click, sounds good !! I know :)

Here are the steps : (taking the assumption Siebel is installed in "E:\Siebel\8.1\Client", "E:\Siebel\8.1\Tools")

1. Create a new batch file (for eg: "mydbisqlc.bat") on the desktop.
2. Copy paste the below lines of text in it.
cd E:\Siebel\8.1\Client_1\BIN
e:
dbisqlc -c
userid=SIEBELMANTRA;password=MYPASSWORD;databasefile=E:\Siebel\8.1\Tools_1\LOCAL\sse_data.dbf

.........................Note : Please change your user name and password in the above command.

3. Save the file on Desktop for keep it handy.
4. Double click on it and enjoy.

I know you must be smiling now after getting this cool tip !!!!
Check it out !!!!!!
.

Saturday, April 4, 2009

Extending Tables / Columns in Siebel Local Database

I have started working on new Env these days and due to slow connectivity to the remote database server, I generally connect to my Local Database to see the changes in SRF via dedicated client.

Now while working on one of the requirement I was required to extend one column in Table in local database. So since it was my local database, extratced with my User Credentials, I went into the Siebel Tools -> Tables and here is what I tried :



1. Query for Table.
2. Create the New Column with all the datatype and length details.
3. Clicked on Apply and as used ODBC source : "SSD Local Db default instance". This is the ODBC data source that I have mentioned in Tools CFG to connect to my local Database.
4. Since its my local database, put in Database User : "", Database User Password : "".
5. Clicked on "Apply".



Got surprised to see that, it gave "Permission Denied" error. I was like, "its my database, my tools, in my machine and the same ODBC data source, still its not working......." hmmmmmm

Started looking into the options and workaround, then realized you can only change the Database Schema if you are logging with the Table Owner credentials. And the Table owner of any local database extracted is "Siebel". Soooooo, just tried again applying the table with the same above process, the only parameter I changed was : "Database User = SIEBEL". and yes it WORKED !!!!!



P.S. : The similar process is applicable for Sample Database as well. Database User : "SIEBEL", Database User Password = "SADMIN".

.

Thursday, February 26, 2009

Siebel High Interactivity Framework

First time I installed Siebel 8.0 on my new laptop and tried opening Sample Dedicated client but system prompt a message saying that :

"Your version of the Siebel High Interactivity Framework for IE, required for use of this Siebel application, may not be current. In order to download a current version of the Siebel High Interactivity Framework, please ensure that your browser security settings are correct and then log in to the application again. Consult your system administrator for details about the Siebel High Interactivity Framework and correct browser settings"

Now, this seems very easy as it was just asking for download it and everybody know when you open Siebel client for the first time, it automatically get downloaded on to the machine.

But, now let me tell what was the issue I was facing and how I got rid of it. When this message was appearing in, a bar was appearing under the Address bar in the Internet Explorer (to install the ActiveX Control) which requires a click so that it can install the Siebel High Interactivity framework (SHIF), but I was not able to click on that because at that moment the popup message was on screen with the "Ok" button. Once I click on "Ok" Siebel client gets closed since SHIF was not there. Again tried opening Siebel client, again the same message with Ok Button and the bar was appearing at the top of the screen where I can't click. Clicked on "OK", Siebel client got closed...... frustration!!!!

I thought it was due to some pop-up blocker or something, so I tried to change the browser settings but didn't get rid of it. Finally got one trick by which it got resolved. Here it is :

While opening Siebel Client, keep pressing "Ctrl" button on the keyboard and observe the difference. This time I didn't get the prompt message and automatically it prompt with the message of installing the SHIF and I clicked on Install and everything worked fine after that..... no issues.

.

Sunday, February 1, 2009

Mouse Hover Text for Siebel Form Applet's Controls

Again on the demand of our Client, we were able to found one unique feature in Siebel by which you can play with the "Controls" (button, textbox etc) available on any Form Applet. Thanks to Rahul (my colleague), who discover this feature. Once you are aware of this feature and just need to know the basic HTML programming, you can display the control the way you want. Sounds good !!! right??

Actually the requirement was to put a hover text on a TextBox (Account) displayed on Opportunity Form Applet. Let me tell you what a hover text is? It is basically a information about some field, which get displayed in a square box when you place mouse over the field.
OOB no feature is available on Control's property, which we can use to solve the purpose. You might be thinking of using "Prompt-Text String Override" property of control for this purpose, but I believe, this property just display the text in Status Bar when cursor is on the control.

So, for putting hover text on the control, we used "Caption - String Override" property itself. But here is a trick. We need to write the Caption along with the HTML tags, so that when this control get render on the UI with some additional HTML tags, we achieve what we are looking for.

Try this, change the Caption-String Override to :
<_label title="This is sample hover text">Account<_/label>
(Please remove the _(underscore) from the above text and then use. I used this for Account field on Opportunity Form Applet. Compile the SRF and see the magic.)

Some more I tried :

1. <_label style="BACKGROUND-COLOR: yellow">Currency<_/label>

2. <_b><_label style="COLOR: RED">OptyId<_/label><_/b>

So, the bottom line is, the more you know the HTML the more you play with the Caption on form applet.

Give it a try !!!!

Saturday, January 31, 2009

Dynamic PickList as a DropDown

Sounds interesting !!! isn't it?

Let me agree that my Client is really smart in using the Siebel application in its own style. Well, he is actually dealing with the end users, who are using the application, so must be knowing what user wants. So, he (our Client) asked us to change the PickApplet into a dropdown which is available on "Template Name" field on "Sales Assessment List Applet" exposed on "Opportunity Assessment View".

First I thought, why he wants to change it at all?? But he was having the valid point in saying that "
my users don't like opening the pick applet for selecting the assessment template name, when there is only 10-15 sales assessment templates are available in the application. So please make it visible like we have for static picklists."

hhhmm...... well, now I need to explore the possibility to achieve this. The requirement sounds bit tricky in the sense that for Dynamic PickLists, I always configured the PickApplet as well. So, to convert it into the dropdown is something new for me.

We already know that Static PickLists are displayed as dropdown, one might think of a solution to create a new List of Values with the same name as of Sales Assessment Templates and create a static picklist and use it for Template Name field. Also let the pickmap fire accordingly as per the previous configuration. But this is just a temporary solution, what if in future new Sales Assessment get added into the application, then every time we need to make a updation in List of Values as well.

So, lets do something interesting. Here is below what I tried :
1. Remove the PickApplet from "Template Name" field, available on Sales Assessment List Applet.
2. Keep the Read Only property set to TRUE.
3. Now check for the following property on the dynamic picklist (Sales Assessment Template Pick List) used :
a) Long List = FALSE
b) No Insert = TRUE

That's it. Compile the SRF with all the configuration changes mentioned above and observe the difference.

Try it out !!!!!

Saturday, January 3, 2009

License Keys in Sample Database

Here is one of the trick that I just tried with Siebel Sample Database and looks good to me.

When I open the Siebel Dedicated Client with the Sample Database, I was not able to some of the Product Configurator views under "Administration-Product" screen. I went back to check for the Views/Responsibilities assigned to me and found all the views were there under my responsibility. So the problem was somewhere else.

Later I found that, "If some of the License Keys are missing in the database, then it might happen that the associated views to it will not be visible in the application". I found the license keys which was required to make the views related to "Product Configurator", from "
http://licensecodes.oracle.com/siebel".
Now I just need to enter these license keys, so I navigated to "Administration-Application -> License Keys" view and got surprised as everything was read only and system was not allowing me enter any more license keys.

Now, this is really fuzzy situation that I am having the license keys but not able to enter it into the system. After lots of head-scratching, I found one way by which we can do that.

What you need to do is, just change the "ConnectString" parameter in Siebel.cfg file to point to the Sample Database and try connect to the Local database (which is now actually pointing to the Sample Database) via dedicated now.

TA DA..... you will the License keys applet is now editable. You can enter whatever license keys you want.

ENjoy !!!!!!

Saturday, November 29, 2008

Call Business Service from Browser : A Trick

Siebel is really a miser if talk of browser script.... but, here is the way that can be used to take full advantage out of it :)

At times we have the requirement to call a Business Service from “Browser Script” then it is necessary to make the entry of that “Business Service” everytime in .CFG file with the following syntax under [SWE] section of the CFG file:

ClientBusinessService X = “”Where X = 1,2,3,4……

So, to get rid of this here is a trick. You can implement a new "Generic Business Service" which will internally call the Business Service that we want to call from Browser Script.

Name of Business Service = CallBusSerFromBrowScript
Method Name = Service_PreInvokeMethod

Generic business Service Code :
function Service_PreInvokeMethod (MethodName, Inputs, Outputs)
{
if(MethodName == “GenericCall”)
{
var svc = TheApplication().GetService(Inputs.GetProperty(”BSName”));
svc.InvokeMethod(Inputs.GetProperty(”MethodName”), Inputs, Outputs);
svc = null;
}
return (ContinueOperation);
}

Procedure for Calling :
Please follow the below code for calling your Business Service from browser script. Lets say you want to call “MyBusinessService” with Method Name = “MyMethod”, then use the following code :
var input = theApplication().NewPropertySet();
var output = theApplication().NewPropertySet();
input.SetProperty(”BSName”,”MyBusinessService”);
input.SetProperty(”MethodName”,”MyMethodsvc = theApplication().GetService(”CallBusSerFromBrowScript”);
svc.InvokeMethod(”GenericCall”, input, output);
svc = null;output = null;input = null;
ToDo List ( Admin Team + Development Team + QA Team)
1. Please update the following code in .CFG file of your web client under [SWE] section with the name of Generic Business Service. This is to be done one time only.

ClientBusinessServiceX = “CallBusSerFromBrowScript”where X = 1,2,3………..
TA DA…… once you are done with this, life become easy. Try it out !!!!!!!!!
This way you make the life of your Siebel-Admin people easier as they don’t require making changes in CFG file in every release. :)