SDSF中执行REXX调用ISPF服务报ISPS118S错误的求助
问题:SDSF环境下调用ISPF TBCREATE服务触发ISPS118S错误
我们定期运行作业,需将作业输出保存至PDS,随后解析输出内容并提取部分信息存入另一成员。操作通过在SDSF命令行输入%加REXX成员名的方式执行REXX程序。编写的REXX代码在调用ISPEXEC的TBCREATE服务时触发ISPS118S错误,提示ISPS118S SERVICE NOT INVOKED. A VALID ISPF ENVIRONMENT DOES NOT EXIST.,但SDSF确实运行在ISPF环境下。
代码片段
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)"
报错信息
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) +++
错误原因及解决办法
错误原因
虽然SDSF运行在ISPF环境中,但通过SDSF行命令%执行的REXX程序默认以TSO环境启动,并未关联ISPF会话所需的控制块与上下文环境。ISPF服务要求程序必须在已初始化的ISPF会话中运行,而SDSF行命令触发的REXX进程未加载必要的ISPF环境变量和控制结构,因此无法调用ISPF服务。
解决办法
方案1:显式初始化ISPF环境
在调用ISPF服务前,添加ISPF会话初始化代码,确保建立有效的ISPF上下文:
/* 初始化ISPF环境 */ RC = ISPEXEC("SELECT PGM(ISPEXEC) PARM(START)") if RC <> 0 then do Say "** 无法初始化ISPF环境,程序终止。" exit 8 end
注意:使用完ISPF服务后,可调用ISPEXEC "END"关闭会话,避免资源泄漏。
方案2:改用ISPF命令行执行REXX
若操作流程允许,直接在ISPF命令行输入%SMPSAVE执行程序,此时程序会直接在ISPF环境中运行,无需额外初始化。但此方案需调整现有操作习惯。
方案3:替代ISPF表服务
若仅需临时存储数据,可直接使用REXX的stem变量(如代码中已有的SMPODSNS.)替代ISPF表,完全绕开ISPF环境依赖,直接遍历stem变量处理数据即可。
内容的提问来源于stack exchange,提问作者Alan
相关产品推荐
相关产品推荐

