Anmelden

View Full Version : CL: Kann man Status eines Jobs abfragen?



Seiten : 1 2 [3]

Bodo Roggenkamp
24-01-03, 10:03
Hallo Rolf,

so ist es. Das es möglich ist, habe ich ja bereits geantwortet. Trotzdem wird von einigen das Gegenteil behauptet. Warum nur? Weil sie es nicht besser wissen?
Wenn in einigen Beiträgen behauptet wird, im CL kann eine Datei mehrfach ausgelesen werden, dann muss man doch davon ausgehen, das dem so ist und die Leute auch schon damit gearbeitet haben. Und doch wird stur etwas anderes behauptet.
Schon merkwürdig...

Gruss
Bodo

schreibr
24-01-03, 10:34
Vielleicht liegt es aber auch am fehlenden Verständnis, dass hier unterschiedliche Meinungen herrschen.
Das Lesen einer Datei im CL läuft mit RCVF. Um das Dateiende festzustellen wird auf MONMSG MSGID(CPF0864) abgefragt. Wenn diese MONMSG im CL erreicht wird, ist es definitiv nicht mehr möglich mit POSDBF OPNID(Datei) POSITION(*START) die Datei erneut zu lesen, da durch den letzten RCVF bereits der Dateizeiger im "Nirwana" steht.
Mit einem kleinen Trick kann man dies jedoch umgehen. Vor dem RCVF mit RTVMBRD FILE(Datei) NBRCURRCD(Variable) holt man sich die aktuelle Satzanzahl der zu lesenden Datei. In der RCVF-Schleife einen Zähler+1 mitlaufen lassen. VOR jedem erneutem RCVF den Zähler mit der NBRCURRCD(Variable) vergleichen - sind beide Werte identisch den POSDBF absetzen und der nächste RCVF führt nicht zur MONMSG(CPF0864) und damit geht der Dateizeiger nicht ins "Nirwana".

Gruss Reinhold

hs
24-01-03, 10:54
Also nochmals vielen Dank an alle, die mir bei der Erstellung des CL geholfen haben

Ich versuche die Diskussion jetzt mal abzuschliessen.

Das CL funktioniert mittlerweile einwandfrei, habe auch noch ein paar Finessen eingebaut.

Ich hatte beim testen nämlich festgestellt, dass der Job - wenn er läuft - nicht immer nur den Status RUN hat, sondern auch z.B. LCKW, wenn er auf eine Sperre wartet.

Deshalb habe ich noch eingebaut, dass das CL solange wartet, bis der Job einen bestimmten Status angenommen hat, z.B. DLYW.

Hier das fertige CL:

