コピー元ファイルの中のゼロ・レコードのモニター
コピー元ファイルが物理ファイルまたは論理ファイルで、 コピーされることになる 1 つまたは複数のメンバーが空のときは、 コピーに関する特殊な考慮事項があります。
- COMPRESS(*NO) が CPYF コマンドで指定され、 コピー元ファイルにレコードが入っていない場合。
- COPY コマンドで COMPRESS(*YES) が指定され、 コピー元ファイル・メンバーに未削除レコードが入っていない場合。
コピー元のメンバーにレコード選択の指定 (CPYFRMQRYF コマンド、 または CPYF コマンドの INCCHAR および INCREL パラメーター) があり、 その結果レコードが生成されない場合には、空とは見なされません。
コピー先ファイルが (*PRINT を含む) プリンター・ファイルのとき、 またはコピー先ファイルが物理ファイルで、MBROPT(*ADD) または MBROPT(*UPDADD) が指定されているときは、 既存のデータが破壊されないため、 空のコピー元ファイル・メンバーがコピーされます。 コピーされた各メンバーは、通常のコピー完了メッセージによって識別されます。 コピー先ファイルがスプール・ファイルの場合は、 それぞれの空のコピー元ファイル・メンバーごとに空のスプール出力ファイルが生成されます。 CPYF コマンドの PRINT パラメーターで *COPIED、*EXCLD、または *ERROR を指定した場合は、 空メンバーがリストに示され、レコードは何も印刷されません。
- テープ・ファイルまたはディスケット・ファイルは、 出力ボリューム上に生成されません。 ディスケット・ファイルがスプール・ファイルのときは、 スプール出力ファイルは作成されません。
- 既存のコピー先ファイルの物理ファイル・メンバーは、消去されません。
- コピー先ファイルが存在せず、CRTFILE(*YES) がコピー・コマンドで指定された場合は、 物理ファイルが作成されます。
- コピー先ファイルが物理ファイルで、コピー先ファイル・メンバーが存在しない場合は、 メンバーがファイルに追加されます。
- CPYF コマンドの PRINT パラメーターで *COPIED、 *EXCLD、または *ERROR を指定した場合は、 空メンバーはリストに示されません。
コピー・コマンドで総称名、または FROMMBR パラメーターに対して *ALL を指定した場合は、 スキップされた空コピー元ファイル・メンバーは、 通知メッセージとして送られるメッセージ CPF2869 によって識別されます。 すべてのコピー元ファイル・メンバーがスキップされる場合は、 すべてに関する CPF2869 通知メッセージおよびそれに続く CPF2817 エスケープ・メッセージの後で、CPF2870 診断メッセージが送られます。
コピー・コマンドで単一メンバー名または FROMMBR (*FIRST) を指定した場合、 またはコピー元ファイルに対して、単一メンバーの処理を強制するオーバーライドがあるときは、 スキップされた空メンバーは診断メッセージ CPF2869 によって識別されます。 CPF2869 診断メッセージの後に CPF2817 エスケープ・メッセージが続きます。
PGM
/* No need to monitor for zero records
when MBROPT(*ADD) specified */
CPYF FROMFILE(D504/GEORGE) TOFILE(D504/KEN) +
FROMMBR(EMPTY1) TOMBR(MBR1) MBROPT(*ADD)
CPYF FROMFILE(D504/GEORGE) TOFILE(D504/KEN) +
FROMMBR(EMPTY2) TOMBR(MBR2) MBROPT(*REPLACE)
MONMSG MSGID(CPF2817) CMPDTA(CPF2869) +
EXEC(CLRPFM FILE(D504/KEN) MBR(MBR2))
/* Monitor for zero records and
send a message when all members
to copy are empty */
CPYF FROMFILE(D504/GEORGE) +
TOFILE(D504/NEWFILE) FROMMBR(EMPTY*) +
TOMBR(NEWMBR) MBROPT(*REPLACE)
MONMSG MSGID(CPF2817) CMPDTA(CPF2870) +
EXEC(SNDPGMMSG TOPGMQ(*EXT) +
MSG('All members to copy are empty'))
ENDPGM
最初の CPYF コマンドでは MBROPT(*ADD) が指定されているので、 コピー元ファイル・メンバーが空の場合に、 エスケープ・メッセージがプログラムに送られることはありません。 コピーの前に MBR1 が存在しない場合は、 (コピー元ファイル・メンバーが空であるかデータが入っているかに関係なく) MBR1 はコピー先ファイルに追加されるということに注意してください。
2 番目の CPYF コマンドでは、コピーの際、 コピー元ファイル・メンバーが空の場合に、コピー先ファイル・メンバーを消去することがないので、 2 番目の CPYF コマンドの後の MONMSG コマンドで CLRPFM コマンドを開始して、 コピー元ファイル・メンバーが空のとき、コピー先ファイル・メンバーを消去します。
3 番目の CPYF コマンドでは、 総称名 EMPTY* が使用され、複数のメンバーのコピーが要求されるので、 コピー元のメンバーがすべて空の場合は、 CPF2817 エスケープ・メッセージは CPF2870 の比較データを持ちます。