Ошибка неверной длины при передаче параметров в макрос ispf из кода rexx
Я написал макрос для изменения строки всех членов PDS. Я передаю PDS, существующее значение и новое значение через JCL. Я получаю неверную ошибку длины при передаче аргументов в макрос ispf с помощью rexx. Ошибка:
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 Macro - 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. Я не могу получить основную причину ошибки. Может кто-нибудь помочь, пожалуйста?
3 ответа
Подумайте, что ваш редактор PARM ожидает имя переменной, а не ее значение.
ADDRESS ISPEXEC "EDIT DATASET ('"PDS"("LIBMEM.I")') " ||,
"MACRO ("MAC") PARM ("S12")"
Так что попробуй заменить "... PARM ("S12")"
с "... PARM (S12)"
Как указали Fritz и zarchasmpgmr, PARM должен указывать на имя переменной. Нам нужно увидеть макрос и исполняемый файл, чтобы убедиться, что мы знаем, что вы имеете в виду, жестко кодируя параметр в TEMPMAC и просто передавая имя макроса. PARM - необязательный параметр, поэтому он не требуется для EDIT. Если указан PARM, тогда код ISPF будет искать имя переменной. Таким образом, код смотрит на хранилище, на которое указывает параметр. Поскольку предполагается, что это имя переменной, код анализирует хранилище для 8-байтового поля, которое соответствует критериям для NAME. Код будет искать то, что находится между паренами. ISPS108 происходит, когда то, что находится между паренами, больше 8 байтов без разделителя. Если то, что находится в хранилище, соответствует определению NAME, тогда мы продолжим и позже проверим, что содержит это имя переменной, вызвав TSO для предоставления значения переменной. Если PARM не закодирован, то мы просто пропускаем обработку, поскольку необязательный параметр отсутствует.
Передача parms, как вы сделали здесь, плохая идея. Лучше поместить их в пул переменных внутри вызывающего exec, а затем VGET внутри макроса.
Хотя в этом случае значения STRING1 и STRING2 должны быть единичными токенами / словами (потому что именно так они были созданы с помощью оператора ARG в exec), подход vput / vget позволяет передавать произвольные строки в макрос. Нет смысла объединять их в одну переменную, а затем анализировать их отдельно в макросе, просто vput и затем vget оба из них.
Если у вас есть макрос, ваша команда isredit change не будет работать при некоторых обстоятельствах, в зависимости от того, что на самом деле являются значениями string1 и string2. Например, представьте, если они содержат такие слова, как FIRST LAST, которые также являются допустимыми параметрами для команды изменения?
обычно я делал
hexstring1 = c2x(string1)
hexstring2 = c2x(string2)
"address isredit change x'"hexstring1"' '"hexstring2"' all"
в таких макросах, так что совершенно неважно, каково содержимое строк.