2017-07-31 29 views
0

我寫了一個宏來更改字符串PDS的所有成員。我通過JCL傳遞 PDS,現有值和新值。 我使用rexx將參數傳遞給ispf宏時出現無效長度錯誤。錯誤是:從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. 我無法找到錯誤的根本原因。有人可以幫忙嗎?

回答

5

認爲您的編輯PARM正在等待變量名稱,而不是值。

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

所以儘量用"... PARM (S12)"

+1

這是正確的。'EDIT'(和'VIEW')的'PARM'參數中的值是ISPF變量的**名稱**,而不是值。 ISPF服務中有不少位置指定變量名稱,而不是變量值。 LM服務因此而臭名昭着。例如,'LMINIT'想要變量**名稱**,但其他變量需要**值**。查看所需內容的最簡單方法是,如果使用變量名稱,參數描述將以** - var **結尾;在這種情況下,它被定義爲'PARM(parm-var)'。 – zarchasmpgmr

+0

謝謝Fritz!有效。但奇怪的是,當我在TEMPMAC宏中硬編碼參數時,它正在工作,並且只是傳遞宏名稱。 – bp89

0

更換"... PARM ("S12")"至於弗裏茨和zarchasmpgmr指出PARM必須在變量名點。 我們需要查看宏和exec,以確保我們知道您在TEMPMAC中對參數進行硬編碼並僅傳遞宏名稱即表示您的意思。 PARM是一個可選參數,所以EDIT不需要它。如果指定PARM,則ISPF代碼將查找變量名稱。所以代碼查看參數指向的存儲空間。由於它應該是一個變量名,因此該代碼正在解析符合NAME標準的8字節字段的存儲。代碼將查找哪些父項之間的內容。 ISPS108發生在什麼之間的parens是大於8個字節沒有分隔符。如果存儲中的內容滿足NAME定義,則我們繼續並稍後檢查,通過調用TSO提供變量值來查看此變量名稱包含的內容。如果PARM沒有編碼,那麼我們只是繞過處理,因爲可選參數不存在。

+0

附加說明..在REXX上面PARM看起來像 PARM(2016-01-01 IWPULDT) 2016-01-01超過8個字符並導致S108消息。如果它小於8(例如PARM(2016 IWPULDT)),那麼您將得到ISPS109 - 發現意外列表。發現名單不在預期列表中。所以這一切都取決於PARM(...)中的內容。 PARM()不會有錯誤。 –

0

按照你在這裏完成的方式傳遞parms是一個壞主意。最好是將它們VPV調用到調用exec中的變量池中,然後將它們VGET放入宏中。

儘管在這種情況下,STRING1和STRING2的值必須是單個標記/字(因爲這是它們如何由exec中的ARG語句創建的),vput/vget方法允許您將任意字符串傳遞到宏中。沒有必要將它們連接成一個單獨的變量,然後在宏中解析它們,只要輸入&然後將它們兩個都分開。

一旦你有了宏,你的'isredit change'命令在某些情況下將不起作用,這取決於string1和string2的實際值。想象一下,如果它們包含像FIRST LAST這樣的詞,它們也是更改命令的有效參數?

我用來做

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

在這樣的宏,以便它是完全不相干的什麼字符串的內容。

相關問題