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
-
- Messages : 11
- Enregistré le : mar. 16 juin 2009, 17:16:10
- Localisation : Saint-Brieuc
- Contact :
-
- 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
-
- 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.
-
- 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)