PDA

View Full Version : Dateigröße ermitteln und anzeigen



Bratmaxxe
03-01-07, 13:37
Frohes Neues liebe RLP-Gemeinde !

Eine Dateigröße über API zu ermitteln ist nicht das Thema, sondern eher die Anzeige per 'QMHSNDPM'.

PGM-Ablauf ist folgender:

CMD 'DSPFSIZ' aufrufen, File und zugehörige Libl angeben.

Diese beiden Parameter werden an ein CLLE übergeben




/*------------------------------------------------------------------*
PGM PARM(&FIL &LIBL)

DCL VAR(&FIL) TYPE(*CHAR) LEN(10)
DCL VAR(&LIBL) TYPE(*CHAR) LEN(10)

/* Programm zur Anzeige aufrufen */
CALL PGM(WI567) PARM(&FIL &LIBL)

ENDE: ENDPGM



Leider funktioniert dann die Anzeige per QMHSNDPM nicht...

Rufe ich WI567 mit 2 Parametern ohne zwischengeschaltetes CL auf, funktionierts... wo liegt der Fehlerteufel begraben ?



D P_MsgID S 7 INZ('CPF9897')
D P_MsgFile S 20 INZ('QCPFMSG *LIBL')
D P_MsgData S 80
D P_MsgKey S 4
D P_MsgType S 10 INZ('*INFO')
D P_PgmQueue S 10 INZ('*CTLBDY')
D P_PgmStack S 10I 0 INZ(1)
D P_DataLength S 10I 0


C CALL (E) 'QMHSNDPM'
C PARM P_MsgID
C PARM P_MsgFile
C PARM P_MsgData
C PARM P_DataLength
C PARM P_MsgType
C PARM P_PgmQueue
C PARM P_PgmStack
C PARM P_MsgKey
C PARM P_Error


Gruß
Bratmaxxe

Fuerchau
03-01-07, 13:44
Betrachte den Eintrag P_PgmStack, an welche Ebene du sendest !
Wenn du die ja nach Aufruf nicht anpasst ....

Bratmaxxe
03-01-07, 14:02
Betrachte den Eintrag P_PgmStack, an welche Ebene du sendest !
Wenn du die ja nach Aufruf nicht anpasst ....

Danke Fuerchau,

der Wert P_PgmStack steht derzeit fest auf 1...

Habe mir den Aufrufstapel angesehen, welcher wie folgt aussieht:

DSPFSIZCL -> Befehlsverarbeitendes CL




Programm
Rqs oder
Lvl Prozedur Bibliothek Anweisung Instruktio
GRPPGM PGM 7200 006B
QCMDEXC QSYS 0129
1 QPGMMENU QSYS 03A3
QUOCPP QPDA 0776
QUOMAIN QPDA 00FD
2 QUOCMD QSYS 01E1
_CL_PEP PGM
DSPFSIZCL PGM 0000002400
< _PEP_WI567 PGM
WI567 PGM 0000000462
QTEVIREF QSYS 046B



Habe mittlerweile die Werte 0, 1 und 2 ausgetestet, aber nichts funktioniert...

Bewege ich mich auf dem Holzweg ?

Gruß
Bratmaxxe

Fuerchau
03-01-07, 15:09
Schau dir nochmal genau die Parameter PgmQueue und Stack an:
http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/apis/QMHSNDPM.htm?resultof=%22%71%6d%68%73%6e%64%70%6d% 22%20

Bei ILE ist das leider etwas schwieriger, das Ziel zu identifizieren.

BenderD
03-01-07, 16:04
Hallo,

bei ILE ist zuweilen *PGMBDY statt *CTLBDY commoder

mfg

Dieter Bender


Schau dir nochmal genau die Parameter PgmQueue und Stack an:
http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/apis/QMHSNDPM.htm?resultof=%22%71%6d%68%73%6e%64%70%6d% 22%20

Bei ILE ist das leider etwas schwieriger, das Ziel zu identifizieren.

Frank Hildebrandt
03-01-07, 16:30
Versuch mal den hier.




