Recup Msg du trigger suite maj SQL dans prog SQLRPGLE

RPG (3 et 4, free), CL, SQL, etc...
Répondre
albert06
Messages : 16
Enregistré le : sam. 07 juil. 2018, 09:17:47

Recup Msg du trigger suite maj SQL dans prog SQLRPGLE

Message 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

cmasse
Site Admin
Messages : 777
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

trigger

Message 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.
Christian Massé (Volubis.fr)

albert06
Messages : 16
Enregistré le : sam. 07 juil. 2018, 09:17:47

(sans sujet)

Message par albert06 »

En SQLRPGLE "Classique".
Merci encore pour votre aide.

cmasse
Site Admin
Messages : 777
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

trigger

Message 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 ?
Christian Massé (Volubis.fr)

albert06
Messages : 16
Enregistré le : sam. 07 juil. 2018, 09:17:47

(sans sujet)

Message 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.

cmasse
Site Admin
Messages : 777
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

message d'erreur

Message 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
Christian Massé (Volubis.fr)

Répondre