/* Rexx - Generate JCL to run ISPF in batch using the current */ /* TSO session allocations. */ /* */ /* This is an ISPF edit macro. */ /* */ /* Usage: Place this in your Rexx or CLIST library as */ /* member BATCHPDF. */ /* Enter any edit session and enter %BATCHPDF. */ /* The edit session should then contain working JCL for */ /* using ISPF in batch. Change the job card as */ /* needed and add or remove ddnames and data sets as */ /* needed. */ /* */ /* Notes: You can add an IEBCOPY step before the IKJEFT01 */ /* step if you need to copy an existing profile onto */ /* that data set. One is provided, but in comments. */ /* */ /* If you have a member called JOBCARD in the PDS you */ /* are editing when you run this, It will be copied in */ /* to the JCL automatically. Otherwise a default */ /* job card will be inserted. */ /* */ /* The JCL generated also uses a temporary CLIST. */ /* Place invocation of your program there. */ /* */ /* */ /* Author: Doug Nadel http://www.sillysot.com/mvs */ /* */ /* I'd like to thank Gilbert Saint-Flour for the swareq */ /* subroutine. http://members.home.net/gsf/ */ /* (Removed in v1.02 but still -- Hey, Gilbert!!) */ /* */ /* Version history: 1.00 Feb 10, 2000 - Initial release */ /* 1.01 Feb 11, 2000 - Profile init step */ /* - Minor reformatting */ /* 1.02 Jan 10, 2007 - Remove named profile ds */ /* - Use VIO for prof & clist */ /* - Replace storage searches */ /* with QBASELIB calls */ /* - Remove volser but code */ /* exists in comments */ /*--------------------------------------------------------------------*/ Address isredit "MACRO" If sysvar(syspref) <> "" Then If sysvar(syspref) <> userid() Then prefix = sysvar(syspref)"."userid() Else prefix = sysvar(syspref) Else prefix = userid() Do Until sysdsn("'"tempdsn"'") <> "OK" /* Set up temp ds name */ tempdsn = prefix".T"substr(reverse(time("L")),1,6)".ISPPROF" End "X ALL .ZL .ZF" /* Exclude all */ "DEL ALL X" /* And now delete everything */ "CAPS OFF" /* Insure lower case is Allowed */ lineno = 0 ddnames = "SYSEXEC ISPLLIB ISPPLIB ISPSLIB ISPMLIB ISPILIB" Address ispexec "CONTROL ERRORS RETURN" "COPY JOBCARD AFTER 0" copyrc = rc Address ispexec "CONTROL ERRORS CANCEL" "CAPS OFF" /* In case copy changed caps */ If copyrc > 0 Then Call add "//"userid()"I JOB (ACCT),NOTIFY=&SYSUID.,MSGLEVEL=(1,1)" "(LINENO) = linenum .zl" /* Start adding at top */ /*--------------------------------------------------------------------*/ Call comment "Create Startup CLIST" Call add "//GENER0 EXEC PGM=IEBGENER" Call add "//SYSUT1 DD *" Call add "" Call add " ISPEXEC VGET (ZTIMEL) /* ISPF services can run here */" Call add " WRITE &ZTIMEL" Call add "" Call scomment "Add any setup here" Call scomment "And start your program here. Use ISPEXEC SELECT." Call scomment "" Call scomment "To invoke the editor, code a line like:" Call scomment " ISPEXEC EDIT DATASET('FRED.CNTL(BUBBA)') MACRO(BINKY)" Call scomment "and remember that the macro must do an END or CANCEL." Call add "" Call add "" Call scomment "You can set the step return code if you want." Call add " SET ZISPFRC = 0" Call add " ISPEXEC VPUT (ZISPFRC) SHARED /* set step return code */" Call add "" Call add "//SYSUT2 DD DISP=(,PASS),DSN=&&CLIST0(TEMPNAME)," Call add "// SPACE=(TRK,(1,1,2),RLSE),UNIT=VIO," Call listdsi 'SYSPROC FILE' Call add "// DCB=(LRECL="syslrecl",BLKSIZE=0," || , "DSORG=PO,RECFM="sysrecfm")" Call add "//PROFILE DD DISP=(,PASS),SPACE=(TRK,(10,10,5)),UNIT=VIO," Call add "// DCB=(LRECL=80,BLKSIZE=0,DSORG=PO,RECFM=FB)" Call add "//SYSPRINT DD DUMMY" Call add "//SYSIN DD DUMMY" /*--------------------------------------------------------------------*/ Call comment "Initialize profile data set (optional)" Call add "//* COPY EXEC PGM=IEBCOPY" Call add "//* SYSPRINT DD DUMMY" Call add "//* SYSIN DD DUMMY" Address ispexec "QBASELIB ISPPROF ID(P)" Parse Var p "'" p "'" Call add "//* SYSUT1 DD DISP=SHR,DSN=" || p Call add "//* SYSUT2 DD DISP=(OLD,PASS),DSN=*.GENER0.PROFILE" /*--------------------------------------------------------------------*/ Call comment "Invoke ISPF" Call add "//BATCHPDF EXEC PGM=IKJEFT01,DYNAMNBR=128" Call insert "STEPLIB ","STEPLIB" Call add "//SYSPROC DD DSN=&&CLIST0,DISP=(OLD,DELETE)" Call insert "SYSPROC ","" Do dds = 1 to words(ddnames) ddname = subword(ddnames,dds,1) Call insert ddname,ddname End Call add "//ISPPROF DD DISP=(OLD,PASS),DSN=*.GENER0.PROFILE" Call add "//ISPTABL DD DISP=(OLD,PASS),DSN=*.GENER0.PROFILE" || , ",VOL=REF=*.ISPPROF" Call add "//ISPTLIB DD DISP=(OLD,PASS),DSN=*.GENER0.PROFILE" || , ",VOL=REF=*.ISPPROF" Call insert "ISPTLIB ","" Call add "//ISPCTL0 DD DISP=(,DELETE),SPACE=(TRK,(10,10)),UNIT=VIO," Call add "// DCB=(LRECL=80,BLKSIZE=0,DSORG=PS,RECFM=FB)" Call add "//ISPCTL1 DD DISP=(,DELETE),SPACE=(TRK,(10,10)),UNIT=VIO," Call add "// DCB=(LRECL=80,BLKSIZE=0,DSORG=PS,RECFM=FB)" Call add "//ISPWRK1 DD DISP=(,DELETE),SPACE=(TRK,(10,10)),UNIT=VIO," Call add "// DCB=(LRECL=80,BLKSIZE=0,DSORG=PS,RECFM=FB)" Call add "//ISPLST1 DD DISP=(,DELETE),SPACE=(TRK,(10,10))," Call add "// DCB=(LRECL=133,BLKSIZE=0,DSORG=PS,RECFM=VB)" Call add "//ISPLOG DD SYSOUT=*," Call add "// DCB=(LRECL=120,BLKSIZE=2400,DSORG=PS,RECFM=FB)" Call add "//ISPLIST DD SYSOUT=*,DCB=(LRECL=121,BLKSIZE=1210,RECFM=FBA)" Call add "//* "copies("- ",32) Call add "//SYSTSPRT DD SYSOUT=*" Call add "//SYSTSIN DD *" If sysvar(syspref) <> "" Then Call add " PROFILE PREFIX("sysvar(syspref)")" Else Call add " PROFILE NOPREFIX" Call add " ISPSTART CMD(%TEMPNAME) NEWAPPL(ISR)" Call add "/*" Call add "//*"copies("-",67)"*" "LOCATE .ZF" Exit 1 /*--------------------------------------------------------------------*/ /* Subroutines follow */ /*--------------------------------------------------------------------*/ scomment: /* Add comments in sample */ Call add " /* "left(Arg(1),56)" */" Return /*--------------------------------------------------------------------*/ comment: /* Add block comments */ /* Add comments in sample */ Call add "//*"copies("-",67)"*" Call add "//*"center(" "Arg(1)" ",67)"*" Call add "//*"copies("-",67)"*" Return /*--------------------------------------------------------------------*/ add: /* Add lines to the JCL */ Parse Arg line "LINE_AFTER "lineno" = (LINE)" lineno = lineno + 1 Return /*--------------------------------------------------------------------*/ insert: Procedure Expose lineno /* Insert DD statements */ ddname = Arg(2) Parse Value "" With dsns vol Address ispexec "QBASELIB" Arg(1) "ID(DSNS)" dsns = translate(dsns," ","',") If words(dsns) > 0 Then Do a = 1 to words(dsns) dsn = word(dsns,a) line = "//"left(ddname,9)"DD DISP=SHR,DSN="dsn /* --- uncomment to include volser --- */ /* */ /* Call outtrap "out.",1000 */ /* Address TSO "LISTDS '"dsn"'" */ /* Call outtrap "OFF" */ /* If out.0 > 4 Then */ /* vol = word(out.5,1) */ /* If length(line) < 63 Then */ /* line = substr(line,1,63) || vol */ /* Else */ /* If length(line) < 65 Then */ /* line = line vol */ /* */ /* --- uncomment to include volser --- */ Call add line ddname = "" End Return