Trigger

Pete Hall's web site


A Trigger template program
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