View Full Version : CL: Kann man Status eines Jobs abfragen?
Bodo Roggenkamp
22-01-03, 13:49
Hallo,
nur noch als Anmerkung. Es ist sehr wohl möglich innerhalb eines CL-Programmes eine Datei mehrfach auszulesen, indem man die Datei im Programm schliesst, öffnet u. anschließend positioniert.
Gruss
Bodo
Erstmal Danke für all eure Antworten.
Im Einzelnen:
@Robert:
Der Übersichtlichkeit halber würde ich gerne alles in einem CL erschlagen.
@Fuerchau:
Der Job wird nur einmal am Tag aufgerufen, wenn (fast) niemand mehr arbeitet. Die Ausgabe von WRKACTJOB kann ich auch auf ein Subsystem einschränken (Parameter SBS).
Deshalb habe ich mit dem CL keine Not und möchte mich nicht mit APIs beschäftigen (zumal ich relativ selten in der AS400 programmiere)
@Bodo:
Meine Frage war ja genau, wie ich die Datei schliessen muß! Mir fehlt der Befehl.
Gruß
HS
In CL gibt es leider keinen CLOSE !
Die einzige Möglichkeit ist das Beenden des CL's.
Hierzu gibt es 2 Möglichkeiten:
1. ENDPGM/RETURN
2. TFRCTL
Zu 1: Dies ist sichherlich nicht gewünscht, aber man kann ja obigen Vorschlag aufnehmen, d.h., die Abfrage der Spoolfile in einem Unterprogramm durchzuführen. Wenn das Unterprogramm beendet wird, wird auch die Datei geschlossen.
zu 2: TFRCTL entspricht im wesentlichen dem CALL-Befehl, was aber das Beenden des eigenen Programmes zur Folge hat, d.h., die Datei wird geschlossen !
Warum kannst du TFRCTL nicht verwenden ?
Nochmals vielen Dank für eure Unterstützung.
Ich habe herausgefunden, dass die Datei Offensichtlich automatisch geschlossen wird, wenn ich über den letzten Satz hinauslese.
Deshalb kann ich jetzt alles in einem CL erschlagen:
PGM
/* VARIABLEN*/
DCL VAR(&JOBNR) TYPE(*CHAR) LEN(10)
DCL VAR(&JOB) TYPE(*CHAR) LEN(10)
DCL VAR(&STATUS) TYPE(*CHAR) LEN(10)
DCL VAR(&WARTEN) TYPE(*DEC)
DCLF FILE(QTEMP/WAOUTPUT)
/* FESTSTELLEN, OB der JOB LÄUFT */
START: RTVJOBA JOB(&JOB) NBR(&JOBNR) PRTDEV(&DRUCKER)
WRKACTJOB OUTPUT(*PRINT) SBS(MEINSBS)
CRTPF FILE(QTEMP/WAOUTPUT) RCDLEN(150)
CPYSPLF FILE(QPDSPAJB) TOFILE(QTEMP/WAOUTPUT) +
JOB(&JOBNR/*N/&JOB) SPLNBR(*LAST)
DLTSPLF FILE(QPDSPAJB) JOB(&JOBNR/*N/&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 ENDE)
/*VERLASSEN, WENN DATEIENDE ERRREICHT*/
CHGVAR VAR(&JOB) VALUE(%SST(&WAOUTPUT 4 10))
CHGVAR VAR(&STATUS) VALUE(%SST(&WAOUTPUT 111 3))
IF COND(&JOB = 'MEINJOB' *AND &STATUS = +
'RUN') THEN(CHGVAR VAR(&WARTEN) VALUE(1))
GOTO READ /* NÄCHSTEN SATZ LESEN */
/* WURDE DER JOB MIT STATUS RUN GEFUNDEN ? */
ENDE: DLTF FILE(QTEMP/WAOUTPUT)
IF COND(&WARTEN = 1) THEN(DO)
DLYJOB DLY(60)
GOTO START
ENDDO
ENDPGM
Gruß
HS
[Dieser Beitrag wurde von hs am 23. Januar 2003 editiert.]
Statt GOTO START hätte man auch einen erneuten CALL auf das Programm machen und das laufende Programm beenden können.
Bei dieser Lösung ist auch ganz sicher, dass die Datei geschlossen wurde und von vorne verarbeitet wird.
Birgitta
Bodo Roggenkamp
23-01-03, 09:07
Hallo Hs,
nun warst Du etwas schneller. Wollte Dir gerade anbieten, Dir via Mail ein Test_CL_PGM zu schicken. Es ist sehr wohl möglich, eine permanent existierende Datei innerhalb eines CL's auszulesen und vor dem EOF die Datenbankdatei erneut auf den Anfang der Datei zu positionieren. Wenn noch Bedarf besteht, E-Mail bekannt geben.
Gruss
Bodo
hallo hs,
da die arbeitsdatei sowieso in der qtemp steht, würde ich der crtpf vorverlegen und anstelle des dltpf würde ich ein clrpfm ensetzen (os400 braucht dann nicht schon wieder tabellen verwalten)
Es ist leider nicht sichergestellt, dass die Datei nach einem CPF0864 beim RCVF tatsächlich geschlossen ist !
Beim nächsten Release oder PTF kann dieser "Fehler" behoben sein, da in CL definiert ist, dass eine Datei nur 1 Mal verarbeitet werden kann !
Warum kannst du dann nicht nach dem DLYJOB einen TFRCTL verwenden ?
Anmerkung: Das Abfragen des eigenen Jobs ist nicht nötig, da beim CPYSPLF ... JOB(*) immer der eigene Job gemeint ist.
Ich habe es versucht mit TFRCTL.
Ging aber nicht, da die Datei in der QTEMP nicht gelöscht wurde.
Und löschen kann ich sie ja im CL nicht, da sie noch in Benutzung durch den RCFT ist, wenn ich nicht bis über den letzten Satz lese.
Eventuell ist dieser Fehler erst in neueren Releases, bei unserem 3.7 jedenfalls scheint es zu funktionieren.
Und auf PTF brauche ich wohl auch nicht mehr zu hoffen :-)
Gruß
HS
Hallo zusammen.
Also im CL gibt es sehr wohl den Befehl Close um eine Datenbankdatei zu schliessen.
Der Befehl zum Schliessen heisst "CLOF" und der zum Oeffnen "OPNDBF".
Wenn ich eine geöffnete Datei neu positionieren will, gibt es den Befehl "POSDBF".
Ich brauche also kein TFRCTL oder anderes.
Gruss
Rolf