2017-07-31 9 views
0

文字列を変更するためにPDSのすべてのメンバーを書きました。私は PDS、既存の値と新しい値をJCL経由で渡しています。 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がある:JCLで

/*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          

、私は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")" 

だから、フリッツとzarchasmpgmrはPARMは、変数名で指していなければなりません指摘したように"... PARM (S12)"

+1

これは正しいです。'EDIT'(および' VIEW')の 'PARM'パラメーターの値は、値ではなくISPF変数の**名前**です。 ISPFサービスには、可変値ではなく変数名を指定する場所がかなりあります。 LMサービスはこれで有名です。例えば、 'LMINIT'は変数** name **を求めていますが、他の変数は変数** value **を求めています。何が望まれているかを見る最も簡単な方法は、変数名が使用されている場合、パラメータ記述が** - var **で終了することです。この場合、それは 'PARM(parm-var)'と定義されています。 – zarchasmpgmr

+0

ありがとうフリッツ!出来た。しかし、奇妙なことは、TEMPMACマクロでパラメータをハードコードし、マクロ名を渡すだけで動作していたことです。 – bp89

0

"... PARM ("S12")"を交換してみてください。 TEMPMACでパラメータをハードコーディングし、マクロ名を渡すだけで何を意味するのかを確認するには、マクロとexecを確認する必要があります。 PARMはオプションのパラメータなので、EDITでは必須ではありません。 PARMが指定されている場合、ISPFコードは変数名を検索します。したがってコードは、パラメータが指す記憶域を調べます。変数名であるはずなので、コードはNAMEの基準を満たす8バイトのフィールドの記憶域を解析しています。コードは、括弧の間にあるものを探します。 ISPS108は、括弧間の区切りが区切り文字なしの8バイトを超える場合に発生します。記憶域にあるものがNAME定義を満たしていれば、引き続き変数値を供給するためにTSOを呼び出して、この変数名が何を含んでいるかを確認します。 PARMがコード化されていない場合、省略可能なパラメータが存在しないので処理をバイパスします。

+0

その他のメモ..上記のREXXでは、PARMは PARM(2016-01-01 IWPULDT)-01-01のように8文字を超えていて、S108メッセージを生成しました。 8未満であれば(例えばPARM(2016 IWPULDT))、ISPS109を取得したはずです - 予期しないリストが見つかりました。リストが期待されていないところで名前のリストが見つかりました。だから、それはPARM(...)の中にあるものに依存します。 PARM()にはエラーはありません。 –

0

ここで行ったやり方でparmsを渡すのは悪い考えです。呼び出し側execの内部の変数プールにそれらをVPUTし、マクロ内でそれらをVGETする方が良いでしょう。

この場合、STRING1とSTRING2の値は単一のトークン/ワードでなければなりません(これはexecのARGステートメントによって作成されたものです)。vput/vgetのアプローチにより、任意の文字列をマクロに渡すことができます。それらを1つの変数に連結して、マクロ内でそれを構文解析するという点はありません。単にvput &をvgetしてください。

マクロを使用すると、実際にはstring1とstring2の値によっては、 'isredit change'コマンドが動作しないことがあります。たとえば、変更コマンドの有効なパラメータでもあるFIRST LASTのような単語が含まれているとしたらどうでしょうか?

私はそれは文字列の内容が何であるかを完全に無関係だようなマクロに

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

を行うために使用。

関連する問題