<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2475725884974991295</id><updated>2012-01-02T00:48:24.252-06:00</updated><category term='EIM'/><category term='server parameters'/><category term='data validation'/><category term='scripting'/><category term='meta'/><category term='book reviews'/><category term='fundamentals'/><category term='integration'/><category term='SDLC'/><category term='virtual business components'/><category term='introduction'/><category term='interview question'/><category term='configuration'/><category term='Fusion'/><category term='workflow'/><category term='best practice'/><category term='security'/><category term='regular expressions'/><category term='performance'/><category term='user properties'/><category term='project management'/><category term='upgrade'/><category term='script alternatives'/><category term='system administration'/><title type='text'>Siebel Developer</title><subtitle type='html'>Tips and Tricks for Siebel development from an expert in the field.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://siebeldev.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://siebeldev.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jim Tanner-Uicker</name><uri>http://www.blogger.com/profile/00825624314517215608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>24</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2475725884974991295.post-5476927567863577331</id><published>2010-11-23T00:44:00.004-06:00</published><updated>2010-11-23T00:59:16.090-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='user properties'/><category scheme='http://www.blogger.com/atom/ns#' term='script alternatives'/><category scheme='http://www.blogger.com/atom/ns#' term='workflow'/><title type='text'>Launching a Workflow Process from a Business Component</title><content type='html'>One way to replace business component scripting with more declarative configuration is by using Siebel Workflow.  A workflow process can perform many of the same operations that you can configure with eScript.  If you want to execute a workflow when a BusComp field is updated, you can invoke it from scripting in the SetFieldValue event of the business component.  There is, however, the option of using business component user properties for a completely declarative solution.&lt;br /&gt;&lt;br /&gt;An example of using the applet version of the Named Method &lt;em&gt;n&lt;/em&gt; user property to invoke a workflow process can be found in &lt;a href="http://download.oracle.com/docs/cd/B40099_02/books/ToolsDevRef/ToolsDevRef_UserProps21.html"&gt;Siebel Bookshelf&lt;/a&gt;.  The same user property is available for business components.  An example of a named method declaration follows:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"style=";font-family:monospace;font-size:13px;"&gt;&lt;strong&gt;User Property Name: &lt;/strong&gt;Named Method 1&lt;br /&gt;&lt;strong&gt;User Property Value: &lt;/strong&gt;"MyInvokeWFMehod", "INVOKESVC",  "Employee", "Workflow Process Manager", "RunProcess", "'ProcessName'", "'The Do Something Cool Workflow Process'", "'WorkPhone'", "[Work Phone Number]", "'Login'", "[Login Name]", "'RowId'", "[Id]"&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;In this example, "MyInvokeWFMehod" is the name I give to the named method.  "Employee" is the name of the business component.  "The Do Something Cool Workflow Process" is the name of the workflow process.  After the workflow process name, a series of name-value pairs are additional parameters passed to the workflow.  "WorkPhone" and "Login" are process properties of the workflow process.  Each process property name can be followed by a bracketed field name or business component expression.  "RowId" is a method argument of the Workflow Process Manager business service that passes its value to the "Object Id" process property of the workflow.  &lt;br /&gt;&lt;br /&gt;Please note that parameter names and literals must be in quotes, despite the fact that the user property arguments are already in quotes, which results in the strange syntax of "'Literal Value'".  &lt;br /&gt;&lt;br /&gt;Another user property is also usually required to invoke the named method, unless the named method is already invoked by the business component itself.  To invoke the named method upon a field being updated, use the On Field Update Invoke &lt;em&gt;n&lt;/em&gt; user property.  For example:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"style=";font-family:monospace;font-size:13px;"&gt;&lt;strong&gt;User Property Name: &lt;/strong&gt;On Field Update Invoke 1&lt;br /&gt;&lt;strong&gt;User Property Value: &lt;/strong&gt;"Work Phone Number", "Employee", "MyInvokeWFMehod"&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;When the "Work Phone Number" field of the "Employee" business component is updated, the "MyInvokeWFMehod" named method is invoked, which calls the "RunProcess" method of the "Workflow Process Manager" business service, which acts as a proxy for the "Workflow Process Manager" server component, which executes the "The Do Something Cool Workflow Process" process, using values passed from the business component directly into workflow process properties.&lt;br /&gt;&lt;br /&gt;In summary, use the On Field Update Invoke &lt;em&gt;n&lt;/em&gt; business component user property together with the Named Method &lt;em&gt;n&lt;/em&gt; business component user property and your own workflow process for a completely non-scripted way to add complex logic to the event of updating a business component field.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2475725884974991295-5476927567863577331?l=siebeldev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siebeldev.blogspot.com/feeds/5476927567863577331/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2475725884974991295&amp;postID=5476927567863577331' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/5476927567863577331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/5476927567863577331'/><link rel='alternate' type='text/html' href='http://siebeldev.blogspot.com/2010/11/launching-workflow-process-from.html' title='Launching a Workflow Process from a Business Component'/><author><name>Jim Tanner-Uicker</name><uri>http://www.blogger.com/profile/00825624314517215608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2475725884974991295.post-6877783832498523945</id><published>2010-09-07T22:30:00.004-05:00</published><updated>2010-09-08T00:21:17.518-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='system administration'/><category scheme='http://www.blogger.com/atom/ns#' term='book reviews'/><title type='text'>New Siebel Administration Book</title><content type='html'>There are few Siebel books on the market, so when I found out about a book by the author of &lt;a href="http://siebel-essentials.blogspot.com/"&gt;one of my favorite Siebel blogs&lt;/a&gt;, I wanted to write a review right away.  &lt;a href="http://www.packtpub.com/oracle-siebel-crm-8-2-installation-and-management/book?utm_source=siebeldev.blogspot.com&amp;utm_medium=bookrev&amp;utm_content=blog&amp;utm_campaign=mdb_004291"&gt;Oracle Siebel CRM 8 Installation and Management&lt;/a&gt;, by Alexander Hansal, is an introduction to many of the key administrative tasks in short, easy-to-understand sections.&lt;br /&gt;Some of the sections of the book are quite strong.  The chapter on Siebel Remote is very good.  It covers the various types of mobile clients for various users, the process of extracting the mobile client for a user, initializing local databases, keeping them synchronized, and many more important tasks.  In a 25 page chapter, Hansal provides an overview of Siebel Remote that an administrator can read before diving into the Siebel Bookshelf guide that is more than 10 times as long.  Another chapter on system monitoring offers a good introduction to that topic, including a pretty detailed overview of SARM analyzer functionality.  &lt;br /&gt;Some chapters are weaker.  The chapter on access control, for example, was sketchy and confusing.  However, in the balance, the book offers valuable assistance to a Siebel Administrator who wants an overview of the various parts of the job.&lt;br /&gt;The book cover claims that the book "offers a comprehensive understanding of Siebel CRM."  It does not do that.  Instead, the book offers an overview.  As an overview, it's quite good.  Administrators who are new to the role would do well to read this book from cover to cover.  The high-level understanding offered there can be supplemented with deeper dives into Siebel Bookshelf as real-life situations arise.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2475725884974991295-6877783832498523945?l=siebeldev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siebeldev.blogspot.com/feeds/6877783832498523945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2475725884974991295&amp;postID=6877783832498523945' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/6877783832498523945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/6877783832498523945'/><link rel='alternate' type='text/html' href='http://siebeldev.blogspot.com/2010/09/new-siebel-administration-book.html' title='New Siebel Administration Book'/><author><name>Jim Tanner-Uicker</name><uri>http://www.blogger.com/profile/00825624314517215608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2475725884974991295.post-7343240055936119650</id><published>2010-09-04T00:22:00.000-05:00</published><updated>2010-09-04T00:22:41.601-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fundamentals'/><category scheme='http://www.blogger.com/atom/ns#' term='workflow'/><title type='text'>Workflow Policies vs Workflow Processes</title><content type='html'>Building a solution with Siebel Workflow often involves the use of both Workflow Policies and Workflow Processes.  Siebel Workflow, taken together, is a complete application for automating server processes defined using declarative relationships between logical objects.  As a Siebel Developer, you need to understand the difference between a Workflow Policy and a Workflow Process.&lt;br /&gt;&lt;br /&gt;A Workflow Process is a program that runs on the Siebel server.  It is defined through a graphical interface as a set of steps.  When the process runs, a single record is processed.  The workflow process steps are performed as a series of data operations.&lt;br /&gt;&lt;br /&gt;A Workflow Policy is a specific event that occurs on the Siebel database.  Based on a database trigger, it can include many complex criteria, but it ultimately evaluates to a true/false condition to determine whether to execute a program or not.  Commonly, a Workflow Policy will execute a Workflow Process.&lt;br /&gt;&lt;br /&gt;Do not be confused between the Business Object that is part of the Workflow Process definition and the Workflow Policy Object that is part of the Workflow Policy definition.  A Workflow Process runs on the business layer of the Siebel object model.  The Business Object that helps define a Workflow Process is the same Business Object that governs the logical data entity relationships between Business Components in Siebel screens and views.&lt;br /&gt;&lt;br /&gt;A Workflow Policy Object is also configured in Siebel Tools, and it also represents a logical data entity, but it seems closer to the data layer of the Siebel object model.  Workflow Policy Objects, Components, Columns, and Component Columns are a objects that do not contain or enforce any business rules.  They are essentially columns and tables, and the relationships between them.&lt;br /&gt;&lt;br /&gt;By first understanding the basic differences between these two core components of Siebel Workflow, a Siebel Developer can begin to grasp the basics of the powerful business process automation application known as Siebel Workflow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2475725884974991295-7343240055936119650?l=siebeldev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siebeldev.blogspot.com/feeds/7343240055936119650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2475725884974991295&amp;postID=7343240055936119650' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/7343240055936119650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/7343240055936119650'/><link rel='alternate' type='text/html' href='http://siebeldev.blogspot.com/2010/04/workflow-policies-vs-workflow-processes.html' title='Workflow Policies vs Workflow Processes'/><author><name>Jim Tanner-Uicker</name><uri>http://www.blogger.com/profile/00825624314517215608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2475725884974991295.post-2546406762221844906</id><published>2010-04-05T00:51:00.006-05:00</published><updated>2010-04-05T01:05:39.198-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='system administration'/><category scheme='http://www.blogger.com/atom/ns#' term='SDLC'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>Abstracting Database Passwords in Batch Scripts</title><content type='html'>Even when a Siebel implementation does not need to be SOX compliant, it is still important to develop and maintain processes to reduce errors and fraud.  Separation of duties (SoD) is an important security principle in any enterprise application environment.  For example, it is often best to prevent Siebel Developers from having administrative access, and to prevent Siebel Administrators from changing code. &lt;br /&gt;&lt;br /&gt;One potential vulnerability is that command-line server manager connections require a username and password that authenticate against the Siebel database.  People with this information can use a third-party tool to access and manipulate the Siebel database.  In a production environment, administrators need these passwords, but they should be restricted as much as possible, especially from developers.  &lt;br /&gt;&lt;br /&gt;Scripts invoking the Siebel Server Manager command-line interface can be a powerful tool for automating server tasks, but connecting to the command-line interface on a Windows server requires the following syntax:&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"style=";font-family:monospace;font-size:13px;"&gt;srvrmgr /g gateway1 /e enterprise1 /s server1 /u sadmin /p sadmin&lt;/span&gt;&lt;/blockquote&gt;In the above command the /u and /p arguments require a valid username and password using database authentication.  A batch script containing this information challenges the SoD principle.  Either an administrator manipulates the script to insert the password, or a developer does.  Either way, the roles become blurred.&lt;br /&gt;&lt;br /&gt;The solution to this problem is to isolate passwords and other environment-specific information from the script itself.&lt;br /&gt;&lt;br /&gt;Consider the following excerpt from a Windows shell script:&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"style=";font-family:monospace;font-size:13px;"&gt;call E:\secure\envvariables.cmd &lt;br /&gt;&lt;br /&gt;E:\sba80\siebsrvr\BIN\srvrmgr /g %gateway_server% /e %enterprise_server% /s %siebel_server% /u &lt;span style="font-weight:bold;"&gt;%eimuserid%&lt;/span&gt; /p &lt;span style="font-weight:bold;"&gt;%eimpassword%&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;In the envvariables.cmd file, the following:&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"style=";font-family:monospace;font-size:13px;"&gt;@set gateway_server=PRODGTWY&lt;br /&gt;@set enterprise_server=Siebentprod&lt;br /&gt;@set siebel_server=Siebprodbat1&lt;br /&gt;@set &lt;span style="font-weight:bold;"&gt;eimuserid&lt;/span&gt;=EIMIMPORT&lt;br /&gt;@set &lt;span style="font-weight:bold;"&gt;eimpassword&lt;/span&gt;=SecurePwd&lt;/span&gt;&lt;/blockquote&gt;It doesn't matter how much complex logic is added to the shell script containing the srvrmgr command, user names and passwords are segregated from the logic in a file that can only be modified by the system administrator.  Moreover, environment information is also segregated, so the script can be migrated through UAT and Production without modification.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2475725884974991295-2546406762221844906?l=siebeldev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siebeldev.blogspot.com/feeds/2546406762221844906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2475725884974991295&amp;postID=2546406762221844906' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/2546406762221844906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/2546406762221844906'/><link rel='alternate' type='text/html' href='http://siebeldev.blogspot.com/2010/04/abstracting-database-passwords-in-batch.html' title='Abstracting Database Passwords in Batch Scripts'/><author><name>Jim Tanner-Uicker</name><uri>http://www.blogger.com/profile/00825624314517215608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2475725884974991295.post-5625781590930177871</id><published>2010-03-12T23:12:00.000-06:00</published><updated>2010-03-12T23:40:30.617-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='script alternatives'/><category scheme='http://www.blogger.com/atom/ns#' term='workflow'/><category scheme='http://www.blogger.com/atom/ns#' term='interview question'/><title type='text'>Interview Question #2 - What is a Siebel Operation Step?</title><content type='html'>This interview question uses a technical term to test a Siebel Developer's understanding of a topic.  "Siebel Operation" can be almost anything to someone who does not have a basic familiarity with Siebel Workflow, but it is an everyday term for any Workflow Developer.&lt;br /&gt;&lt;br /&gt;Q: Please explain what a Siebel Operation is, and how it is used.&lt;br /&gt;&lt;br /&gt;A: At minimum, the candidate should know that a Siebel Operation is a type of Workflow Process Step.  If the candidate does not volunteer this information without additional prompting, he or she is not a Workflow Developer.&lt;br /&gt;&lt;br /&gt;Candidates should know that a Siebel Operation can be used to Insert or Update records as part of a Workflow Process.  A candidate should know the difference between a Workflow Process and a Workflow Policy or Workflow Policy Program.  Siebel Operation is a term that is only used in connection with Workflow Processes.&lt;br /&gt;&lt;br /&gt;In addition to Insert and Update, recent versions of Siebel have other types of operations.  Most Siebel Workflow Developers know that a Query operation is now available.  Since Siebel 8.0, there are Upsert and looping operations: PrevRecord, NextRecord, and QueryBiDirectional.  In my experience, knowledge of these operations is less common; it can be difficult to find a developer who can explain how to build a loop in a Workflow Process.&lt;br /&gt;&lt;br /&gt;Workflow Process Steps operate on the business layer of Siebel, as opposed to the database layer.  A Business Component that is associated with the Workflow Process's Business Object is required for any Siebel Operation.  Workflow Developers should know these things, although a little prompting may be required.&lt;br /&gt;&lt;br /&gt;A good Workflow Developer should also know about the Siebel Operation Object Id process property, which is updated after an Insert, Update, or Upsert operation.  If one record is inserted or updated, this process property will contain the row id of the affected record.  If more than one record, the property will contain an asterisk: '*'.  If no records are affected, the property will not contain a value.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2475725884974991295-5625781590930177871?l=siebeldev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siebeldev.blogspot.com/feeds/5625781590930177871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2475725884974991295&amp;postID=5625781590930177871' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/5625781590930177871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/5625781590930177871'/><link rel='alternate' type='text/html' href='http://siebeldev.blogspot.com/2010/02/interview-question-2-what-is-siebel.html' title='Interview Question #2 - What is a Siebel Operation Step?'/><author><name>Jim Tanner-Uicker</name><uri>http://www.blogger.com/profile/00825624314517215608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2475725884974991295.post-6980239203575755308</id><published>2010-02-28T23:32:00.000-06:00</published><updated>2010-02-28T23:32:23.894-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virtual business components'/><category scheme='http://www.blogger.com/atom/ns#' term='scripting'/><title type='text'>VBC Compatibility Mode</title><content type='html'>The Query method of a VBC Business Service in Siebel versions later than 7.5 has an Inputs property set whose structure can be difficult to navigate.  Take a look at the XML representation from &lt;a href="http://download.oracle.com/docs/cd/B40099_02/books/EAI2/EAI2_UseVirtBusComp11.html"&gt;Siebel Bookshelf&lt;/a&gt;:&lt;blockquote&gt;&lt;span class="Apple-style-span"style=";font-family:monospace;font-size:13px;"&gt;&lt;br /&gt;&amp;lt;siebel-xmlext-query-req&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;lt;buscomp&amp;#160;id=&amp;quot;1&amp;quot;&amp;gt;Contact&amp;lt;/buscomp&amp;gt;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;lt;remote-source&amp;gt;http://throth/servlet/VBCContacts&amp;lt;/remote-source&amp;gt;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;lt;max-rows&amp;gt;6&amp;lt;/max-rows&amp;gt;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;lt;search-string&amp;gt;=([Phone]&amp;#160;IS&amp;#160;NOT&amp;#160;NULL)&amp;#160;AND&amp;#160;([AccountId]&amp;#160;=&amp;#160;&amp;quot;1-6&amp;quot;)&amp;lt;/search-string&amp;gt;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;lt;search-spec&amp;gt;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;lt;node&amp;#160;node-type=&amp;quot;Binary&amp;#160;Operator&amp;quot;&amp;gt;AND&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;lt;node&amp;#160;node-type=&amp;quot;Unary&amp;#160;Operator&amp;quot;&amp;gt;IS&amp;#160;NOT&amp;#160;NULL&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;lt;node&amp;#160;node-type=&amp;quot;Identifier&amp;quot;&amp;gt;Phone&amp;lt;/node&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;lt;/node&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;lt;node&amp;#160;node-type=&amp;quot;Binary&amp;#160;Operator&amp;quot;&amp;gt;=&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;lt;node&amp;#160;node-type=&amp;quot;Identifier&amp;quot;&amp;gt;AccountId&amp;lt;/node&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;lt;node&amp;#160;value-type=&amp;quot;TEXT&amp;quot;&amp;#160;node-type=&amp;quot;Constant&amp;quot;&amp;gt;1-6&amp;lt;/node&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;lt;/node&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;lt;/node&amp;gt;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;lt;/search-spec&amp;gt;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;lt;sort-spec&amp;gt;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;lt;sort&amp;#160;field=&amp;quot;Location&amp;quot;&amp;gt;ASCENDING&amp;lt;/sort&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;lt;sort&amp;#160;field=&amp;quot;Name&amp;quot;&amp;gt;DESCENDING&amp;lt;/sort&amp;gt;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt;&amp;#160;&amp;#160;&amp;lt;/sort-spec&amp;gt;&lt;br /&gt;&amp;lt;/Siebel-xmlext-query-req&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;I've found that the search-string node of the property set isn't particularly useful unless your back-end data source has a column structure that matches your VBC.  In the example above, you can quickly see how difficulty it could be for a Siebel developer to write a script to parse a property set containing a search-spec node with any complexity.&lt;br /&gt;&lt;br /&gt;In Siebel versions prior to 7.5, the Inputs property set was much simpler.  Below, see an eScript snippet that unloads a search specification in the query method of a VBC Business Service using the older format of input:&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"style=";font-family:monospace;font-size:13px;"&gt;var child = Inputs.GetChild(0);&lt;br /&gt;var sPolicyNumber = child.GetProperty("Policy Number");&lt;br /&gt;var sLastName = child.GetProperty("Date of Birth");&lt;br /&gt;var sFirstName = child.GetProperty("First Name");&lt;/span&gt;&lt;/blockquote&gt;Where query specifications are entered into a form applet as field, the old format lets you easily retrieve input values and manipulate them in eScript variables.&lt;br /&gt;&lt;br /&gt;For Query input in the earlier, simpler format, add the following Business Component User Property to your VBC:&lt;br /&gt;&lt;blockquote&gt;Name: &lt;span class="Apple-style-span"style=";font-family:monospace;font-size:13px;"&gt;VBC Compatibility Mode&lt;/span&gt;&lt;br /&gt;Value: &lt;span class="Apple-style-span"style=";font-family:monospace;font-size:13px;"&gt;Siebel 7.0.4&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2475725884974991295-6980239203575755308?l=siebeldev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siebeldev.blogspot.com/feeds/6980239203575755308/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2475725884974991295&amp;postID=6980239203575755308' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/6980239203575755308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/6980239203575755308'/><link rel='alternate' type='text/html' href='http://siebeldev.blogspot.com/2010/01/vbc-compatibility-mode.html' title='VBC Compatibility Mode'/><author><name>Jim Tanner-Uicker</name><uri>http://www.blogger.com/profile/00825624314517215608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2475725884974991295.post-2602243478153527280</id><published>2010-02-18T23:48:00.006-06:00</published><updated>2010-02-23T00:36:23.602-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='fundamentals'/><category scheme='http://www.blogger.com/atom/ns#' term='interview question'/><title type='text'>Interview Question #1 - What is a Link?</title><content type='html'>I've decided to add a new feature to this blog.  With this post, I am introducing a series of interview questions that Siebel developers and development leads should consider when preparing for technical interviews.  I've interviewed many developers, and I've been interviewed quite a few times as well, and I have a pretty good idea of what makes a good technical interview question.  &lt;br /&gt;&lt;br /&gt;When I interview someone, my questions are designed to discover what a candidate knows, not bolster my ego by proving that I know something the candidate doesn't.  I focus on the fundamentals of Siebel configuration, allowing the candidate to demonstrate the depth of his or her knowledge.&lt;br /&gt;&lt;br /&gt;Q: Please describe the Siebel configuration object called a "Link".&lt;br /&gt;&lt;br /&gt;A: The candidate should be able to provide at least two of the following, but should not contradict any of them:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A Link defines the relationship between Business Components.&lt;/li&gt;&lt;li&gt;Links are used to define a Business Object; the relationships between the primary Business Component and other (child) Business Components in the Business Object are Links.&lt;/li&gt;&lt;li&gt;A Link is not the same thing as a Multi-Value Link or a Multi-Value Group, but the definition of a Multi-Value Link does include a Link.&lt;/li&gt;&lt;li&gt;A one-to-many Link makes a master-detail View possible.&lt;/li&gt;&lt;li&gt;Links are defined on the Business Object layer, using Business Component Fields rather than Table Columns, although many-to-many links use Table and Column names to define the intersection table.&lt;/li&gt;&lt;li&gt;The "Source" Field is on the Parent Business Component, while the "Destination" Field is on the Child Business Component.&lt;/li&gt;&lt;li&gt;A Link can have a Search Specification.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;It's ok to prompt the candidate with leading questions to develop a better understanding of the depth of his or her knowledge, asking open-ended questions wherever possible.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2475725884974991295-2602243478153527280?l=siebeldev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siebeldev.blogspot.com/feeds/2602243478153527280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2475725884974991295&amp;postID=2602243478153527280' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/2602243478153527280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/2602243478153527280'/><link rel='alternate' type='text/html' href='http://siebeldev.blogspot.com/2010/02/interview-question-1-what-is-link.html' title='Interview Question #1 - What is a Link?'/><author><name>Jim Tanner-Uicker</name><uri>http://www.blogger.com/profile/00825624314517215608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2475725884974991295.post-4358084907706632637</id><published>2010-01-26T16:31:00.003-06:00</published><updated>2010-01-26T22:32:17.819-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='best practice'/><title type='text'>Check Your Data</title><content type='html'>It's simple to avoid, but it is surprising how often developers will make the mistake of implementing new functionality without first verifying that it will work with data that already inhabit the database.&lt;br /&gt;&lt;br /&gt;For example, your organization might need to update an existing Siebel implementation.  One of the new requirements is to evaluate a Contact's Date of Birth, calculating the Contact's age and only allowing certain functionality for Contacts that are older than a limit.  &lt;br /&gt;&lt;br /&gt;To do this, you might create a calculated field that tests the Date of Birth so that the field's value is TRUE if the Contact is too young.  If the field's value is FALSE, the restricted functionality is allowed.&lt;br /&gt;&lt;br /&gt;You know that you have to handle NULL, because your calculated field won't return either TRUE or FALSE if the Date of Birth is NULL.  But the business requirement calls for making Date of Birth a required field, and you can assume that no new Contacts will be created without a Date of Birth.  Unfortunately existing data might contain NULL values that will break this functionality, and a NULL value in a required field can cause more problems, even in screens and views unrelated to the new age restriction.&lt;br /&gt;&lt;br /&gt;Some configurators forget to thoroughly test their new functionality against the data already existing in the database.  This situation might not be caught in the test cycle if only a small percentage of records have NULL values.  But a situation like this can cause big problems if it is not caught before the new functionality is deployed.&lt;br /&gt;&lt;br /&gt;The best practice is to carefully test to be sure that new functionality works with old data.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2475725884974991295-4358084907706632637?l=siebeldev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siebeldev.blogspot.com/feeds/4358084907706632637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2475725884974991295&amp;postID=4358084907706632637' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/4358084907706632637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/4358084907706632637'/><link rel='alternate' type='text/html' href='http://siebeldev.blogspot.com/2010/01/check-your-data.html' title='Check Your Data'/><author><name>Jim Tanner-Uicker</name><uri>http://www.blogger.com/profile/00825624314517215608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2475725884974991295.post-9076282748750223815</id><published>2010-01-20T23:07:00.010-06:00</published><updated>2010-01-23T21:09:06.165-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data validation'/><category scheme='http://www.blogger.com/atom/ns#' term='configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='script alternatives'/><category scheme='http://www.blogger.com/atom/ns#' term='regular expressions'/><title type='text'>Simple Input Validation through HTML Attributes</title><content type='html'>The best place to validate user input is at the source.  If you can keep field validations in the browser, you can avoid unnecessary server requests and provide immediate user feedback while reducing the amount of bad data being submitted.  This can be especially useful in the standard interactivity client because it can perform validations immediately, without waiting for the user to attempt to commit the record.  &lt;br /&gt;&lt;br /&gt;A Siebel form applet is an HTML form, and the controls are input elements on those forms.  The HTML Attributes property of a Control object provides an opportunity to insert a JavaScript event to the input element.  &lt;br /&gt;&lt;br /&gt;For example, I recently implemented a query applet with a field validation on the Social Security Number control.  To do so, I updated the HTML Attributes property of the control to &lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"   style="  ;font-family:monospace;font-size:13px;"&gt;onkeyUp="if(/[^0-9\-]/.test(this.value)  ){ alert('The Social Security Number field accepts only numeric data.'); this.value='';}"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The above validation intercepts the onkeyUp event of the input element, and uses a regular expression test to detect if the key pressed was any other besides a number or a hyphen.  If an errant character is found, the applet displays a message and clears the control.  This validation occurs entirely on the browser, but without adding any browser scripts to the applet.&lt;br /&gt;&lt;br /&gt;Here's another example of a date validation on another control on the same applet:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"   style="  ;font-family:monospace;font-size:13px;"&gt;onBlur="if(/^( *)((0[1-9]|[1-9]|1[012])[/](0[1-9]|[1-9]|[12][0-9]|3[01])[/](18|19|20)\d\d)( *)$/.test(this.value)||this.value==''){}else{alert('The Date of Birth field accepts date input in the M/D/YYYY or MM/DD/YYYY format');this.value='';}"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A somewhat more complex regular expression tests the format of a date.  In this case, the expression doesn't test the input until the focus moves out of the field.  &lt;br /&gt;&lt;br /&gt;The HTML Attributes property of the Control object provides a clean, declarative approach for input validation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2475725884974991295-9076282748750223815?l=siebeldev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siebeldev.blogspot.com/feeds/9076282748750223815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2475725884974991295&amp;postID=9076282748750223815' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/9076282748750223815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/9076282748750223815'/><link rel='alternate' type='text/html' href='http://siebeldev.blogspot.com/2010/01/simple-input-validation-through-html.html' title='Simple Input Validation through HTML Attributes'/><author><name>Jim Tanner-Uicker</name><uri>http://www.blogger.com/profile/00825624314517215608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2475725884974991295.post-7171578120358413048</id><published>2009-09-07T10:21:00.006-05:00</published><updated>2010-01-21T00:07:17.265-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='best practice'/><category scheme='http://www.blogger.com/atom/ns#' term='scripting'/><title type='text'>Setting the SSA Primary Field</title><content type='html'>When I started configuring Siebel, I was mostly self-taught, which means that I usually settled for the first way I found of accomplishing my goal.  Setting the primary record on a multi-value group through script is one example.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My method: query for the record I needed in the child buscomp, obtain the row id, and then use that row id to update the primary id field of the parent.  For example, if I needed to set the primary position on the Account buscomp, I would begin by looking up the position id, then I would use a SetFieldValue statement to set the Primary Position Id with the id I had retrieved.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Wrong approach!&lt;/b&gt;  That is the dangerous way.  A scripting error will potentially corrupt your database in the same way direct sql could, by breaking its referential integrity.  Directly setting a primary id field is not supported by Oracle.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The feature I didn't understand, which makes the process much easier and safer, is a system field called SSA Primary.  You may have noticed this field in MVG Applet configurations.  It's a system field, much like Created or Id, but it is different in two important ways: &lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;The SSA Primary field does not correspond directly to a database column.&lt;/li&gt;&lt;li&gt;The SSA Primary field is editable.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Like other system fields, it is not listed in the Fields object in Tools, and you don't have to explicitly activate it in scripting.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Using the SSA Primary field, here is the correct way to use script to set the primary on an MVG, as recommended by Oracle:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Get the MVG business component using the &lt;span class="Apple-style-span"   style="  ;font-family:monospace;font-size:13px;"&gt;BusComp.GetMVGBusComp&lt;/span&gt; method.&lt;/li&gt;&lt;li&gt;Use &lt;span class="Apple-style-span"   style="  ;font-family:monospace;font-size:13px;"&gt;BusComp.SetSearchSpec&lt;/span&gt; and &lt;span class="Apple-style-span"   style="  ;font-family:monospace;font-size:13px;"&gt;BusComp.ExecuteQuery&lt;/span&gt; methods to locate the correct record on the MVG business component.&lt;/li&gt;&lt;li&gt;Set the SSA Primary field with the statement &lt;span class="Apple-style-span"   style="  ;font-family:monospace;font-size:13px;"&gt;BusComp.SetFieldValue("SSA Primary Field", "Y")&lt;/span&gt;, substituting the actual business component variable name.&lt;/li&gt;&lt;li&gt;Use &lt;span class="Apple-style-span"   style="  ;font-family:monospace;font-size:13px;"&gt;BusComp.WriteRecord&lt;/span&gt; on the &lt;b&gt;parent&lt;/b&gt; business component.  This is because the Primary Id field is on the parent.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Some versions of Siebel Tools will give a semantic warning when you check the syntax after you try to set the SSA Primary field.  This is a Siebel bug, and this warning can be safely ignored.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight:bold;"&gt;Update - Fixed a typo caught by commenter Duarte: Above instructions previously contained &lt;span class="Apple-style-span"   style="  ;font-family:monospace;font-size:13px;"&gt;BusComp.SetFieldValue("SSA Primary", "Y")&lt;/span&gt; instead of &lt;span class="Apple-style-span"   style="  ;font-family:monospace;font-size:13px;"&gt;BusComp.SetFieldValue("SSA Primary Field", "Y")&lt;/span&gt;.  Thanks Duarte!&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2475725884974991295-7171578120358413048?l=siebeldev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siebeldev.blogspot.com/feeds/7171578120358413048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2475725884974991295&amp;postID=7171578120358413048' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/7171578120358413048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/7171578120358413048'/><link rel='alternate' type='text/html' href='http://siebeldev.blogspot.com/2009/09/setting-ssa-primary-field.html' title='Setting the SSA Primary Field'/><author><name>Jim Tanner-Uicker</name><uri>http://www.blogger.com/profile/00825624314517215608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2475725884974991295.post-2023250703669617455</id><published>2009-09-07T10:05:00.002-05:00</published><updated>2009-09-07T10:15:44.307-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='configuration'/><title type='text'>New Gadget from Impossible Siebel</title><content type='html'>Jason at &lt;a href="http://www.impossiblesiebel.com/"&gt;Impossible Siebel&lt;/a&gt; has developed the &lt;a href="http://www.impossiblesiebel.com/2009/09/impossiebel-toolbar-beta.html"&gt;ImposSiebel Toolbar Beta&lt;/a&gt;, which is definitely worth a look.  As he writes:&lt;div&gt;&lt;blockquote&gt;...this is a program which allows developers to hook into any Siebel session, in anyenvironment, and get quick access to the Siebel objects without going into Tools.&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;Who doesn't want that?  I can see this as being especially helpful for developers working with the SI client, where there is no &lt;b&gt;Help -&gt; About View&lt;/b&gt; feature.  From the screenshots, it looks great!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2475725884974991295-2023250703669617455?l=siebeldev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siebeldev.blogspot.com/feeds/2023250703669617455/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2475725884974991295&amp;postID=2023250703669617455' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/2023250703669617455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/2023250703669617455'/><link rel='alternate' type='text/html' href='http://siebeldev.blogspot.com/2009/09/new-gadget-from-impossible-siebel.html' title='New Gadget from Impossible Siebel'/><author><name>Jim Tanner-Uicker</name><uri>http://www.blogger.com/profile/00825624314517215608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2475725884974991295.post-3953142095643242849</id><published>2009-08-07T21:41:00.004-05:00</published><updated>2010-01-21T00:08:23.419-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EIM'/><title type='text'>Using a Randomizer to Split EIM Batches</title><content type='html'>EIM runs best when it imports data in batches of 5,000 to 10,000 records.  There are potentially many techniques for dividing a large number of records into batches of this size.  Here is my favorite:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Imagine the EIM_CONTACT table has 300,000 records that you want to import, but all of them contain the number 1 in the IF_ROW_BATCH_NUM column.  Ideally, you would prefer to load the data in 60 batches of 5,000 records each, numbered 101 - 160.  Use the following SESSION SQL step in the process to split the batches:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  ;font-family:monospace;font-size:13px;"&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;[SPLIT BATCHES]&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;TYPE  = IMPORT&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;BATCH = 0&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt; &lt;/span&gt;TABLE = EIM_CONTACT&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;SESSION SQL = "UPDATE SIEBEL.EIM_CONTACT SET IF_ROW_BATCH_NUM = floor(dbms_random.value(101, 160)) WHERE IF_ROW_BATCH_NUM = 1 &lt;/div&gt;&lt;div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The above EIM step is separated from all other functionality for clarity, but your own process will probably contain some differences.  For example, the SESSION SQL could be part of your EIM IMPORT step, or the UPDATE statement could contain more columns.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Part of the guarantee of a randomizer is that generated numbers will spread equally across the available range, so you can assume that your data will be distributed evenly across the 60 batches. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Please notice that I'm assuming there are no records in batch number 0.  Otherwise, they would be imported during this step.  Also notice that I'm using functions specific to the Oracle database.  Different databases have different functions for generating random numbers, but the technique is largely the same for any database you use.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2475725884974991295-3953142095643242849?l=siebeldev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siebeldev.blogspot.com/feeds/3953142095643242849/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2475725884974991295&amp;postID=3953142095643242849' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/3953142095643242849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/3953142095643242849'/><link rel='alternate' type='text/html' href='http://siebeldev.blogspot.com/2009/08/using-randomizer-to-split-eim-batches.html' title='Using a Randomizer to Split EIM Batches'/><author><name>Jim Tanner-Uicker</name><uri>http://www.blogger.com/profile/00825624314517215608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2475725884974991295.post-1171288044101891921</id><published>2009-08-05T21:51:00.004-05:00</published><updated>2010-01-21T00:09:17.772-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='system administration'/><category scheme='http://www.blogger.com/atom/ns#' term='server parameters'/><title type='text'>The CancelQueryTimeOut Parameter</title><content type='html'>Long-running queries can be the most aggrevating problem that Siebel users face, and the ability to cancel them is often highly valued. The Siebel High Interactivity client has this capability. When a query has been running for a few seconds, a little pop-up box appears with a "Cancel" button, allowing users to stop the query.&lt;br /&gt;&lt;br /&gt;In Siebel 7.7 and 7.8, the parameter to enable this was in the [SWE] section of the application config file (such as fins.cfg). To enable the functionality, change the parameter in the file:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"   style="  ;font-family:monospace;font-size:13px;"&gt;CancelQueryTimeOut = &lt;em&gt;timeout&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If &lt;em&gt;timeout&lt;/em&gt; is 3, for example, the popup button will appear after 3 seconds. If the value is -1, the popup is disabled.&lt;br /&gt;&lt;br /&gt;Unfortunately, many Siebel administrators may believe the CancelQueryTimeOut parameter simply doesn't work in Siebel 8.0. It does work, but it is incorrectly documented. &lt;a href="http://download.oracle.com/docs/cd/B40099_02/books/AppsAdmin/AppsAdminOngoingTasks4.html#wp1123299"&gt;Siebel Bookshelf&lt;/a&gt; erroneously says the functionality is enabled in the [SWE] section of the config file, but there is no [SWE] section in Siebel 8.0. In Siebel 8.0, CancelQueryTimeOut is available as an Object Manager parameter.&lt;br /&gt;&lt;br /&gt;To enable the functionality in Siebel 8.0:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Go to &lt;strong&gt;Administration - Server Configuration -&gt; Enterprises -&gt; Component Definitions&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Query for your Object Manager component and select it&lt;/li&gt;&lt;li&gt;In Component Parameters, ensure that "Advanced" parameters are displayed&lt;/li&gt;&lt;li&gt;Query for the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;CancelQueryTimeOut&lt;/span&gt; parameter&lt;/li&gt;&lt;li&gt;Update the parameter to the amount of time, in seconds, you would like to wait before the pop-up button appears on a long-running query (the default is -1, which means the functionality is disabled)&lt;/li&gt;&lt;li&gt;Restart the object manager component&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;I find that this parameter is very useful for improving user satisfaction and also reducing the number of orphan tasks on the object manager, which can occur when a user closes the browser before a query returns.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2475725884974991295-1171288044101891921?l=siebeldev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siebeldev.blogspot.com/feeds/1171288044101891921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2475725884974991295&amp;postID=1171288044101891921' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/1171288044101891921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/1171288044101891921'/><link rel='alternate' type='text/html' href='http://siebeldev.blogspot.com/2009/08/cancelquerytimeout-parameter.html' title='The CancelQueryTimeOut Parameter'/><author><name>Jim Tanner-Uicker</name><uri>http://www.blogger.com/profile/00825624314517215608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2475725884974991295.post-6864862416689647851</id><published>2009-05-13T14:26:00.004-05:00</published><updated>2009-05-13T14:49:04.047-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='fundamentals'/><title type='text'>Manager Visibility</title><content type='html'>Manager-based visibility is one of the toughest concepts for Siebel users to understand, and it also is a little tricky to simulate in a SQL-based query tool, so I thought I would post a summary of some of the basic concepts.&lt;br /&gt;&lt;br /&gt;If I open a view with position-based team access control, such as one based on the Account business component, Sales Rep visibility returns all records where my position is on the sales team. By default, Manager visibility returns all those records, and also all records where one of my reports, direct or indirect, is primary on the sales team.&lt;br /&gt;&lt;br /&gt;With single-position access control like with the Quote Bus Comp, Manager visibility returns all records associated with my position or with any of my reports positions.&lt;br /&gt;&lt;br /&gt;With a business component such as Action, with person-based access control, records must be associated with my employee record or with the employee record of one of my reports. The reporting relationship is based on my currently active position. Subordinate positions must be the Primary Held Position of the subordinate's employee record for the employee to be included in the query. If the record has multiple owners, default functionality is to show only those records where the subordinate employee is the primary owner.&lt;br /&gt;&lt;br /&gt;Views with Manager visibility can be based on business components that have a Person or Position type view mode. No special "Manager" view mode is required. Such views usually have names beginning "My Team's".&lt;br /&gt;&lt;br /&gt;Person-based and position-based access control are based on a single relationship: between a position and it's parent position. Position is a party-based business component, and this relationship is defined on the S_PARTY table, with the column PAR_PARTY_ID joined to the parent record. Although every position can have only one parent, a position is subordinate to multiple positions for the purpose of manager visibility, because a position is subordinate to parent position's parent position, and etcetera. Therefore, manager visibility is actually based on an indeterminate number of iterations of the position/parent position relationship.&lt;br /&gt;&lt;br /&gt;It would be extremely difficult to describe an unknown number of iterations of the position/parent position relationship with a single SQL statement. Siebel solves this problem by writing each position's reporting relationships to a table called S_PARTY_RPT_REL. A reporting relationship record is created for each related record, following the reporting chain through all iterations. This results in a many-to-many relationship, as each position can have many subordinate positions and each position can have a chain of parent and grandparent positions. Records in the S_PARTY_RPT_REL are created when a new record is inserted in S_POSTN, or when a user clicks on the "Generate Reporting Relationships" button in the Position administration view.&lt;br /&gt;&lt;br /&gt;In a query to populate the My Teams view with data, S_PARTY_RPT_REL.PARTY_ID is set equal to the user's active position id. S_PARTY_RPT_REL.SUB_PARTY_ID joins to the applet's business component table and/or the sales team intersection table, depending on the business component.&lt;br /&gt;&lt;br /&gt;For more about Manager visibility see the Siebel Security Guide in Siebel Bookshelf.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2475725884974991295-6864862416689647851?l=siebeldev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siebeldev.blogspot.com/feeds/6864862416689647851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2475725884974991295&amp;postID=6864862416689647851' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/6864862416689647851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/6864862416689647851'/><link rel='alternate' type='text/html' href='http://siebeldev.blogspot.com/2009/05/manager-visibility.html' title='Manager Visibility'/><author><name>Jim Tanner-Uicker</name><uri>http://www.blogger.com/profile/00825624314517215608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2475725884974991295.post-3404914227737812365</id><published>2009-05-01T23:39:00.007-05:00</published><updated>2009-05-03T17:05:03.385-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='best practice'/><category scheme='http://www.blogger.com/atom/ns#' term='scripting'/><title type='text'>Get Rid of Dead Code</title><content type='html'>&lt;p&gt;How many Siebel developers believe that the best way to remove lines of code from an existing script is to put some comment characters in front of the un-needed code, preventing it from executing. Many developers will copy an existing line of code to change an operation or add a condition, "commenting" the original version instead of deleting it. &lt;strong&gt;-- Added 5/3&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Good coding practice tells us to diligently and carefully comment and annotate changes to scripts, right? Lets take a step back for a moment and think it through. I'm not certain that the commented lines of script are very helpful, at least in most cases.&lt;/p&gt;&lt;p&gt;First of all, commented script rarely helps to trace the historical changes made in a script. If the commented changes are dated, as they often are, you might find the date helpful. But script comments don't lend themselves to historical analysis nearly as well as versioning. Comparing a previous version of a script with the current version, in a source control repository for example, is much easier than trying to decipher the versions from comments in the script itself. Especially considering that the comments from several changes are often mixed in together.&lt;/p&gt;&lt;p&gt;Secondly, commented script doesn't help much in understanding how the current version of the script works. Lets face it: when you examine a script, you are not looking at the code that is commented. You skip the comments and focus on the code that is still active. If the developer happened to leave some actual words among all the dead code, you might stop to read it, but you certainly won't spend much analysis to find out how the script used to work.&lt;/p&gt;&lt;p&gt;Thirdly, and perhaps most importantly, dead code can cause significant overhead on the Siebel server. Every development team that habitually comments unused blocks of script will soon find that an entire event handler has been commented. In fact, it is common to find Siebel repositories with multiple event handlers entirely commented out. Also common are scripted event handlers where no script is present at all. Event handlers are marked as scripted even if the script contains no executable code except the application-provided stub:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;function WebApplet_PreCanInvokeMethod (MethodName,&lt;br /&gt;&amp;amp;CanInvoke)&lt;br /&gt;{&lt;br /&gt;    return (ContinueOperation);&lt;br /&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;These event handlers cause a measurable increase in CPU load, especially when the event is frequently encountered. The empty scripts also become a maintenance issue, increasing the time required to compile an srf.&lt;/p&gt;&lt;p&gt;So, get rid of all that dead code. If a scripted event handler is empty, completely delete the script record in the Tools list applet. If you are removing individual lines of script, make sure you fully document your changes in design documents, and use a source control system to keep previous versions of the script. But keep the script itself clean. A clean repository will be easier to maintain and provide less overhead on your Siebel server.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2475725884974991295-3404914227737812365?l=siebeldev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siebeldev.blogspot.com/feeds/3404914227737812365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2475725884974991295&amp;postID=3404914227737812365' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/3404914227737812365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/3404914227737812365'/><link rel='alternate' type='text/html' href='http://siebeldev.blogspot.com/2009/05/get-rid-of-dead-code.html' title='Get Rid of Dead Code'/><author><name>Jim Tanner-Uicker</name><uri>http://www.blogger.com/profile/00825624314517215608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2475725884974991295.post-5552191386375084678</id><published>2009-04-23T22:56:00.000-05:00</published><updated>2009-04-23T22:56:34.034-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data validation'/><category scheme='http://www.blogger.com/atom/ns#' term='server parameters'/><category scheme='http://www.blogger.com/atom/ns#' term='script alternatives'/><category scheme='http://www.blogger.com/atom/ns#' term='regular expressions'/><title type='text'>A Regular Expression Validation</title><content type='html'>&lt;p&gt;Data Validation Manager is great, but what would validation be without Regular Expressions? Here's how I used both to meet a business requirement.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The requirement arose from some errors logged when Siebel would attempt to send email to invalid addresses. We wanted to notify a user who entered invalid characters in the email address field. Of course, this edit wouldn't guarantee that addresses entered would actually exist, but it would at least ensure that people wouldn't separate two addresses with a colon (':') instead of a semicolon (';'), which is what was happening.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Step 1: Create a Business Service&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Create a new Business Service with a method containing the following code snippet: &lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font face="courier new"&gt;var sPattern = Inputs.GetProperty("Pattern");&lt;br /&gt;var sSample = Inputs.GetProperty("Sample");&lt;br /&gt;var rExp = new RegExp(sPattern);&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;font face="courier new"&gt;if(rExp.test(sSample))&lt;br /&gt;{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Outputs.SetProperty("Result", 1);&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Outputs.SetProperty("Result", 0);&lt;br /&gt;}&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Step 2: Create a Data Validation Rule&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Our Data Validation Rule Set is called "Employee Email Validation". In the data validation rule, use the new business service to test a business component field against a regular expression pattern. Use the following syntax for the pattern:&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font face="courier new"&gt;InvokeServiceMethod("ABC Validation Service", "Validate", "Pattern='^(([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}))+([;,](([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}))+)*$', Sample=eval([EMail Addr])", "Result")&lt;&gt;0&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;The regular expression pattern above was adapted from one available on the website &lt;a href="http://www.regular-expressions.info/"&gt;http://www.regular-expressions.info/&lt;/a&gt;, where you can quickly learn how to get started with regular expressions. Also note the use of the eval() function, which will result in the contents of the Business Component Field being passed to the business service instead of the literal field name. See Metalink &lt;a href="https://metalink3.oracle.com/od/faces/secure/km/DocumentDisplay.jspx?id=782338.1"&gt;Doc ID 782338.1&lt;/a&gt; (login required) for Oracle's How-To article for using eval() with InvokeServiceMethod() for a very similar application.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Step 3: Create a Runtime Event&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Your next step is to create a Runtime Event manually through the Administration - Runtime Events screen. For our data validation, we created an Action Set for the Employee WriteRecord event. &lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Action Type: BusService&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Business Service Name: Data Validation Manager&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Business Service Method: Validate&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Business Service Context: "Rule Set Name", "Employee Email Validation", "Enable Log", "Y"&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;Please note that although we did our validation on the Employee BusComp, it doesn't work on the Administration - User -&gt; Employees. We have a custom view created on the Employee BusComp that exposes the email field. I'm not actually sure why it doesn't work in the vanilla view, but I'll post an update if I find out.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Step 4: Update Enterprise Parameter&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;A security feature introduced with Siebel 7.7 restricts the InvokeServiceMethod function to only business services that are registered on the Query Access List. The parameter can be set at the enterprise level or the component (e.g., Object Manager) level. However, since component-level settings always override enterprise settings, setting the parameter at the component level would preclude the use of any other business services that are registered at the enterprise.&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Enterprise Parameter Name: Business Service Query Access List&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Enterprise Parameter Value: ABC Validation Service&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;A common Siebel software limitation applies here. Only a maximum of 100 characters can be used to specify business service names in this parameter. You should carefully plan which business services you want to use with InvokeServiceMethod. Do not leave spaces between multiple business service names, but separate names with commas, and do not use quote marks.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;After setting up a very simple business service to evaluate regular expressions, we can create any number of complex validations to display a message when a pattern is matched, with no additional scripting at all. For example, another requirement to validate the format of an identification number in a free text field was accomplished with a second data validation using the same business service.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;If you are new to regular expressions, take a look. They are incredibly useful.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2475725884974991295-5552191386375084678?l=siebeldev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siebeldev.blogspot.com/feeds/5552191386375084678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2475725884974991295&amp;postID=5552191386375084678' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/5552191386375084678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/5552191386375084678'/><link rel='alternate' type='text/html' href='http://siebeldev.blogspot.com/2009/04/regular-expression-validation.html' title='A Regular Expression Validation'/><author><name>Jim Tanner-Uicker</name><uri>http://www.blogger.com/profile/00825624314517215608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2475725884974991295.post-4536829264870235086</id><published>2009-01-07T16:10:00.011-06:00</published><updated>2009-01-08T12:46:09.654-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SDLC'/><category scheme='http://www.blogger.com/atom/ns#' term='project management'/><category scheme='http://www.blogger.com/atom/ns#' term='best practice'/><title type='text'>Two-Track Development: Part 1 - Establish a Process</title><content type='html'>&lt;div&gt;&lt;div&gt;Siebel projects often have lengthy development cycles, and enterprises often find that they need to manage overlapping releases where a development cycle is not complete before work begins on the next effort. Faced with such a requirement, project teams find themselves in the unenviable position of maintaining two Siebel development repositories at once, one for each project. &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_rsq2TMW9lUs/SWY-50S1KdI/AAAAAAAAAAU/cX-7BdESaRA/s1600-h/two-track+diagram.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5288983975404317138" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; WIDTH: 188px; CURSOR: hand; HEIGHT: 320px" alt="" src="http://1.bp.blogspot.com/_rsq2TMW9lUs/SWY-50S1KdI/AAAAAAAAAAU/cX-7BdESaRA/s320/two-track+diagram.JPG" border="0" /&gt;&lt;/a&gt;In the image to the left, you can see two development paths, one for Q1 and one for Q2. The Q1 path has an active development effort, with ongoing test cycles in QA and UAT. The Q2 path does not have a UAT environment, because only the Q1 path will be migrated to production. After the Q1 path deploys, Q2 will become the primary path, including DEV 2, TEST 2, and UAT.  A new Q3 path can be created with the DEV 1 and TEST 1 environments.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;To allow development to proceed on the Q2 path, the Q2 team must always be working with the latest version of the code from the previous project. The latest changes from the Q1 path must be merged to the Q2 path so that Q2 developers are working with an environment that looks like the one they will ultimately release. In other words, the Q2 repository includes a superset of Q1 and Q2 changes, just as the production repository will after Q2 deploys.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;To successfully manage the process, it helps to have a regular merge schedule. At a pre-specified interval, such as once per week, a dedicated team member can discover changes to the DEV 1 environment, mediate conflict resolution between those changes and required configurations in the DEV 2 environment, and propagate those changes into the DEV 2 environment.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Once all changes have been merged into DEV 2, they will follow the normal promotion process to system test and, ultimately UAT and production.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;How can this work? Over the next several posts I'll discuss some of the issues involved, along with some technical hints. I'll be relying especially on a process developed by a colleague of mine, Ashutosh Nigam. &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2475725884974991295-4536829264870235086?l=siebeldev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siebeldev.blogspot.com/feeds/4536829264870235086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2475725884974991295&amp;postID=4536829264870235086' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/4536829264870235086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/4536829264870235086'/><link rel='alternate' type='text/html' href='http://siebeldev.blogspot.com/2009/01/two-track-development-part-1-establish.html' title='Two-Track Development: Part 1 - Establish a Process'/><author><name>Jim Tanner-Uicker</name><uri>http://www.blogger.com/profile/00825624314517215608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_rsq2TMW9lUs/SWY-50S1KdI/AAAAAAAAAAU/cX-7BdESaRA/s72-c/two-track+diagram.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2475725884974991295.post-3350139401848294212</id><published>2008-05-29T21:13:00.003-05:00</published><updated>2008-05-30T14:19:45.297-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='integration'/><category scheme='http://www.blogger.com/atom/ns#' term='Fusion'/><title type='text'>Fusion Links</title><content type='html'>I was looking around at &lt;a href="http://siebelguide.com/"&gt;SiebelGuide.com&lt;/a&gt; today and found a &lt;a href="http://siebelguide.com/siebelblogs/2008/05/22/oracle-fusion-for-siebel-nice-demo/"&gt;blog post&lt;/a&gt; linking to an &lt;a href="http://download.oracle.com/technology/products/middleware/appsintegration/Middleware_SOA_CRM.swf"&gt;Oracle demo&lt;/a&gt; I really enjoyed. The demo discusses the Siebel Adapter, which I have not had an opportunity to use, for Oracle Fusion Middleware. In the demo, you get to see how to create a JCA interface for querying an Account, and then how to access that interface with a BPEL process. I have a little bit of familiarity with the BPEL process manager, and I can tell you it is as cool as it looks.&lt;br /&gt;&lt;br /&gt;Oracle has a &lt;a href="http://www.oracle.com/technology/tech/fmw4apps/siebel/index.html"&gt;Best Practice Center&lt;/a&gt; portal for researching integration options with Fusion and Siebel. It can be a great place to start if you want to develop a deeper understanding of what the Oracle Application Server has to offer to Siebel implementers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2475725884974991295-3350139401848294212?l=siebeldev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siebeldev.blogspot.com/feeds/3350139401848294212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2475725884974991295&amp;postID=3350139401848294212' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/3350139401848294212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/3350139401848294212'/><link rel='alternate' type='text/html' href='http://siebeldev.blogspot.com/2008/05/fusion-links.html' title='Fusion Links'/><author><name>Jim Tanner-Uicker</name><uri>http://www.blogger.com/profile/00825624314517215608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2475725884974991295.post-4274709984772207625</id><published>2008-05-27T21:39:00.004-05:00</published><updated>2008-05-30T16:34:51.242-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='user properties'/><category scheme='http://www.blogger.com/atom/ns#' term='best practice'/><title type='text'>On Field Update Invoke</title><content type='html'>The On Field Update Invoke user property is a clean way to run some custom functionality when a BusComp field is updated. If you reflexively assume that you need to put script in the SetFieldValue event, you should consider this user property to execute your specialized functionality instead.&lt;br /&gt;&lt;br /&gt;The syntax is as follows:&lt;br /&gt;&lt;br /&gt;User Property Name: &lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;On Field Update Invoke &lt;em&gt;n&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;User Property Value: &lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;"[FieldToCheck]", "[BusCompName]", "[MethodName]", "[Condition]"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Condition&lt;/strong&gt; is an optional parameter. If you leave it out, the method will be called any time the field is updated. If you include it, the condition must be true for the method to be invoked.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;FieldToCheck&lt;/strong&gt; is also optional. If the parameter is omitted, include double quotes as a placeholder.  The method will be invoked any time the BusComp is updated, as if it were called from the BusComp_WriteRecord event.  If the parameter is present, the user property works just like BusComp_SetFieldValue; the update happens as soon as the cursor leaves the FieldToCheck field.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Note that you can run a BusComp method on a different BusComp than the one that spawns the event.   Specify the &lt;strong&gt;BusCompName&lt;/strong&gt; and the &lt;strong&gt;MethodName&lt;/strong&gt;.  Siebel does this quite extensively (for updating child records when a parent record is updated, for example) to implement vanilla functionality.  The BusComp method is invoked on another business component in the active Business Object.&lt;br /&gt;&lt;br /&gt;It is also important to understand what methods can be called from this user property.  It can be used to call an eScript function.  You can add eScript to the BusComp_PreInvokeMethod event to capture the invocation and call a function on the current BusComp, and from there invoke a workflow process  or business service. &lt;br /&gt;&lt;br /&gt;The user property can also  invoke methods on the Business Component Class that would normally be invoked through the InvokeMethod method.  For example, you could call the CompleteActivity method on an Activity.  Be aware of the specialized methods that are available for the class you are using.&lt;br /&gt;&lt;br /&gt;If your implementation includes Siebel Order Management, Signals can also be raised from this user property.  For any of the Order Management Business Components, if a method is not found on the business component itself, Siebel will raise a signal if it exists.&lt;br /&gt;&lt;br /&gt;Whatever you choose, Siebel recommends the On Field Update Invoke user property as preferable to adding scripting to the BusComp_SetFieldValue event.  The SetFieldValue event is inefficient, and even though the On Field Update Invoke user property may invoke a custom script, it can be more efficient than invoking the same script from the SetFieldValue event.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2475725884974991295-4274709984772207625?l=siebeldev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siebeldev.blogspot.com/feeds/4274709984772207625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2475725884974991295&amp;postID=4274709984772207625' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/4274709984772207625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/4274709984772207625'/><link rel='alternate' type='text/html' href='http://siebeldev.blogspot.com/2008/05/on-field-update-invoke.html' title='On Field Update Invoke'/><author><name>Jim Tanner-Uicker</name><uri>http://www.blogger.com/profile/00825624314517215608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2475725884974991295.post-9097750521598104496</id><published>2008-05-22T21:08:00.002-05:00</published><updated>2008-05-22T23:07:22.559-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='system administration'/><category scheme='http://www.blogger.com/atom/ns#' term='workflow'/><title type='text'>Workflow Monitor Agent</title><content type='html'>&lt;a href="http://download.oracle.com/docs/cd/B40099_02/books/BPFWorkflow/BPFWorkflow_Admin_Policies7.html#wp1101096"&gt;Siebel Bookshelf&lt;/a&gt; can be a little confusing in its discussion of Workflow Monitor Agent.  If you don't read the Bookshelf chapter carefully, you can come away with the impression that Workflow Monitor Agents must be administered from the command line and dynamically configured.&lt;br /&gt;&lt;br /&gt;The key to the whole thing, as far as I'm concerned, is the section in the middle of the page that talks about creating "a new workflow monitor agent Component Definition."  For several reasons (possibly a future blog topic), it makes sense to split your Workflow Policies into several Workflow Policy Groups.  Create as many as you need.  For each one, create a separate Workflow Monitor Agent Component Definition.  Follow the instructions in Bookshelf.&lt;br /&gt;&lt;br /&gt;Set the Default Tasks to 1.  This allows you to forget everything about administering Workflow Monitor Agent from the command line.  The component will start and stop within the graphical interface.&lt;br /&gt;&lt;br /&gt;Set sleep time to the desired amount.  Set up an email address and mail server for automatic notifications, and tweak any other parameters that catch you interest.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2475725884974991295-9097750521598104496?l=siebeldev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siebeldev.blogspot.com/feeds/9097750521598104496/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2475725884974991295&amp;postID=9097750521598104496' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/9097750521598104496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/9097750521598104496'/><link rel='alternate' type='text/html' href='http://siebeldev.blogspot.com/2008/05/workflow-monitor-agent.html' title='Workflow Monitor Agent'/><author><name>Jim Tanner-Uicker</name><uri>http://www.blogger.com/profile/00825624314517215608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2475725884974991295.post-2132776070570170535</id><published>2008-05-21T21:09:00.004-05:00</published><updated>2008-05-21T22:04:03.501-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='upgrade'/><category scheme='http://www.blogger.com/atom/ns#' term='best practice'/><title type='text'>Another Reason to Comment</title><content type='html'>Carefully commenting all updated repository objects has clear benefits. It helps trace repository changes back to the responsible &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;configurators&lt;/span&gt;. It helps accomplish a sort of configuration management so that you have a rudimentary history of changes that were made to the repository.&lt;br /&gt;&lt;br /&gt;Complicating repository configuration management is the fact that &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Siebel&lt;/span&gt; developers do not start with a blank slate. Unlike a discreet block of script, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Siebel&lt;/span&gt; configuration might involve meeting a single requirement by changing the value of one or two properties on several &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;pre&lt;/span&gt;-existing objects throughout many different projects in the repository. Careful commenting can provide information about what changes were made, and why, and when.&lt;br /&gt;&lt;br /&gt;One drawback for commenting the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Siebel&lt;/span&gt; repository objects is the relatively small size of the Comments attribute itself, which commonly contains information about several changes by different developers to meet more than one requirement. If each comment includes the initials of the developer, the date, the requirement number, and a description of the changes made, you will quickly run out of space. A good approach to keeping comments concise is to reference an external document, such as a detailed technical design.&lt;br /&gt;&lt;br /&gt;With all the configuration management concerns, you might not consider another, possibly more important reason to carefully comment repository object changes. These comments can be invaluable during a repository upgrade.&lt;br /&gt;&lt;br /&gt;During configuration, upgrading can be the last thing you want to consider, but if the project is successful, upgrading is inevitable. And the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Siebel&lt;/span&gt; upgrade process includes a many tedious and time-consuming steps. After the repository merge, which is an automated process that transforms the repository objects from one version to the next, there are usually hundreds or thousands of conflicts that must be manually reviewed. The &lt;a href="http://download.oracle.com/docs/cd/B40099_02/books/UPG/UPG_Merge10.html#wp1089739"&gt;Reviewing &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Siebel&lt;/span&gt; Repository Object Property Conflicts&lt;/a&gt; process is one of the most difficult, tedious, and error-prone tasks of the entire upgrade.&lt;br /&gt;&lt;br /&gt;The conflicts that must be manually reviewed are cases where there are three versions of the same repository object, and there is no clear path for the automated upgrade to take. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Siebel&lt;/span&gt; provides an Attribute List View that makes the process as easy as possible, and you have a 90% chance that the automated merge has actually identified the correct "Standard Win" version. But, for the remaining 10% of the attributes, which can be literally hundreds of choices, developer comments can be the key to an informed decision.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2475725884974991295-2132776070570170535?l=siebeldev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siebeldev.blogspot.com/feeds/2132776070570170535/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2475725884974991295&amp;postID=2132776070570170535' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/2132776070570170535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/2132776070570170535'/><link rel='alternate' type='text/html' href='http://siebeldev.blogspot.com/2008/05/another-reason-to-comment.html' title='Another Reason to Comment'/><author><name>Jim Tanner-Uicker</name><uri>http://www.blogger.com/profile/00825624314517215608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2475725884974991295.post-4069756333272014161</id><published>2008-05-20T21:12:00.000-05:00</published><updated>2008-05-20T21:12:40.012-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data validation'/><category scheme='http://www.blogger.com/atom/ns#' term='configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='user properties'/><title type='text'>Text Length Override</title><content type='html'>One of my favorite User Properties is "Text Length Override". It is a simple technique for enforcing the length of a text field without ugly popup messages.&lt;br /&gt;&lt;br /&gt;If you have a business requirement to restrict user input to a certain number of characters, you have several options.  You can find a database column that has the exact number of characters you need.  You can create a field validation that will popup an error message if a user enters more characters than required. The user must correct the error condition before being allowed to step off the field.  You can do something even more intrusive (with scripting, for example) to alert the user that he or she has made a mistake and/or fix the problem for them.&lt;br /&gt;&lt;br /&gt;But a completely non-intrusive, transparent, and elegant way to address the situation is to use the Text Length Override User Property on the field.  Text Length Override is a User Property that corrects what almost seems to be a defect in the normal functioning of a BusComp field. &lt;br /&gt;&lt;br /&gt;It seems intuitive that a field attribute called "Text Length" would set a limit to the amount of text that could be entered into a field.  Probably most people wouldn't bother to look that one up.  But the fact is that Text Length does nothing at all unless combined with the Text Length Override User Property.  The amount of text that a field will accept is normally determined by the size of the underlying database column.&lt;br /&gt;&lt;br /&gt;So how does this work?  Suppose the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You have a BusComp Field called "Short Name".  &lt;/li&gt;&lt;li&gt;The field is mapped to a column called ALIAS_NAME, which is a varchar(100).  &lt;/li&gt;&lt;li&gt;The business requires that no more than 30 characters of text can be entered into Short Name.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Here's what you need to do if you want to prevent excess text from being entered, but you don't want a validation message to interrupt the user interaction with the view:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Set the Text Length attribute on the Short Name field to 30&lt;/li&gt;&lt;li&gt;Create a User Property object as a child of the Field.&lt;/li&gt;&lt;li&gt;Set the Name attribute of the User Property to "Text Length Override".&lt;/li&gt;&lt;li&gt;Set the Value of the User Property to "True".*&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;That's all.  The User Property "overrides" the normal functionality of the Text Length attribute (it normally doesn't do anything), and limits the text to the Text Length specified.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;em&gt;* Siebel 8 Bookshelf says that you can set the value of the User Property to anything, even null, and the functionality will be the same.  This is a change from previous versions.&lt;/em&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2475725884974991295-4069756333272014161?l=siebeldev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siebeldev.blogspot.com/feeds/4069756333272014161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2475725884974991295&amp;postID=4069756333272014161' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/4069756333272014161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/4069756333272014161'/><link rel='alternate' type='text/html' href='http://siebeldev.blogspot.com/2008/05/text-length-override.html' title='Text Length Override'/><author><name>Jim Tanner-Uicker</name><uri>http://www.blogger.com/profile/00825624314517215608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2475725884974991295.post-340681238358045493</id><published>2008-05-19T21:22:00.004-05:00</published><updated>2008-05-21T15:39:13.886-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='configuration'/><title type='text'>Search Specification Performance</title><content type='html'>&lt;p&gt;With a web-based application such as Siebel, performance is always a primary concern, especially database performance. Database performance problems can cause ripple effects, as a bad-performing query can cause an increased load on the database, making it slow to respond to other, simpler queries. If a query runs several times (for example, when a user scrolls through a list applet, causing multiple fetches from a slow-performing cursor) database performance problems can become the Achilles heel of a Siebel implementation, and network slowdowns can compound this problem, as multiple fetches are added to multiple network round trips.&lt;/p&gt;&lt;p&gt;One easy way to attack database performance from the outset is by examining Search Specifications and Sort Specifications configured in your Business Components, Applets, and Pre-Defined Queries. Searches and Sorts should use indexed columns whenever possible, and you should be careful not to defeat your indexes by searching on an expression that will not use one. For example, avoid using "OR" in your search expressions, because the expression is simply copied to the WHERE clause of the query, and databases generally do a full table scan on an "OR" condition. &lt;/p&gt;&lt;p&gt;If you have any doubts about the performance of a particular search, compile the SRF, spool the SQL, and ask your DBA to run the explain plan. He or she can tell you if your query is performing optimally. Siebel performance can be a little bit tricky, because you don't write the SQL yourself, and you can't actually provide database hints. But when you are writing Search Expressions, you may have more control over the generated SQL than you realize.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2475725884974991295-340681238358045493?l=siebeldev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siebeldev.blogspot.com/feeds/340681238358045493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2475725884974991295&amp;postID=340681238358045493' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/340681238358045493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/340681238358045493'/><link rel='alternate' type='text/html' href='http://siebeldev.blogspot.com/2008/05/search-specification-performance-with.html' title='Search Specification Performance'/><author><name>Jim Tanner-Uicker</name><uri>http://www.blogger.com/profile/00825624314517215608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2475725884974991295.post-6168186892420657925</id><published>2008-05-17T16:02:00.000-05:00</published><updated>2008-05-17T16:20:34.853-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='introduction'/><category scheme='http://www.blogger.com/atom/ns#' term='meta'/><title type='text'>First Post</title><content type='html'>Hi!&lt;br /&gt;&lt;br /&gt;This post kicks off what I hope will become a valuable resource for Siebel Developers of all levels of experience. Something I've learned is that the Siebel toolset is complex enough that everyone can continue to grow in knowledge, even after working with it for years. We all develop habits with our favorite techniques, but the best of us also experiment to discover new ways of making the software do what we need it to do.&lt;br /&gt;&lt;br /&gt;In this blog, I hope to touch on many different areas of interest to those of us who work with Siebel. I plan to get into configuring screens and views, as well as more advanced topics such as integration with EAI and EIM, server management, and scripting. If you have a topic you'd like to hear about, please post in comments and I'll consider your topic for a future post.&lt;br /&gt;&lt;br /&gt;Siebel has changed over the years, and not all of us are working with the same version. When I am posting about a topic, I will try to highlight version differences when I am aware of them. Comments from developers who work with different versions are also helpful in filling the gaps in my experience. My current job has me working with Siebel 7.8, and I am not an Oracle employee, and those two factors will obviously influence what I choose to write about, but I intend this forum to extend to areas of interest to Siebel developers everywhere.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2475725884974991295-6168186892420657925?l=siebeldev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://siebeldev.blogspot.com/feeds/6168186892420657925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2475725884974991295&amp;postID=6168186892420657925' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/6168186892420657925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2475725884974991295/posts/default/6168186892420657925'/><link rel='alternate' type='text/html' href='http://siebeldev.blogspot.com/2008/05/first-post.html' title='First Post'/><author><name>Jim Tanner-Uicker</name><uri>http://www.blogger.com/profile/00825624314517215608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
