Friday, September 12, 2008

A distant past - Part 1 Siebel

When did the whole thing start?

Well, one of the answers is found in the vast archive of the Wayback Machine ---> http://www.archive.org. If you search for www.siebel.com you are taken back to the mid-90ies and a somewhat unpretentious website from 1996. Just in case the archive gets lost some day, I have preserved a screenshot of the 1996 siebel.com website myself.

A distant past - Part 2 or "It's still there"

Tom on TV

the Siebel Sample Database comes together with a sample file system, which reveals most of its parts when you navigate to the Administration - Document screen and the Literature view. The content there is intended to support the sample data such as products and their images but there are also some kind of random pebbles to be found by the more leisurous among you. Just some samples (SIA or SBA refers to the Siebel Industry Applications or Siebel Business Applications - formerly known as HORizontal - variety of Siebel CRM):

  • .mov files from a documentary about diabetes (SIA)
  • a graphic file showing 10 deutsche mark (SIA and SBA)
  • an 84 page prospectus for a fictitious company named Sycamore Networks (SIA)

and of course - because this is what this post is all about:

  • a TV ad featuring Tom Siebel (maybe 1998), to be found in the SBA sample database


So it is up to you to find the most interesting file and maybe post it here as a comment.

In case you do not have an installation of Siebel CRM 8.0 with the sample database at hand

Automating the Application Deployment Manager (ADM) packaging process

"Open the box, open the box!"

Introduced in version 7.7 of Siebel CRM, ADM (Application Deployment Manager) has been significantly enhanced in version 8.0. The purpose of ADM is to assist developers and administrators to deploy changes made to the Siebel Repository, the physical UI files, Actuate report files and – last but not least – the administrative data of a Siebel CRM application from one enterprise (e.g. development) to another (e.g. test).

Version 8.0 of Siebel CRM also introduces the Siebel Management Server and Siebel Management Agent. These java based modules are used for the packaging and deployment of the a/m changes.

This post covers the techniques to automate the ADM packaging process. It mainly focuses on command line utilites which can be invoked as part of a shell script.

1. Initialize the package / create folder structure using admpkgr

The command line utility for ADM packaging is admpkgr. It resides in the /mgmtsrvr directory of the Siebel Management Server installation.

For automation purposes, shell scripts can be used similar to the following:

call admpkgr init d:\ousea\mgmtsrvr\adm\packages\xyz_package_01

2. Export database types (administrative data) using srvrmgr

Bookshelf Reference: Application Deployment Manager Guide version 8.0: Creating ADM Deployment Units from Database Types Directly from Command-Line --> http://download.oracle.com/docs/cd/B40099_02/books/AppDeployMgr/AppDeployMgr_CreatePkg7.html#wp1009283

To automate the export of administrative data objects such as LOVs, Data Maps, Responsibilites and many more (ADM natively supports more than 60 data types in version 8.0), the ADM Batch Processor server component (new in version 8.0) can be used.

Using the ‘start task’ command from a srvrmgr prompt works as expected for the ADM Batch Processor, however some issues have been reported with passing the parameters. Here are two versions to do it. The first one is passing the parameters using the ‘with’ clause. The second is setting the parameters and then restarts the component.

We are using an input file here, so the basic command would be as follows (note the /i switch):

\bin\srvrmgr /g /e /u /p /s /i ""

Sample input file for version 1:

start task for comp admbatchproc with admpath=\mgmtsrvr\adm\packages\xyz_package_01\database,admdatatype='EAI Data Map',admfilter='[Name] LIKE "XYZ*"',admeaimethod=synchronize,admprefix=XYZ_EAIDMAP

Sample input file for version 2 (which is safe especially for the admfilter parameter):

shutdown comp admbatchproc
sleep 60
change param admpath=d:\ousea\mgmtsrvr\adm\packages\xyz_package_01\database for comp admbatchproc
change param admdatatype='EAI Data Map' for comp admbatchproc
change param admfilter='[Name] LIKE "XYZ*"' for comp admbatchproc
change param admeaimethod=synchronize for comp admbatchproc
change param admprefix=XYZ_EAIDMAP for comp admbatchproc
startup comp admbatchproc
sleep 20

Here is an explanation of the parameters for admbatchproc:

admpath = Location for resultant export files
admdatatype = Name of Data Type (as in Application Deployment Manager screen)
admfilter = Filter to be applied on the data type. For example, '[List Of Values Parent(UDA).Value]="NM"'
admeaimethod = One of three methods: upsert, synchronize, or custom
admprefix = Prefix for the name of exported XML file

3. Export repository changes using consoleapp.exe

Bookshelf Reference: Application Deployment Manager Guide Version 8.0: “Using Consoleapp.exe to Create Repository Deployment Units” --> http://download.oracle.com/docs/cd/B40099_02/books/AppDeployMgr/AppDeployMgr_CreatePkg22.html#wp1012566

The command line utility consoleapp.exe (in the Siebel Tools bin directory) can be generically used to invoke business service methods within a Siebel application from the command line (headless, i.e. without rendering a GUI). The ADM framework provides a bunch of business services which are used mainly for reloading the various caches or – in this case – for exporting repository changes.

In a shell script example, one would use consoleapp.exe to call the “Siebel Tools Export Support for ADM” business service as follows to export the “XYZ New Order for Account” Workflow:

\bin\consoleapp "\bin\enu\tools.cfg" ENU SADMIN "Siebel Tools Export Support for ADM" "Export:Repository=Siebel Repository,Object_1=XYZ New Order for Account,Type_1=Workflow Process,ExportFile=\mgmtsrvr\adm\packages\xyz_package_01\repository\XYZ_WF_1.sif,DescriptorFile=\mgmtsrvr\adm\packages\xyz_package_01\repository\XYZ_WF_1_des.xml,ExportCount=1,LogFile=d:\temp\adm.log"

If this is your first exposure to consoleapp.exe, it might feel a little weird. Here is the syntax:

consoleapp.exe "" “:"

An alternative way to use consoleapp.exe according to bookshelf is to use an xml input file. I have not yet had the privilege to test this in real life, however. The syntax is as follows:

consoleapp.exe /f inputfile.xml

Caveat ---> http://en.wikipedia.org/wiki/Caveat: Make sure that the descriptor file name is exactly spelled like the export file name, having .xml (instead of .sif) as the file type and des as the suffix. Example: ExportFile=XYZ_WF_1.sif, DescriptorFile=XYZ_WF_1_des.xml.

4. Export file types using OS utilities

Files, such as web template files (.swt), must also be copied into the respective package directories. Since there is no dedicated utility provided by Oracle, the shell script would refer to classic file copy utilities. The following is an example for Windows xcopy:

#copy all web template files changed since June, 1st 2007 to the webtempl directory
xcopy \WEBTEMPL\*.swt \mgmtsrvr\adm\packages\xyz_package_01\file\AppServer\webtempl /D:06-01-2007

