MainframeSupports
tip uge 46/2011:

Jeg har hidtil undgået at skrive mine egne JCL procedurer. Jeg synes ikke, jeg har haft behovet, og de virker meget begrænset i deres funktion. Alligevel er de fleste installationer inficeret med et hav af JCL procedurer. I gamle dage var der også krav til, at JCL procedurer skulle placeres i bestemte biblioteker. Heldigvis er meget af alt dette ikke sandt længere, og jeg har på det seneste set lidt af lyset. Derfor denne uges tip, som helt klart er skrevet til dig, der ikke har set lyset overhovedet.

Der findes grundlæggende to slags JCL procedurer. Den ene slags er inline JCL procedurer, og den anden er rigtige JCL procedurer, der kan anvendes på tværs af forskellige jobs. En inline JCL procedure virker kun i det job, den er skrevet i. Den har også den i mine øjne store ulempe, at den skal defineres før det JCL, der skal bruge JCL proceduren. Man kan altså ikke skrive sine steps øverst i jobbet og JCL proceduren nederst. Af netop denne grund vil jeg anbefale dig at bruge rigtige JCL procedurer lige fra starten, da det er ufatteligt enkelt.

Lad mig som sædvanligt vise et eksempel. Først et JCL procedure:

//MYPROC   PROC MYPARM=
//*
//IEBCOPY  EXEC PGM=IEBCOPY
//SYSPRINT DD SYSOUT=*
//SYSUT1   DD DISP=SHR,DSN=&MYPARM.
//SYSUT2   DD DISP=SHR,DSN=&MYPARM.
//SYSIN    DD DUMMY
//*
//MYPROC   PEND

JCL proceduren gemmer du i et member i et normalt JCL bibliotek. Memberets navn er JCL procedurens navn. Den første linie i memberet skal være et PROC JCL-kort. Det behøver ikke have noget navn. Efter PROC kan du angive nogle parametre, som kan overføres til JCL proceduren. Det er netop muligheden for parameter-overførsel, der i mine øjne gør JCL procedurer interessante. I eksemplet har jeg kun defineret een parameter (MYPARM=). Hvis denne parameter ikke angives, så er den tom. Flere parametre adskilles med kommaer og en parameter kan tildeles en default-værdi (MYPARM2=MYINITVALUE).

Efter PROC skriver du så dine steps. Du kan bruge en parameter næsten alle mulige steder i JCL'en. Desværre kan en procedure ikke indeholde inline SYSIN (det kommer med z/OS version 1.13) og hvis den kan, så kan du desværre ikke anvende parameteren i data til SYSIN, hvilket er rigtig irriterende. I eksemplet anvender jeg min ene parameter som datasetnavn og det endda to gange for at kunne lave en god gammel compress af et member dataset (et PDS). Det afsluttende PEND JCL-kort behøver du ikke angive, og hvis du gør, så er navnet på det underordnet.

JCL-proceduren kaldes simpelt fra dit job således (jeg har som sædvanlig udeladt JOB-kortet):

//PROCLIB  JCLLIB ORDER=MY.JCL.LIBRARY
//*
//STEP0001 EXEC MYPROC,MYPARM=MY.PROGRAM.LIBRARY
//STEP0002 EXEC MYPROC,MYPARM=MY.LOAD.LIBRARY

Før det første step, hvor du vil anvende din JCL-procedure, skal du angive et JCLLIB JCL-kort. Navnet er underordnet og kan helt udelades. Efter ORDER= angiver du navnet på dit JCL-bibliotek. Hvis du er avanceret kan du angive flere JCL-biblioteker, så du får samme effekt som med en concatenering på et DD-kort. Du skal i givet fald adskille hvert datasetnavn med komma og putte en parentes rundt om alle datasetnavnene.

Jobbet i eksemplet vil udføre JCL-proceduren MYPROC i MY.JCL.LIBRARY to gange. Første step vil lave compress af datasettet MY.PROGRAM.LIBRARY og det andet step vil lave compress af MY.LOAD.LIBRARY. Det er jo ikke meget det job fylder, og det er utroligt nemt at rette i.

Forrige danske tip        Last tip in english        Tip oversigten