
Ved Renden 31 2870 Dyssegaard Tel. +45 23 34 54 43
| 
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
|