5. Delete empty subdirectories using OS utilities

It is best practice to delete empty subdirectories to increase processing time and decrease the amount of warnings during packaging and deployment. This would be accomplished using classic OS utilities. The following is a windows example:

rd \mgmtsrvr\adm\packages\xyz_package_01\File\AppServer\reports\enu

6. Generate the package descriptor file using admpkgr

Now it’s time for admpkgr again. As in step 1, it can be used in a shell script with the ‘generate’ option as follows:

call admpkgr generate \mgmtsrvr\adm\packages\xyz_package_01

7. Validate the package using admpkgr

Here is a windows example how to call admpkgr from a shell script and direct the output to a log file:

call admpkgr validate \mgmtsrvr\adm\packages\xyz_package_01 >> "d:\temp\admpkgr_out.txt"


Summary

The ADM packaging process is multifold, and various command line tools come into play when you want to automate it, namely admpkgr, srvrmgr, consoleapp.exe and OS file system manipulation tools.

Business Process Solution Library Siebel

Here I go again

If you have been involved in Siebel CRM projects over the past years, you might have come across some business analyst who mentioned the Siebel Business Process Solution Library (BPSL), which has been released as part of the strong business process strategy together with Siebel CRM version 7.5 in 2002.

Teaching the approach to analyze your business processes and align them with the out of the box functionality BEFORE you start customizing the hell out of your CRM app during the Business Analyst courses ---> http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getlppage?page_id=213&path=SCRM&columnNumber=3*, Siebel instructors all over the world were challenged to position the library NOT as a complete encyclopedia of all business processes that you can do in Siebel applications. To be honest, this would be a ridiculously small library given the vast functionality of Siebel CRM.



In contrary, the BPSL describes - that is at least mho - common best practice approaches to business processes which are (of course) supported in Siebel out of the box.

However, the BPSL has had a rich (including integration with Corel iGrafx and IBM Rational Requisite) but also difficult past and finally has emerged again on metalink3, Oracle's support portal for Siebel CRM customers. So if you have access to metalink3, you also have access to the link below.

Link to BPSL on metalink3 ---> https://metalink3.oracle.com/od/faces/secure/km/DocumentDisplay.jspx?id=554746.1&h=Y
(credentials needed)

*Note: The current Business Analyst training does not teach the BPSL.

Close to the Standard Siebel

"Once bitten, twice shy"

If you have the opportunity to observe some of the Siebel CRM projects (or any other standard enterprise software project) across the globe, however small or large they may be, there is a familiar pattern:

  1. Phase of enthusiasm
  2. Learning phase, along with the assurance to "stay close to the standard"
  3. Pilot phase during which most of the requirements become clear (and complex)
  4. Land of oblivion (where the first thing to be forgotten is the promise of 2.)
  5. Regression to coding (believing that writing custom code can solve all problems faster and easier than standard functionality)

These are some typical phases (hope you also note the satirical aspect) that a typical project goes through.

However, we are talking about standard software, which means frankly that the customizing developers at the customer site find themselves in a race against time and hundreds of developers in the Oracle offices who are determined to create another splendid version (Siebel 8.1 is just around the corner these days).

So when a project has matured and all requirements are solved, the upgrade project typically comes next. And it is during the first attempts to upgrade the more or less customized application to the newest version when the whole thing seems to blow up (# 5. of the above list being reason #1 for the blow-up in most cases).

So we can add to our list

6. a phase of frustration
7. the vow to stay closer to the standard after the upgrade, which is immediately followed by
8. the requirement to upgrade the application (which is complex)
9. The land of oblivion... - we had that before ;-)

To cite a customer: "What does 'close to the standard' mean? How can we solve our very complex requirements if we are not allowed to add custom code? How can we customize the applications and remain upgradeable?"

The answer to the first question: "Thoroughly observe and clearly understand the standard functionality and metadata and when you implement solutions, let your developers behave the same way the developers at Oracle do."

Let's elaborate on this using the Siebel CRM Repository as an example.

Since Siebel 7 was brought on the market in 2001, we can observe that any new module (e.g. Siebel Loyalty in 7.7, Customer Order Management in 7.8), however complex its functionality may be, can be dissected into the following:

1. The basic objects

Metadata objects like applets, business components and tables which allow users and EAI processes to create, read, update or delete data needed for the new module. The Siebel Essentials ---> http://education.oracle.com/pls/web_prod-plq-dad/show_desc.redirect?dc=D46318GC10 or Core Consultant Course ---> http://education.oracle.com/pls/web_prod-plq-dad/show_desc.redirect?dc=D49247GC10 teaches how to create and modify these objects and how they refer to each other.

The following is a chart familiar to those who benefited from these courses



Summing up, we can say that adding or modifying objects of these 10 basic types is "close to standard" because this is exactly the way how the standard application is created.

OK, we now have nice views and applets and they allow us to read and manipulate data. But how does the additional functionality come in here? The answer is:

2. Business Services

These are metadata objects which (since Siebel 2000) serve as globally accessible capsules of functionality (i.e. code). So whenever an Oracle developer is asked to implement some functionality that is not available in the current application, he or she will write code and place it in the repository as a business service.

This is in fact the answer to the second question: You are indeed allowed to write custom code, but you should have it written as a business service" and - being a loyal Oracle University instructor - I would add "And your developers can learn how to do this in the Siebel Scripting Workshop."

A quick look at the current standard Siebel CRM repository (SIA 8.0) reveals a rich library of more than 1000 highly reusable and well-documented (along with many not-at-least-documented - keep your fingers off those) business services.


List of business services in Siebel Tools

OK, so we now have the data access and reusable services, but what if I need to call these services one after the other and combine them with my custom code. This leads us to the 3rd ingredient of standard Siebel CRM applications:

3. Workflows

Siebel Workflow allows developers to combine classic Siebel operations like creating or updating records with standard or custom business services along with decision logic and exception handling. Siebel Workflow is highly scalable and tests have proven a very high performance (outdoing scripted code by factors).

