Trigger

RPG (3 et 4, free), CL, SQL, etc...
Répondre
cimmelé
Messages : 34
Enregistré le : mer. 28 mars 2007, 21:57:59
Localisation : Rennes(35)
Contact :

Trigger

Message par cimmelé »

Bonjour,

:roll: J'aimerais pouvoir retrouver dans un programme RPG utilisé comme trigger, le nom du programme ayant effectué la transaction BD et déclenché l'appel au trigger...

Est ce que cette possibilité existe ?

Merci

cmasse
Site Admin
Messages : 764
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

retrouver le nom du pgm

Message par cmasse »

la technique est la suivante, envoyer un message au pgm en indiquant un niveau dans la liste d'invocation et récupérer le nom de celui qui l'a recu.

API QMHSNDPM = SNDPGMMSG en CL, QMHRCVPM = RCVMSG en CL.

dans le cas d'un trigger il faut ajouter 1 (donc 3 et non 2 dans STACK) afin de tenir compte de DB2 qui a lui même lancé le trigger.

Code : Tout sélectionner

     H  nomain


      * prototype de la fonction
      *
      /copy prototypes,quiappel


      * corps de la fonction
     Pquiappel         B                    export
     D                 PI            10
     D  niveau                       10I 0  const


      *  variables locales
     Dbinaire          S             10I 0


     DLENTXT           S                   like(binaire)
     DSTACK            S                   like(binaire)
     DKEY              S                   like(binaire)
     DATTENTE          S                   like(binaire)
     DCODERR           DS
     D  LGCOD                              like(binaire)   INZ(16)
     D  LGUTIL                             like(binaire)

     D  MSGID                         7
     D  RESERV                        1


      *
      *  on envoi un message au programme au-dessus (stack=empilement)
      *  et on le relit.
      *   (dans les infos retournées il y a le nom du pgm en 111)
      *


      * on rajoute 2 pour tenir compte de la place occupée par le pgm
      * utilisant lui même la fonction ET de la place du PEP (entry point)


     c                   eval      stack = niveau + 2


     C                   CALL      'QMHSNDPM'
     C                   PARM                    ID                7
     C                   PARM                    MSGFL            20
     C                   PARM      'peu importe' MSGTXT           10
     C                   PARM      10            LENTXT
     C                   PARM      '*INFO  '     MSGTYP           10
     C                   PARM      '*'           PGMQ             10
     C                   PARM                    STACK
     C                   PARM                    KEY
     C                   PARM                    CODERR
     C                   CALL      'QMHRCVPM'
     C                   PARM                    retour          120
     C                   PARM      120           lentxt
     C                   PARM      'RCVM0200'    format            8
     C                   PARM      '*'           PGMQ             10
     C                   PARM                    STACK
     C                   PARM      '*ANY'        MSGTYP
     C                   PARM                    KEY
     C                   PARM      0             ATTENTE
     C                   PARM      '*REMOVE'     ACTION           10
     C                   PARM                    CODERR
     c                   return    %subst(retour:111:10)
     Pquiappel         E
Christian Massé (Volubis.fr)

Répondre