我编写了一个宏来更改字符串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。 我无法找到错误的根本原因。有人可以帮忙吗?
答案 0 :(得分:5)
认为您的编辑PARM正在等待变量名称,而不是值。
ADDRESS ISPEXEC "EDIT DATASET ('"PDS"("LIBMEM.I")') " ||,
"MACRO ("MAC") PARM ("S12")"
因此,请尝试将"... PARM ("S12")"
替换为"... PARM (S12)"
答案 1 :(得分:0)
正如Fritz和zarchasmpgmr所指出的,PARM必须指向一个变量名。 我们需要查看宏和exec,以确保我们通过在TEMPMAC中对参数进行硬编码并只传递宏名称来了解您的意思。 PARM是可选参数,因此EDIT不需要它。如果指定了PARM,则ISPF代码将查找变量名称。因此代码查看参数指向的存储。由于它应该是一个变量名,因此代码正在解析满足NAME标准的8字节字段的存储。代码将查找parens之间的内容。当parens之间的内容大于8个字节且没有分隔符时,ISPS108发生。如果存储中的内容符合NAME定义,那么我们继续并稍后通过调用TSO来提供变量值来检查此变量名称包含的内容。如果PARM未编码,那么我们只是绕过处理,因为不存在可选参数。
答案 2 :(得分:0)
以你在这里完成的方式传递parms是一个坏主意。最好将它们VPUT到调用exec中的变量池,然后在宏内部对它们进行VGET。
虽然在这种情况下STRING1和STRING2的值必须是单个令牌/单词(因为它们是由exec中的ARG语句创建的),但是vput / vget方法允许您将任意字符串传递给宏。没有必要将它们连接成一个变量,然后在宏中解析它,只是vput&然后vget他们两个。
一旦你有一个宏你的'isredit change'命令在某些情况下不起作用,这取决于string1和string2的值实际是什么。例如,想象一下它们是否包含FIRST LAST等词,它们也是更改命令的有效参数?
我曾经做过
sed ':B;/^[0-9][0-9]* /N;/\n[0-9][0-9]* /!{s/\n/; /;bB};h;s/\n.*//p;x;s/.*\n//;tB' infile
在这样的宏中,这与字符串的内容完全无关。