You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 03:03:23