从 rexx 代码向 ispf 宏传递参数时出现无效长度错误

Posted

技术标签:

【中文标题】从 rexx 代码向 ispf 宏传递参数时出现无效长度错误【英文标题】:Invalid length error while passing parameters to ispf macro from rexx code 【发布时间】:2017-07-31 17:09:20 【问题描述】:

我写了一个宏来改变一个字符串所有的PDS成员。我正在路过 PDS,现有价值和通过 JCL 的新价值。 使用 rexx 将参数传递给 ispf 宏时出现无效长度错误。错误是:

ISPS108 Invalid length    -/-Parameter 'PARM' exceeds the allowable length.

我的 REXX 代码 - IWPURDX 是:

TRACE "ALL"                                                         
ARG PDS STRING1 STRING2 .                                           
MAC  = 'TEMPMAC'                               /* Macro name        
*/                                                                  
PDS = STRIP(PDS,"B","'")                                            
STRING1 = STRIP(STRING1,"B","'")                                    
STRING2 = STRIP(STRING2,"B","'")                                    
S12 = STRING1 || " " || STRING2                                     
SAY "STRING1" STRING1                                               
SAY "STRING2" STRING2                                               
SAY "S12" S12                                                       
SAY "LENGTH" LENGTH("S12")                                          
X = OUTTRAP("LIBMEM.")                         /* Trap output of TSO
*/                                                                  
 ADDRESS TSO "LISTDS '"PDS"' M"                                     
 X = OUTTRAP("OFF")                                           

DO I = 7 TO LIBMEM.0                                         
  LIBMEM.I = STRIP(LIBMEM.I)                   /* Member name
*/                                                           
  ADDRESS ISPEXEC "EDIT DATASET ('"PDS"("LIBMEM.I")') " ||,  
    "MACRO ("MAC") PARM ("S12")"                             
  SAY I RC LIBMEM.I                                          
END

ISPF 宏 - TEMPMAC 是:

 /*REXX*/                                       
 TRACE "ALL"                                    
SAY "TEMPMAC"                                   
ADDRESS ISREDIT "MACRO (PARM) PROCESS"          
PARSE VAR PARM STRING1 STRING2                  
ADDRESS ISREDIT "CHANGE ALL 'STRING1' 'STRING2'"
C_RC = RC                                       
ADDRESS ISREDIT "END"                           
EXIT C_RC                                       

在 JCL 中,我通过以下 ISPF 命令调用它们:

//REXX  EXEC PGM=IKJEFT01,REGION=32M                               
//SYSPRINT DD  SYSOUT=*                                            
//SYSTSIN  DD  *                                                   
  ISPSTART CMD(%IWUPDRX 'PPPRG3.BASE.WRJCL' '2016-01-01' 'IWPULDT')
/*                                                                 

我还打印了长度,所以字符串传递给宏 - 它说 3。 我无法找到错误的根本原因。有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

认为您的编辑 PARM 正在等待一个变量名,而不是值。

ADDRESS ISPEXEC "EDIT DATASET ('"PDS"("LIBMEM.I")') " ||,  
    "MACRO ("MAC") PARM ("S12")"

所以尝试用"... PARM (S12)"替换"... PARM ("S12")"

【讨论】:

这是正确的。 EDIT(和VIEW)的PARM 参数中的值是ISPF 变量的名称,而不是值。在 ISPF 服务中有很多地方可以指定变量名,而不是变量值。 LM 服务因此而臭名昭著;例如,LMINIT 想要变量 name,但其他人想要变量 value。查看所需内容的最简单方法是,如果使用变量名,参数描述将以 -var 结尾;在这种情况下,它被定义为PARM(parm-var) 谢谢弗里茨!有效。但奇怪的是,当我在 TEMPMAC 宏中硬编码参数并且只是传递宏名称时它正在工作。【参考方案2】:

正如 Fritz 和 zarchasmpgmr 指出的那样,PARM 必须指向一个变量名。 我们需要查看宏和执行程序,以确保我们通过在 TEMPMAC 中硬编码参数并仅传递宏名称来了解您的意思。 PARM 是一个可选参数,因此 EDIT 不需要它。如果指定了 PARM,则 ISPF 代码将查找变量名。所以代码查看参数指向的存储。由于它应该是一个变量名称,因此代码正在解析存储中的一个符合 NAME 标准的 8 字节字段。代码将查找括号之间的内容。当括号之间的内容大于 8 个字节且没有分隔符时,就会出现 ISPS108。如果存储中的内容符合 NAME 定义,那么我们继续并稍后通过调用 TSO 来提供变量值来检查该变量名包含的内容。如果 PARM 没有编码,那么我们只是绕过处理,因为可选参数不存在。

【讨论】:

附加说明.. 在上述 PARM 的 REXX 中,PARM(2016-01-01 IWPULDT) 2016-01-01 超过 8 个字符并导致 S108 消息。如果它小于 8(例如 PARM(2016 IWPULDT) ),那么您将获得 ISPS109 - Unexpected list found 。在不期望列表的地方找到了名称列表。所以这一切都取决于 PARM(...) 里面的内容。 PARM() 不会出错。【参考方案3】:

以您在此处所做的方式传递 parms 是一个坏主意。最好将它们 VPUT 到调用 exec 中的变量池,然后在宏中 VGET 它们。

虽然在这种情况下,STRING1 和 STRING2 的值必须是单个标记/单词(因为它们是由 exec 中的 ARG 语句创建的),但 vput/vget 方法允许您将任意字符串传递到宏中。将它们连接成单个变量然后在宏中将其解析出来是没有意义的,只需 vput & 然后 vget 两者。

一旦你在一个宏中加入了 'isredit change' 命令,你的'isredit change' 命令在某些情况下将不起作用,这取决于 string1 和 string2 的实际值是什么。例如,想象一下它们是否包含像 FIRST LAST 这样的词也是更改命令的有效参数?

我曾经做过

hexstring1 = c2x(string1)
hexstring2 = c2x(string2)
"address isredit change x'"hexstring1"' '"hexstring2"' all"

在这样的宏中,字符串的内容是什么完全无关紧要。

【讨论】:

以上是关于从 rexx 代码向 ispf 宏传递参数时出现无效长度错误的主要内容,如果未能解决你的问题,请参考以下文章

如何批量运行 ISPF 编辑宏

ISPF 面板 REXX 中是不是提供 ISPEXEC 服务?

如何通过 JCL 将参数传递给 REXX 程序

没有 ISPF 的文件剪裁

ISPF 编辑宏,如何防止“浏览替换”发生..?

是否有用 REXX 或 CLIST 编写的 TSO 命令可以确定谁已将数据集排入队列?