The tool of choice of Oracle developers to orchestrate reusable services into, yes, yet another service (that's what a workflow really is: just another service which you can call from literally anywhere) is Siebel Workflow.

Open the list of standard workflows in Siebel Tools and see for yourself. The current version (SIA 8.0) comes replete with more than 1000 standard workflow processes for literally any kind of functionality such as pricing, integrating with SAP, marketing or customer-facing processes such as quote-to-cash or forgotten passwords.


Example for a standard workflow

Summary (= Answer to the third question and I will make this short):

Focus your customizing investment on the 10 basic objects, business services and workflow and your project is close to the standard and therefore easily upgradeable.

Oracle Master Data Management - Siebel

a closer look

These days I am reading a white paper ---> http://www.oracle.com/dm/08q3field/mdm_detailed_technical.pdf on Oracle Master Data Management (MDM). A customer is interested in training on MDM and I wanted to find out what role the Siebel Customer Data Integration (CDI) and Universal Customer Master (UCM) solution and Oracle BI EE (formerly known as Siebel Analytics) play in the Oracle MDM offering.

You can download the technical white paper on the Oracle Master Data Management website ---> http://www.oracle.com/master-data-management/index.html.

The paper is in fact helpful to help us define the problem areas of existing IT infrastructures, the half-baked solutions that lack the power to combine operational and analytical data into a single view of the customer. It also defines the ideal information architecture and gives a nice overview of the Oracle products (yes, including Siebel CDI, UCM and Oracle BI EE) available to build or buy an MDM solution.

The N² problem

It starts with the N² (n square) problem that occurs when data synchronization between transactional applications is accomplished with code. IT managers all over the globe experience this on a daily basis.




Enterprise Application Integration

Of course there is a more elegant solution established over the last decade which is usually described as an information bus or hub-and-spoke topology, supported by Enterprise Application Integration (EAI) technology.



Service Oriented Architecture

EAI has recently evolved into serice oriented architecture (SOA) where interfaces can be called from an application's service layer independently of the programming language or software platform. SOA is more than just synchronizing data, it also supports business process orchestration across separate systems.



Data Quality

So when your IT infrastructure has evolved to SOA, you will find that the old saying "garbage in, garbage out" is more true than ever before, because data quality is crucial to successful business process integration. So the paper concludes that an MDM solution that really deserves this name must also embed data quality solutions.

Data Warehousing, Business Intelligence and Reporting

Most companies today have established data warehouses and ETL processing that pulls data from the transactional systems into the DW. And most of them have invested in Business Intelligence tools to analyze the billions of records that they store in the DW in order to drive business decisions.

So far so good.

But the following should make us think twice:

  1. Company A rolls out the new CRM system.
  2. A few years later, the analytical CRM project is started
  3. Shortly after the first pilots, the data quality project is launched.

So the BI system suffers from the poor data quality of the transactional systems. Garbage in, garbage out again.



An ideal information architecture

The paper boldly announces the ideal information architecture which brings the MDM system into play as a central instance which enables metadata and data cleansing and forms the base source system for ETL.



Building an MDM solution using Oracle Products

Today, after uncounted strategic acquisitions, Oracle is able to support the ideal architecture with its software stack. So let's look at the architecture from a software perspective.

  • Oracle 11g with RAC for the Database
  • OWB for ETL and Profiling
  • ODI for ETL and Data Migration
  • Master entity data models
  • ESB for integration
  • BPEL PM for orchestration
  • Portal for the user interface
  • IdM for managing users
  • WS Manager for managing services
  • BI EE for analytics
  • JDeveloper for creating or extending the MDM management application.

Oracle utilizes these technologies to build its MDM Data Hubs. Customers who want to build their own MDM solution should use these components as well.

Summary

MDM can be seen as an approach to solve the common IT problems like ever increasing data volume, poor data quality and lack of business insight.

Oracle offers a variety of products to build a solution and also offers pre-built MDM applications like Oracle Customer Hub and Oracle Product Hub.

Siebel CRM is represented by the Siebel CDI and UCM applications and by Oracle BI EE (formerly known as Siebel Analytics).

So to get full grips to an MDM solution, there is a lot to learn and a lot to gain.

have fun

Siebel Server System Alert Notification

E-mail for you...

Triggered by an inquisitive mind, I have recently tried out the System Alert Notification Feature ---> http://download.oracle.com/docs/cd/E05553_01/books/SystAdm/SystAdm_ConfigServer22.html#wp1014907 of the Siebel Server. This feature has been introduced in Siebel 7.7 and allows server components to notify administrators via e-mail when error conditions occur.

The following describes the setup procedure for a simple test scenario.
The scenario assumes that you have an SMTP server up and running as well as a Siebel Enterprise Server installation.

1. Configure the System Alert Profile

You can use the preconfigured System Alert profile with the alias "AdminEmailAlert".
Navigate to Site Map > Administration - Server Configuration > Enterprises > System Alerts.
In the Alert Parameters list, set the parameters according to your environment. You can do it in the GUI or if you prefer the srvrmgr command line here is a template for an input file:

change param AdminEmailAddress=user@localhost.com,
FromAddress=server@localhost.com,
SMTPServerPort=5025,
SMTPServer=localhost,
Message='This is a message from your Siebel Server: '
for named subsystem adminemailalert


click to enlarge

2. Enable notification for a server component.

Let's try it with the Workflow Process Manager:

Navigate to Site Map > Administration - Server Configuration > Enterprises > Component Definitions.
Query for the Workflow Process Manager component definition.
In the Component Parameters list query for *otification* to find all parameters related to notification.

Set the parameters as follows:

Notification Handler = AdminEmailAlert (the name of the system alert profile you modified in step 1)
Notification Action on Task Ex(it) = 1 (Note: this is an advanced parameter, to set it in the GUI, click the Advanced button)

Here is an input file template for srvrmgr:

change param NotifyHandler=AdminEmailAlert,
NotifyOnTaskExit=1 for compdef wfprocmgr


To verify you can use the following command:

list advanced params %otification% for compdef wfprocmgr


click to enlarge

Be a good boy/girl and shutdown and startup the Workflow Process Manager

3. Test

For testing reasons you can simply start a job with no parameters for the component.
Navigate to Site Map > Administration - Server Management > Jobs and create a new job record for the Workflow Process Manager.
Do not enter any parameters and click Submit Job
Press ALT+ENTER to refresh the list. The job will soon change its status to "Error".
Check the e-mails for your test account. Voilá:


click to enlarge

4. How it works

Any component which has the notification enabled as in step 2 will call the Siebel Administrator Notification Component (alias: AdminNotify) on the Siebel Server it resides on. So it is crucial, that this component is in an online state.

Summary

Notification e-mails can be sent from any Siebel Server component to one or more e-mail accounts (comma separated list). The setup is straightforward. Watch out for the advanced parameter NotifyOnTaskExit which has a default value of 0 (zero, no notification) and has to be set to 1.

Siebel Essentials Blog is funny and interesting

office humor, eh ;-)

glad that humorous posts fresh up the discussion, I found that my post on staying close to the standard in Siebel CRM projects has been cited on another blog site ---> http://siebelunleashed.com/staying-close-to-standards. It is very good to see that there are now several blogs on Siebel CRM to be found on the internet (please see the blog roll on the left).

Register Business Services in Siebel 8

gotcha!

Whenever you wish to use an external script such as browser script (which IS external because it runs in the browser) to call a method of a Siebel Business Service, you have to declare this Business Service so that the application accepts the call.

This is a security feature which has been introduced in Siebel 7.5.

Because otherwise any script kiddie could inject javascript code into the Siebel Web Client ---> http://siebelunleashed.com/internet-explorer-address-bar-and-siebel-browser-script/, call any Business Service and wreak havoc.

Most of you are familiar with the odd entries in the applications .cfg file

