Watch programme RPG ILE

RPG (3 et 4, free), CL, SQL, etc...
Alain MOIROUD
Messages : 20
Enregistré le : mer. 18 févr. 2015, 20:41:00

Watch programme RPG ILE

Message 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

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

manque d'informations

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

Alain MOIROUD
Messages : 20
Enregistré le : mer. 18 févr. 2015, 20:41:00

(sujet non précisé)

Message 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

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

STRWCH

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

Alain MOIROUD
Messages : 20
Enregistré le : mer. 18 févr. 2015, 20:41:00

Message par Alain MOIROUD »

Je vous remercie pour votre réponse, en fait il faut mettre quoi alors au lie *IMMED, *EVTWCH ?

Alain MOIROUD
Messages : 20
Enregistré le : mer. 18 févr. 2015, 20:41:00

Nouvelle tentative

Message 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 :(

Alain MOIROUD
Messages : 20
Enregistré le : mer. 18 févr. 2015, 20:41:00

Message 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

Philippe S
Messages : 11
Enregistré le : lun. 02 févr. 2015, 19:46:00

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

Alain MOIROUD
Messages : 20
Enregistré le : mer. 18 févr. 2015, 20:41:00

Message 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

Alain MOIROUD
Messages : 20
Enregistré le : mer. 18 févr. 2015, 20:41:00

Message 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

Philippe S
Messages : 11
Enregistré le : lun. 02 févr. 2015, 19:46:00

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

Alain MOIROUD
Messages : 20
Enregistré le : mer. 18 févr. 2015, 20:41:00

Message 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

Philippe S
Messages : 11
Enregistré le : lun. 02 févr. 2015, 19:46:00

Message 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.
Modifié en dernier par Philippe S le mar. 17 mars 2015, 14:21:01, modifié 1 fois.

Alain MOIROUD
Messages : 20
Enregistré le : mer. 18 févr. 2015, 20:41:00

Message 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

germor
Messages : 75
Enregistré le : lun. 06 juin 2011, 08:01:43

Message par germor »

Bonjour,
et merci pour vos explications.
Modifié en dernier par germor le mer. 01 juil. 2015, 10:38:28, modifié 2 fois.

Répondre