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
			
			
			
									
									
						Interception Trigger
- 
				Fabrice_Sof
 - Messages : 11
 - Enregistré le : mar. 16 juin 2009, 17:16:10
 - Localisation : Saint-Brieuc
 - Contact :
 
- 
				Fabrice_Sof
 - Messages : 11
 - Enregistré le : mar. 16 juin 2009, 17:16:10
 - Localisation : Saint-Brieuc
 - Contact :
 
(sans texte)
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
			
			
			
									
									
						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
Bonjour,
personnellement mes triggers envoient des messages d'infos (attention deux crans au dessus dans la pile d'appel) par
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:
			
			
			
									
									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               
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)
						SQLSTATE 23503 Violation de contrainte
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.
			
			
			
									
									
						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
JE viens de refaire un essai avec de pgm là
et j'ai bien le nom de la contrainte
			
			
			
									
									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;                     
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)