从 rexx 代码向 ispf 宏传递参数时出现无效长度错误
Invalid length error while passing parameters to ispf macro from rexx code
我写了一个宏来改变一个字符串的所有PDS成员。我路过
通过 JCL 的 PDS、现有价值和新价值。
使用 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。
我无法找到错误的根本原因。有人可以帮忙吗?
认为您的编辑 PARM 正在等待变量名,而不是值。
ADDRESS ISPEXEC "EDIT DATASET ('"PDS"("LIBMEM.I")') " ||,
"MACRO ("MAC") PARM ("S12")"
所以尝试用"... PARM (S12)"
替换"... PARM ("S12")"
正如 Fritz 和 zarchasmpgmr 指出的那样,PARM 必须指向一个变量名。
我们需要查看宏和 exec 以确保我们通过在 TEMPMAC 中对参数进行硬编码并仅传递宏名称来了解您的意思。
PARM 是可选参数,因此 EDIT 不需要它。如果指定了 PARM,则 ISPF 代码将查找变量名。所以代码查看参数指向的存储。因为它应该是一个变量名,所以代码正在解析满足 NAME 标准的 8 字节字段的存储。该代码将查找括号之间的内容。当 parens 之间的内容大于 8 个字节且没有分隔符时,会发生 ISPS108。如果存储中的内容符合 NAME 定义,那么我们将继续并稍后通过调用 TSO 提供变量值来检查此变量名称包含的内容。如果 PARM 没有编码,那么我们就绕过处理,因为可选参数不存在。
按照您在此处所做的方式传递参数是个坏主意。最好将它们 VPUT 到调用 exec 中的变量池,然后在宏中 VGET 它们。
尽管在这种情况下,STRING1 和 STRING2 的值必须是单个值 tokens/words(因为它们是 exec 中的 ARG 语句创建的)vput/vget 方法允许您传递任意值字符串到宏中。将它们连接成一个变量然后在宏中将它们分开解析是没有意义的,只是 vput & 然后 vget 两者。
一旦你在宏中使用了你的 'isredit change' 命令在某些情况下将不起作用,这取决于 string1 和 string2 的实际值。例如想象一下,如果它们包含像 FIRST LAST 这样的词也是更改命令的有效参数?
我曾经做过
hexstring1 = c2x(string1)
hexstring2 = c2x(string2)
"address isredit change x'"hexstring1"' '"hexstring2"' all"
在这样的宏中,字符串的内容完全无关。
我写了一个宏来改变一个字符串的所有PDS成员。我路过 通过 JCL 的 PDS、现有价值和新价值。 使用 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。 我无法找到错误的根本原因。有人可以帮忙吗?
认为您的编辑 PARM 正在等待变量名,而不是值。
ADDRESS ISPEXEC "EDIT DATASET ('"PDS"("LIBMEM.I")') " ||,
"MACRO ("MAC") PARM ("S12")"
所以尝试用"... PARM (S12)"
"... PARM ("S12")"
正如 Fritz 和 zarchasmpgmr 指出的那样,PARM 必须指向一个变量名。 我们需要查看宏和 exec 以确保我们通过在 TEMPMAC 中对参数进行硬编码并仅传递宏名称来了解您的意思。 PARM 是可选参数,因此 EDIT 不需要它。如果指定了 PARM,则 ISPF 代码将查找变量名。所以代码查看参数指向的存储。因为它应该是一个变量名,所以代码正在解析满足 NAME 标准的 8 字节字段的存储。该代码将查找括号之间的内容。当 parens 之间的内容大于 8 个字节且没有分隔符时,会发生 ISPS108。如果存储中的内容符合 NAME 定义,那么我们将继续并稍后通过调用 TSO 提供变量值来检查此变量名称包含的内容。如果 PARM 没有编码,那么我们就绕过处理,因为可选参数不存在。
按照您在此处所做的方式传递参数是个坏主意。最好将它们 VPUT 到调用 exec 中的变量池,然后在宏中 VGET 它们。
尽管在这种情况下,STRING1 和 STRING2 的值必须是单个值 tokens/words(因为它们是 exec 中的 ARG 语句创建的)vput/vget 方法允许您传递任意值字符串到宏中。将它们连接成一个变量然后在宏中将它们分开解析是没有意义的,只是 vput & 然后 vget 两者。
一旦你在宏中使用了你的 'isredit change' 命令在某些情况下将不起作用,这取决于 string1 和 string2 的实际值。例如想象一下,如果它们包含像 FIRST LAST 这样的词也是更改命令的有效参数?
我曾经做过
hexstring1 = c2x(string1)
hexstring2 = c2x(string2)
"address isredit change x'"hexstring1"' '"hexstring2"' all"
在这样的宏中,字符串的内容完全无关。