Page 1 sur 2

Watch programme RPG ILE

Posté : mar. 10 mars 2015, 16:11:11
par Alain MOIROUD
J'ai un soucis avec mon programme Watch en RPG ILE qui semble-t-il ne fonctionne plus correctement en V7R1, alors qu'en V6R1 il fonctionnait bien.

J'utilise dans le CL de lancement la possibilité de monitorer les messages avec le *Généric, exemple CPA49*, cette possibilité n'existait pas en V6R1 puisqu'il fallait mettre l'identifiant en entier.

J'ai essayer aussi avec la possibilité *ALL, sans plus de succès.

j'ai essayer STRWCH avec : *EVTWCH, *IMMED, *ALL cela ne fonctionne pas non plus

Je ne voit pas ou cela pêche, pourriez-vous m'aider ?

Je vous remercie d'avance

manque d'informations

Posté : mar. 10 mars 2015, 16:32:11
par cmasse
Bonjour,

il nous manque des infos :

1/ détail de la commande STRWCH ou extrait du CL

2/ ca na marche pas ???
ça veut dire message d'erreur ou il ne se passe rien, le pgm n'est jamais lancé ?

3/ si message d’erreur, le code erreur, SVP.

bref aidez nous à vous aider....

(sujet non précisé)

Posté : mar. 10 mars 2015, 16:46:13
par Alain MOIROUD
Le CL de lancement

PGM

DCL VAR(&SESS) TYPE(*CHAR) LEN(10) +
VALUE('WCH_SYSOPR')

/* soumission du WACH */

SBMJOB CMD(STRWCH SSNID(&SESS) WCHPGM(MON_SYSOPR) +
WCHMSG((*IMMED *NONE *MSGDTA *ALL *GE +
00)) WCHMSGQ((*SYSOPR))) JOB(&SESS) +
JOBD(INFOZEN) USER(INFOZEN) INLLIBL(*JOBD)

ENDPGM

Extrait du RPG ILE

H COPYRIGHT('(c) 2015, INFO''ZEN ')
H DFTACTGRP(*NO) ACTGRP(*NEW) BNDDIR('QC2LE')
F*------------------------------------------------------------*
F* *
F* Monitoring de la *SYSOPR *
F* *
F* *
F*------------------------------------------------------------*

FWchParam IF E K Disk

* Définition clé d'accès à WCHPARAM

D K_WchParam ds LikeRec( WchPgmF : *Key )
D ReturnMsgId S 7 Import('_EXCP_MSGID')
*
D W_MsgDtaPtr s *
*
D W_MsgDta ds 75 Based( W_MsgDtaPtr )
D UsrPrf 10 Overlay( W_MsgDta : 11 )
D Device 10 Overlay( W_MsgDta : 21 )
*
D W_Data ds 1000
D MsgId 7 Overlay( W_Data : 5 )
D MsgQName 10 Overlay( W_Data : 13 )
D MsgQLib 10 Overlay( W_Data : 23 )
D MsgKey 4 Overlay( W_Data : 387 )
D MsgF 10 Overlay( W_Data : 391 )
D OffRplDta 4B 0 Overlay( W_Data : 441 )
*
*//------------------------------------------------------------//
*// Réception des paramètres //
*//------------------------------------------------------------//
D main pi
D W_Type 10a Type message
D W_Session 10a Session
D W_Error 10a Erreur
D Data 1000a Données

c/free

If W_Type = '*MSGID';
W_Data = Data;

W_MsgDtaPtr = %addr(W_Data) + OffRplDta;


// Chargement de l'ID Message dans la clé

K_WchParam.WchCle = 'OPR' + %Trim( MsgId );
Chain %Kds( K_WchParam ) WchParam;

If %Found( WchParam );

ReturnMsgId = *Blanks;

QcmdExc( 'SNDRPY MSGKEY(' + MsgKey + ') MSGQ(' +
%Trim( MsgQlib ) + '/' + %Trim ( MsgQName ) + ') ' +
' RPY(' + %Trim( WchVal ) + ')' );