h DftActGrp(*NO)
*
* Prozedurenprototyp für Prozedur 'QMHSNDPM'
*
dQMHSNDPM PR ExtPgm('QMHSNDPM')
d 7A Const --> Message identifier
d 20A Const --> Qualified message file name
d 32767A Const Options(*VarSize) --> Message data
d 10I 0 Const --> Length of message data
d 10A Const --> Message type
d 256A Const --> Call stack entry
d 10I 0 Const --> Call stack counter
d 4A <-- Message key
d 32767A Options(*VarSize) <-> Error code
d 10I 0 Const Options(*NoPass) --> Length of call stack entry
d 20A Const Options(*NoPass) --> Call stack entry qualification
d 10I 0 Const Options(*NoPass) --> Display program messages SWT
d 10A Const Options(*NoPass) --> Call stack entry data type
d 10I 0 Const Options(*NoPass) --> Coded character set identifier
*
* Datenstruktur für Format 'ERRC0100' für Fehlercode
*
dERRC0100 DS
d ERRCBytePrv 10I 0 Inz(272) --> Bytes provided
d ERRCByteAvl 10I 0 <-- Bytes available
d ERRCExcId 7A <-- Exeption-Id.
d ERRCRsrvd 1A <-- Reserved
d ERRCExcDta 256A <-- Exeption data
*
* Sonstige Felddeklarationen
*
dITMsgKey S 4A Nachrichtenschlüssel
*
* Nachricht in die Programmnachrichtenwarteschlange senden
*
c Reset ERRC0100
c CallP QMHSNDPM('CPF9897' : --> Message identifier
c 'QCPFMSG *LIBL' : --> Qualified message file name
c 'Hello World' : --> Message data
c 11 : --> Length of message data
c '*INFO' : --> Message type
c '*' : --> Call stack entry
c 2 : --> Call stack counter
c ITMsgKey : <-- Message key
c ERRC0100 : <-> Error code
c 1 : --> Length of call stack entry
c '*NONE *NONE' : --> Call stack entry qualification
c 0)
*
* Programmende
*
c Eval *INLR = *On

Bratmaxxe
04-01-07, 06:59
vielen Dank für Eure Hilfe,

- leider bringt *PGMBDY nichts

- auch mit der Prozedur von Frank gab's kein Erfolg...



- muss man vielleicht was in der Aktivierungsgruppe einstellen (ACTGROUP *NEW ...) ?

....

anbei die komplette Source:




H DECEDIT('0,') DATEDIT(*DMY.)
H DFTACTGRP(*NO) OPTION(*NODEBUGIO)
H* ************************************************** *************
*
//-----------------------------------
// Prototypenbeschreibung für Module
// und Serviceprogramme einbinden
//-----------------------------------
D/COPY QSYSINC/QRPGLESRC,QUSROBJD
*
//-----------------------------------------
// Prozeduren für Exterene Programmaufrufe
//-----------------------------------------
D USROBJD PR EXTPGM('QUSROBJD')
D R_RTN 527A
D R_LEN 4B 0
D R_FMT 8A
D R_OBJ 20A
D R_OBJT 10A
*
//-----------------------------------------
// übersicht interne Prozeduren/Funktionen
//-----------------------------------------
D GET_SIZE PR
D V_OBJ 10A VALUE
D V_LIBL 10A VALUE
D V_SIZE 9S 0 OPTIONS(*NOPASS)
D V_OK N OPTIONS(*NOPASS)
*
* Prozedurenprototyp für Prozedur 'QMHSNDPM'
*
dQMHSNDPM PR ExtPgm('QMHSNDPM')
d 7A Const
d 20A Const
d 32767A Const Options(*VarSize)
d 10I 0 Const
d 10A Const
d 256A Const
d 10I 0 Const
d 4A
d 32767A Options(*VarSize)
d 10I 0 Const Options(*NoPass)
d 20A Const Options(*NoPass)
d 10I 0 Const Options(*NoPass)
d 10A Const Options(*NoPass)
d 10I 0 Const Options(*NoPass)
*
* Datenstruktur für Format 'ERRC0100' für Fehlercode
*
dERRC0100 DS
d ERRCBytePrv 10I 0 Inz(272)
d ERRCByteAvl 10I 0
d ERRCExcId 7A
d ERRCRsrvd 1A
d ERRCExcDta 256A
*
//------------------------------------------
// Variablendeklaration
//------------------------------------------
*
D OK S N Inz(*Off)
d ITMsgKey S 4A
D P_MsgData S 32767A
D P_DataLength S 10I 0
D SIZE S 9S 0
*
‚*-------------------------------------------------------------------
‚* PARAMETER
‚*-------------------------------------------------------------------
C *ENTRY PLIST
C PARM PAFILE 10
C PARM PALIBL 10
*
C*‚*********************************************** *********************
C*š* MAIN-PROGRAM *
C*‚*********************************************** *********************
*
* // Größe der Datei ermitteln
C CALLP(E) GET_SIZE(PAFILE:PALIBL:SIZE:OK)
*
C EXSR SND_MSG
*
*š // Programmende einleiten
C MOVE *ON *INLR
C*
*================================================= ====================
*= SND_MSG - Nachricht in die Messagesubfile schreiben
*================================================= ====================
C SND_MSG BEGSR
*
* // Vorhergehende Verarbeitung ok ?
C IF OK
C EVAL P_MsgData = 'Datei: ' + %TRIM(PAFILE) +
C ' - Größe: ' +
C %TRIM(%EDITC(SIZE:'K')) + ' Byte'
C ELSE
C EVAL P_MsgData = 'Datei wurde nicht gefunden...'
C ENDIF
*
C EVAL P_DataLength = %SIZE(P_MsgData)
*
* //Nachricht in die Messagesubfile senden
c Reset ERRC0100
c CallP QMHSNDPM('CPF9897' :
c 'QCPFMSG *LIBL' :
c P_MsgData :
c P_DataLength :
c '*INFO' :
c '*' :
c 2 :
c ITMsgKey :
c ERRC0100 :
c 1 :
c '*NONE *NONE' :
c 0)
*
C ENDSR
*
//--------------------------------------------------------------------
// Funktion GET_SIZE : Dateigröße ermitteln
//--------------------------------------------------------------------
P GET_SIZE B
D GET_SIZE PI
D V_OBJ 10A VALUE
D V_LIBL 10A VALUE
D V_SIZE 9S 0 OPTIONS(*NOPASS)
D V_OK N OPTIONS(*NOPASS)
//------------------
// Lokale Variablen
//------------------
D L_LEN S 4B 0 INZ
D L_FMT S 8A INZ
D L_OBJ S 20A INZ
D L_OBJT S 10A INZ
D L_TEST S 527A INZ
//--------------------------------------------------------------------
C CLEAR QUSD0400
*
C IF V_LIBL = *BLANKS
C EVAL L_OBJ = V_OBJ + '*LIBL'
C ELSE
C EVAL L_OBJ = V_OBJ + '' + %TRIM(V_LIBL)
C ENDIF
*
C EVAL L_OBJT = '*FILE'
C EVAL L_LEN = %SIZE(QUSD0400)
C EVAL L_FMT = 'OBJD0400'
C CALLP(E) USROBJD(L_TEST:L_LEN:L_FMT:L_OBJ:L_OBJT)
C EVAL QUSD0400 = L_TEST
C IF NOT %ERROR()
C EVAL V_SIZE = QUSOBJS00
C EVAL V_OK = *ON
C ELSE
C EVAL V_OK = *OFF
C ENDIF
*
C RETURN
*
//--------------------------------------------------------------------
P GET_SIZE E



