Extrahieren/Sortieren aus einem „variable blocked“ Dataset mit JCL

In meinem aktuellen Projekt werden die Eingangsdaten auf dem Mainframe in einem VB-Dataset (variable blocked) Dataset bereitgestellt. Das Dataset enthält Datensätze mit unterschiedlich langen Satzarten und einem einheitlichen Header. Anhand der im Headerbereich verfügbaren Information zu einer „Satzart“ kann mit der unten angeführten JCL eine (oder mehrere) bestimmte Satzarten aus diesem Dataset extrahiert/sortiert werden.

Im ersten SORT-Step werden die Satzarten BETRT2, BETRT3 und BETRT4 aus dem Dataset BAT.PO.K.KE.BEST.N0202.V0204001 in die Ergebnisdatei Y0E6844.EMKSORT.OUT geschrieben. Zu beachten ist hier, dass die Eingangs-Dataset keine FB-Datei (fixed blocked), sondern eine HOST-Datei im VB-Format (variable blocked) ist. Das führt dazu, dass in der INCLUDE-Bedingung die Stelle 72 angegeben ist (wenn man sich das Dataset im browse-mode ansieht, dann zeigt die Spaltenposition an der die Satzart im Dataset steht aber ab Position 68 – man muss bei einer VB-Datei also immer 4 Byte dazuzählen). Wäre es eine FB-Datei müsste im Job die tatsächliche Position angegeben werden – also 68.

---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----
******************************** Top of Data *********************************
14002015020220150203KDINFO                                   00001DINFO     01
14002015020220150203K000000000000400020                      00001KONT01    02
14002015020220150203K000000000000400021                      00002KONT02    12
14002015020220150203K000000000001700100                      00003BETRT2    08
14002015020220150203K000000000002500200                      00004GPKT01    03
14002015020220150203K000000000000300030                      00005ANTR      04
14002015020220150203K000000000000900040                      00006BETRT4    01

Im zweiten SORT-Step (der ist optional falls man ihn braucht) werden aus den extrahierten Satzarten nur die eindeutigen Kontrakt-Nummern extrahiert und in das Dataset Y0E6844.EMKSORT.OUT2 geschrieben. Dies ist speziell für diese Satzarten gedacht, da hier in den Eingangsdaten Duplikate enthalten sind.

Quellcode:

//EMKSRT JOB (666045,BA), 
//       'MOELLER', 
//       CLASS="K",
//       NOTIFY=&SYSUID,
//       MSGCLASS=T 
//SORT EXEC PGM=SORT
//SYSPRINT DD SYSOUT=* 
//SORTIN   DD DSN=BAT.PO.K.KE.BEST.N0202.V0204001,DISP=SHR
//SORTOF01 DD DSN=Y0E6844.EMKSORT.OUT, 
//            DISP=(,CATLG,DELETE) 
//* 
//SYSIN DD * 
    SORT FIELDS=COPY 
       OUTFIL FILES=01, 
       INCLUDE=((72,6,CH,EQ,C'BETRT2'),OR, 
                (72,6,CH,EQ,C'BETRT3'),OR, 
                (72,6,CH,EQ,C'BETRT4')) 
//* 
//SORT EXEC PGM=SORT
//SYSOUT DD SYSOUT=* 
//SORTIN DD DSN=Y0E6844.EMKSORT.OUT,DISP=SHR
//SORTOUT DD DSN=Y0E6844.EMKSORT.OUT2, 
// DISP=(,CATLG,DELETE) 
//* 
//SYSIN DD * 
    SORT FIELDS=(28,18,CH,A) 
     SUM FIELDS=NONE 
//* 
.

QMF for Workstation V10 – 256 offene Fenster, dann ist Schluss

Während meiner Arbeit mit DB2-Prozeduren bin ich auf eine nicht dokumentierte Beschränkung bezüglich der Anzahl von geöffneten Fenstern gestoßen. Hierbei reagiert QMF for Workstation in der Version 10 sehr „gelassen“. In meiner Prozedur werden über das import-Statement SQL-Queries importiert und nacheinander abgearbeitet. Obwohl die Systemvariable DSQQW_PROC_WNDWS auf 0 gestellt ist, werden bei mehr als 256 importierten Queries einige Fenster nicht geschlossen und die Verarbeitung wird ohne Fehlermeldung beendet. Offensichtlich ist die maximale Anzahl an geöffneten Fenstern auf 256 begrenzt. Ein statement zum vorzeitigen Schließen von Fenstern existiert leider nicht. Setzt man die Systemvariable DSQQW_PROC_WNDWS=0, so werden alle Fenster nach erfolgreicher Beendigung der Prozedur geschlossen – nicht jedoch, wenn mehr als 256 Fenster geöffnet wurden.

Als akzeptablen Workaround kann man die zu importierenden Queries in Sub-Prozeduren auslagern, welche dann in einer Haupt-Prozedur aufgerufen werden. Somit können Cluster von Subprozeduren gebildet werden und 256 x 256 Fenster geöffnet und die darin enthaltenen Queries ausgeführt werden. Das dürfte für die meisten Anwendungsfälle ausreichen ;-).