Page 1 sur 1

Recup Msg du trigger suite maj SQL dans prog SQLRPGLE

Posté : ven. 25 oct. 2019, 15:32:17
par albert06
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

trigger

Posté : lun. 28 oct. 2019, 08:45:20
par cmasse
Comment le récupérez vous en RPG "classique" ? par API ?

il doit être dans la lOG, mais c'est SQL qui l'a reçu.

(sans sujet)

Posté : lun. 04 nov. 2019, 16:06:07
par albert06
En SQLRPGLE "Classique".
Merci encore pour votre aide.

trigger

Posté : lun. 04 nov. 2019, 16:17:40
par cmasse
je me suis mal exprimé, vous disiez qu'en RPG "classique" (RPGLE) vous saviez récupérer le message...

comment faites vous ? par APi, RCVMSG en CL ?

(sans sujet)

Posté : mar. 05 nov. 2019, 14:39:21
par albert06
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.

message d'erreur

Posté : mar. 05 nov. 2019, 19:54:52
par cmasse
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