首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从rexx代码向ispf宏传递参数时出现的无效长度错误

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

Stack Overflow用户
提问于 2017-07-31 17:09:20
回答 3查看 909关注 0票数 0

我编写了一个宏来更改PDS的所有成员的字符串。我通过JCL传递PDS、现有值和新值。当使用rexx将参数传递给ispf宏时,我得到了无效的长度错误。错误是:

代码语言:javascript
复制
ISPS108 Invalid length    -/-Parameter 'PARM' exceeds the allowable length.

我的REXX代码- IWPURDX是:

代码语言:javascript
复制
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是:

代码语言:javascript
复制
 /*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命令调用它们:

代码语言:javascript
复制
//REXX  EXEC PGM=IKJEFT01,REGION=32M                               
//SYSPRINT DD  SYSOUT=*                                            
//SYSTSIN  DD  *                                                   
  ISPSTART CMD(%IWUPDRX 'PPPRG3.BASE.WRJCL' '2016-01-01' 'IWPULDT')
/*                                                                 

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-07-31 19:32:13

假设您的编辑PARM正在等待变量名,而不是值。

代码语言:javascript
复制
ADDRESS ISPEXEC "EDIT DATASET ('"PDS"("LIBMEM.I")') " ||,  
    "MACRO ("MAC") PARM ("S12")"

因此,尝试用"... PARM ("S12")"替换"... PARM (S12)"

票数 5
EN

Stack Overflow用户

发布于 2017-08-01 09:48:19

正如Fritz和zarchasmpgmr所指出的,PARM必须指向变量名。我们需要查看宏和执行部分,以确保通过硬编码TEMPMAC中的参数和传递宏名来确定您的意思。PARM是一个可选参数,因此编辑不需要它。如果指定了PARM,则ISPF代码将查找变量名。因此,代码查看参数所指向的存储。因为它应该是一个变量名,所以代码解析了一个符合名称条件的8字节字段的存储。代码将查找父母之间的内容。当父类之间的值大于8个字节而没有分隔符时,就会发生ISPS108。如果存储中的内容符合名称定义,那么我们继续,然后通过调用TSO来提供变量值来检查这个变量名包含什么。如果没有编码PARM,那么我们就绕过处理,因为不存在可选参数。

票数 0
EN

Stack Overflow用户

发布于 2017-10-21 12:11:00

像你在这里做的那样,经过帕斯是个坏主意。最好是将它们放到调用的exec中的变量池中,然后在宏中进行VGET。

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

一旦宏中有了“isredit change”命令,在某些情况下就不能工作了,这取决于string1和string2的实际值。例如,想象一下,如果其中包含像开头这样的单词,这也是更改命令的有效参数?

我以前做过

代码语言:javascript
复制
hexstring1 = c2x(string1)
hexstring2 = c2x(string2)
"address isredit change x'"hexstring1"' '"hexstring2"' all"

在这样的宏中,使字符串的内容完全不相关。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45421682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档