If ReturnMsgId <> *Blanks; // ça c'est mal passé !!!
EndIf;

Endif;



EndIf;

Return;

/end-free

En fait je n'ai pas de messages d'erreur, ni autre information. Lorsqu'un message arrive dans la QSYSOPR il ne se passe rien dans mon programme. Je ne filtre que quelques messages particuliers nécessitant une réponse, ces messages son paramétrés dans un fichier avec leur valeur de réponse.

Merci de votre aide

STRWCH

Posté : mer. 11 mars 2015, 17:21:12
par cmasse
J'ai fait un essai en partant de votre code (sans l'accès au fichier) , ça marche.

Maintenant avec WCHMSG=*IMMED, vous n'avez que les messages impromptus (ne venant pas d'un fichier message), donc sans doute pas les erreurs systèmes et sans doute pas de type question (donc pas de SNDRPY)

Posté : mer. 11 mars 2015, 22:43:52
par Alain MOIROUD
Je vous remercie pour votre réponse, en fait il faut mettre quoi alors au lie *IMMED, *EVTWCH ?

Nouvelle tentative

Posté : mer. 11 mars 2015, 23:08:18
par Alain MOIROUD
Bonsoir,

J'ai essayé de nouveau en modifiant les paramètre de lancement de la commande STWCH.
Sans plus de succès, il me semble que mon programme n'est jamais déclenché.
Je ne vois pas ou ça cloche :(

Posté : ven. 13 mars 2015, 22:54:30
par Alain MOIROUD
Bonjour,

J'ai modifié mon programme en enlevant l'appel au fichier, en lançant la commande STRWCH pour ne surveiller que le message CPA5305 Enregistrement non ajouté fichier plein qui nécessite une réponse, en l'occurrence 9999

Mon programme n'est jamais déclenché

Vous me dites avoir fait un essai avec mon code, sans l'appel au fichier (ce que je viens de faire) et que vos ç& marche, mais pas chez moi et je ne vois pas ou se situe le problème.

Avez-vous une manière particulière de lancer la commande STRWCH ?

Merci de votre aide

Posté : dim. 15 mars 2015, 13:45:48
par Philippe S
J'apporte ici mon grain de sel mais du genre un coup dans le noir.

Avez-vous regardé cette page sur la toile ?

Posté : dim. 15 mars 2015, 21:38:41
par Alain MOIROUD
Bonjour,

Je suis aller voir la page que vous indiquez, très bien commentée et qui situe exactement mon problèmes.
Malheureusement même après avoir fait les vérifications indiquées, malgré tout mon programme ne semble pas être appelé lors d'un évènement dans la QYSOPR.
Je re précise que je suis en V7R1 de l'OS et au dernier niveau CUM.
La question que je me pose : faut-il une clé de licence particulière ou du moins en vérifier certaines ?

Merci de votre aide

Posté : lun. 16 mars 2015, 00:59:02
par Alain MOIROUD
Bonjour à tous,
D'abord merci de votre aide
J'ai trouvé la solution à mon problème :

Ce n'est pas que mon programme ne soit pas appelé, en fait il l'est bien, c'est la commande de réponse au message qui ne fonctionne pas, en tous cas comme je l'ai écrite :

QcmdExc( 'SNDRPY MSGKEY(' + MsgKey + ') MSGQ(' +
%Trim( MsgQlib ) + '/' + %Trim ( MsgQName ) + ') ' +
' RPY(' + %Trim( WchVal ) + ')' );

J'ai remplacé par l'appel d'un CL de réponse :

*
D SndRpy pr extpgm('WCH004C')
D 4
D 10
D 10
D 30
*
Callp(e) SndRpy( MsgKey : MsgQName : MsgQLib : Rep );

LE CL de réponse :

Pgm Parm( &Msgkey &Msgqf &Msgql &Rep )

Dcl &Msgkey *Char 4
Dcl &Msgqf *Char 10
Dcl &Msgql *Char 10
Dcl &Rep *Char 30

/* Envoi reponse au message à *SYSOPR pour essai wach pgm */

SndRpy MsgKey( &MsgKey ) Msgq( &Msgql/&Msgqf ) Rpy( &Rep )


EndPgm


Et là ho merveille cela fonctionne.

Je cherche maintenant à comprendre pourquoi :

QcmdExc( 'SNDRPY MSGKEY(' + MsgKey + ') MSGQ(' +
%Trim( MsgQlib ) + '/' + %Trim ( MsgQName ) + ') ' +
' RPY(' + %Trim( WchVal ) + ')' );

Ne Fonctionne pas, en tous cas lorsque je met en commentaire l'appel du CL et que je réactive la commande ci-dessus cela ne fonctionne plus.
Je pense que cette commande doit échouée sur le message CPF2410 clé de message non trouvée. Mais ne sachant pas comment débuger un programme appelé en WATCH je n'en suis pas sur.
Je suis, pour ma curiosité, preneur de toutes suggestions.

Encore merci pour aide

Posté : lun. 16 mars 2015, 13:06:30
par Philippe S
Il faut déboguer le programme RPG.

Pour trouver le job associé au WATCH, faire WRKACTJOB JOB(NomSession) où NomSession est l'ID de session indiqué par la commande WRKWCH *STRWCH.

Ensuite, pour déboguer le programme, faire STRSRVJOB du job watch puis STRDBG du programme d'exit watch. Placer ensuite les points d'arrêt dans le programme par F6, sortir du programme et émettre un message pour le déclencher. Suivre ensuite le déroulement du programme pas à pas pour trouver l'erreur.

Ces informations étaient déjà indiquées sur la page web référencée dans mon message précédent...

Posté : lun. 16 mars 2015, 19:53:59
par Alain MOIROUD
En débugant mon programme, je me suis aperçu que :

QcmdExc( 'SNDRPY MSGKEY(' + MsgKey + ') MSGQ(' +
%Trim( MsgQlib ) + '/' + %Trim ( MsgQName ) + ') ' +
' RPY(' + %Trim( WchVal ) + ')' );

écrit de cette manière, renvoyait le message CPF0006, erreur dans la commande. Cela proviens du fait que la clé du message (MsgKey) est une valeur Hexadécimale et ne peut être transmise telle quelle dans ce cas là.

Pour solutionner le problème, j'ai trouvé une API équivalente à SNDRPY à qui on peut transmettre directement la valeur Hexa de MsgKey et là cela fonctionne parfaitement. Je peux maintenant intercepté et paramétré tous les messages de type *INQ avec leur valeur de réponse.

Ci-dessous le pgm RPG LE complet :

H COPYRIGHT('(c) 2015, INFO''ZEN ')
H DFTACTGRP(*NO) ACTGRP(*NEW) BNDDIR('QC2LE')
F*------------------------------------------------------------*
F* *
F* Monitoring de la *SYSOPR *
F* *
F* *
F*------------------------------------------------------------*

FWchParam IF E K Disk

* Définition clé d'accès à WCHPARAM

D K_WchParam ds LikeRec( WchPgmF : *Key )

*
D w_dated s 26Z
D w_datef s 26z
D w_result s 6s 0
D Rep s 30
D ReturnMsgId s 7 Import('_EXCP_MSGID')
D Q s 1 Inz('''')
D CmdExc s 32767 Varying
D PxMsgQue s 20a
D SnMsgQue s 20a
D MsgQName1 s 20a
D MsgType s 10a inz('*ANY')
D MsgTypCpy s 10a inz('*COPY')
D MsgLength s 10i 0 inz(0)
D MsgText s 512a inz(' ')
D MsgKey1 s 4a inz('*TOP')
D MsgKey2 s 4a inz(' ')
D CpyMsgKey s 4a inz(' ')
D WaitTime s 10i 0 inz(0)
D MsgAction s 10a inz('*SAME')
D MsgRmv s 10a inz('*NO')
*
D W_MsgDtaPtr s *
*
D W_MsgDta ds 75 Based( W_MsgDtaPtr )
D UsrPrf 10 Overlay( W_MsgDta : 11 )
D Device 10 Overlay( W_MsgDta : 21 )
*
D W_Data ds 1000
D MsgId 7 Overlay( W_Data : 5 )
D MsgQName 10 Overlay( W_Data : 13 )
D MsgQLib 10 Overlay( W_Data : 23 )
D MsgKey 4 Overlay( W_Data : 387 )
D MsgF 10 Overlay( W_Data : 391 )
D OffRplDta 4B 0 Overlay( W_Data : 441 )
*
D DS
D RplMsgKey 4a
D RplKeyBin 10u 0 overlay(RplMsgKey)
*
D ApiError Ds
D AeBytPrv 10i 0 Inz( %Size( ApiError ))
D AeBytAvl 10i 0
D AeExcpId 7a
D 1a
D AeExcpDta 1000a
*
* Procedure QCMDEXC
*
D QcmdExc pr 10i 0 extproc('system')
D command * value options(*string)
*
D SendRply Pr ExtPgm( 'QMHSNDRM' )
D RnMsgKey 4a Const
D RnMsgQName 20a Const
D RnRplTxt 32767a Const options(*varsize)
D RnRplLen 10i 0 Const
D RnRmvMsg 10a Const
D RnError 32767a Options( *VarSize )

D main pr extpgm('MON_SYSOPR') entry plist
D 10a
D 10a
D 10a
D 1000a
*
*//------------------------------------------------------------//
*// Réception des paramètres //
*//------------------------------------------------------------//
D main pi
D W_Type 10a Type message
D W_Session 10a Session
D W_Error 10a Erreur
D Data 1000a Données

c/free

If W_Type = '*MSGID';

W_Data = Data;

W_MsgDtaPtr = %addr(W_Data) + OffRplDta;

// Chargement de l'ID Message dans la clé

K_WchParam.WchCle = 'OPR' + %Trim( MsgId );
Chain %Kds( K_WchParam ) WchParam;

If %Found( WchParam );

ReturnMsgId = *Blanks;
RplMsgKey = MsgKey;
MsgQName1 = MsgQName + MsgQlib;
MsgText = %Trim( WchVal );
MsgLength = %Len( %Trim( WchVal ) );

SendRply(RplMsgKey :
MsgQName1 :
MsgText :
MsgLength :
MsgRmv :
Apierror );

If ReturnMsgId <> *Blanks; // ça c'est mal passé !!!

QcmdExc( 'SNDPGMMSG MSG(' + Q + ReturnMsgId +
' Erreur lors envoi reponse SNDRPY' + Q + ') ' +
' TOMSGQ(*SYSOPR)' );
EndIf;

Endif;

EndIf;

Return;

/end-free


Voilà et encore merci de votre aide

Posté : mar. 17 mars 2015, 12:40:30
par Philippe S
...Cela proviens du fait que la clé du message (MsgKey) est une valeur Hexadécimale et ne peut être transmise telle quelle dans ce cas là.

Non. Il y a probablement une erreur dans le formatage de la commande mais ce n'est pas à cause de cela. Dans la mesure où la variable MsgKey est correctement définie, qu'elle le soit dans un DS ou dans une définition isolée, cela ne change rien à l'affaire. Cependant, c'est bien mieux et plus pro d'avoir remplacé qcmdexc par une API et, personnellement, tant que j'y étais, j'en aurais profité pour changer l'envoi du message d'erreur avec qcmdexc par l'API QMHSNDM.

Posté : mar. 17 mars 2015, 14:03:58
par Alain MOIROUD
Bonjour,

C'est vrai que l'utilisation d'api est plus appropriée, vous avez raison à propos de l'envoi du message par QcmdExc je vais remplacer par l'api QMHSNDM

Merci pour vos réponses et l'aide apportée.

Ce monitoring va m'être d'une grande utilité dans l'exploitation quotidienne chez certains clients qui n'ont pas forcément de service informatique ni même d'informaticien à demeure.

Merci à vous tous

Posté : mer. 18 mars 2015, 09:47:15
par germor
Bonjour,
et merci pour vos explications.