ClientBusinessServiceN = Name of the Business Service
(where N is a sequential number)

However, during some upgrades to Siebel 8, things went bump in the night ---> http://www.pitt.edu/%7Edash/bump.html.
That is, their browser scripts didn't work anymore, and adding the line to the .cfg file didn't help either.

Here is the solution, and it is in fact related to the year-long effort to get away from text files to configure server components. So since Siebel 8 you have to declare the Business Services which you would like to call from external scripts as an Application User Property.

Migration ---> http://siebel.ittoolbox.com/groups/technical-functional/siebelupgrades-l/new-tasks-for-siebel-80-upgrades-1420925 is rather easy, because they have the same syntax as in the .cfg file.

As you can see in the screenshot below, also PDQDisabledViewN made it into the Application User Props.

Siebel Query Language - an Example

Romeo and Julian...

About the Siebel Query Language

First of all, it abbreviates to SQL which is kind of funny, of course it has nothing to do with SQL.
Just like you can get more out of a spreadsheet application like Excel when you are familiar with its internal functions and syntax, you can get much more out of Siebel CRM if you are familiar with the Siebel Query Language.

Where is it used?

The answer to this question is very interesting, it is used almost everywhere when you define expressions. It is available in both Siebel Tools and the Siebel Web Client and since version 8.0 both the developement environment and the Web Client (that one since 7.0) sport an expression designer.


Expression Designer in the Siebel Web Client
click to enlarge




Expression Designer in Siebel Tools (since 8.0)

Here is a probably complete list of areas where you can use the Siebel Query Language:

Siebel Web Client
  • Predefined Queries
  • Conditional Expressions for Personalization Rules
  • Conditional Expressions for Runtime Events
  • Data Validation Manager rules
  • Data Map Editor
  • [Update] iHelp branching expressions

Siebel Tools
  • Calculated fields
  • Pre-default and post-default values for fields
  • Field Validation property
  • User properties
  • Expressions in Siebel Workflow and UI Tasks

Where is the reference?

The Siebel Query Language is documented in the Personalization Administration Guide ---> http://download.oracle.com/docs/cd/B40099_02/books/PersAdm/PersAdmfunctions.html#wp89966 of the Siebel Bookshelf.

An example:

The following is an example for a predefined query. The task is to filter the list of contacts so that it displays only persons that have their birthday in the current month.

Working with date fields can be tricky and you just can't type something like *June* in a date field. This is where the date functions ---> http://download.oracle.com/docs/cd/B40099_02/books/PersAdm/PersAdmfunctions8.html#wp61252, also known as julian functions come into play.

Our first choice would be the JulianMonth() function. This function takes a date field as a parameter and returns the julian number of the current month which is for example 80660 for August 2008. So the nerds among you will have quickly calculated ---> http://aa.usno.navy.mil/data/docs/JulianDate.php this back and month #1 is of course January of 4713 BC.

If we want to query for persons who have their birthday in the current month, then the JulianMonth() function alone is not helpful because the return value for August 1968 is different from August 2008, so we need a way to extract the month number (1-12) from the date. This can be accomplished by multiplying the julian year number (6721 for 2008) by 12 and subtracting it from the julian month number.

So the equation is: # of current month = JulianMonth(Today()) - JulianYear(Today())*12

This equation will be the base for our query in Siebel CRM. So basically if we want to match the Birth Date field of a Contact with the # of current month, the query goes as follows:

JulianMonth([Birth Date])-JulianYear([Birth Date])*12 = JulianMonth(Today()) - JulianYear(Today())*12

Creating the predefined query:

Usually you can enter even complex queries directly in any control or list column of the applet (in query mode) but there are restrictions in field length and data type. So here is a way that always works.

Navigate to the Contacts List and save the current query (even an empty query would do).


click to enlarge

Navigate to Site Map -> Administration - Application -> Predefined Queries and retrieve your previously saved query.

Replace anything that might be between the two double quotes after 'Contact'.Search = with
JulianMonth([Birth Date])-JulianYear([Birth Date])*12 = JulianMonth(Today()) - JulianYear(Today())*12

So finally it looks like this:


click to enlarge

In the Household Contact view you can enter some birth dates and run your test in the contact List. I have added the Birth Date field to the Contact List Applet to verify.



List of contacts with a birth date in August
click to enlarge

siebel.exe switches - siebel

...and siebdev.exe too ;-)

siebel.exe, as we all know, is the engine behind the non-zero-footprint flavour of Siebel applications, namely the Mobile Web Client or the Developer Web Client. Some call it fat client, some call it dedicated web client, depending mostly on the year when they first heard about it. Discussions whether the Mobile Web Client is a different installer than the Developer Web Client and whether the Developer Web Client is the same thing as the fat client often reach religious depths.

The installer places a bunch of shortcuts in the windows start menu which usually follow the syntax of

/c

So /c is a mandatory switch because any Siebel applications consists of the very same executable along with a different configuration file from which it reads the rest of its knowledge.

In order to please the more inquisitive among you, find below a complete list of switches that you can use with siebel.exe. If you know of any other switch, please inform us.

Typical switches (used in shortcuts)

/c Path to .cfg file (required), directory path defaults to \bin\enu
/d Datasource (as in .cfg file), defaults to local
/l language (optional, language pack must be installed), defaults to enu
/u Username (optional)
/p Password (optional)
/s Path to spool file (optional, to spool all SQL generated by siebel.exe)

Extra switches

/b Path to Browser executable (optional, for multi-browser testing of customer or partner (SI) applications)
/h Debug Mode (used with Siebel Tools for debugging)
/ctsim (often confused with /ctisim, which does not work ;-) CTI Simulation mode (used for demo)
/editseeddata allows modification of seed data, often referred to in maintenance release guides

And now for siebdev.exe:

siebdev.exe is the engine behind Siebel Tools, which is the only application that does not run in a browser window. However, Siebel Tools is defined in the Siebel Repository and the siebdev.exe works just like the siebel.exe. That is, it reads a .cfg file and an .srf file (the file that newbies usually try to compile to during their first steps with Siebel Tools).

So siebdev.exe accepts most of the switches that siebel.exe does, namely /c, /d, /u, /p and /s.

But there are some additional switches, used in conjunction with the "classic" ones. They have been passed along from consultant mouth to consultant ear for eons before they found their way into the documentation.

/bv runs all validation rules for the entire repository, so take your time
/batchimport automates the import of .sif files
/batchexport automates the export of objects to .sif files
/bc allows to run batch compilation
/tl language (typically used with /bc for multiple language deployments)
/applybatchpatch is used for applying batch patches, or patches in batches.

Have a nice day

Client Side Logging - Siebel

books at bedtime

If you read technical blogs, you get the impression that these guys don't have a life and if they sleep at all, they sleep with the Siebel Bookshelf under their pillow.

