WRITE ステートメントは、出力ファイルまたは入出力ファイルに 1 つの論理レコードを解放します。
WRITE ステートメントが実行される時には、次のようになっている必要があります。
フォーマット 1: 順次ファイルの WRITE ステートメント >>-WRITE--レコード名-1--+----------------+----------------------> | (1) | '-FROM--ID-1-----' >--+-+------------------------------------------------------+--| 句 1 |-+--> | '-+-BEFORE-+--+-----------+--+-+-ID-2---+--+-------+-+-' | | '-AFTER--' '-ADVANCING-' | '-整数-1-' +-LINE--+ | | | | '-LINES-' | | | +-簡略名-1--------------+ | | '-PAGE------------------' | '-| invalid_key |--| not_invalid_key |-------------------------------' >--+-----------+----------------------------------------------->< '-END-WRITE-' 句 1 |--+---------------------------------------------+------------> '-+----+--+-END-OF-PAGE-+--命令ステートメント-3-' '-AT-' '-EOP---------' >--+--------------------------------------------------+-------| '-NOT--+----+--+-END-OF-PAGE-+--命令ステートメント-4-' '-AT-' '-EOP---------' invalid_key |--+--------------------------------------+-------------------| '-INVALID--+-----+--命令ステートメント-1-' '-KEY-' not_invalid_key |--+------------------------------------------+---------------| '-NOT INVALID--+-----+--命令ステートメント-2-' '-KEY-'
フォーマット 2: 索引付きおよび相対ファイルの WRITE ステートメント >>-WRITE--レコード名-1---+------------+--------------------------> '-FROM--ID-1-' >--+--------------------------------------+-------------------> '-INVALID--+-----+--命令ステートメント-1-' '-KEY-' >--+------------------------------------------+---------------> '-NOT INVALID--+-----+--命令ステートメント-2-' '-KEY-' >--+-----------+----------------------------------------------->< '-END-WRITE-'
フォーマット 3: 行順次ファイルの WRITE ステートメント >>-WRITE--レコード名-1---+------------+--------------------------> '-FROM--ID-1-' >----+-----------------------------------------------------+----> '---AFTER----+-----------+--+-+-ID-2---+--+-------+-+-' '-ADVANCING-' | '-整数-1--' +-LINE--+ | | '-LINES-' | '-PAGE------------------' >--+-----------+----------------------------------------------->< '-END-WRITE-'
相対ファイルの場合、作成されるレコード内の文字位置数と、 置換されるレコード内の文字位置数は、異なっていても構いません。
MOVE ID-1 TO レコード名-1. WRITE record-name-1.
MOVE は、CORRESPONDING 句を指定していない MOVE ステートメントの規則に従って行われます。
ID-1 は、受け取り項目としてレコード名-1 が指定された MOVE ステートメントに対して、有効な送り出し項目でなければなりません。
ID-1 およびレコード名-1 は、同じストレージ域を参照することはできません。
WRITE ステートメントの実行後も、ID-1の中の情報は使用可能です (『共通の処理機能』にあるINTO 句および FROM 句を参照)。
ADVANCING 句は、ページ上での出力レコードの位置付けを制御します。
VSAM ファイルに対して、BEFORE 句および AFTER 句はサポートされていません。QSAM ファイルは順次に編成されます。ADVANCING 句と END-OF-PAGE 句は、印刷ページの各行の縦方向の位置付けを制御します。
単一の WRITE ステートメントには、ADVANCING PAGE 句と END-OF-PAGE 句を指定できます。
印刷ページが中間装置 (例えば、ディスク) に保持される場合は、その出力を編集またはブラウズするときに、フォーマットが予期したものと異なることがあります。
ADVANCING 句を指定する場合には、次の規則が適用されます。
FD 項目に LINAGE 節が含まれている場合には、 その節で指定された次のページの最初の印刷可能行に位置変更されます。 LINAGE 節を省略すると、位置変更は後に続く次のページの第 1 行目になります。
簡略名 句は、 カードせん孔装置ファイルのスタッカー選択のためにも指定することができます。スタッカー選択を使用する場合は、 WRITE AFTER ADVANCING を使用しなければなりません。
WRITE ステートメントに ADVANCING 句が指定されているか、ファイルに LINAGE 節があると、 書き出されるレコードの中に紙送り制御文字が生成されます。該当するファイルが EXTERNAL 節で定義されている場合、 実行単位内のすべてのファイル結合子は、 書き出されるレコードに紙送り制御文字が生成されるように定義されていなければなりません。 つまり、すべてのファイルに LINAGE 節がある場合は、 一部のプログラムが ADVANCING 句指定の WRITE ステートメントを使用し、 他のプログラムが ADVANCING 句が指定されていない WRITE ステートメントを使用することができます。 ただし、これらのファイルのいずれにも LINAGE 節がない場合で、 しかも ADVANCING 句指定の WRITE を使用するプログラムがある場合には、 実行単位内の WRITE ステートメントを使用するすべてのプログラムは、 ADVANCING 句指定の WRITE ステートメントを使用しなければなりません。
ADVANCING 句を省略すると、 AFTER ADVANCING 1 LINE を指定した場合と同じようにして自動行送りが行われます。
ファイルに対して LINAGE 節を指定すると、WRITE ステートメントの実行中、 次の規則に従って、関連する LINAGE-COUNTER 特殊レジスターが変更されます。
使用上の注意: ADV コンパイラー・オプションが指定されていると、 コンパイラーは制御文字を使用できるようにレコード長に 1 バイトを追加します。レコード定義の中に制御文字用に第 1 バイトを確保している場合には、 NOADV コンパイラー・オプションを使用してください。 LINAGE 節を使用して定義されているファイルでは、 NOADV コンパイラー・オプションは無効です。 コンパイラーはこのようなファイルについては、 ADV コンパイラー・オプションが指定されているかのように処理するからです。
VSAM ファイルに対して AT END-OF-PAGE 句はサポートされていません。
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 句を両方指定できます。
VSAM 順次ファイルに対して INVALID KEY 句はサポートされていません。
無効キー条件は、次の場合に起きます。
無効キー条件が起きると、以下のことが発生します。
明示的または暗黙の 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 モードでオープンされた順次ファイルに対してのみ実行できます (QSAM ファイルでは EXTEND モードでオープンされた順次ファイルに対して実行できます。)
マルチボリューム OUTPUT ファイル (テープまたは順次直接アクセス・ファイル) でボリュームの終わりが認識されたときは、 WRITE ステートメントは次の処理を行います。
パンチ機能を使用するときは、READ ステートメントの後の入出力操作は、 パンチ機能ファイルに対する WRITE ステートメントでなければなりません。
追加データを一部のカードだけにパンチしたい (他のカードにはパンチしない) ときは、 最初に出力域を SPACES で満たして、 ヌル・カードのためのダミーの WRITE ステートメントを発行する必要があります。
パンチ機能ファイルのためにスタッカー選択をしたい場合は、 SPECIAL-NAMES 段落で適切なスタッカー関数名を指定し、次に 関連する簡略名を使用して WRITE ADVANCING ステートメントを発行します。
パンチ機能操作 (指定してある場合) が完了した後、 印刷機能ファイルに対して WRITE ステートメントを発行することができます。
追加データを一部のデータ・カードだけに印刷したい (他のカードには印刷しない) ときは、 ヌル・カード用の WRITE ステートメントを省略することができます。 カードの限界を超えて書き込もうとすると、 その結果としてアプリケーションは必ず異常終了します。 したがって、END-OF-PAGE 句を指定することはできません。
使用する IBM 3525 の特定のモデルの能力に合わせて、 印刷ファイルを 2 行印刷ファイルまたは複数行印刷ファイルのどちらかにすることができます。各行には、64 文字まで印刷することができます。
行の制御は、 印刷機能ファイルに対して WRITE AFTER ADVANCING ステートメントを発行することによって指定されます。 そのようなステートメントの 1 つに行の制御を使用する場合は、 そのファイルに対して発行される他のすべての WRITE ステートメントでも行の制御を使用しなければなりません。 最大の印刷可能文字数は、スペース文字を含めて 64 です。 そのような WRITE ステートメントでは、行送りの抑止を指定することはできません。
ID と整数は、 他の WRITE AFTER ADVANCING ステートメントの場合と同じ意味を持っています。 ただし、そのような WRITE ステートメントでは、 カードの限界を超えて行位置を増やすことはできません。 そのようにすると異常終了します。
WRITE AFTER ADVANCING ステートメントの簡略名オプションも指定することができます。SPECIAL-NAMES 段落では、環境名と簡略名を以下の表で示したように関連付けることができます。
| 環境名 | 意味 |
|---|---|
| C02 | 行 3 |
| C03 | 行 5 |
| C04 | 行 7 |
| C05 | 行 9 |
| ... | ... |
| C22 | 行 21 |
| C12 | 行 23 |
索引付きファイルに対して 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 ステートメントが実行されると、 このレコードはファイルの中の指定された相対レコード番号の位置に入れられます。