Friday, February 19, 2016
Multi Org support for an Inbound Web Service
Friday, August 2, 2013
Two Buttons with same Method Invoked = ShowPopup, displaying different popup applets!!
“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
|
Wednesday, July 24, 2013
How to expose a hidden field in Siebel list applet?
Wednesday, July 27, 2011
Child Field Read Only depending on Parent Field Value
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
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?
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??
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?
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".


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?
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
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);
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 :Step1: Set Input Arguments
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?
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 :
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 ?
1. Navigate to SiebSrvr/Bin folder.
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.
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 !!!!
Saturday, April 4, 2009
Extending Tables / Columns in Siebel Local Database
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 !!!!!
.
Thursday, February 26, 2009
Siebel High Interactivity Framework
"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
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.
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 :
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
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 :
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
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, 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
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 :
svc.InvokeMethod(”GenericCall”, input, output);
ClientBusinessServiceX = “CallBusSerFromBrowScript”where X = 1,2,3………..

