Interception Trigger

RPG (3 et 4, free), CL, SQL, etc...
Répondre
Fabrice_Sof
Messages : 11
Enregistré le : mar. 16 juin 2009, 17:16:10
Localisation : Saint-Brieuc
Contact :

Interception Trigger

Message par Fabrice_Sof »

Bonjour,

Je voudrais savoir comment dans un RPG IV(free) intercepter les erreurs envoyées par un trigger lors de la mise du fichier

Merci

Fabrice_Sof
Messages : 11
Enregistré le : mar. 16 juin 2009, 17:16:10
Localisation : Saint-Brieuc
Contact :

(sans texte)

Message par Fabrice_Sof »

Je connais déjà le code suivant :

monitor;
update monfichier;
on error 1023;
....
on error 1024;
....
on error *file;
....
endmon;

Mais ce qui m'intéresse, c'est de récupérer le message d'erreur renvoyé par le trigger du style "Code erronné"

Merci

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

message trigger

Message par cmasse »

Bonjour,

personnellement mes triggers envoient des messages d'infos (attention deux crans au dessus dans la pile d'appel) par

Code : Tout sélectionner

  *                                                              
  * envoi d'un message diagnostic au pgm applicatif              
  *                                                              
 C                   CALL      'QMHSNDPM'                        
 C                   PARM      'CPF9898'     ID                7 
 C                   PARM                    MSGFL               
 C                   PARM                    MSGTXT              
 C                   PARM                    LENTXT              
 C                   PARM      '*DIAG'       MSGTYP              
 C                   PARM                    PGMQ                
 C                   PARM      2             STACK               
 C                   PARM                    KEY                 
 C                   PARM                    ERRDS               
avant d'envoyer un message *ESCAPE un cran au dessus (1 dans STACK) afin d'interrompre l'action base de données. Ce qui me permet de récupérer l'erreur grâce à un appel au CL suivant:

Code : Tout sélectionner

              PGM        PARM(&CST)                                          
              DCL        VAR(&POS) TYPE(*CHAR) LEN(4)                        
              DCL        VAR(&KEY) TYPE(*CHAR) LEN(4)                        
              DCL        VAR(&ID) TYPE(*CHAR) LEN(7)                         
              DCL        VAR(&MSG) TYPE(*CHAR) LEN(78)                       
              DCL        VAR(&DATA) TYPE(*CHAR) LEN(1024)                    
              DCL        VAR(&CST) TYPE(*CHAR) LEN(78)                       
                                                                             
              RCVMSG     PGMQ(*PRV) MSGTYPE(*LAST) RMV(*NO) +                
                           KEYVAR(&KEY) MSG(&MSG) MSGDTA(&DATA) MSGID(&ID)   
  BOUCLE:     IF (&MSG = ' ') RETURN                                         
                                                                             
              IF ((&ID ^= 'CPF502D') & (&ID ^= 'CPF502B') & +                
                  (&ID ^= 'CPF5009') & (&ID ^= 'CPF503A') & +                
                  (&ID ^= 'CPF502F') ) THEN(DO)                              
                CHGVAR     VAR(&POS) VALUE(&KEY)                             
                RCVMSG     PGMQ(*PRV) MSGTYPE(*PRV) MSGKEY(&POS) +           
                             RMV(*NO) KEYVAR(&KEY) MSG(&MSG) +               
                             MSGDTA(&DATA) MSGID(&ID)                        
                GOTO BOUCLE                                                  
              ENDDO                                                          
 /* VIOLATION D'INTEGRITE REFERENTIELLE  (CLÉ PRIMAIRE)         */       
              IF (&ID = 'CPF5009') THEN(DO)                                  
                CHGVAR &CST 'Cette clé existe déja'                          
              ENDDO                                                          
              ELSE DO                                                        
 /* VIOLATION D'INTEGRITE REFERENTIELLE (sur le fichier fils)       */       
                IF (&ID = 'CPF502D') CHGVAR &CST  %SST(&DATA 177 78)         
 /*                                     (sur le fichier parent)     */       
                IF (&ID = 'CPF503A') CHGVAR &CST  %SST(&DATA 897 78)         
                                                                             
 /* VIOLATION CONTRAINTE DE DOMAINE        */                                
                IF (&ID = 'CPF502F') CHGVAR &CST  %SST(&DATA 897 78)         
 /* OU ERREUR SUITE À TRIGGER (CPF502B)                              */      
                IF (&ID = 'CPF502B') DO                                      
 /*  LE TEXTE PEUT SE TROUVER DANS LE MESSAGE DIAGNOSTIQUE PRECEDENT */      
                 CHGVAR     VAR(&POS) VALUE(&KEY)                            
                 RCVMSG     PGMQ(*PRV) MSGTYPE(*PRV) MSGKEY(&POS) +          
                              RMV(*NO) MSG(&MSG)                             
                 IF (&MSG = ' ') THEN(CHGVAR &CST 'Erreur envoyée par trigger')
                 ELSE CHGVAR     VAR(&CST) VALUE(&MSG)                       
                ENDDO                                                        
              ENDDO                                                          
              ENDPGM                                                         
Christian Massé (Volubis.fr)

albert06
Messages : 18
Enregistré le : sam. 07 juil. 2018, 09:17:47

SQLSTATE 23503 Violation de contrainte

Message par albert06 »

Bonjour,
Dans votre programme CL, en cas de violation d’intégrité référentielle sur une clé primaire le programme retourne le message 'Cette clé existe déjà'.
Serait-il possible d'avoir en retour, de la même manière qu'avec la violation d’intégrité référentielle, le nom de la contrainte enfreinte ?
Je pensais trouver l'info dans la variable &DATA, mais ce n'est pas le cas.
Merci pour vos réponses.

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

Contrainte

Message par cmasse »

JE viens de refaire un essai avec de pgm là

Code : Tout sélectionner

**free
dcl-f vins disk usage(*output);
dcl-pr DB2ERRC EXTPGM;
  msg char(78);
End-Pr;
dcl-s msg char(78);

pr_code = 999999;
vin_code = 999999;

monitor;
  write vinsf;
on-error *all;
  DB2ERRC(msg);
  dsply (%subst(msg : 1 : 50));
endmon;

*INLR = *on;                     
et j'ai bien le nom de la contrainte

Code : Tout sélectionner

 Violation de contrainte référentielle sur le membre VINS. 
 C                                                         
 Erreur de contrainte référentielle dans fichier VINS.     
 DSPLY  Q_BDVINA_VINS_GARDE_CODE_00001                     
Christian Massé (Volubis.fr)

Répondre