MainframeSupports
tip uge 23/2011:

Overskriften på denne uges tip er nok lidt overdrevet, da JCL på ingen måde supporterer brugen af REXX, men med nogle ganske få kunstgreb er det muligt at skrive et REXX program direkte i JCL og eksekvere programmet i et efterfølgende step. Jeg har set princippet anvendt af andre, men har ikke selv fundet brug for det, indtil en dag jeg havde brug for at anvende en JCL variabel i noget SYSIN. Desværre understøtter JCL ikke anvendelsen af JCL variable i SYSIN, så i stedet opfandt jeg følgende stump JCL:

...
//         SET PGMNAME=MYSQLPGM
//MAKEREXX EXEC PGM=IEBGENER
//SYSPRINT DD SYSOUT=*
//SYSIN    DD DUMMY
//SYSUT2   DD DISP=(NEW,PASS),DSN=&&REXX(REXXPGM),
//         SPACE=(TRK,(1,1,1)),RECFM=FB,LRECL=80
//SYSUT1   DD *
  /* REXX */
  ARG PGMNAME
  MYSQLWHR.0 = 1
  MYSQLWHR.1 = " WHERE PROGNAME = '"PGMNAME"'"
  "EXECIO * DISKW MYSQLWHR (STEM MYSQLWHR. OPEN FINIS)"
/*
//*
//RUNREXX  EXEC PGM=IKJEFT01,PARM='%REXXPGM &PGMNAME'
//SYSTSPRT DD SYSOUT=*
//SYSTSIN  DD DUMMY
//SYSEXEC  DD DISP=(OLD,DELETE),DSN=&&REXX
//MYSQLWHR DD DISP=(NEW,PASS),DSN=&&MYSQLWHR,
//         SPACE=(TRK,1),RECFM=FB,LRECL=80
...

Steppet MAKEREXX skriver REXX-koden til dent temporære dataset &&REXX i member REXXPGM. Det næste step RUNREXX afvikler REXX'en, som skriver en linie i det temporære dataset &&MYSQLWHR, som jeg anvender i et efterfølgende step til at opbygge et SQL-kald. Det vigtigste her er dog, at jeg ved hjælp af inline REXX'en kan få overført værdien af JCL variablen PGMNAME til et dataset, som jeg kan anvende i noget SYSIN (eller et hvilket som helst andet input dataset for den sags skyld). Jeg kunne også have valgt at danne al SYSIN i REXX'en, men så ville REXX'en bare blive større og JCL'en sværere at læse og forstå. Hvis du ikke helt har styr på at concatenere SYSIN data skrevet direkte i JCL'en med datasets, så er det en god ide at lade REXX'en danne alt input.

Forrige danske tip        Last tip in english        Tip oversigten