WRITE ステートメントは、出力ファイルまたは入出力ファイルに 1 つの論理レコードを解放します。
WRITE ステートメントが実行される時には、次のようになっている必要があります。
相対ファイルの場合、作成されるレコード内の文字位置数と、 置換されるレコード内の文字位置数は、異なっていても構いません。
MOVE identifier-1 TO record-name-1. WRITE record-name-1.
MOVE は、CORRESPONDING 句を指定していない MOVE ステートメントの規則に従って行われます。
ID-1 は、受け取り項目としてレコード名-1 が指定された MOVE ステートメントに対して、有効な送り出し項目でなければなりません。
ID-1 およびレコード名-1 は、同じストレージ域を参照することはできません。
WRITE ステートメントの実行後も、ID-1の中の情報は使用可能です (『共通の処理機能』にあるINTO 句および FROM 句を参照。)
ADVANCING 句は、ページ上での出力レコードの位置付けを制御します。
環境名 C01-C012 または S01-S05 で WRITE ADVANCING を指定すると、1 行行送りされます。
ADVANCING 句を指定する場合には、次の規則が適用されます。
FD 項目に LINAGE 文節が含まれている場合には、 その文節で指定された次のページの最初の印刷可能行に位置変更されます。 LINAGE 文節を省略すると、位置変更は後に続く次のページの第 1 行目になります。
ADVANCING 句を省略すると、 AFTER ADVANCING 1 LINE を指定した場合と同じようにして自動行送りが行われます。
ファイルに対して LINAGE 文節を指定すると、WRITE ステートメントの実行中、 次の規則に従って、関連する LINAGE-COUNTER 特殊レジスターが変更されます。
END-OF-PAGE 句が指定されている場合、 WRITE ステートメントの実行時に印刷ページの論理的終わりに達すると、 END-OF-PAGE 命令ステートメントが実行されます。 END-OF-PAGE 句を指定する場合、このファイルの FD 項目には、LINAGE 文節がなければなりません。
印刷ページの論理的終わりは、関連する LINAGE 文節の中で指定します。
END-OF-PAGE 条件が起こるのは、 WRITE END-OF-PAGE ステートメントの実行によって、 ページ本体のフッター域内で印刷または行送りが行われるときです。これが起こるのは、LINAGE-COUNTER 特殊レジスターの値が、 LINAGE 文節の WITH FOOTING 句で指定された値に等しくなる、またはそれを超えてしまうような WRITE ステートメントが実行されたときです。 WRITE ステートメントが実行され、次いで END-OF-PAGE 命令ステートメントが実行されます。
ある WRITE ステートメント (END-OF-PAGE 句の指定の有無に関係なく) が現在のページ本体の中で最後まで実行できないとき、自動的なページ・オーバーフロー条件が起こります。これは、WRITE ステートメントが実行されると、 LINAGE-COUNTER の値が LINAGE 文節で指定されたページ本体の行数を超えてしまうときに起こります。この場合は、 装置が次の論理ページの最初の印刷可能な行 (LINAGE 文節で指定する) に位置変更される前 (BEFORE)、 または位置変更された後で (AFTER)、 行が印刷されます (前になるか後になるかは BEFORE、 AFTER のうちのどちらの句を指定するかによって異なります)。 END-OF-PAGE 句が指定されていれば、次に END-OF-PAGE 命令ステートメントが実行されます。
LINAGE 文節の WITH FOOTING 句が指定されていない場合、ページ終了条件を (ページ・オーバーフロー条件と異なるものとして) 検知することができないために、 自動的なページ・オーバーフロー条件が起こります。
WITH FOOTING 句が指定されていても、ある WRITE ステートメントを実行すると、 LINAGE-COUNTER が LINAGE 文節で指定されたフッター域の値とページ本体の値を両方とも超えてしまう場合には、 ページ終了条件と自動的なページ・オーバーフロー条件が同時に起こります。
キーワード END-OF-PAGE と EOP は同じ意味です。
単一の WRITE ステートメントには、 ADVANCING PAGE 句と END-OF-PAGE 句を両方指定できます。
無効キー条件が起きると、以下のことが発生します。
明示的または暗黙の EXCEPTION/ERROR プロシージャーがファイルに指定されている場合、そのプロシージャーが実行されます。そのようなプロシージャーが指定されていない場合は、結果は予測できません。
OPEN OUTPUT モードの相対ファイルに適用される INVALID KEY 条件は、 OPEN EXTEND モードの相対ファイルにも適用されます。
INVALID KEY 句および利用可能な EXCEPTION/ERROR プロシージャーは、両方とも省略することができます。
この明示的範囲終了符号は、WRITE ステートメントの範囲を区切るために使用されます。 END-WRITE 句を使用することによって、 条件的な WRITE ステートメントを他の条件ステートメントの中にネストすることができます。 END-WRITE 句は、命令の WRITE ステートメントと共に使用することもできます。
詳しくは、範囲区切りステートメントを参照してください。
順次ファイルの最大レコード・サイズは、ファイルの作成時に設定され、後で変更することはできません。
WRITE ステートメントの実行後、論理レコードはレコード名-1 の中で使用することはできなくなります。ただし、次のいずれかの場合を除きます。
これらの場合には、レコード名-1 の中の論理レコードは使用可能です。
ファイル位置標識は、WRITE ステートメントの実行によって影響を受けません。
ファイル内にレコードを保管するために必要な文字位置の数は、 COBOL プログラムの中でレコードの論理記述によって定義された文字位置の数と同じであっても、同じでなくても構いません (PICTURE 文節の編集および USAGE 文節を参照)。
ファイル制御項目の中で FILE STATUS 文節を指定している場合、WRITE ステートメントが実行されると、それが正常に実行されたかどうかにかかわりなく、関連するファイル状況キーが更新されます。
WRITE ステートメントは、OUTPUT モードでオープンされた順次ファイルに対してのみ実行できます。
索引付きファイルに対して WRITE ステートメントを実行する場合、その前に基本レコード・キー (ファイル制御項目で定義した RECORD KEY データ項目) を必要な値に設定しておく必要があります。 RECORD KEY 値は、ファイル内で固有でなければならないことに注意してください。
ファイル制御項目の中に ALTERNATE RECORD KEY 文節も指定してある場合、 DUPLICATES 句が指定されていない限り、各代替レコード・キーも固有でなければなりません。 DUPLICATES 句が指定されている場合、代替レコード・キー値は固有である必要はありません。 この場合、システムは、後でレコードを順次にアクセスするときに、 保管したときと同じ順序で取り出すことができるようにレコードを保管します。
ファイル制御項目の中に ACCESS IS SEQUENTIAL が指定されている場合、 RECORD KEY 値の昇順にレコードを書き出さなければなりません。
ファイル制御項目の中に ACCESS IS RANDOM または ACCESS IS DYNAMIC が指定されている場合、レコードはプログラマーが指定した任意の順序で書き出すことができます。
相対レコード OUTPUT ファイルの場合、WRITE ステートメントによって以下の操作が行われます。
書き込まれる最初のレコードは、 相対レコード番号 1 を持ち、2 番目のレコードは相対レコード番号 2 を持ち、 3 番目のレコードは相対レコード番号 3 を持つ、というようになります。
ファイル制御項目の中で RELATIVE KEY が指定されていれば、 WRITE ステートメントの実行時に、書き込まれたばかりのレコードの相対レコード番号が、 RELATIVE KEY の中に入れられます。
I-O ファイルの場合、 ACCESS IS RANDOM または ACCESS IS DYNAMIC のいずれかを指定する必要があります。 WRITE ステートメントは新規レコードをファイルに挿入します。 WRITE ステートメントを発行する前に、 このレコードの希望する相対レコード番号を RELATIVE KEY に入れておかなければなりません。 WRITE ステートメントが実行されると、 このレコードはファイルの中の指定された相対レコード番号の位置に入れられます。