I can confirm it is not that bad. However, rtfm ---> http://www.acronymfinder.com/RTFM.html is always a good thing and it sometimes reveals features that are quite helpful.

This post tries to shed some light on the Client-Side Logging or High-Interactivity Siebel applications. You can read the full documentation in the System Monitoring and Diagnostics Guide ---> http://download.oracle.com/docs/cd/B40099_02/books/SysDiag/SysDiagClientSideLogging.html#wp1004801.

Client-side logging for high-interactivity applications writes information to a local log file.

It is useful to close the gap in monitoring that existed in earlier Siebel versions, which means you can now

  • capture browser activity data for troubleshooting, such as when a Siebel Web Client stops responding or fails
  • Log individual user or global session information for a specific Siebel Server
  • Debug the source code using JavaScript
  • Trace the sequences of operations

You can enable Client-Side Logging either by setting the SEBLCL_TRACEMODE environment variable on the client machine or setting parameters for the object manager component on the Siebel server like in the following example:

change param
ClientSideLogging=True,
ClntTraceMode=1,
ClntLogFileSize=50,
ClntLogArchiveCount=5,
ClntLogDirectory=D:\SiebelLogs,
ClntTraceUnicode=true
for compdef SCCObjMgr_enu

Once enabled, log files are created in the given local directory of each client. Let's look at a typical file's content.


click to enlarge

So each entry in the file shows which area it belongs to along with the log level, timestamp and - most notably - a SARM id, which allows you to correlate the client file content with SARM files from the server components.

So it is possible to trace a complete client session from the the click in the browser to the operation in the database connector layer of the object manager.

Wednesday, May 7, 2008

Siebel List of Values - A Strategic Move - Continued.

Last time I said that I will be presenting a Solution to make Required Fields dynamic and SRF independent. So I am back with What I promised.

Requirement:

Siebel Service Request module was to be implemented because of a new implementation the business requirements were being changed all the time. One Strange requirement was to make the Required Fields of a business component dynamic. So that they can be changed without a release. Now, we all know one way to make a field required is to set the Required Property of the field to true. But that would mean that if I were to change that a new SRF deployment will be required.


Solution:
LOV's again were the life saver for us. We created an LOV called SRV_REQ_FIELD and in the Display value we provided the names of the fields that we wanted as Required Fields. In the Business Component PreWrite Record we queried for that particular LOV and traversed through the records that were active. If the Field provided in the LOV did not contained a value then an error was raise stating that the value for that particular required field was not supplied. I am giving the Pseudo Code below to what that script might look like


BOLOV = TheApplication().GetBusObject("List Of Values");
BCLOV = BOLOV.GetBusComp("List Of Values");
with (BCLOV)
{
Query for LOV Type as 'SR_REQ_FIELD' and Active Flag = 'Y'
}

IsRecord = BCLOV.FirstRecord();
while( Last record is not reached)
{
this.ActivateField(BCLOV.GetFieldValue("Name"));
if ( this.GetFieldValue(BCLOV.GetFieldValue("Name")) == "" )
Raise Errro Text ("Value not given")
BCLOV.NextRecord();
}


This solution is not recommended if the number of fields that are required is fairly large. But still can be really handy in many situations.

Hope you liked this post! If yes, Do post your comments.

For other posts Related to LOV please go through the category of List of Values

Siebel List of Values - A Strategic Move!

List of Values (LOV) is assumed to pretty simple entity in siebel and having very limited use, of showing values in dropdown picklist. But lately I found they can be used in more than one ways. They can be a real life saver. One use I have found of them is to avoid hard coding. Yes, you can avoid hard coding of values and use LOV instead which you can then change without SRF Release.

I will list below some real scenarios which I have come across and used List of Values to accomplish task which otherwise would have a real pain while moving stuff different environments.

Workflows - Requirement :
We were creating workflows that were going to integrate Siebel with some other application with the help of MQ Series. Now, to accomplish that we had to enter two paramerters related to MQ Series in the first step of workflows, Queue Manager and Physical Queue Name.

If, we were to hardcode then it would be difficult to move workflow between different envoirnments such as QA and production because they had different Physical Queue Name . There LOV's came to our Rescue. We created two LOV's with the values of the Queue Manager and Queue Name and used LookupValue() method in workflows to acomplish that.

LookupValue method accepts two arguments 'LOV Type' and Language Independent Code ('LIC') and returns the display value of that LOV Type. The syntax is as following



LookupValue("LOV Type","LIC")

Example :
  • Create an new LOV Type (in this case we are created MQ_PHY_QUEUE_NAME. It should be same in all the environments where you want to deploy the workflow)
  • Enter the Display Value (actual value that you want to speficy like in this case we specify ESBLDAS for dev env and ESBLQAS for QA Env)
  • Enter the LIC (can be anything descriptive like in this case we had given 'Physical Queue Name')
  • In the Input Arguments of workflow choose input argument type as Expression and specify the value as LookupValue("MQ_PHY_QUEUE_NAME","Physical Queue Name")

Now, it is going to pick the value as 'Display Value' of the LOV that you have specified.

In next post I will describe how can we use LOV to dynamically specify Required Fields for a Business Component.

For other posts Related to LOV please go through the category of List of Values

Siebel CRM How To - Create a new LOV?

Whatever I have posted in this blog assumes that you have fair bit of idea working on Siebel CRM. I noticed there is hardly anything in this blog that can help a newbie. So thought of starting a new Category that is 'Siebel CRM How To'. This Category will include step by step How To's to various things in Siebel CRM. Starting this series is a simple 'How To' of creating a new List of Value and adding to the existing List of Value (LOV).

Information about LOV and explaination about the various terms is subject of another post. In this post I am just going to have step by step tutorial of creating a new LOV and adding new values to existing LOV's

Creating a new LOV

You can create an LOV from two places both have a different way of creating LOV in Siebel CRM.

Administration ==> Data ==> List of Values
Administration ==> Data ==> LOV Explorer


Through List of Values to add a new LOV following steps have to be followed. As an Example we will add a new LOV for Martial Status of a person.


  1. Click New and Choose LOV_TYPE in Type Field
  2. Enter MARITAL_LOV in 'Display Value'.
  3. Enter 'Marital Status' in Language-Independent Code Field
  4. Enter 'English-American' if you implementation language is English otherwise it will be according to the language of your implementation. Save the record
  5. Click New again and choose 'MARITAL_LOV' in Type Field
  6. Enter 'Married' in Display Value and Language-Independent Code Field
  7. Enter 'English-American' if you implementation language is English otherwise it will be according to the language of your implementation. Save the record.
  8. Follow steps 5 -7 for all values that you want to associate with this LOV

For example we will follow steps 5 - 7 and just change the value Married to Single so that It can have two values 'Married' and 'Single'

