× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.



Here is a sample trigger program and a couple of it's /COPY's:

TRIGGERS - main program
TRIGGERD - /COPYed D specifications
TRIGGERC - /COPYed calculation specs common to all trigger programs

Code is a little old, so cut me some slack.

You will be missing the following copies
HSPEC
SRVPGMCPY
I can send those later.  SRVPGMCPY tends to make one rather /COPY phobic. 
So I might only send you a subset, but it should have all you need.  Don't 
want to scare you off.

TRIGGERS
      /DEFINE HSpec
      /INCLUDE ROUTINES/QRPGLESRC,HSPEC
      /UNDEFINE HSpec

 
***************************************************************************
      * Program: This is a sample trigger program just to show you the 
basic    *
      * constructs.      *
      * This one will show you the following things a trigger can do:  *
      * 1)  Log access to another file.      *
      * 2)  Lock a person out of a particular record      *
      * 3)  Change the record buffer to record who updated this record 
last and *
      *     when.      *
      *      *
      * Replace occurances of TESTFILE with the name of the file you want 
to    *
      * trigger off of.      *
      *      *
      * Modification log:      *
      * 02/20/02 by R.Berendt, CCP    Group Dekko Services, LLC      *
      *          Created.      *
      *      *
      * Compilation instructions:      *
      *   (no special instructions this time.)      *
      *      *
 
***************************************************************************

     F* Log of changes to file.
     FTESTLOGF  O    E             DISK    BLOCK(*NO)

      /DEFINE DSpec
      /COPY ROUTINES/QRPGLESRC,SRVPGMCPY
      /COPY ROUTINES/QRPGLESRC,TRIGGERD
      /UNDEFINE DSpec
     D NEW           E DS                  EXTNAME(TESTFILE) QUALIFIED

      /COPY ROUTINES/QRPGLESRC,TRIGGERC

      /free
       // If the person is not ROB, then don't let them read the record 
with the key 'yabba'.
       // This could be easily changed to record types, groups of users, 
etc.
       if user<>'ROB';
        select;
        when (focDesc='INSERT' and new.reckey='yabba')
             or (focDesc<>'INSERT' and old.reckey='yabba');
         exsr fail;
         return;
        endsl;
       endif;

       // Write out changes to log file.
       if focDesc='INSERT' or focDesc='UPDATE';
        lreckey=new.reckey;
        laction=event;
        lusername=User;
        ltimestamp=%timestamp();
        write testlog;
       endif;

       // On writes or updates, change the record buffer to record user 
and time
       // of change.
       if focDesc='INSERT' or focDesc='UPDATE';
        new.username=User;
        new.dattim=%timestamp();
        %subst(datastuff:nwoff-80+1:nwrcl)=new;
       endif;

       return;
       // end of mainline code

       begsr fail;
       // This user may not access this record.  Abort the trigger.
       CALLP     QMHSNDPM('CPF9898':
                          'QCPFMSG   QSYS      ':
                          'Not authorized to record':
                          300:
                          '*ESCAPE':
                          '*':
                          1:
                          MsgKey:
                          errc0100);
       endsr;
      /end-free



TRIGGERD
     D  ORNOFF                57     60I 0
     D* Length of the original byte map.  Should equal # of fields
     D  ORNLEN                61     64I 0
     D* Offset to the new record
     D  NWOFF                 65     68I 0
     D* Length of the new record
     D  NWRCL                 69     72I 0
     D* Offset to the new record null byte map
     D  NWNOFF                73     76I 0
     D* Length of the new record null byte map
     D  NWNLEN                77     80I 0
     D* Reserved data and record data.
     D  DATASTUFF             81  32000a

     D TRIGLENDS       DS
     D* Trigger buffer length
     D  TRIGLEN                      10I 0

     D* External description of file being updated.  Must specify file in 
your program!
     D* Therefore, copy the following line into your program, remove the 
comment, and
     D* specify the correct file name.
     D*NEW           E DS                  EXTNAME(filename) QUALIFIED
     D OLD             DS                  LIKEDS(NEW)

     D AryElem         s             10i 0
     D FailedTrigger   s               n   inz(*off)
 

TRIGGERC

     C     *ENTRY        PLIST
     C                   PARM                    TRIG
     C                   PARM                    TRIGLENDS

      /free

       FailedTrigger=*off;
       AryElem=%lookup(lcklvl:clcCode);
       if AryElem>0;
        clcDesc=clcDescA(Aryelem);
       else;
        clcDesc=*blanks;
       endif;
       AryElem=%lookup(event:focCode);
       if AryElem>0;
        focDesc=focDescA(Aryelem);
       else;
        focDesc=*blanks;
       endif;
       AryElem=%lookup(trtime:tmcCode);
       if AryElem>0;
        tmcDesc=tmcDescA(Aryelem);
       else;
        tmcDesc=*blanks;
       endif;
       // If this is a delete, change or read then move the old record 
into the
       // old record data structure.
       if focDesc='DELETE' or focDesc='UPDATE' or focDesc='READ';
        old=%subst(datastuff:oroff-80+1:orrcl);
       endif;
       // If this is a add or change then move the new record into the new
       // record data structure
       if focDesc='INSERT' or focDesc='UPDATE';
        new=%subst(datastuff:nwoff-80+1:nwrcl);
       endif;
      /end-free

Rob Berendt
-- 
Group Dekko Services, LLC
Dept 01.073
PO Box 2000
Dock 108
6928N 400E
Kendallville, IN 46755
http://www.dekko.com





"Smith, Mike" <Mike_Smith@xxxxxxxxxxxxxxxx> 
Sent by: rpg400-l-bounces@xxxxxxxxxxxx
10/26/2004 03:01 PM
Please respond to
RPG programming on the AS400 / iSeries <rpg400-l@xxxxxxxxxxxx>


To
<rpg400-l@xxxxxxxxxxxx>
cc

Fax to

Subject
Trigger?






We have a situation were I need to add a trigger to a file to circumvent
a problem.  We should really fix the bug, but this is a temporary
situation so it has been decided to try this approach
. 
We have a file that in certain situations is updating a field, as a
result of this field being populated, other processes are being
affected. 
So the idea was when a record is inserted to have the trigger program
CLEAR this field.  I have tried to accomplish this directly in the
trigger program(both before and after the insert) and also, in a called
program from the trigger. 

Does this sound like I can accomplish this in the trigger.  If so, what
should the approach be. 

Michael Smith
iSeries.mySeries.

--
This is the RPG programming on the AS400 / iSeries (RPG400-L) mailing list
To post a message email: RPG400-L@xxxxxxxxxxxx
To subscribe, unsubscribe, or change list options,
visit: http://lists.midrange.com/mailman/listinfo/rpg400-l
or email: RPG400-L-request@xxxxxxxxxxxx
Before posting, please take a moment to review the archives
at http://archive.midrange.com/rpg400-l.



As an Amazon Associate we earn from qualifying purchases.

This thread ...

Replies:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.