[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Dec 2004
    Beiträge
    178

    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

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Dec 2004
    Beiträge
    178
    Danke Fuerchau !!

    das isses.

    Schneller gehts wohl nimmer.

    Gruß

  4. #4
    Registriert seit
    Dec 2004
    Beiträge
    178
    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

  5. #5
    Registriert seit
    Dec 2002
    Beiträge
    301
    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                                                             
    $$FUNCTION                    10A                                        FUNCTION            
    $$RCDTYPE                      2A                                        RECORD TYPE         
    $$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          
    $$SPLFNAM                     10A                                        SPOOLFILE NAME      
    $$SPLFNBR                      8B 0                                      SPOOLFILE NUMBER    
    $$OUTQ                        10A                                        OUTPUT QUEUE        
    $$LIBOUTQ                     10A                                        LIBRARY OUTPUT QUEUE
     
    *                                                                                             
     * 
    API FEHLERMELDUNGEN                                                                         
     
    *                                                                                             
    $$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

  6. #6
    Registriert seit
    Dec 2004
    Beiträge
    178
    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ß

  7. #7
    Registriert seit
    Apr 2002
    Beiträge
    792
    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(&SPLFDTATYPE(*CHARLEN(128)
               
    DCL        VAR(&DTALENTYPE(*DECLEN(5 0VALUE(128
               DCL        
    VAR(&WAITTYPE(*DECLEN(5 0VALUE(-1)
               
    DCL        VAR(&JOBNAMETYPE(*CHARLEN(10)
               
    DCL        VAR(&JOBUSERTYPE(*CHARLEN(10)
               
    DCL        VAR(&JOBNBRTYPE(*CHARLEN(6)
               
    DCL        VAR(&SPLFNAMETYPE(*CHARLEN(10)
               
    DCL        VAR(&SPLFNBRTYPE(*DECLEN(9 0)
        
    LOOP:

    /* RECEIVE DATA QUEUE ENTRY, OR WAIT FOR ONE  */
                
    CALL       PGM(QRCVDTAQPARM(MYDATAQ MYLIB +
                             &
    DTALEN &SPLFDTA &WAIT)

    /* GET DETAILS FOR DATA QUEUE ENTRY   */
                
    CHGVAR     VAR(&JOBNAMEVALUE(%SST(&SPLFDTA 13 10))
                
    CHGVAR     VAR(&JOBUSERVALUE(%SST(&SPLFDTA 23 10))
                
    CHGVAR     VAR(&JOBNBRVALUE(%SST(&SPLFDTA 33 6))
                
    CHGVAR     VAR(&SPLFNAMEVALUE(%SST(&SPLFDTA 39 10))
                
    CHGVAR     VAR(&SPLFNBRVALUE(%BIN(&SPLFDTA 49 4))


    /* MACH WAS */

    GOTO       CMDLBL(LOOP


    Gruß

    Sascha

  8. #8
    Registriert seit
    Dec 2002
    Beiträge
    301
    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

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    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).
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  10. #10
    Registriert seit
    Dec 2002
    Beiträge
    301
    Zitat 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 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:
     Feststellenob der Job beendet werden soll                     
    c                   ShtDn                                        01
    c                   
    If        *IN01 = *On                          
    ... Beende das Programm                                
    c                   
    EndIf 
    Frank Hildebrandt

  11. #11
    Registriert seit
    Dec 2004
    Beiträge
    178
    Vielen Dank.

    Hab das CL von JonnyRico genommen. Läuft jetzt in ner JOBQ und krallt mir alle Spools.

    Funktioniert 1a.

    Danke !!

  12. #12
    Registriert seit
    Dec 2004
    Beiträge
    178
    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

  1. OUTQ Beschreibung sichern und wiederherstellen
    By SL in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 07-12-06, 10:46
  2. Antworten: 6
    Letzter Beitrag: 29-06-06, 15:32
  3. Standardsystemdrucker und OUTQ
    By phil.sebastian in forum NEWSboard Drucker
    Antworten: 1
    Letzter Beitrag: 23-05-06, 12:08
  4. Hosttransform PCL5 mit AFPDS Spools langsam
    By chrhu in forum NEWSboard Drucker
    Antworten: 6
    Letzter Beitrag: 10-05-06, 13:02
  5. Kopien für Formularsätze drucken
    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
  •