Jeg har i mange år gjort mit bedste for at undgå at benytte ISPF File Tailoring til at generere jobs med, fordi jeg synes, at det er ualmindeligt besværligt. Nu synes jeg endelig, jeg har fundet den ultimate erstatning, nemlig en lille fiks REXX procedure. Alt foregår i REXX, hvilket gør det utroligt nemt at benytte i batch, hvor det kan være utroligt svært at få File Tailoring til at virke 100% korrekt.
Jeg vil vise dig et eksempel, som ganske upædagogisk viser resultatet af job genereringen med ISPF EDIT og derfor ikke egner sig til batch. Linien kan dog simpelt erstattes med en SUBMIT kommando, og så er du kørende både i TSO og i batch.
/* REXX */ ARG PARM GENUSER = USERID() CALL GENJOB ADDRESS ISPEXEC 'EDIT DATASET(ISPF.JCL(GENJOB))' EXIT GENJOB: DROP JCL. JCLNO = 0 CALL JL '//'GENUSER'G JOB ,GENERATED,CLASS=E,MSGCLASS=F' CALL JL '// COND=(4,LT),REGION=0M,NOTIFY='GENUSER CALL JL '//*' CALL JL '//IDCAMS EXEC PGM=IDCAMS' CALL JL '//SYSPRINT DD SYSOUT=*' CALL JL '//SYSIN DD *' CALL JL ' ' CALL JL '/*' JCL.0 = JCLNO ADDRESS TSO "ALLOC FI(JCL) DA(ISPF.JCL(GENJOB)) SHR REUSE" "EXECIO * DISKW JCL (STEM JCL. OPEN FINIS)" "FREE FI(JCL)" RETURN JL: ARG JCLLINE JCLNO = JCLNO + 1 JCL.JCLNO = JCLLINE RETURN 0
Eksemplet opbygger et job, der kører en dummy IDCAMS, men det er bare for at illustrere, hvor pæn opbygningen af jobbet tager sig ud, når du benytter procedure JL (for JobLine). For at JL virker efter hensigten, så skal du starte din job generering med DROP JCL. efterfulgt af JCLNO = 0. Når du er færdig, skal du huske at sætte JCL.0 = JCLNO, ellers virker EXECIO ikke korrekt. Hvis du udelader DROP JCL. så vil det virke, så længe du kun genererer et job i samme REXX, men der vil gå kuk i det anden gang EXECIO eksekveres, så husk DROP uanset hvad.
I eksemplet gemmer jeg resultatet af min job generering i dataset userid.ISPF.JCL, men allerede her kan du bare submitte jobbet, hvis du laver din ALLOC om til "ALLOC FI(JCL) SYSOUT WRITER(INTRDR)". Måske undrer du dig over RETURN 0 i JL proceduren. Så kan du også kalde JL sådan her ?=JL('//* NOGET JCL'). Det er kortere at skrive, men så skal du huske at afslutte alle linier med en ), og det gider jeg ikke, og jeg synes heller ikke det er lige så læse-venligt, men det er nok smag og behag.