Page 1 sur 1
Interception Trigger
Posté : mer. 09 sept. 2009, 13:29:41
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
(sans texte)
Posté : mer. 09 sept. 2009, 15:29:38
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
message trigger
Posté : ven. 11 sept. 2009, 15:43:55
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
SQLSTATE 23503 Violation de contrainte
Posté : ven. 02 nov. 2018, 14:46:53
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.
Contrainte
Posté : lun. 05 nov. 2018, 12:49:40
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