Gruß
Bratmaxxe

Frank Hildebrandt
04-01-07, 08:22
Ich gehe jetzt mal von folgendem Fall bei Dir aus. Der Befehl ruft ein ILE-CL auf. Das ILE-CL ruft dann das ILE-RPG auf. Die Nachricht soll dann in der Nachrichtenzeile angezeigt werden, von wo aus der Befehl aufgerufen wird. Dann musst Du den Parameter 'Call stack counter' auf 4 setzen. Wenn der Wert auf 0 steht, dann wird die Nachricht in die Nachrichtenwarteschlange des ILE-RPG gesendet. Wenn der Wert auf 1 steht, dann wird die Nachricht in die Nachrichtenwarteschlange der Program-Entry-Prozedure des ILE-RPG gesendet. Wenn der Wert auf 2 steht, dann wird die Nachricht in die Nachrichtenwarteschlange des ILE-CL gesendet. Wenn der Wert auf 3 steht, dann wird die Nachricht in die Nachrichtenwarteschlange der Program-Entry-Prozedure des ILE-CL gesendet. Wenn der Wert auf 4 steht, dann wird die Nachricht in die Nachrichtenwarteschlange des Programms gesendet, welches den Befehl abgesetzt hat.

Bratmaxxe
04-01-07, 08:25
Da lag der Hund begraben ;) *lach*

Wert 4 für StackEntry....

Lieben Dank nochmal Frank !!!

Gruß
Bratmaxxe


Ich gehe jetzt mal von folgendem Fall bei Dir aus. Der Befehl ruft ein ILE-CL auf. Das ILE-CL ruft dann das ILE-RPG auf. Die Nachricht soll dann in der Nachrichtenzeile angezeigt werden, von wo aus der Befehl aufgerufen wird. Dann musst Du den Parameter 'Call stack counter' auf 4 setzen. Wenn der Wert auf 0 steht, dann wird die Nachricht in die Nachrichtenwarteschlange des ILE-RPG gesendet. Wenn der Wert auf 1 steht, dann wird die Nachricht in die Nachrichtenwarteschlange der Program-Entry-Prozedure des ILE-RPG gesendet. Wenn der Wert auf 2 steht, dann wird die Nachricht in die Nachrichtenwarteschlange des ILE-CL gesendet. Wenn der Wert auf 3 steht, dann wird die Nachricht in die Nachrichtenwarteschlange der Program-Entry-Prozedure des ILE-CL gesendet. Wenn der Wert auf 4 steht, dann wird die Nachricht in die Nachrichtenwarteschlange des Programms gesendet, welches den Befehl abgesetzt hat.

DVE
08-01-07, 09:50
@bratmaxxe
Warum so "umständlich" als RPGLE und nicht als CLP ?
Also RTVOBJD und anschließend SNDPGMMSG ??

Gruß
DVE