Through LOV Explorer you have to perform the following steps.

  1. Click New and enter 'MARITAL_LOV' in the Type field
  2. Click on the + sign in the left hand side of the LOV Explorer window for the type that you created
  3. Click on the Values folder.
  4. In the Right hand side Applet click on New
  5. Enter 'Married' in the 'Code' and 'Display Value' Field
  6. Enter 'English-American' if you implementation language is English otherwise it will be according to the language of your implementation. Save the record.
  7. Repeat steps 4-6 for the all the values that you want to enter.


That's it. You are done with creating the New LOV with new Values

To enter New Values in the existing Siebel LOV just perform the following steps.

  1. Query for the LOV Type that you want to add New Values.
  2. Copy the record Enter the Display Value and Language Independent Code Field
  3. Change the value in the Order Field to be the unique number and save the record.
Related Posts that you might like to Read:

Siebel CRM - List of Values a Strategic Move!
Siebel CRM - List of Values a Strategic Move- Continued!

Siebel CRM How To - Invoke Workflow through BC User Property

Till siebel 7.5 the only method know to invoke workflows were

  • Runtime Events in start step of workflow
  • Business Service
  • Business Component Script
  • Workflow Policies
But from Siebel 7.7 ownwards there is one more method by which we can invoke a workflow. That way is Siebel business Component user property. You can 'Named Methodn' user property in a BC which can invoke a workflow where n is increment to the last named method user property defined on that BC.

Name: Named Method

Value:[Event Name] , "INVOKESVC", , "Workflow Process Manager", "RunProcess", 'ProcessName',[Name of the Workflows] , 'RowId', [Row Id Value]

Example

The below mentioned will invoke a workflow named 'Example Workflow' when a new record is created in Example BC.

Name: Named Method 1

Value: "New Record", "INVOKESVC", "Example", "Workflow Process Manager", "RunProcess", "'ProcessName'", "Example Wrokflow", "'RowId'", "[Id]"

Hope this post helps you. If yes, Please post your comments.

Siebel Tools How To - Have Mutiple Local database Instances?

This article is a step by step guide to have mutiple local database instances on the same system.
Below mentioned points might be the reason why you would want to do that

  • You are working on mutilple projects and they all have repository named 'Siebel Repository'. You want to work on both repositories simultaneously.
  • You share your system and you want the changes made by other developer to be on a different instance rather than yours.
  • You have a server that can be accessed by mutiple people who work on it simultaneously

So, How do you do that? Here is the answer

  • Make a copy of your siebel local database (that is file named sse_data.dbf) rename it to be anything such as sse_data_copy.dbf
  • Make a copy your tools.cfg file (which should be residing in siebel install dir\tools\bin\enu\) and rename it to such as tool_copy.cfg
  • Open the tools_copy.cfg file scroll down to section [Local]
  • Find parameter named Connect String and change the value to reflect the name and path of you newly created copy of your dbf file.

for example

Previous Value : C:\PROGRA~1\Siebel\7.8\Tools\local\sse_data.dbf -q -m -x NONE -gp 4096 -c256m -ch256m -ch256m

New Value : C:\PROGRA~1\Siebel\7.8\Tools\local\sse_data_copy.dbf -q -m -x NONE -gp 4096 -c256m -ch256m -ch256m

you can change the other parameters also. To learn more about other parameters please read my post Siebel CRM - Configuration File (cfg) Disected and Explained.

  • Change the parameter named DockRepositoryName to different name if you don't want to have repository of your newly created instance to be Siebel Repository.
  • Create a copy of your shortcut which you use to access your siebel tools instance.
  • Right Click on the newly created instance and choose properties from the context menu
  • In the Target field of the newly opened window scroll to the point where it mentions the name of the cfg file which should be tools.cfg
  • Rename just the name of the file to tools_copy.cfg (the name of the copy of the cfg file you made)

for example

Orignal Value : "C:\Program Files\Siebel\7.8\Tools\BIN\siebdev.exe" /c "C:\PROGRA~1\Siebel\7.8\Tools\bin\enu\tools.cfg"

New Value : "C:\Program Files\Siebel\7.8\Tools\BIN\siebdev.exe" /c "C:\PROGRA~1\Siebel\7.8\Tools\bin\enu\tools_copy.cfg"

And you are done. Now you have two Siebel tools instances on the same system.

This solution will not work if :

  1. If you mutiple users work on the system at same time. (For example a terminal server where multiple users can login and work simultenously)
  2. If you want to Check in your changes to a different server

In next article we will discuss about additional changes that can be done to overcome this problem.

I Hope this post was helpful to you. If yes, Please post your comments or suggestion to make this site better.

Siebel How To - Create Inbound and Outbound Webservice?

I was fortunate enough early in my carrer to get a chance to work on Siebel EAI. It was the first implementation of Web Services in our project. So, had to struggle a lot to understand basics of web service. But I always from my school time had intrest in XML and Web so understanding that part was not that difficult but I really had to work hard to understand web services from Siebel Prespective. I am thankful to God now that there was nobody to guide me at that time which resulted in terrific learning and understanding of a fact

'Siebel is Huge' like a sea and what I have explored till now is not even 10% of whole Siebel.

During my days working on Siebel Web Services I created a Powerpoint Presentation (PPT) which had minimum steps that you need to perform to create Inbound and Outbound Service with Screen Shots. Which I would like to share with you all. It can act as a your guide to check If you are missing any steps in creating Web Service. It is not a comprehensive guide but just a tutorial to give you insight and to point you to the right direction if you are involved in EAI.

Click on the Link Below to download the PPT.

Download Now!!!!

Hope this post helps you. Please post your comments and suggestions.

Siebel How To - enable or disable a button conditionally?

I was working on my desk one day and newbie to siebel approached me to ask a question(also a avid reader on asked me the same question on mail). He asked me about a simple requirement or rather I should say the requirement that appeared simple to me.

The requirement was :

A button on an Applet should be enabled if a particular user logs into the application otherwise it should remain disabled.The Solution is a simple script that we can write on Applet_PreCanInvoke event to enable or disable a button conditionally.

I am providing the pseudo code for that script below

function WebApplet_PreCanInvokeMethod (MethodName, &CanInvoke)
{
if (MethodName == "UrButtonMethod")
{
if(UserLogin == "AuthorisedUser")
{
CanInvoke="TRUE";
return (CancelOperation);
}
else
{
CanInvoke="FALSE";
return (CancelOperation);
}
}
}

There is just one catch in the above mentioned code. How will you find that user is the authorised user or not. There are several ways of doing it some are easy and some are difficult.

I will tell you the easiest way to do that. You just need to write one line of code to accomplish that which is as following.

if(TheApplication().GetProfileAttr("Me.Login") == "AuthorisedUserLogin")

There is a whole bunch of such kind of profile attributes that are available to us all the time in the whole application, we can use them anywhere we want. But discussion on Profile Attributes is subject of another post. So, come back for more.

If this post was helpful to you, Please post your comments or suggestions to make this site better.

Navigating Siebel - Via Keyboard!

