Volubis, le forum IBM i Index du Forum Volubis, le forum IBM i
avec les clubs Informatiques IPL et Bretagne.
 
 FAQFAQ   RechercherRechercher   Liste des MembresListe des Membres   Groupes d'utilisateursGroupes d'utilisateurs   S'enregistrerS'enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

Recup Msg du trigger suite maj SQL dans prog SQLRPGLE

 
Poster un nouveau sujet   Répondre au sujet    Volubis, le forum IBM i Index du Forum -> langages
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
albert06



Inscrit le: 07 Juil 2018
Messages: 16

MessagePosté le: Ven 25 Oct 2019, 15:32:17    Sujet du message: Recup Msg du trigger suite maj SQL dans prog SQLRPGLE Répondre en citant

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
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
cmasse
Site Admin


Inscrit le: 14 Fév 2007
Messages: 716
Localisation: Nantes

MessagePosté le: Lun 28 Oct 2019, 08:45:20    Sujet du message: trigger Répondre en citant

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)
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
albert06



Inscrit le: 07 Juil 2018
Messages: 16

MessagePosté le: Lun 04 Nov 2019, 16:06:07    Sujet du message: (sans sujet) Répondre en citant

En SQLRPGLE "Classique".
Merci encore pour votre aide.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
cmasse
Site Admin


Inscrit le: 14 Fév 2007
Messages: 716
Localisation: Nantes

MessagePosté le: Lun 04 Nov 2019, 16:17:40    Sujet du message: trigger Répondre en citant

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)
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
albert06



Inscrit le: 07 Juil 2018
Messages: 16

MessagePosté le: Mar 05 Nov 2019, 14:39:21    Sujet du message: (sans sujet) Répondre en citant

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(7Cool
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 7Cool )

/* Violation d'intégrité référentielle (sur la table fils) */
WHEN COND(&ID = 'CPF502D') THEN(CHGVAR &CST +
%SST(&DATA 177 7Cool)

/* Violation d'intégrité référentielle (sur la table parent) */
WHEN COND(&ID = 'CPF503A') THEN(CHGVAR &CST +
%SST(&DATA 177 7Cool)
/* Violation de la contrainte de domaine */
WHEN COND(&ID = 'CPF502F') THEN(CHGVAR &CST +
%SST(&DATA 177 7Cool)

/* 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.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
cmasse
Site Admin


Inscrit le: 14 Fév 2007
Messages: 716
Localisation: Nantes

MessagePosté le: Mar 05 Nov 2019, 19:54:52    Sujet du message: message d'erreur Répondre en citant

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)
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Volubis, le forum IBM i Index du Forum -> langages Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com

Anti Bot Question MOD - phpBB MOD against Spam Bots