best practise for scripting
TRANSCRIPT
© 2006 Oracle Corporation – Proprietary and Confidential
© 2006 Oracle Corporation – Proprietary and Confidential
<Insert Picture Here>
Agenda
• The Problem• Possible Solutions• Design Time Decisions• Declarative Alternatives• Optimization Techniques• Release 7.8 and 8.0 Enhancements• Question and Answer
© 2006 Oracle Corporation – Proprietary and Confidential
• Siebel CRM internal benchmarks show that, depending on the Release, an application with a moderate amount of script can be affected as follows:
CPU Utilization 80% increase
Memory Utilization 19% increase
Response Time 65% decrease
Scripting Cost to Performance
• There is a strong correlation between the probability of one of our customers being in a “red” status and the amount of script in that customer’s repository.
© 2006 Oracle Corporation – Proprietary and Confidential
<Insert Picture Here>
Agenda
• The Problem• Possible Solutions• Design Time Decisions• Declarative Alternatives• Optimization Techniques• Release 7.8 and 8.0 Enhancements• Question and Answer
© 2006 Oracle Corporation – Proprietary and Confidential
Possible Solutions
• In view of the performance cost of script, there are three possible courses of action that we can take:• Envision and Define to avoid script• Use declarative alternatives instead of script• Use performance friendly techniques in
script
© 2006 Oracle Corporation – Proprietary and Confidential
<Insert Picture Here>
Agenda
• The Problem• Possible Solutions• Design Time Decisions• Declarative Alternatives• Optimization Techniques• Release 7.8 and 8.0 Enhancements• Question and Answer
© 2006 Oracle Corporation – Proprietary and Confidential
Cut Script at Design Time or Before
• Include a knowledgeable Siebel technical resource in the early stages (planning, scope, design phases) of the project methodology.• Employees of your Organization who understand the standard
application.
• Many times the application design stage is seen as only being between business owners and business analysts.
• Myth: Developers are paid by the number of lines of code they write.
© 2006 Oracle Corporation – Proprietary and Confidential
<Insert Picture Here>
Agenda
• The Problem• Possible Solutions• Design Time Decisions• Declarative Alternatives• Optimization Techniques• Release 7.8 and 8.0 Enhancements• Question and Answer
© 2006 Oracle Corporation – Proprietary and Confidential
Replace Script with Declarative Alternatives
• For many functional requirements there is a configuration technique available that requires no script.
• Knowing these configuration techniques, one can make better decisions about whether to write script in the first place.
© 2006 Oracle Corporation – Proprietary and Confidential
Example: Field Data Validation
Requirement: Field Validation
if (fieldname == “Activation Date”){ if(this.GetFieldValue(“Expiration Date”) != “”) { if(this.GetFieldValue(“Activation Date”) >
this.GetFieldValue(“Expiration Date”)) { throw(“Activation Date must be less than Expiration Date, if
Expiration Date has been filled in”); } }}
© 2006 Oracle Corporation – Proprietary and Confidential
Configuration Alternative
Solution: use BC Field Validation Property
© 2006 Oracle Corporation – Proprietary and Confidential
Configuration Alternative
• Additional properties introduced in Release 8.0• Validation Message with Symbolic String support
• Message Display Mode
© 2006 Oracle Corporation – Proprietary and Confidential
Example: Setting Field Values Based on Field Changes
‘SetFieldValue eventif (fieldname == “Product Serialized Flag”){ if(this.GetFieldValue(“Serial Number”) == “” && this.GetFieldValue(“Product Serialized Flag”) == ‘Y’) { this.SetFieldValue(“Serial Number”, this.GetFieldValue(“Asset
Number”)); }}
© 2006 Oracle Corporation – Proprietary and Confidential
Configuration Alternative
• On Field Update Set User Property
© 2006 Oracle Corporation – Proprietary and Confidential
Example: Responding to Write Events
function BusComp_WriteRecord()
{
if(this.GetFieldValue(“Account Status”) == “Followup”)
{
var bc = TheApplication().GetBusObject(“Action”).GetBusComp(“Action”);
bc.NewRecord(NewAfter);
bc.SetFieldValue(“Description”, “Account Followup”);
bc.SetFieldValue(“Due”, Today());
bc.WriteRecord();
}
}
© 2006 Oracle Corporation – Proprietary and Confidential
Configuration Alternative
• Runtime Events• Bigger complement of events than available in script
© 2006 Oracle Corporation – Proprietary and Confidential
Example: PreCanInvokeMethod
function Applet_PreCanInvokeMethod(MethodName,&CanInvoke){ if(MethodName == “Submit”) { CanInvoke = “TRUE”; return(CancelOperation); }}
© 2006 Oracle Corporation – Proprietary and Confidential
Configuration Alternative
• Applet Named Method User Property
• New in Release 8, CanInvokeMethod User Property
© 2006 Oracle Corporation – Proprietary and Confidential
Other Configuration Alternatives - Profile Attributes
• Dynamic versus Static Profile Attributes• Ex: ActiveViewName
• Static Profile Attributes based on Personalization Profile BC• GetProfileAttr
• Is Employee• GetProfileAttrAsList
• Ex: GetProfileAttrAsList(“User Responsibilities”)
Where can they be used to avoid code?• Search Specification (BC and Applets) • Calculated fields to be referenced in User Properties• Personalization• Pre Default Value and Post Default Values
© 2006 Oracle Corporation – Proprietary and Confidential
Other Configuration Alternatives
Functions in Calculated Expressions• LoginName, PostionId, etc
User Properties• Required• Named Method to invoke a Bus Service• Configuring Data-Driven Read-Only Behavior
© 2006 Oracle Corporation – Proprietary and Confidential
Other Siebel Alternatives to Script
• State Model
© 2006 Oracle Corporation – Proprietary and Confidential
Other Siebel Alternatives to Script
• Audit Trail
© 2006 Oracle Corporation – Proprietary and Confidential
<Insert Picture Here>
Agenda
• The Problem• Possible Solutions• Design Time Decisions• Declarative Alternatives• Optimization Techniques• Release 7.8 and 8.0 Enhancements• Question and Answer
© 2006 Oracle Corporation – Proprietary and Confidential
The First Rule of Script Optimization
The Fastest Script You’ll Ever Write…
is the Script that You Never Write
© 2006 Oracle Corporation – Proprietary and Confidential
The Keys to Optimization – Choices
• There is no silver bullet for scripting performance
• Improving performance is about making many small choices over time. It is about discipline and making the right small choices over and over again.
• Generally, the earlier in the implementation methodology we start thinking about the impact of scripting on performance the better.
“There are always two choices. Two paths to take. One is easy. And its only reward is that it is easy”- Anonymous
© 2006 Oracle Corporation – Proprietary and Confidential
Do Not Script The BusComp_PreGetFieldValue Event
• The BusComp_PreGetFieldValue event is for every field that is retrieved in a SQL SELECT statement, so it is fired very, very frequently.
• Any script in this event causes a severe penalty in performance.
• Siebel CRM has numerous cases of customers with severe performance problems that have been tracked down almost exclusively to the use of this one event.
• In Release 2000, there were a few legitimate uses for this event. In Release 7, we have yet to see a necessity for using the event.
© 2006 Oracle Corporation – Proprietary and Confidential
Frequently Fired Events
• Other events that fire frequently are:• ChangeRecord• ShowControl
• PreCanInvokeMethod
• Use care when scripting these events.
© 2006 Oracle Corporation – Proprietary and Confidential
Minimize Browser to Server Roundtrips
• Performance Key: Minimize Server Roundtrips• In BrowserScript, these are caused by:
• Referencing Profile Attributes• Calling Server-Side Business Services• Using the “Immediate Post Changes” field property
© 2006 Oracle Corporation – Proprietary and Confidential
Algorithmic Improvements
• No Need to Query Child Business Components In Loops
bcOrder.ExecuteQuery( ForwardOnly ); if ( bcOrder.FirstRecord() ) { do {
…
bcOrderLineItems.ExecuteQuery(ForwardOnly);
… } while ( bcOrder.NextRecord() ); }
© 2006 Oracle Corporation – Proprietary and Confidential
Use Indexed Columns For Searching
• Script should use indexed columns in its search and sort specifications.
• Failure to use indexed columns in search and sort specifications leads to queries that use temporary tables or produce sequential table scans. Both of these are detrimental to performance.
Example:
bc.SetSearchSpec(Name, theName);
bc.SetSearchSpec(CustomField, theField);
bc.SetSearchSpec(SomethingElse, theElse);
© 2006 Oracle Corporation – Proprietary and Confidential
Use The Correct Cursor Mode
• For the ExecuteQuery() method, use the ForwardOnly cursor mode wherever possible.• Improves performance• Can only traverse forward from first to last record• Does not create a buffer to hold records when they have been scrolled
past. (Memory Savings)• Does not have to keep a linked list up to date when scrolling through
record set. (CPU savings)
• Unless ForwardBackward is required• Moves in both directions• Required to show records in applet• Using DB2 UDB for z/OS and OS/390 (Siebel Tech Note 592)
© 2006 Oracle Corporation – Proprietary and Confidential
Field Activation
• Setting field property ‘Force Active’ to True unnecessarily causes performance issues in both configuration and script.
• Especially true for Joined and Multi-valued fields.
• A business component field is “Active” when:
• It is exposed and visible on the currently displayed applet.• Field's Link Specification property is set to TRUE• Field's Force Active property is set to TRUE• Business component's Force Active property is set to TRUE
© 2006 Oracle Corporation – Proprietary and Confidential
Remove Debugging Code
• Debugging code should be removed before going into production
• This does not apply to TheApplication().Trace() TheApplication().Trace() statements may be left in the code in production as long as TraceOn() is removed or commented out.
© 2006 Oracle Corporation – Proprietary and Confidential
Avoid Run-time Business Services in Production
• Run-time Business Services do not perform well• They are not pre-compiled to intermediate code• They must be interpreted from scratch on execution• They are great for prototyping• They are terrible in Production• Also, they are not very amenable to source code control
© 2006 Oracle Corporation – Proprietary and Confidential
<Insert Picture Here>
Agenda
• The Problem• Possible Solutions• Design Time Decisions• Declarative Alternatives• Optimization Techniques• Release 7.8 and 8.0 Enhancements• Question and Answer
© 2006 Oracle Corporation – Proprietary and Confidential
Siebel Scripting Features Timeline
• Siebel CRM Release 6 and prior: • Support for SVB and eScript
• Release 7.x: • BrowserScript and ServerScript
• Release 7.7.2.3 and 7.8: • Introduction of the ST eScript Engine
• Release 8.0: • Enhancements to the ST eScript Engine
• Enhancements in Tools Configuration to assist and reduce scripting
© 2006 Oracle Corporation – Proprietary and Confidential
How to Turn on the New Script Engine
• Tools and client cfg files[Siebel]
RepositoryFile = siebel_sia.srf
ApplicationName = Siebel Tools
ApplicationTitle = Siebel Tools
ApplicationSplashText = Siebel Tools
Vertical = sia
ComponentName = Siebel Tools Client
DataSource = Local
EnableCLIScripting = TRUE
© 2006 Oracle Corporation – Proprietary and Confidential
7.8 Scripting Highlights
• Improved Performance – Higher throughput with a lower CPU and memory footprint in cases where customers have implemented a significant amount of script.
• Improved Scalability – Lower footprint per user for CPU and memory use.
• New Functionality – Added support for ECMAScript Edition 4 compliant strong typing. Using strongly typed objects will get both better functional scripts and performance.
© 2006 Oracle Corporation – Proprietary and Confidential
Preliminary Performance/Scalability results
CPU reduction• 18-20% reduction in CPU usage per user in heavily OM dependent
script scenarios (100 connected users)• 25-35% reduction in CPU usage per user in low OM dependent script
scenarios (100 connected users)
Memory footprint reduction• 20-30% memory footprint reduction per user (100 connected users)
© 2006 Oracle Corporation – Proprietary and Confidential
Another 7.8 Performance Enhancement
• Introducing the CountRecords method• This new method can be used in place of any current code that loops
through recordsets to determine the number of records.
© 2006 Oracle Corporation – Proprietary and Confidential
Late and Early Binding Class Support
• Late Binding:var a = new Date ();
a.toString();
Binding will happen at runtime, since a is not strongly typed.
• Early Binding:var a : Date = new Date ();
a.toString();
Binding will happen at compile time.
© 2006 Oracle Corporation – Proprietary and Confidential
8.0 Scripting Highlights Enhancements to the ST eScript Engine
• Repository Based Script Assist
• Script Libraries• Can call business service functions directly after declaring a
business service. No need to declare property sets and make an InvokeMethod call.
• Modular, reusable, upgradeable components can now be written.• Use is optional: All code written prior to 8.x is still supported
• Script Assist Favorites
• Fix and Go
© 2006 Oracle Corporation – Proprietary and Confidential
Enhancements in Tools Configuration to Assist and Reduce Scripting
Script Editor Syntax Highlighting • VB and eScript support
Debug Window Global support • VB and eScript support
Enabling buttons declaratively • Most applet class support
Customizable messages for Field Validation property
© 2006 Oracle Corporation – Proprietary and Confidential
The preceding is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions.The development, release, and timing of any features or functionality described for Oracle’s products remain at the sole discretion of Oracle.