&STRG は正しく 22桁のブランク値として渡されていますがINCCHAR(*RCD 10 *EQ &STRG) に値が代入されるとこの式はINCCHAR(*RCD 10 *EQ ) という式となってしまいます。これが CPYF によって1 桁のブランクと見なされてしまう原因となっています。引用符で囲む方法も正しく動作しませんでした。従って次のように条件分岐をするしか方法がなさそうです。0001.00 PGM PARM(&STRG) 0002.00 DCL VAR(&STRG) TYPE(*CHAR) LEN(22) 0003.00 0004.00 IF COND(&STRG *EQ ' ') THEN(DO) 0005.00 CPYF FROMFILE(FILEA) TOFILE(FILEB) MBROPT(*ADD) + 0006.00 CRTFILE(*YES) INCCHAR(*RCD 10 *EQ ' ') + 0007.00 FMTOPT(*NOCHK) 0008.00 ENDDO 0009.00 ELSE CMD(DO) 0010.00 CPYF FROMFILE(FILEA) TOFILE(FILEB) MBROPT(*ADD) + 0011.00 CRTFILE(*YES) INCCHAR(*RCD 10 *EQ &STRG) + 0012.00 FMTOPT(*NOCHK) 0013.00 ENDDO 0014.00 ENDPGM
回答ありがとうございました。ブランクが一つの場合はこの方法で切り抜けられますね。ブランクが複数の場合や'ABC 'とかの場合面倒になりますね。(CPYFをブランクの回数繰り返すとか)対話式にCPYFを行う場合このようなことは問題にならないので何か方法はありそうな気はしますが・・・
根本的な解決をしようとすると、少し面度にはなりますが下記のように3つの文字列 : CPYF FROMFILE .... ' + &STRG + ') FMTOPT ...' をこのようにして結合したものを API: QCMDEXC で実行させることです。この方法であれば &STRG にどのような値が入っていても正しく希望通りに動作します。0001.00 PGM PARM(&STRG) 0002.00 DCL VAR(&STRG) TYPE(*CHAR) LEN(22) 0003.00 DCL VAR(&CMD) TYPE(*CHAR) LEN(512) 0004.00 DCL VAR(&CMDLEN) TYPE(*DEC) LEN(15 5) VALUE(512) 0005.00 0006.00 CHGVAR VAR(&CMD) VALUE('CPYF + 0007.00 FROMFILE(FILEA) + 0008.00 TOFILE(FILEB) MBROPT(*ADD) + 0009.00 CRTFILE(*YES) INCCHAR(*RCD 10 *EQ ''' + 0010.00 *CAT &STRG *CAT ''') FMTOPT(*NOCHK)') 0011.00 CALL PGM(QCMDEXC) PARM(&CMD &CMDLEN) 0012.00 ENDPGM