There are cases when a particular data validation or Business Process invocation should only occur when a new record is being written down to the database, but not when an existing record is being updated. Or it may be the other way around, but the Siebel developer has to figure out what operation is happening. I have found many ways these can be achieved, here are my favourite three.
1. Using a Boolean flag in script. This is how I first implemented such a scenario. I was new to Siebel and hadn't yet mastered all the scripting events . Easiest way out seemed to declare a Boolean flag in the declarations section of the Buscomp server script, and giving it a default value of false. Then in NewRecord event, this flag should be turned to true. Finally, in the PreWriteRecord or WriteRecord event, the value of this flag could be checked, and new records can be differentiated fromo exisiting records.
2. RunTime events. This is a No-Scripting approach to the same problem. In Runtime events, if you select the buscomp events supported, it can be seen that Siebel now provides three events for WriteRecord operation :
· WriteRecord : Triggered everytime after records are committed.
· WriteRecordNew : Triggered only when new records are committed.
· WriteRecordUpdated: Triggered only when existing records are updated.
But these events only occur AFTER the records are committed. They can't be used to do validation/invocation before records are committed.
3. IsNewRecordPending. This is a new specialised Busines Component Method, meant for EBCs, documented here. But on trying the command out, I found that it works perfectly well in normal business components as well. This method can be invoked from any other event in BC level, but it only makes sense to invoke it in the PreWriteRecord section.
var isNewRecord = this.InvokeMethod("IsNewRecordPending");
This way new records can be differentiated from old records before they are committed to the system.