我们定期运行作业,需要将输出保存到PDS中,然后解析输出以提取部分输出保存到另一个成员中。这需要通过使用百分号和REXX成员名称作为SDSF命令行发出REXX命令来完成。我曾试图编写一个REXX代码来实现这一点,但在尝试调用ISPF服务时出错,称ISPF环境尚未建立。但是,这是在ISPF下运行的SDSF。
我的代码中有这个(从几个来源复制并修改(:
parse arg PSDSFPARMS "(" PUSERPARMS
parse var PSDSFPARMS PCURRPNL PPRIMPNL PROWTOKEN PPRIMCMD .
PRIMCMD=x2c(PPRIMCMD)
RC = isfquery()
if RC <> 0 then
do
Say "** SDSF environment does not exist, exec ending."
exit 20
end
RC = isfcalls("ON")
Address SDSF "ISFGET" PPRIMPNL "TOKEN('"PROWTOKEN"')" ,
" (" VERBOSE ")"
LRC = RC
if LRC > 0 then
call msgrtn "ISFGET"
if LRC <> 0 then
Exit 20
JOBNAME = value(JNAME.1)
JOBNBR = value(JOBID.1)
SMPDSN = "SMPE.*.OUTPUT.LISTINGS"
LISTC. = ''
SMPODSNS. = ''
SMPODSNS.0 = 0
$ = outtrap('LISTC.')
MSGVAL = msg('ON')
address TSO "LISTC LVL('"SMPDSN"') ALL"
MSGVAL = msg(MSGVAL)
$ = outtrap('OFF')
do LISTCi = 1 to LISTC.0
if word(LISTC.LISTCi,1) = 'NONVSAM' then
do
parse var LISTC.LISTCi . . DSN
SMPODSNS.0 = SMPODSNS.0 + 1
i = SMPODSNS.0
SMPODSNS.i = DSN
end
IX = pos('ENTRY',LISTC.LISTCi)
if IX <> 0 then
do
IX = pos('NOT FOUND',LISTC.LISTCi,IX + 8)
if IX <> 0 then
do
address ISPEXEC "SETMSG MSG(IPLL403E)"
EXITRC = 16
leave
end
end
end
LISTC. = ''
if EXITRC = 16 then
exit 0
address ISPEXEC "TBCREATE SMPDSNS NOWRITE" ,
"NAMES(TSEL TSMPDSN)"
我通过在";H〃;SDSF面板,它运行良好,直到它在REXX:中达到这一点
114 *-* address ISPEXEC "TBCREATE SMPDSNS NOWRITE" ,
"NAMES(TSEL TSMPDSN)"
>>> "TBCREATE SMPDSNS NOWRITE NAMES(TSEL TSMPDSN)"
ISPS118S SERVICE NOT INVOKED. A VALID ISPF ENVIRONMENT DOES NOT EXIST.
+++ RC(20) +++
有人知道为什么它说我没有一个有效的ISPF环境,以及我如何绕过这一点吗?
我过去用REXX做过很多工作,包括编写REXX代码来处理行命令,但这是我第一次尝试在该代码中使用ISPEXEC命令。
谢谢,Alan
这是许多人都面临的挑战-我多年前就写了一个工具,做了这件事,然后在去年使用SDSF REXX API创建了一个更通用的新工具。
如果没有其他东西,你可以从它借来满足你自己的需求或按原样使用。
你可以在这里找到它:https://github.com/lbdyck/sdsfxdd
语法看起来可能很复杂,但实际上相当简单:
%sdsfxdd JOBname(jobname(jobid)) +
STEPname(stepname) +
DDname(ddname) +
HLQ(high-level-qualifier) +
QUALifier(qualifier) +
SUFfix(suffix) +
LISt(list) +
OWNer(owner) +
SYStem(sys) +
DATE(date)
这允许您将其作为工作中的一个步骤来运行(可能是最后一步(。
希望这能帮助