MainframeSupports
tip uge 41/2003:

Nu har jeg gennem flere år med stor selvfølgelighed benyttet den specielle TSO/REXX kommando EXECIO i mange af mine tips. Nu er tiden inde til en nærmere forklaring af denne kommando. Jeg har set, at den oftest anvendes til at læse og skrive een record ad gangen og det er faktisk synd, da det vil gå langt hurtigere at benytte en stem til at læse ind i eller skrive ud fra.

Den traditionelle måde at benytte EXECIO på ser eksempelvis således ud:

ADDRESS TSO "ALLOC FI(MYFILE) DA('MYUSER.DATASET') SHR REUSE"
ADDRESS TSO "EXECIO 0 DISKR MYFILE (OPEN"
ADDRESS TSO "EXECIO 1 DISKR MYFILE"
DO WHILE RC = 0
  PULL MYRECORD
  /* Process contens of variable myrecord */
  ADDRESS TSO "EXECIO 1 DISKR MYFILE"
END
ADDRESS TSO "EXECIO 0 DISKR MYFILE (FINIS"
ADDRESS TSO "FREE FI(MYFILE)"

Den første EXECIO åbner filen allokeret til DD-navn MYFILE. Den næste EXECIO læser den første record fra filen ind på REXX stakken. REXX statementet PULL henter den sidst indlæste record fra REXX stakken ind i den angivne variabel. Den sidste EXECIO lukker filen igen. Det er altid en god ide at lukke filen, da man kan rode sig ud i en masse problemer ved ikke at gøre det. Ovenstående kodestump er som klippet ud af et PL/1 eller COBOL program. Derfor er der mange REXX programmer, der læser på denne måde. Men nu til forenklingen, der i øvrigt også eksekverer langt hurtigere:

DROP MYRECORDS.
ADDRESS TSO "ALLOC FI(MYFILE) DA('MYUSER.MYINPUT.DATASET') SHR REUSE"
ADDRESS TSO "EXECIO * DISKR MYFILE (STEM MYRECORDS. OPEN FINIS"
ADDRESS TSO "FREE FI(MYFILE)"
DO RECORDNO = 1 TO MYRECORDS.0
  MYRECORD = MYRECORDS.RECORDNO
  /* Process contens of variable myrecord */
END

Den første og eneste EXECIO åbner filen allokeret til DD-navn MYFILE, indlæser hele filens indhold i stem-varablen MYRECORDS. og lukker til sidst datasettet. Efter EXECIO operationen indeholder variablen MYRECORDS.0 antallet af indlæste records. MYRECORDS.0 vil altså være 0, hvis filen er tom. Indholdet af den første record i filen findes i variablen MYRECORDS.1 og så fremdeles. Det er simpelthen så enkelt og smukt, at jeg næsten får tårer i øjnene. Bemærk i øvrigt statementet DROP MYRECORDS., som initialiserer stem-variablen. Den er en rigtig god ide at benytte, hvis man indlæser i eller skriver ud fra den samme stem-variabel flere gange i samme program.

For at få indholdet af stem-variablen MYRECORDS. skrevet ud i en fil, så skal man ændre DISKR til DISKW i EXECIO kommandoen og intet andet. Hele indholdet af stem-variablen vil blive udskrevet og ikke bare det antal, der står i MYRECORDS.0. En detalje, der kan skabe en del forvirring. Derfor er en DROP af stem-variablen en rigtig god ide, før man begynder at fylde data i den.

Nu er det jo sådan, at stem-variable er begrænset af den virtuelle storage, som ens TSO-session stiller til rådighed. Derfor er det ikke altid lige heldigt at benytte EXECIO * til at indlæse med. * angiver nemlig, at hele filen skal indlæses. Man kan faktisk angive et antal i stedet for * og det er så antallet af records, der indlæses i stem-variablen. Man kan altså med en kombination af de to eksempler få klaret både store og små filer med en fornuftig performance. Og til sidst skal du da lige have et link til den mest friske udgave af TSO/E REXX reference om EXECIO, jeg kunne finde på nettet. Det er ikke småting, man kan med den kommando.

Forrige danske tip        Last tip in english        Tip oversigten