PGM PARM(&JOBNAME &SBSNAME &BEDINGUNG &JOBSTAT &WARTEZEIT)
/************************************************** *************************/
/* */
/* DIE PROZEDUR WARTET SOLANGE, BIS DER ÜBERGEBENE JOB EINEN */
/* BESTIMMTEN STATUS HAT BZW. NICHT MEHR HAT */
/* DANN WIRD DAS CL BEENDET. */
/* */
/* PARAMETER: */
/* - JOBNAME : WELCHER JOB SOLL GEPRÜFT WERDEN */
/* - SBSNAME : IN WELCHEM SUBSYSTEM */
/* - BEDINGUNG: EQ: CL WARTET SOLANGE, WIE JOB DIESEN STATUS HAT */
/* NE: CL WARTET SOLANGE, BIS JOB ANDEREN STATUS HAT */
/* - JOBSTAT : DER JOBSTATUS, DER ABGEPRFT WERDEN SOLL */
/* - WARTEZEIT: SOLANGE WARTEN BIS ERNEUTE PRÜFUNG ERFOLGT */
/************************************************** *************************/
/* VARIABLEN*/
DCL VAR(&DRUCKER) TYPE(*CHAR) LEN(10)
DCL VAR(&STATUS) TYPE(*CHAR) LEN(10)
DCL VAR(&WARTEN) TYPE(*DEC)
DCL VAR(&JOB) TYPE(*CHAR) LEN(10)
DCL VAR(&JOBNAME) TYPE(*CHAR) LEN(10)
DCL VAR(&SBSNAME) TYPE(*CHAR) LEN(10)
DCL VAR(&JOBSTAT) TYPE(*CHAR) LEN(5)
DCL VAR(&BEDINGUNG) TYPE(*CHAR) LEN(2)
DCL VAR(&WARTEZEIT) TYPE(*DEC)
DCLF FILE(QTEMP/WAOUTPUT)
/* AB HIER VERARBEITUNG */
CRTPF FILE(QTEMP/WAOUTPUT) RCDLEN(150)
RTVJOBA PRTDEV(&DRUCKER)
START: CHGJOB PRTDEV(OHNE) /* SOLL NICHT GEDRUCKT WERDEN */
WRKACTJOB OUTPUT(*PRINT) SBS(&SBSNAME)
CHGJOB PRTDEV(&DRUCKER)
CPYSPLF FILE(QPDSPAJB) TOFILE(QTEMP/WAOUTPUT) JOB(*) +
SPLNBR(*LAST)
DLTSPLF FILE(QPDSPAJB) JOB(*) SPLNBR(*LAST)
CHGVAR VAR(&WARTEN) VALUE(0) /* STARTWERT */
/* JETZT LESEN BIS DATEIENDE UND JOB SUCHEN */
READ: RCVF /* SATZ LESEN*/
MONMSG MSGID(CPF0864) EXEC(GOTO WEITER)
/*VERLASSEN, WENN DATEIENDE ERRREICHT*/
CHGVAR VAR(&JOB) VALUE(%SST(&WAOUTPUT 4 10))
CHGVAR VAR(&STATUS) VALUE(%SST(&WAOUTPUT 111 4))
/* HANDELT ES SICH UM DEN GESUCHTEN JOB? */
IF COND(&JOB *EQ &JOBNAME) THEN(DO)
/* JETZT JE NACH BEDINGUNG DEN JOBSTATUS PRÜFEN */
IF COND(&BEDINGUNG *EQ 'EQ' *AND &STATUS *EQ &JOBSTAT) +
THEN(CHGVAR VAR(&WARTEN) VALUE(1))
IF COND(&BEDINGUNG *NE 'EQ' *AND &STATUS *NE &JOBSTAT) +
THEN(CHGVAR VAR(&WARTEN) VALUE(1))
ENDDO
GOTO READ /* NÄCHSTEN SATZ LESEN */
/* WURDE DER JOB MIT ENTSPRECHENDEM STATUS GEFUNDEN ? */
WEITER: IF COND(&WARTEN = 1) THEN(DO)
CLRPFM FILE(QTEMP/WAOUTPUT)
DLYJOB DLY(&WARTEZEIT)
GOTO START /* WIEDER VON VORN BEGINNEN */
ENDDO
ENDE:
DLTF FILE(QTEMP/WAOUTPUT)
ENDPGM

Fuerchau
24-01-03, 10:59
Also:
OPNDBF eröffnet zwar eine Datei, aber nicht für das CLP !
Zusätzlich ist nämlich ein OVRDBF ... SHARE(*YES) erforderlich (bzw. CHGPF/LF ... SHARE(*YES)), damit beim Open (RPG/COBOL/...) die GLEICHE Datei noch einmal eröffnet wird.
Dies kann mann mittels DSPJOB, Auswahl 14 nämlich sehr schön sehen, dass die Datei dann ggf. 2 Mal eröffnet ist!

Unabhängig von OPNDBF, CL eröffnet die Datei mit einem eigenen ODP als INPUT !
D.h., POSDBF funktioniert nicht, da CL ja diese Datei gar nicht eröffnet.

Auch nach intensivem Test (V4R5, V5R1) konnte ich in einem CLP eine Datei NICHT 2 Mal lesen, beim 2.Versuch wurde sofort CPF0864 gemeldet und es wurde KEIN Satz verarbeitet.

Wenn man einen RCVF absetzt und die Datei nicht vorhanden ist, wird CPF4101 gemeldet (Datei nicht gefunden), ist die Datei beim 2. Durchlauf nicht vorhanden, wird aber CPF0864 gemeldet, als ob ich die Datei verarbeitet hätte !!!

@hs

Debugge mal dein Programm, ob du wirklich die Datei 2 Mal liest, laut CL-Definition ist dies WIRKLICH nicht möglich und ich habe es einfach nicht geschafft !!!

Und was den TFRCTL betrifft, hast du natürlich recht, dass ich die Datei bis zum Ende lesen muss, wenn ich sie löschen will.
Der TFRCTL schließt aber die Datei auch, wenn ich nicht bis zum Ende gelesen habe.
Ich kann also die Datei z.B. am Anfang des Programmes mittels DLTF und MONMSG löschen, falls sie existieren sollte.

@rolf

Die Befehle OPNDBF/CLOF/POSDBF wirken nur auf HLL-Programme, also RPG/COBOL usw.
Ein CLP ignoriert sogar SHARE(*YES) und eröffnet die Datei immer INPUT !
Ein mehrfaches Lesen ist definitiv NICHT möglich !

hs
30-01-03, 15:23
Hallo fuerchau,

hast Recht gehabt, der Jobstatus wurde tatsächlich nur einmal geprüft.

Habe den GOTO durch einen TFRCTL ersetzt, dann funktionierts, weil die Datei ja im CL dann nur einmal gelesen werden muss.

Gruß und nochmals Danke
HS