PDA

View Full Version : RCVMSG nach QCMDEXC



flytokiwi
29-03-06, 09:45
Hallo Forum,

ich stehe mal wieder auf dem Schlauch. Ich habe folgendes Problem: In einem CLLE rufe ich per CALL ein RPGLE auf. In diesem wird mit CALL ein QCMDEXC aufgerufen, welchen ich über eine Bezugszahl abfange. Einen eventl. Abbruch des QCMDEXC gebe ich über einen Parameter an mein CLLE zurück. In diesem möchte ich nun mit RCVMSG die Meldung des Abbruchs ermitteln. Wie komme ich den da dran? Die Nachricht wurde ja an die Nachrichtenwarteschlange des RPGLE gesendet.

Gruss
Ralph

Frank Hildebrandt
29-03-06, 10:31
Anstatt das Programm "QCMDEXC" rufst Du das nachfolgende Programm 'CMD' auf. Wenn der Befehl
nicht ausgeführt werden konnte, dann bekommst Du im zweiten Parameter die
Nachrichten-Id. zurück.



h DftActGrp(*NO) ActGrp(*CALLER) BndDir('QC2LE')
*
*-------------------------------------------------------------------------------------------*
*
* Prozedurenprototyp für Prozedur 'CMD'
*
dCMD PR
d 1024A Const --> Befehl
d 7A <-- Nachrichten-Id.
*
* Prozedurenschnittstelle für Prozedur 'CMD'
*
dCMD PI
d PICmd 1024A Const --> Befehl
d PIMsgId 7A <-- Nachrichten-Id.
*
*-------------------------------------------------------------------------------------------*
*
* Prozedurenprototyp für Prozedur 'system'
*
dsystem PR 10I 0 EXTPROC('system')
d * Value Options(*String)
*
* Nachrichten-Id.
*
dMsgId S 7A Import('_EXCP_MSGID')
*
*-------------------------------------------------------------------------------------------*
*
* Befehl ausführen
c If system(PICmd) > 0
* Fehler aufgetreten
c Eval PIMsgId = MsgId
c Else
* Kein Fehler aufgetreten
c Eval PIMsgId = *Blanks
c EndIf
* Programmende
c Eval *INLR = *On

B.Hauser
29-03-06, 12:38
Hallo,

ich würde entweder über API QMHSNDMG eine Escape-Message aus dem RPG-Programm an das CL senden.

Die evt. einfachere Möglichkeit wäre den Nachrichten-Text als Ausgabe-Parameter an das CL ausgeben. Der aufbereitete Nachrichten-Text (80 Stellen) kann aus der Programm-Status-Datenstruktur (Stelle 91-170) entnommen werden.

Beispiel:


D QCMDEXC PR extpgm('QCMDEXC')
D P$CLCmd 32702 const options(*VarSize)
D P$CLCmdLen 15P 5 const

D MYRPGPGM PI extpgm('MYRPGPGM')
D P$MsgTxt 100A

D P$Cmd S 100A

D PGMSDS SDS
D SDSMsgId 40 46
D SDSMsgTxt 91 170
*-------------------------------------------------------
/Free
Monitor;
clear P$MsgTxt;
P$Cmd = 'Was auch immer';
QCmdExc(P$Cmd: %Len(P$cmd));
On-Error;
P$MsgTxt = SDSMsgTxt;
EndMon;

*INLR = *On;
/End-Free

Die Verwendung des QCMDEXC hat gegenüber dem system den Vorteil, dass der komplette Message-Text (incl. den variablen Texten) ausgebeben wird. Mit system kann lediglich die Message-Id ermittelt werden.
Birgitta

flytokiwi
29-03-06, 13:49
Danke für die Antworten,

ich denke ich mache es so wie Birgitta, da ich den Text benötige.