[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    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

  2. #2
    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ß

  3. #3
    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

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    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

  5. #5
    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

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
  •