メニューボタン
サポートチーム便り2023.11.08

CPYTOIMPFコマンドで後続ブランクが除去できません・・・

Question

CPYTOIMPFコマンドにてパラメーター RMVBLANK を指定していますが、後続ブランクが除去できません。

CPYTOIMPFコマンドやCPYFRMIMPFコマンドの挙動に関するデータエリアがあると噂を耳にしましたが、その影響でしょうか。

他のプログラムでもCPYTOIMPFコマンドを実行しているので、影響範囲が大きくなると困ります。

何か良い解決方法は無いでしょうか・・・

Answer

CPYTOIMPF コマンドにて RMVBLANK(*BOTH) などと指定しても期待通りにブランクが除去できない場合、データエリア QSYS/QCPTOIMPF が影響している可能性があります。

データエリア QSYS/QCPTOIMPF は、IBM i (AS/400)v5.3 以降のバージョンにて IBM i (AS/400)v5.2 までと同じ挙動をさせたい場合に作成します。

<参照URL> CPYFRMIMPF and CPYTOIMPF Data Areas
https://www.ibm.com/support/pages/cpyfrmimpf-and-cpytoimpf-data-areas

このデータエリアが存在すると、パラメーター RMVBLANK だけではなく、IBM i (AS/400)v5.3 以降で追加されたパラメーターが効かず、IBM i (AS/400)v5.2 までと同じ挙動となってしまいます。

本来であればデータエリア QSYS/QCPTOIMPF を削除して、他のプログラムや処理にて CPYTOIMPF コマンドのパラメーターの見直しや修正するようご案内しますが、そのような対応が難しいケースもあるかと思います。

実はライブラリー QSYS ではなく、ライブラリー QTEMP に同じ名前のデータエリア QCPTOIMPF を作成すると、データエリア QSYS/QCPTOIMPF が参照されなくなり、ブランクが除去できるようになります。

コマンド例:

CRTDTAARA DTAARA(QTEMP/QCPTOIMPF) TYPE(*CHAR) LEN(6) VALUE('NO')

これは、システムが初めにライブラリー QTEMP を検査して、ライブラリー QTEMP に有効なデータエリア QCPTOIMPF がある場合はその値に従って CPYTOIMPF コマンドを実行するためです。

ライブラリー QTEMP に有効なデータエリア QCPTOIMPF がなければ、次にライブラリー QSYS を検査します。

VALUE に指定できる値は3つあります。

データエリア QSYS/QCPTOIMPF を残したままブランクを除去したいのであれば、上記コマンド例のようにデータエリア QTEMP/QCPTOIMPF を VALUE('NO') にて作成してください。

  • NO:無効
  • YES:有効
  • CPV5R2:有効(YESと同義)

"VALUE('NO') なのに LEN(6) で作成するの?"と疑問に感じるかもしれません。

データエリア QSYS/QCPTOIMPF の VALUE('CPV5R2') が LEN(6) なので、データエリア QTEMP/QCPTOIMPF が有効なデータエリアとして認識されるためには、VALUE('NO') の場合であっても LEN(6) で作成する必要があります。

LEN(6)以外でデータエリアを作成しても有効なデータエリア QCPTOIMPF とは認識されないのでご注意ください。

p>ライブラリー QTEMP を参照するので有効範囲はそのジョブまでになります。

コマンド入力行から CPYTOIMPF コマンドを実行する場合でも、プログラム内で実行する場合でも、同一ジョブにてデータエリア QTEMP/QCPTOIMPF が作成されるように、有効範囲を意識して期待通りの結果となるかテストしてみてください。

コマンド例:

ADDENVVAR ENVVAR(QIBM_CP_DEBUG) LEVEL(*JOB)

データエリア QTEMP/QCPTOIMPF が存在しない場合

先にライブラリー QTEMP が検査されていますがデータエリア QCPTOIMPF が存在しないので、データエリア QSYS/QCPTOIMPF の値 'CPV5R2' が有効になっています。

データエリア QTEMP/QCPTOIMPF を VALUE('NO') で作成した場合

ジョブログに「QTEMP/QCPTOIMPF DATA AREA DISABLED BY VALUE 'NO'」と記録されます。

データエリア QTEMP/QCPTOIMPF の値 'NO' なので無効になっています(データエリア QSYS/QCPTOIMPF は参照されていない)ます。

by 槻樹

あわせて読みたい記事

PAGE TOP