We generally navigate siebel with the help of mouse. Suppose, one fine day your mouse stops working would that mean that you are stuck and will not be able to work on siebel? I don't think so, to overcome that situation Siebel has provided keyboard shortcuts or acclerators to navigate and perform important functions in siebel so that you are dependent on Mouse to do all your work in siebel.

And I have always been a fan of keyboard as it saves you lot of time while working on system. So, here I am presenting list of keyboard shortcuts provided by siebel to perform various functions.


Record Management

New Record : CTRL + N
Copy Record : CTRL + B
Delete Record : CTRL + D
Save Record : CTRL + S
Undo Record : CTRL + U OR ESC
Select All Records in List : CTRL + A

Record Navigation

Next Record : CTRL + Down Arrow Key
Next Page of Records : CTRL + ALT + . (In List Applets)
Last Page of Records : CTRL + ALT + L (In List Applets)
Previous Record : CTRL + Up Arrow Key
Previous Page of Records : CTRL + ALT + , (In List Applets)
First Page of Records : CTRL + ALT + F (In List Applets)


Query Management

New Query : CTRL + Q
Execute Query : ENTER in a Field OR CTRL + ENTER in a Text Area
Refine Query : CTRL +R

General Navigation

Go to Site Map : CTRL + SHIFT + A
Open Search Center : CTRL + F OR CTRL + SHIFT + F
Run Report : CTRL + SHIFT + R

Layout Management

Define Columns Displayed : CTRL + SHIFT + K
Define Sort Order : CTRL + SHIFT + O

Online Help Shortcut


Open Online Help : CTRL + ALT + H
Help with Record : CTRL + ALT + K
Technical Support : CTRL + ALT + J

Application Management Shortcut

Connect as New User : CTRL + SHIFT + W (Works in Dedicated Client)
Log Out : CTRL + SHIFT + X (Works in Dedicated Client)


Field Navigation

Next Field : Tab
Previous Field : SHIFT + TAB

If you think I have missed something or you know something that others don't feel free to share it here. I will be more than happy to include it with your reference.

Siebel CRM How To - Automate login into Siebel Dedicated Client

The trick I am going to tell you in this article might seem to you very simple and basic if you have been working on siebel for a long time but for a newbie it can be small time saving trick during his early days of dabbling with Siebel Development. I have come to know in last few days while talking to a friend, assuming that a simple thing is known to everybody is a mistake and there is nothing such as useless simple thing.

My experience has taught me that it is pretty common to ignore simple things but they usually are the one's that can save you a lot of hassel if used in a proper way. During our intital time of Siebel development there is atleast 50 time we open Siebel Dedicated Client and Siebel tools while we are trying to explore Siebel to the best of our ablity. This simple trick can automate your login to the client and tools and save some time of entering username or password.

  • Right Click the shortcut through which you acess the Siebel Client or Siebel Tools and choose Properties from the context menu.
  • Scroll right to the end of Target Text Field Value enter the following text in the end.

/u sadmin /p sadmin /d sample

These text will automate your login to sample database. If you want to automate your login to Local Database enter the following code.

/u username /p pwd /d Local

replace username with your local username and pwd with your local database password

You can create copies of the shortcut that you use and can configure different shortcuts to login to different databases. Detail about switches being used in the above article and other switches that can be used is a subject of another post.

Hope this post helps you. If yes, Then please post your comments or suggestion to improve this blog.

NextRecord DeleteRecord - Use with caution!!

Number of times we have written code in which we have to traverse number of records in a loop and n number of times we have missed one important statement that results in our code to stuck in infinite loop. Yes, I am talking about the statement Object.NextRecord()

This statment is generally used at the end of the loop so that after all the processing is complete we move on to the next record in the record set and perform processing on the next record. I am giving a Psuedo code to explain that.

while(not end of recordset)

{

perform operation

recordset.NextRecord()

}


But here I am going to to tell you about a situation where doing a NextRecord(). will result in problems. Yes, I we are deleting the records in the loop then we don't need to use the NextRecord() function.


Reason for that is using DeleteRecord() results in pointer to moved to next record automatically and if we use NextRecord then it will result in skipping of the last record we are trying to delete. Pseudo to explain this

while(not end of RecordSet)

{

do processing

recordset.DeleteRecord();

// recordset.NextRecord(); // no need to use next record as delete will automatically move the pointer to next line

}

Hope this tip is helpful. Happy Scripting :)

Siebel CRM How To – Restrict a Field to only Accept Certain Characters?

Requirement:

  • We have a multilingual application and we have Unicode enabled database but still we would like to restrict user from entering certain characters.

  • We want to prevent user from entering numbers in alpha-numeric fields.
Solution:

Use charCodeAt function given by Siebel but not documented properly by Siebel. Here I am giving a Pseudo code to explain how it can be used.

if (FieldName == "First Name") {
for (var i=0;i less than field length ;i++) {
var ASCII_code = fieldvalue.charCodeAt(i)
if(ASCII_code is not valid code)
Error("Not Valid Code");
}}


charCodeAt() returns the ASCII code of the character that is supplied to it. ASCII code comparison is way faster than the number function that are used to compare strings so we can also use this function where we want to compare two strings by just modifying the above given Pseudo code.

Hope this helps! If yes, Please put your comments below.

Siebel eScript – How to track performance with Timing Scripts

Timing scripts can come in handy to know exactly how much our code is taking to execute. There can be several reasons for doing this.

  • We are calling several business services in code and we need to know performance of each one.
  • We need to know time our script on business component, Applet is taking
  • We have several approaches to solve the problem and need to know the exact time taken by each.
The code to achieve that is:

var fileVar = Clib.fopen("c:\\Timing.txt", "at");
var timeVar = Clib.ctime(Clib.time());
Clib.fputs(timeVar + ": Starting trace in of code", fileVar);

//code which you want to track time
…………………………………….
…………………………………….

timeVar = Clib.ctime(Clib.time());
Clib.fputs("Ending trace of code: " + timeVar, fileVar);
Clib.fclose(fileVar);

PS: This code will work only if you are trying to run it in dedicated client or your Siebel server is windows server. This code will fail if you are trying to run it from thin client and your Siebel Server is a unix server as it will not able to find the path. You will have to change the path to unix path e.g. /apps/srvr/bin if your server is unix.

Hope this helps!!!!

Siebel eScript – An Overview

Scripting is one of the most important areas in Siebel Development but irony is that it is never recommended to write script in Siebel. Siebel scripting is done in a language known as eScript. eScript shares it’s syntax with JavaScript. If you have worked in JavaScript then you would find it pretty easy to adapt to eScript.

eScript can be broadly classified into two categories

  • Server Scripts
  • Browser Scripts
Server Scripts: as its name suggests is executed on server side. Which means that the user request is sent to server where the scripts is then executed

Browser Script: is actually converted into JavaScript and is executed on client side.

