Bonjour,
J’ai un trigger qui contrôle que le champ date DATDEBU soit systématiquement inférieur ou égal à la date du jour.
Le trigger est actif, lié à la table en Before Update. Il contient le code suivant :
If DATDEBU > %date() ;
msg = 'MSG015';
%subst(msg:200:1)= '*';
//envoi d'un message diagnostic au pgm applicatif
callp QMHSNDPM('CPF9898':'QCPFMSG QSYS':Msg:%len(%trimr(Msg)):
'*ESCAPE': '*':2:MsgKey:ErrorCode);
ENDIF;
Dans un programme SQLRPGLE, je fais un Update (SQL) du champ de la table puis je teste :
Si SQLCODE <> 0
Je souhaite récupérer le message ‘MSG015’
Fin de si.
En RPGLE (Instruction WRITE ou UPDATE) je récupère sans problème mes messages trigger ou mes messages de contrainte.
En SQL je teste SQLERRMC et récupère le nom de ma contrainte. Mais comment faire pour récupérer le message envoyé par mon trigger.
Merci pour votre aide et vos conseils
Recup Msg du trigger suite maj SQL dans prog SQLRPGLE
(sans sujet)
En SQLRPGLE "Classique".
Merci encore pour votre aide.
Merci encore pour votre aide.
(sans sujet)
Bonjour,
En RPGLE j’appelle un prog CLLE qui contient un RCVMSG (je me souviens avoir copier le code à partir de ce forum) :
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(79)
DCL VAR(&FIN) TYPE(*DEC) LEN(1)
CHGVAR VAR(&FIN) VALUE(0)
RCVMSG PGMQ(*PRV) MSGTYPE(*LAST) RMV(*NO) KEYVAR(&KEY) +
MSG(&MSG) MSGDTA(&DATA) MSGID(&ID)
/* Sortie de programme si pas de message */
IF COND(&MSG = ' ') THEN(RETURN)
/* Début de boucle */
DOUNTIL COND(&FIN *NE 0)
IF COND((&ID *EQ 'CPF502D') *Or (&ID *EQ +
'CPF502B') *Or (&ID *EQ 'CPF5009') *Or (&ID +
*EQ 'CPF503A') *Or (&ID *EQ 'CPF502F')) +
THEN(DO)
CHGVAR VAR(&FIN) VALUE(1)
ENDDO
SELECT
/* Violation d'intégrité référentielle (clé primaire) */
WHEN COND(&ID = 'CPF5009') THEN(CHGVAR &CST +
%SST(&DATA 63 78) )
/* Violation d'intégrité référentielle (sur la table fils) */
WHEN COND(&ID = 'CPF502D') THEN(CHGVAR &CST +
%SST(&DATA 177 78))
/* Violation d'intégrité référentielle (sur la table parent) */
WHEN COND(&ID = 'CPF503A') THEN(CHGVAR &CST +
%SST(&DATA 177 78))
/* Violation de la contrainte de domaine */
WHEN COND(&ID = 'CPF502F') THEN(CHGVAR &CST +
%SST(&DATA 177 78))
/* Erreur suite à trigger */
WHEN COND(&ID = 'CPF502B') THEN(DO)
/* Le texte peut se trouver dans le message diagnostique précédent */
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)
CHGVAR VAR(&FIN) VALUE(1)
ENDDO
OTHERWISE DO
/* Exclusion de messages non pertinent */
CHGVAR VAR(&POS) VALUE(&KEY)
RCVMSG PGMQ(*PRV) MSGTYPE(*PRV) MSGKEY(&POS) RMV(*NO) +
KEYVAR(&KEY) MSG(&MSG) MSGDTA(&DATA) +
MSGID(&ID)
ITERATE
ENDDO
ENDSELECT
ENDDO
/* Fin de boucle */
ENDPGM
En retour de programme je teste la valeur de &CST qui contient la valeur de la contrainte enfreinte ou la ref message envoyé par le trigger.
Merci encore.
En RPGLE j’appelle un prog CLLE qui contient un RCVMSG (je me souviens avoir copier le code à partir de ce forum) :
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(79)
DCL VAR(&FIN) TYPE(*DEC) LEN(1)
CHGVAR VAR(&FIN) VALUE(0)
RCVMSG PGMQ(*PRV) MSGTYPE(*LAST) RMV(*NO) KEYVAR(&KEY) +
MSG(&MSG) MSGDTA(&DATA) MSGID(&ID)
/* Sortie de programme si pas de message */
IF COND(&MSG = ' ') THEN(RETURN)
/* Début de boucle */
DOUNTIL COND(&FIN *NE 0)
IF COND((&ID *EQ 'CPF502D') *Or (&ID *EQ +
'CPF502B') *Or (&ID *EQ 'CPF5009') *Or (&ID +
*EQ 'CPF503A') *Or (&ID *EQ 'CPF502F')) +
THEN(DO)
CHGVAR VAR(&FIN) VALUE(1)
ENDDO
SELECT
/* Violation d'intégrité référentielle (clé primaire) */
WHEN COND(&ID = 'CPF5009') THEN(CHGVAR &CST +
%SST(&DATA 63 78) )
/* Violation d'intégrité référentielle (sur la table fils) */
WHEN COND(&ID = 'CPF502D') THEN(CHGVAR &CST +
%SST(&DATA 177 78))
/* Violation d'intégrité référentielle (sur la table parent) */
WHEN COND(&ID = 'CPF503A') THEN(CHGVAR &CST +
%SST(&DATA 177 78))
/* Violation de la contrainte de domaine */
WHEN COND(&ID = 'CPF502F') THEN(CHGVAR &CST +
%SST(&DATA 177 78))
/* Erreur suite à trigger */
WHEN COND(&ID = 'CPF502B') THEN(DO)
/* Le texte peut se trouver dans le message diagnostique précédent */
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)
CHGVAR VAR(&FIN) VALUE(1)
ENDDO
OTHERWISE DO
/* Exclusion de messages non pertinent */
CHGVAR VAR(&POS) VALUE(&KEY)
RCVMSG PGMQ(*PRV) MSGTYPE(*PRV) MSGKEY(&POS) RMV(*NO) +
KEYVAR(&KEY) MSG(&MSG) MSGDTA(&DATA) +
MSGID(&ID)
ITERATE
ENDDO
ENDSELECT
ENDDO
/* Fin de boucle */
ENDPGM
En retour de programme je teste la valeur de &CST qui contient la valeur de la contrainte enfreinte ou la ref message envoyé par le trigger.
Merci encore.
-
- Site Admin
- Messages : 813
- Enregistré le : mer. 14 févr. 2007, 18:00:03
- Localisation : Nantes
- Contact :
message d'erreur
Alors envoyez DEUX messages depuis le trigger
1/pour prevenir le pgm RPG
callp QMHSNDPM('CPF9898':'QCPFMSG QSYS':Msg:%len(%trimr(Msg)):
'*DIAG': '*':3:MsgKey:ErrorCode);
2/ pour interrompre l'action (DB2°
callp QMHSNDPM('CPF9898':'QCPFMSG QSYS':Msg:%len(%trimr(Msg)):
'*ESCAPE': '*':2:MsgKey:ErrorCode);
et en CL allez chercher les messages *DIAG
1/pour prevenir le pgm RPG
callp QMHSNDPM('CPF9898':'QCPFMSG QSYS':Msg:%len(%trimr(Msg)):
'*DIAG': '*':3:MsgKey:ErrorCode);
2/ pour interrompre l'action (DB2°
callp QMHSNDPM('CPF9898':'QCPFMSG QSYS':Msg:%len(%trimr(Msg)):
'*ESCAPE': '*':2:MsgKey:ErrorCode);
et en CL allez chercher les messages *DIAG
Christian Massé (Volubis.fr)