-
Kopien von neuen Spools einer OUTQ
Hallo,
folgendes Problem:
ich habe eine OUTQ Namens 'DRUCKER1' sowie eine OUTQ Namens 'ARCHIV1'.
Meine WAWI schiebt die Spools über ein PRINTFILE in die OUTQ DRUCKER1.
Nun möchte ich für alle Spools die über PRTF(RECHNUNG1)->OUTQ(DRUCKER1)->WTR(DRUCKER1) laufen eine Kopie in die OUTQ 'ARCHIV1' schieben.
Diese greife ich dann zum Archivieren ab.
Gibt es die Möglichkeit die OUTQ 'DRUCKER1' zu überwachen und dann eine KOPIE in ARCHIV1 zu stellen ??
Bringt mir da vielleicht das Printfile dieses Feature ??
Danke für Eure Hilfe !!
Gruß
Linguin
-
Eigentlich ein altes Thema. Suche mal im Forum nach Spool und DTAQ.
Du kannst an eine OUTQ eine DTAQ hängen (nicht User-Objekt).
Jeder Ready-Eintrag erzeugt einen Eintrag in der DTAQ.
Per QRCVDTAQ kannst du diese also überwachen und den Spool kopieren.
Aber Achtung:
Der Kopiervorgang kann länger dauern als gewünscht, so dass folgende Spools nicht mehr verarbeitet werden, da sie inzwischen gedruckt und gelöscht wurden.
Empfehlung:
Alle zu archivierenden Spools mittels SAVE(*YES) erstellen.
Das Überwachungsprogramm ggf. mehrfach gleichzeitig starten (DTAQ wird nach FIFO gelesen).
Die sicherste Möglichkeit für eine Kopie ist SNDNETSPLF mit Attribut *ALLDATA !
Dies ist auch sicher für IPDS/AFPDS-Drucke. Wenn du nur CPYSPLF in PF und CPYF nach QPRINT machst, bekommst du keine richtige Kopie, vor allem fehlen dir sämtliche Attribute, die du erst per API ermitteln müsstest.
SNDTCPSPLF könnte auch klappen.
Die SND-Befehle klappen auch lokal, quasi an sich selbst und sind daher äusserst schnell.
Ich habe 5 solche Prestart-Job's im Spool-Subsystem, ca. 100 Outq's und noch ging nichts verloren.
-
Danke Fuerchau !!
das isses.
Schneller gehts wohl nimmer.
Gruß
-
Hallo Fuerchau,
folgendes hab ich jetzt gemacht:
DUPCHGSPLF Kompiliert und CMD erstellt.
Ich kann auch DUPCHGSPLF mit F4 öffnen. Und manuell ein SPLF von einer OUTQ zur anderen schieben. Funktioniert wunderbar.
Ausserdem habe ich ne DTAQ für die Ausgabewarteschlange erstellt und per CHGOUTQ angehängt.
Meine Frage:
Wie krieg ich jetzt eigentlich die DTAQ so überwacht das bei neuen SPOOLS der DUPCHGSPLF Befehl ausgeführt wird ???
Sorry. Ist neues Land für mich.
Gruß
Linguin
-
Zunächst mal erstellt Du eine Datenwarteschlange über CRTDTAQ DTAQ(MYDTAQ). Dann fügst Du der Ausgabewarteschlange die Datenwarteschlange mit CHGOUTQ OUTQ(MYOUTQ) DTAQ(MYDTAQ) hinzu.
Das folgende Programm verarbeitet dann die Datenwarteschlangeneinträge, die von OS/400 dort eingestellt werden, insofern eine neue Spoolfile in die Ausgabewarteschlange gestellt wird. Dieses Programm sollte im Batch laufen.
PHP-Code:
*
* FORMAT EINES EINTRAGES DER DATENWARTESCHLANGE
*
DARCSPLF DS 128
D $$FUNCTION 10A FUNCTION
D $$RCDTYPE 2A RECORD TYPE
D $$QUALJOB 26A QUALIFIED JOBNAME
D $$JOBNAM 10A OVERLAY($$QUALJOB : 1) JOB-NAME
D $$JOBUSR 10A OVERLAY($$QUALJOB : 11) JOB-USER
D $$JOBNBR 6A OVERLAY($$QUALJOB : 21) JOB-NUMBER
D $$SPLFNAM 10A SPOOLFILE NAME
D $$SPLFNBR 8B 0 SPOOLFILE NUMBER
D $$OUTQ 10A OUTPUT QUEUE
D $$LIBOUTQ 10A LIBRARY OUTPUT QUEUE
*
* API FEHLERMELDUNGEN
*
D $$ERRCOD DS
D $$BYTPRO 1 4B 0 INZ(128)
D $$BYTAVA 5 8B 0 INZ(*ZERO)
D $$EXCID 9 15A INZ(*BLANKS)
D $$RSRVD 16 16A INZ(*BLANKS)
D $$EXCDTA 17 144A INZ(*BLANKS)
*
*-------------------------------------------------------------------------------------------*
*
* ÜBERGABEPARAMETER FÜR API 'QRCVDTAQ'
*
C QRCVDTAQ PLIST
C PARM 'ARCSPLF' P1_DTAQ 10 --> DATA QUEUE
C PARM '*LIBL' P1_LIBDTAQ 10 --> LIBRARY
C PARM P1_LNGDTA 5 0 <-- LENGTH OF DATA
C PARM P1_DTA 128 <-- DATA
C PARM -1 P1_WAIT 5 0 --> WAIT TIME
*
*-------------------------------------------------------------------------------------------*
*
C DOU $$FUNCTION = '*END'
* EINTRAG AUS DER DATENWARTESCHLANGE 'ARCHIVIERUNG DRUCKDATEIEN' EMPFANGEN
C CALL 'QRCVDTAQ' QRCVDTAQ
* DATEN IN DIE FORMAT-DATENSTRUKTUR ÜBERTRAGEN
C MOVE P1_DTA ARCSPLF
* NUR EINTRÄGE FÜR DRUCKDATEIEN VERARBEITEN
C IF $$FUNCTION = '*SPOOL'
... Meine Aktionen ...
C ENDIF
C ENDDO
* PROGRAMMENDE
C SETON LR
Mit dem folgenden Programm wird dann das obige Batchprogramm beendet.
PHP-Code:
*
* ÜBERGABEPARAMETER FÜR API 'QSNDDTAQ'
*
QSNDDTAQ PLIST
PARM 'ARCSPLF' P1_DTAQ 10 --> DATA QUEUE
PARM '*LIBL' P1_LIBDTAQ 10 --> LIBRARY
PARM 128 P1_LNGDTA 5 0 <-- LENGTH OF DATA
PARM '*END' P1_DTA 128 <-- DATA
*
*-------------------------------------------------------------------------------------------*
*
* ARCHIVIERUNG DRUCKDATEIEN BEENDEN
CALL 'QSNDDTAQ' QSNDDTAQ
* PROGRAMMENDE
SETON LR
PS
Das Programm habe ich vor einer Ewigkeit geschrieben.
Frank Hildebrandt
-
Danke Frank.
wenn ich das aber im batch laufen lasse, müssen die spools ja im "gesavt" werden.
Am liebsten wäre mir, wenn das als Überwachungsprogramm irgendwo laufen würde.
Gruß
-
Moin,
damit solltest du die nötigen Infos über die Einträge in der DTAQ bekommen. Musst dir halt ein CL schreiben das die ganze Zeit die DTAQ "pollt".
PHP-Code:
DCL VAR(&SPLFDTA) TYPE(*CHAR) LEN(128) DCL VAR(&DTALEN) TYPE(*DEC) LEN(5 0) VALUE(128 DCL VAR(&WAIT) TYPE(*DEC) LEN(5 0) VALUE(-1) DCL VAR(&JOBNAME) TYPE(*CHAR) LEN(10) DCL VAR(&JOBUSER) TYPE(*CHAR) LEN(10) DCL VAR(&JOBNBR) TYPE(*CHAR) LEN(6) DCL VAR(&SPLFNAME) TYPE(*CHAR) LEN(10) DCL VAR(&SPLFNBR) TYPE(*DEC) LEN(9 0) LOOP:
/* RECEIVE DATA QUEUE ENTRY, OR WAIT FOR ONE */ CALL PGM(QRCVDTAQ) PARM(MYDATAQ MYLIB + &DTALEN &SPLFDTA &WAIT)
/* GET DETAILS FOR DATA QUEUE ENTRY */ CHGVAR VAR(&JOBNAME) VALUE(%SST(&SPLFDTA 13 10)) CHGVAR VAR(&JOBUSER) VALUE(%SST(&SPLFDTA 23 10)) CHGVAR VAR(&JOBNBR) VALUE(%SST(&SPLFDTA 33 6)) CHGVAR VAR(&SPLFNAME) VALUE(%SST(&SPLFDTA 39 10)) CHGVAR VAR(&SPLFNBR) VALUE(%BIN(&SPLFDTA 49 4))
/* MACH WAS */
GOTO CMDLBL(LOOP)
Gruß
Sascha
-
Das Programm sollte schon im Batch laufen. Dazu noch folgende Info wie das ganze Thema abläuft.
1. Das Programm läuft im Batch und wartet über den QRCVDTAQ darauf einen Eintrag aus der Datenwarteschlange zu empfangen und zu verarbeiten. Solange kein Eintrag in der Datenwarteschlange steht verbraucht das Programm auf keine Prozessorzeit.
2. Eine Spoolfile wird in die entsprechende Ausgabewarteschlange gestellt. OS/400 stellt daraufhin einen Eintrag zu dieser Spoolfile in die Datenwarteschlange.
3. Nachdem ein Eintrag in der Datenwarteschlange steht, übergibt OS/400 diesen Satz dem Batchprogramm.
4. Das Batchprogramm empfängt diesen Satz und kann diesen dann verarbeiten.
Die ganze Verarbeitung läuft asynchron ab. D.h. viele Jobs können einen Eintrag in die Ausgabewarteschlange und dadurch auch in die Datenwarteschlange stellen. Nur ein Programm (Das Batchprogramm) verarbeitet die Einträge in der Datenwarteschlange.
Das zweite Programm, das ich gepostet habe sorgt dafür, dass das erste Programm im Bedarfsfall auch sauber beendet werden kann. Ansonsten könnte man es nur über einen ENDJOB OPTION(*IMMED) beenden, da der QRCVDTAQ ansonsten bis zum Sankt Nimmerlein Tag auf einen Eintrag in der Datenwarteschlange warten würde.
Frank Hildebrandt
-
Naja, man kann beim QRCVDTAQ im Parameter Wait eine Wartezeit in Sekunden angeben (-1 = unendlich).
Läuft der Timer ab, kann man per RTVJOBA den ENDSTS prüfen und den Job beenden.
Wenn dann das Subsystem beendet wird, endet auch der Überwachungsjob.
Das Batch-Programm sollte per ADDPJE in ein aktives Subsystem eingebracht werden. Man kann auch eine Anzahl gleichzeitiger Job's angeben (Parallelverarbeitung).
Der DTAQ-Eintrag wird erst im Status RDY erstellt und zwar jedes Mal. Wenn also z.B. von SAV/HLD in RDY freigegeben wird, erscheint ggf. ein neuer Eintrag !
Die DTAQ sollte eine Satzlänge von 128 Bytes haben (CRTDTAQ).
-
Zitat von Fuerchau
Naja, man kann beim QRCVDTAQ im Parameter Wait eine Wartezeit in Sekunden angeben (-1 = unendlich)
Stimmt. Daran habe ich jetzt selber nicht gedacht.
Zitat von Fuerchau
Läuft der Timer ab, kann man per RTVJOBA den ENDSTS prüfen und den Job beenden.
Wäre eine Möglichkeit die Beendigung mit OPTION(*CNTRLD) abzufragen. Würde ich dann nutzen, wenn der QRCVDTAQ in einem CL läuft. Wenn er in einem RPG läuft würde ich folgendes machen.
PHP-Code:
* Feststellen, ob der Job beendet werden soll
c ShtDn 01
c If *IN01 = *On
... Beende das Programm
c EndIf
Frank Hildebrandt
-
Vielen Dank.
Hab das CL von JonnyRico genommen. Läuft jetzt in ner JOBQ und krallt mir alle Spools.
Funktioniert 1a.
Danke !!
-
ich nochmal.
eine Frage hätte ich noch:
Kann ich die DTAQ bei MEHREREN OUTQs hinterlegen ??
So spar ich mir einiges an Arbeit !!
Gruß
Similar Threads
-
By SL in forum IBM i Hauptforum
Antworten: 4
Letzter Beitrag: 07-12-06, 10:46
-
By cbe in forum NEWSboard Drucker
Antworten: 6
Letzter Beitrag: 29-06-06, 15:32
-
By phil.sebastian in forum NEWSboard Drucker
Antworten: 1
Letzter Beitrag: 23-05-06, 12:08
-
By chrhu in forum NEWSboard Drucker
Antworten: 6
Letzter Beitrag: 10-05-06, 13:02
-
By Jörg Schmidt in forum NEWSboard Drucker
Antworten: 6
Letzter Beitrag: 04-05-06, 09:50
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks