Return to Mainframe Utilities Page
Module
/* REXX ***************************************************************/ /* Utility: CA7CMD */ /* Author: David Leigh */ /* Function: This utility takes command line input to pass to CA7 */ /* and return results to the user without having to go */ /* into CA7. If it's in an edit session, it does this */ /* with note lines. Otherwise it puts it into an output */ /* file and takes the user into edit on it. */ /* */ /* If it's not in an edit session, the whole command must */ /* be entered. If it's in an edit session, the whole */ /* command can be entered but doesn't need to be. If */ /* nothing is entered or partial commands, certain defaults */ /* are used to construct an appropriate command for CA7. */ /* */ /* To see the valid inputs available for the edit session */ /* method of invocation, type CA7CMD HELP or CA7CMD ? on */ /* the command line to get help information in note lines. */ /**********************************************************************/ address ispexec "control errors return" address isredit "macro (passcmd)" if rc = 0 then do ismacro = 'yes' if passcmd = "?" then do funcrc = cmd_help(ismacro) exit end if pos(',JOB=',passcmd) = 0 then do "(mbr) = member" if passcmd = '' then passcmd = 'LJCL' passcmd = passcmd ¦¦ ',JOB=' ¦¦ mbr end end else do parse upper arg passcmd ismacro = 'no' if passcmd = "?" then do funcrc = cmd_help(ismacro) exit end end if passcmd = '' then do address ispexec zedlmsg = 'please pass a valid ca7 command such that your ', 'command looks like (for example): ', 'TSO CA7CMD LJOB,JOB=UFBL5305,LIST=ALL' "setmsg msg(utlz001w)" exit end address tso dummy = outtrap('null.') "FREE DD(SYSIN, SYSPRINT, UCC7CMDS TEMPCA7)" "ALLOC DD(SYSIN) NEW" "ALLOC DD(SYSPRINT) NEW SPACE(1,1) CYLINDERS RELEASE" "ALLOC DD(UCC7CMDS) DSN('SYS3.CA7.PROD.COMMDS') SHR REUSE" upper passcmd /* CA-7 demands upper case commands */ passcmd = strip(passcmd,L,",") /* in case the user put in an extra ,*/ /**********************************************************************/ /* don't let an "frjob" go by without a "schid" or it will be too big!*/ /**********************************************************************/ if pos("FRJOB",passcmd) > 0 &, pos("SCHID=",passcmd) = 0 then do address ispexec zedlmsg = 'When using the FRJOB command, you must supply ', 'a SCHID=nnn parameter or the command will be ', 'too resource intensive.' "setmsg msg(utlz001w)" exit end zedlmsg = 'Calling CA7 with command:' passcmd address ispexec "control display lock" address ispexec "display panel(msgpanel)" queue '/LOGON' queue '/PROFS,ID=' ¦¦ sysvar(sysuid) ¦¦ ',R=CA70255' queue PASSCMD queue '/LOGOFF' "execio" queued() "diskw sysin (finis)" ADDRESS ISPEXEC "SELECT PGM(SASSBSTR) PARM(0,POOL=(1-8))" "execio * diskr sysprint (stem result. finis)" "FREE DD(SYSIN, SYSPRINT, UCC7CMDS TEMPCA7)" drop null. if ismacro = 'yes' then do j = result.0 - 5 /* this gets rid of trailer lines*/ address isredit do i = 14 to j line = substr(result.i,2) /* this gets rid of carriage control */ "line_before .zfirst = msgline <1,(line)>" end end else do tempdsn = sysvar(sysuid) ¦¦ '.tempca7.d' ¦¦ date(j) ¦¦ '.t' ¦¦ time(s) address tso "ALLOC DD(TEMPCA7) DSN('"TEMPDSN"')", "NEW", "VOLUME(WRK$$$)", "SPACE(1,1) TRACKS RELEASE", "RECFM(F B A) LRECL(133)" "execio * diskw tempca7 (stem result. finis)" "FREE DD(TEMPCA7)" address ispexec "edit dataset('"tempdsn"')" end exit /**********************************************************************/ /* The following procedure gives a few handy CA7 commands that can */ /* be executed via CA7CMD. This list is, by no means, exhaustive */ /* but can be expanded as people think of good example commands. */ /**********************************************************************/ cmd_help: procedure arg ismacro if ismacro = "NO" then do jobstr = ",JOB=xxxxxxxx" address tso "clear" end else do jobstr = "" address ispexec "control display lock" end say "CA7CMD - Example CA7 commands" say "" say "Here are some example CA7 commands that you may find helpful. To have this" say "list updated, see someone on the Tools team." say "" say "LJOB"jobstr",LIST=TRIG" say " This command shows all the jobs which trigger this job and which this" say " job triggers" say "LJOB"jobstr",LIST=RQJOB" say " This command shows all the requirements that this job has. This is" say " where you find job dependencies and negative dependencies." say "LJCL"jobstr say " This command shows you in which library this job resides as far as" say " CA7 is concerned. It also shows you the JCL that CA7 has for that" say " job right now. *** if you don't enter a command, this is the default" say "LJOB"jobstr",LIST=DEPJ" say " This command shows a list of all jobs that are dependent on the job" say " being displayed, including negative dependencies" say "LJOB"jobstr",LIST=RQUSR" say " This command lists any user requirements on the job" say "LJOB"jobstr",LIST=NODD" say " This command shows everything except STEPDD information" say "LJOB"jobstr",LIST=SCHD" say " This command displays schedule information (works on base" say " calendar jobs only)" say "LJOB"jobstr",LIST=RQVRM" say " This command displays Virtual Resource Manager requirements for" say " a job" say "LDSN,DSN=USC10.SLSS.MASTER,LIST=USERS" say " This command lets you find out which jobs use a specific dataset" say "LRLOG"jobstr",DATE=*" say " This command shows the last 5 day's runlog for this job" say "LPRRN"jobstr say " This command shows detail about the last run for this job" say "FSTRUC"jobstr",SCHID=nnn" say " This command shows the subsequent job triggering path starting at" say " this job" say "FRJOB"jobstr",SCHID=nnn" say " This command shows which base calendar job will eventually trigger" say " this job. Note: it requires a SCHID!" say "*** Presstwice to return ***" pull stuff return 0
Documentation
The CA7CMD utility allows you to invoke CA7 commands from anywhere within ISPF without having to go in and out of the CA7 environment. It uses the CA7 batch terminal feature so its performance is not the best, but its primary benefit is convenience. It is implemented as both a standard REXX that can be executed via the "TSO xxxx" style of invocation as well as as an ISPF edit macro. The advantage of using it as an edit macro is that when you are editing JCL whose member name matches the member name of the JCL in CA7, you have the ability to just type "CA7" on the command line and you'll automatically have an LJCL,JOB=themembername command issued to CA7 and the results returned as message lines in your edited JCL. Alternatively, you could issue the command "CA7CMD LJOB" and it would issue the LJOB,JOB=themembername command and once again, your data is returned to the member. You also have the capability of putting other parameters on the command if you so desire. For instance, you might want to issue the LJOB command with a "LIST=TRIG" paramter. You would just type CA7CMD LJOB,LIST=TRIG and CA7CMD would put the job name in there for you and return the results. If you're executing it as you would a typical Rexx or Clist (i.e. not an edit macro), you need to supply the full command. For example, you could type CA7CMD LJOB,JOB=yourfavoritejob,LIST=RQJOB on any ISPF command line and press ENTER. The results are written to a dataset and you are taken into an edit session on that dataset. This is also a good way to capture CA7 command that you need in a dataset for whatever reason.