Usually scripting is written on objects in Siebel such as Applets, Business Components etc. But the main use of eScript is done to write Business Services. There are lots of things that you achieve through a business service. Detail discussion on business service is subject to different post but it is similar to somewhat workflows implementing complete business processes with the help of script.

Scripting should be used as a last resort. Everything can be done through script of course but it makes the manageability and up gradation of Application difficult.

But as I said in my earlier post to be a successful Siebel developer Scripting and Configuration should be your strong points. Scripting can be fun but should be avoided as long as possible

Siebel Logs - How Useful are they ?

If you have worked on Siebel CRM I am sure that you have heard the term LOGS lot of times. They are one of the most important and useful things if you are a Siebel Developer. But still most of us actually know how to use them to our advantage or to reduce our development time. Here in this Article I will try to explain some tips and tricks to get the logs and debug our code. Now we all know that we have two types of Siebel Application Clients.


  • Dedicated Client
  • Web Client
Siebel Web Client : We will talk first about the Siebel Web Client. Now to get logs from Siebel Web Client there is no easy way and the only way to get logs is to increase the log level at server for "Object Manager" or particular component that you want to get logs of for example Workflow Process Manager. I will talk detail about the Web Client Logging techniques in my next few posts.

In this article I am going to discuss ways which can help us get logs from dedicated clients and speed up our debugging and development time.


Dedicated Client : There are essentialy two ways to get logs from dedicated client

  • Spool
  • Environmental Variable

Spool : it is a very basic and known technique to get the spool of all the SQL Queries that are fired in the database level and we all come across it during our initial Siebel development days. We can enable the spool for Siebel Client as well as Siebel Tools. The steps to enable spool for both the Siebl tools and client there is common process which is as following

  1. Right click the siebel tools or Siebel Client Shortcut
  2. Go to end of String which is in Target Text Field
  3. Enter the Following string at the end: /s "c:\spool.txt"

/s switch here stands for Spool. Various other switches that can be used are as following

  • /u : username
  • /p : password
  • /d : database

With the following string you can automate login to your local or sample database depeding on the value you give in the switch. I am providing you examples of both

/u sadmin /p sadmin /d sample : String to login to Sample database with Sadmin user id
/u user /p pwd /d local : String to login to Local database with "user" user id.

Environmental Variable : This is more powerful and less know method of generating logs for dedicated client. Siebel has provided couple of Environmental Variables which are as following :

  • SIEBEL_LOG_EVENTS
  • SIEBEL_LOG_DIR

SIEBEL_LOG_EVENTS : This environmental variable can have two types of values.
Numeric or text.
The numeric value is the log level which can be between 1-4. 1 being the lowest and 4 being the highest. The Text value can be ALL which means Log Level of 4.

SIEBEL_LOG_DIR : This value of this variable is path where you want to create the logs. Makes sure that the path you mention is valid otherwise the logs will be created in the temp directory.

Examples of both the environmental variables are as following

SIEBEL_LOG_EVENTS : ALL
SIEBEL_LOG_DIR : C:\siebel_logs

The process to create these enviornmental variables is as following

  1. Right click on the My Computer Icon
  2. Select Properties from context menu
  3. Go to ==> Advanced Tab
  4. Click ==> Environmental Variables
  5. In User Environmental Variables Tab click New
  6. Enter SIEBEL_LOG_EVENTS in Variable Name field
  7. Enter ALL in Variable Value Field
  8. Click New again and Enter the following details
  9. Variable Name : SIEBEL_LOG_DIR ; Variable Value : "your siebel log path"

Remember that Variable Names are case Sensitive. After you have created the variables when you start you dedicated client you will notice that in the path that you have given a file named siebel.log is created for Dedicated Client and file named siebel_dev is created for Siebel Tools.

If you don't provide the SIEBEL_LOG_DIR environmental variable the logs are created by default in Temp Directory.

Hope this posts helps you.
If the answer
is yes. Please post your comments and visit again.

Siebel Business Component Outer Join - How Important?

During my past two years of working on Siebel I have come across lot of situations where just one little miss can wreck havoc with the application. It can result in performance issues and Data issues. I think some of you might have guessed by know what miss I am talking about.

I am talking about Outer Join Flag on Join Section of the Business Component. Joins are the integral part of Siebel configuration. They are indispensable, joins are required because we know the database (it can be oracle, DB2 or Microsoft SQL Server) is a relational database known as RDBMS in short form. Which means the information that resides in it is in the form of related tables and we always need information of one table in another. These tables are related with the help of Foreign Keys (FK). So, when we want to show information of one table in another we use Joins and we use them all the times.


When we are creating Joins in Siebel you can see a field called Outer Join Flag. Please see the screenshot below.



and every time we don't check that flag we are heading for trouble.
Now, what exactly does that flag represent? Before I explain it I assume that you have basic understanding of SQL and simple joins. As I have mentioned earlier that everything that configure or do on UI is converted into SQL and that is where this flag comes into picture.

For example see the simple sql pulling data from another table with the help of simple join

select name b
from siebel.s_opty a, siebel.s_doc_quote b
where b.par_row_id = a.row_id
and a.somefield = b.somefield
and a.row_id = 'Some Id'

Now this SQL is suppose to select name of the quote where the par_row_id column (which store row id of its parent) is equal to the row if of opportunity and in addition to that somefield of opportunity is equal to some field of quote. Now we assume that you had created a join between Opportunity-Quote and forgot to check the outer join flag.You will be amazed to see that there are No Records on UI. The reason being it will try to match the exact values in the field and any record that is a not a match will be discarded. Which means if there are some records that have no value in 'somefield' either in Opportunity or on Quote will be discarded. What if we want those records to shown? We have to check the Outer join flag which will result in a query as given below

select name b
from siebel.s_opty a, siebel.s_doc_quote b
where b.par_row_id = a.row_id
and a.somefield = b.somefield(+)
and a.row_id = 'Some Id'

Which will result in all the Quotes that have 'Some Id' in par_row_id or in simple terms that have Opportunity Id with 'Some Id' as their parent.

My experience has taught me to ask this as the first question whenever I face problem mentioned above and I have seen developers sweat over this kind of problem for hours before they spot it. I will mention some real life situations I have faced which were due this little (or rather huge) miss while doing configuration.

Examples - Real Life Situations:
We have developed a web service that resulted in the insertion of quotes from a Java Application. When we inserted a quote it got inserted successfully and when we tried to update it, it Failed. It took us almost a day to find out that a developer had created a new join in business component and forgot to check that Outer Join flag which resulted in update to failed as it was not able to fetch that record.

I had created a new View in Assets Screen. When user was in My Assets view then he was able to see the records but as soon as he choose All view the records disappeared. The reason same a new join and forgot to check Outer join flag.

Whenever you face this kind of problem go through logs and more often than not you will find this as your root cause. To know more about logs read my Post Siebel - Logs How useful are they?

If this Post was helpful to you please post some comments and come back for more.

All Rights Reserved