コピー元ファイルの中のゼロ・レコードのモニター

コピー元ファイルが物理ファイルまたは論理ファイルで、 コピーされることになる 1 つまたは複数のメンバーが空のときは、 コピーに関する特殊な考慮事項があります。

なお、メンバーは次の場合に空と見なされます。
  • COMPRESS(*NO) が CPYF コマンドで指定され、 コピー元ファイルにレコードが入っていない場合。
  • COPY コマンドで COMPRESS(*YES) が指定され、 コピー元ファイル・メンバーに未削除レコードが入っていない場合。

コピー元のメンバーにレコード選択の指定 (CPYFRMQRYF コマンド、 または CPYF コマンドの INCCHAR および INCREL パラメーター) があり、 その結果レコードが生成されない場合には、空とは見なされません。

コピー先ファイルが (*PRINT を含む) プリンター・ファイルのとき、 またはコピー先ファイルが物理ファイルで、MBROPT(*ADD) または MBROPT(*UPDADD) が指定されているときは、 既存のデータが破壊されないため、 空のコピー元ファイル・メンバーがコピーされます。 コピーされた各メンバーは、通常のコピー完了メッセージによって識別されます。 コピー先ファイルがスプール・ファイルの場合は、 それぞれの空のコピー元ファイル・メンバーごとに空のスプール出力ファイルが生成されます。 CPYF コマンドの PRINT パラメーターで *COPIED、*EXCLD、または *ERROR を指定した場合は、 空メンバーがリストに示され、レコードは何も印刷されません。

CPYFRMQRYF コマンドの場合を除けば、空のコピー元ファイル・メンバーは、 ディスケット・ファイルまたはテープ・ファイルにはコピーされず、 MBROPT(*REPLACE) が指定されているときは物理ファイルにもコピーされることはありません。 これらのタイプのコピー先ファイルの場合は、 空のコピー元ファイル・メンバーはスキップされ、 CPF2869 メッセージが (通知メッセージか診断メッセージかのどちらかで) 送られ、 空の各メンバーを識別します。 空のメンバーは、既存のデータの破壊を回避するためにスキップされます。 空コピー元ファイル・メンバーがスキップされるときは、 次の考慮事項が適用されます。
  • テープ・ファイルまたはディスケット・ファイルは、 出力ボリューム上に生成されません。 ディスケット・ファイルがスプール・ファイルのときは、 スプール出力ファイルは作成されません。
  • 既存のコピー先ファイルの物理ファイル・メンバーは、消去されません。
  • コピー先ファイルが存在せず、CRTFILE(*YES) がコピー・コマンドで指定された場合は、 物理ファイルが作成されます。
  • コピー先ファイルが物理ファイルで、コピー先ファイル・メンバーが存在しない場合は、 メンバーがファイルに追加されます。
  • CPYF コマンドの PRINT パラメーターで *COPIED、 *EXCLD、または *ERROR を指定した場合は、 空メンバーはリストに示されません。

コピー・コマンドで総称名、または FROMMBR パラメーターに対して *ALL を指定した場合は、 スキップされた空コピー元ファイル・メンバーは、 通知メッセージとして送られるメッセージ CPF2869 によって識別されます。 すべてのコピー元ファイル・メンバーがスキップされる場合は、 すべてに関する CPF2869 通知メッセージおよびそれに続く CPF2817 エスケープ・メッセージの後で、CPF2870 診断メッセージが送られます。

コピー・コマンドで単一メンバー名または FROMMBR (*FIRST) を指定した場合、 またはコピー元ファイルに対して、単一メンバーの処理を強制するオーバーライドがあるときは、 スキップされた空メンバーは診断メッセージ CPF2869 によって識別されます。 CPF2869 診断メッセージの後に CPF2817 エスケープ・メッセージが続きます。

次の例では、コピー元ファイルおよびコピー先ファイルが両方ともデータベース・ファイルで、 EMPTY1 および EMPTY2 はコピー元ファイルの中の空メンバーです。
注: コード例を使用することにより、お客様は コードに関するライセンス情報および特記事項の条件に同意することになります。
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 の比較データを持ちます。