This template deals with triggers on physical files.The triggered file itself need not be referenced here unless you have need to access it beyond the record that caused the trigger to be pulled.
/TITLE TRIGGER ** Trigger program shell **
* Pete Hall
* http://www.inwave.com/~peteh/
* Replace (PFile) with physical file name
* Replace (AFile) with ancillary file name
* ---------------------------------------------
* Ancillary files
* ---------------------------------------------
F(AFile) UF A E K DISK Commit(RunCommit) UsrOpn
* ------------------------------------------
* Entry Parameters
* ---------------------------------------------
DBuffer DS 32767
D PFName 10
D PFLibrary 10
D PFMember 10
D TrgEvent 1
D TrgTime 1
D TrgCmtLvl 1
D 3
D TrgCCSID 7B 0
D 8
D OrOffset 7B 0
D OrRcdLen 7B 0
D OrNBMapOfs 7B 0
D OrNBMapLen 7B 0
D NwOffset 7B 0
D NwRcdLen 7B 0
D NwNBMapOfs 7B 0
D NwNBMapLen 7B 0
D DataSpace 1 32767
D Bytes 1 Overlay(DataSpace) Dim(32767)
DBufferLen S 7B 0
* ---------------------------------------------
* Original Record
* ---------------------------------------------
D@OrRecord S * Inz(*Null)
DOrRecord E DS ExtName((PFile)) Prefix(OR_)
D Based(@OrRecord)
* ---------------------------------------------
* New Record
* ---------------------------------------------
D@NwRecord S * Inz(*Null)
DNwRecord E DS ExtName((PFile)) Prefix(NW_)
D Based(@NwRecord)
* ---------------------------------------------
* Constant Definitions
* ---------------------------------------------
* Commit Levels
DCL_NONE C '0'
DCL_CHG C '1'
DCL_CS C '2'
DCL_ALL C '3'
* Null byte status
DNB_NOTNULL C '0'
DNB_NULL C '1'
* Trigger events
DTE_INSERT C '1'
DTE_DELETE C '2'
DTE_UPDATE C '3'
* Trigger times
DTT_AFTER C '1'
DTT_BEFORE C '2'
C *ENTRY plist
C parm Buffer
C parm BufferLen
* ---------------------------------------------
* Main-line Procedure
* ---------------------------------------------
* Assign the record templates to their data space
C eval @OrRecord = %Addr(Bytes(OrOffset+1))
C eval @NwRecord = %Addr(Bytes(NwOffset+1))
* Execute the correct procedure based on trigger event
C TrgEvent caseq TE_INSERT DoInsert
C TrgEvent caseq TE_DELETE DoDelete
C TrgEvent caseq TE_UPDATE DoUpdate
C endcs
C return
* ---------------------------------------------
* Process a delete event
* ---------------------------------------------
CSR DoDelete BEGSR
CSR ENDSR
* ---------------------------------------------
* Process an insert event
* ---------------------------------------------
CSR DoInsert BEGSR
CSR ENDSR
* ---------------------------------------------
* Process an update event
* ---------------------------------------------
CSR DoUpdate BEGSR
CSR ENDSR
* ---------------------------------------------
* Program Initialization
* ---------------------------------------------
CSR *INZSR BEGSR
C if TrgCmtLvl > CL_NONE
C move *ON RunCommit
C endif
* > if TrgCmtLvl > CL_NONE
C open
CSR ENDSR
Reference from Pete Hall's web site .
No comments:
Post a Comment