Rational Developer for System z
Enterprise COBOL for z/OS バージョン 4.1 言語解説書


WRITE ステートメント

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-'                           

注:
  1. BEFORE、AFTER、INVALID KEY、および AT END OF PAGE の各句は、VSAM ファイルに対して無効です。
構文図を読む構文図をスキップする
フォーマット 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-'   

レコード名-1
データ部の FD 項目に定義されている必要があります。 レコード名-1 は修飾することができます。 ソート・ファイルやマージ・ファイルと関連付けることはできません。

相対ファイルの場合、作成されるレコード内の文字位置数と、 置換されるレコード内の文字位置数は、異なっていても構いません。

FROM 句
FROM ID-1 句を指定した WRITE ステートメントの実行結果は、 次のステートメントを指定した順序で実行した場合と同じになります。
MOVE ID-1 TO レコード名-1.
WRITE record-name-1. 

MOVE は、CORRESPONDING 句を指定していない MOVE ステートメントの規則に従って行われます。

ID-1
ID-1 は以下のいずれかを参照できます。
  • 作業用ストレージ・セクション、ローカル・ストレージ・セクション、またはリンケージ・セクションに定義されたデータ項目
  • すでにオープンされた別のファイルのレコード記述
  • 英数字関数
  • 国別関数

ID-1 は、受け取り項目としてレコード名-1 が指定された MOVE ステートメントに対して、有効な送り出し項目でなければなりません。

ID-1 およびレコード名-1 は、同じストレージ域を参照することはできません。

WRITE ステートメントの実行後も、ID-1の中の情報は使用可能です (『共通の処理機能』にあるINTO 句および FROM 句を参照)。

ID-2
これは整数データ項目である必要があります。

ADVANCING 句

ADVANCING 句は、ページ上での出力レコードの位置付けを制御します。

VSAM ファイルに対して、BEFORE 句および AFTER 句はサポートされていません。QSAM ファイルは順次に編成されます。ADVANCING 句と END-OF-PAGE 句は、印刷ページの各行の縦方向の位置付けを制御します。

単一の WRITE ステートメントには、ADVANCING PAGE 句と END-OF-PAGE 句を指定できます。

印刷ページが中間装置 (例えば、ディスク) に保持される場合は、その出力を編集またはブラウズするときに、フォーマットが予期したものと異なることがあります。

ADVANCING 句の規則

ADVANCING 句を指定する場合には、次の規則が適用されます。

  1. BEFORE ADVANCING を指定すると、ページが進む前に行が印刷されます。
  2. AFTER ADVANCING を指定すると、行が印刷される前にページが進みます。
  3. ID-2 を指定した場合、 そのページは ID-2 の現行値に等しい行数だけ行送りされます。ID-2 には、基本整数データ項目を指名しなければなりません。ID-2 はウィンドウ表示日付フィールドを指名することはできません。
  4. 整数を指定すると、ページは、その整数値に等しい行数だけ行送りされます。
  5. 整数または ID-2 の値は 0 とすることができます。
  6. PAGE を指定する場合、 使用する句が BEFORE か AFTER かにより装置が次の論理ページに位置付けされる前に (BEFORE)、 または位置付けされた後で (AFTER)、レコードは論理ページ上に印刷されます。 PAGE が使用されている装置で意味を持たない場合、 BEFORE または AFTER (どちらの句が指定されているかに応じて) ADVANCING 1 LINE が想定されます。

    FD 項目に LINAGE 節が含まれている場合には、 その節で指定された次のページの最初の印刷可能行に位置変更されます。 LINAGE 節を省略すると、位置変更は後に続く次のページの第 1 行目になります。

  7. 簡略名 を指定すると、チャネル 1 から 12 へのスキップ、 または行送り抑制が行われます。簡略名 SPECIAL-NAMES 段落内の環境名-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-COUNTER の規則

ファイルに対して LINAGE 節を指定すると、WRITE ステートメントの実行中、 次の規則に従って、関連する LINAGE-COUNTER 特殊レジスターが変更されます。

  1. ADVANCING PAGE が指定されていると、LINAGE-COUNTER は 1 にリセットされます。
  2. ADVANCING ID-2 または整数 を指定している場合、LINAGE-COUNTER は、ID-2 または整数 の値だけ増やされます。
  3. ADVANCING 句を省略している場合、LINAGE-COUNTER は 1 だけ増やされます。
  4. 装置が新しいページの最初の使用可能行に再配置されると、 LINAGE-COUNTER は 1 にリセットされます。

使用上の注意: ADV コンパイラー・オプションが指定されていると、 コンパイラーは制御文字を使用できるようにレコード長に 1 バイトを追加します。レコード定義の中に制御文字用に第 1 バイトを確保している場合には、 NOADV コンパイラー・オプションを使用してください。 LINAGE 節を使用して定義されているファイルでは、 NOADV コンパイラー・オプションは無効です。 コンパイラーはこのようなファイルについては、 ADV コンパイラー・オプションが指定されているかのように処理するからです。

END-OF-PAGE 句

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 句を両方指定できます。

INVALID KEY 句

VSAM 順次ファイルに対して INVALID KEY 句はサポートされていません。

無効キー条件は、次の場合に起きます。

  • 順次ファイルの場合、外部的に定義されたファイルの境界を超えて書き出そうとした場合。
  • 索引付きファイルの場合:
    • 外部的に定義されたファイルの境界を超えて書き出そうとした場合。
    • ACCESS SEQUENTIAL が指定されており、ファイルが OUTPUT モードでオープンされ、 基本レコード・キーの値が前のレコードの基本レコード・キー値よりも大きくない場合。
    • ファイルが OUTPUT モードまたは I-O モードでオープンされ、 基本レコード・キーの値がすでに存在するレコードの基本レコードの値に等しい場合。
  • 相対ファイルの場合:
    • 外部的に定義されたファイルの境界を超えて書き出そうとした場合。
    • アクセス・モードがランダムまたは動的である場合に、 RELATIVE KEY データ項目がファイル内の既存レコードを指定している場合。
    • 相対レコード番号の有効数字の数が、 ファイルの相対キー・データ項目のサイズより大きい場合。

無効キー条件が起きると、以下のことが発生します。

  • INVALID KEY 句が指定されている場合、命令ステートメント-1 が実行されます。無効キーの処理の詳細については、無効キー条件を参照してください。
  • INVALID KEY 句が指定されていない場合、WRITE ステートメントは失敗し、レコード名 の内容は影響を受けません (QSAM ファイルを除く)。さらに、以下のことが発生します。
    • 順次ファイルの場合、ファイル状況キーが指定してあれば、更新されて EXCEPTION/ERROR 条件が存在します。

      明示的または暗黙の EXCEPTION/ERROR プロシージャーがファイルに指定されている場合、 そのプロシージャーが実行されます。 そのようなプロシージャーが指定されていない場合は、結果は予測できません。

    • 対および索引付きファイルの場合、プログラム実行は、『共通の処理機能』の 無効キー条件で説明されている規則に従って進められます。

      OPEN OUTPUT モードの相対ファイルに適用される INVALID KEY 条件は、 OPEN EXTEND モードの相対ファイルにも適用されます。

  • NOT INVALID KEY 句が指定され、 WRITE ステートメントの実行の終わりに有効なキー条件が起きたときには、ID-4 に制御が移されます。

INVALID KEY 句および利用可能な EXCEPTION/ERROR プロシージャーは、両方とも省略することができます。

END-WRITE 句

この明示的範囲終了符号は、WRITE ステートメントの範囲を区切るために使用されます。END-WRITE 句を使用することによって、 条件的な WRITE ステートメントを他の条件ステートメントの中にネストすることができます。 END-WRITE 句は、命令の WRITE ステートメントと共に使用することもできます。

詳しくは、範囲区切りステートメントを参照してください。

順次ファイル用 WRITE

順次ファイルの最大レコード・サイズは、ファイルの作成時に設定され、後で変更することはできません。

WRITE ステートメントの実行後、論理レコードはレコード名-1 の中で使用することはできなくなります。ただし、次のいずれかの場合を除きます。

  • 関連するファイルが、SAME RECORD AREA 節内に指定している場合 (この場合、 レコードは SAME RECORD AREA 節で指名された他のファイルのレコードとしても使用可能です)。
  • WRITE ステートメントの実行が、境界違反を理由に失敗した場合。

これらの場合には、レコード名-1 の中の論理レコードは使用可能です。

ファイル位置標識は、WRITE ステートメントの実行によって影響を受けません。

ファイル内にレコードを保管するために必要な文字位置の数は、 COBOL プログラムの中でレコードの論理記述によって定義された文字位置の数と同じであっても、 同じでなくても構いません (PICTURE 節の編集および USAGE 節を参照)。

ファイル制御項目の中で FILE STATUS 節を指定している場合、WRITE ステートメントが実行されると、それが正常に実行されたかどうかにかかわりなく、関連するファイル状況キーが更新されます。

WRITE ステートメントは、OUTPUT モードでオープンされた順次ファイルに対してのみ実行できます (QSAM ファイルでは EXTEND モードでオープンされた順次ファイルに対して実行できます。)

マルチボリューム・ファイル

マルチボリューム OUTPUT ファイル (テープまたは順次直接アクセス・ファイル) でボリュームの終わりが認識されたときは、 WRITE ステートメントは次の処理を行います。

  • 標準の終了ボリューム・ラベル・プロシージャー
  • ボリュームの切り替え
  • 標準の開始ボリューム・ラベル・プロシージャー

IBM 3525 でのパンチ機能ファイル

パンチ機能を使用するときは、READ ステートメントの後の入出力操作は、 パンチ機能ファイルに対する WRITE ステートメントでなければなりません。

追加データを一部のカードだけにパンチしたい (他のカードにはパンチしない) ときは、 最初に出力域を SPACES で満たして、 ヌル・カードのためのダミーの WRITE ステートメントを発行する必要があります。

パンチ機能ファイルのためにスタッカー選択をしたい場合は、 SPECIAL-NAMES 段落で適切なスタッカー関数名を指定し、次に 関連する簡略名を使用して WRITE ADVANCING ステートメントを発行します。

印刷機能ファイル

パンチ機能操作 (指定してある場合) が完了した後、 印刷機能ファイルに対して WRITE ステートメントを発行することができます。

追加データを一部のデータ・カードだけに印刷したい (他のカードには印刷しない) ときは、 ヌル・カード用の WRITE ステートメントを省略することができます。 カードの限界を超えて書き込もうとすると、 その結果としてアプリケーションは必ず異常終了します。 したがって、END-OF-PAGE 句を指定することはできません。

使用する IBM 3525 の特定のモデルの能力に合わせて、 印刷ファイルを 2 行印刷ファイルまたは複数行印刷ファイルのどちらかにすることができます。各行には、64 文字まで印刷することができます。

  • 2 行印刷ファイルでは、 行は、行 1 (カードの最上端) と行 3 (パンチ段 11 と 12 の間) に印刷されます。行の制御を指定することはできません。 自動的な行送りが行われます。
  • 複数行印刷ファイルでは、25 行までの文字を印刷することができます。 行の制御を指定することができます。 行の制御を指定しなければ、自動的な行送りが行われます。

行の制御は、 印刷機能ファイルに対して WRITE AFTER ADVANCING ステートメントを発行することによって指定されます。 そのようなステートメントの 1 つに行の制御を使用する場合は、 そのファイルに対して発行される他のすべての WRITE ステートメントでも行の制御を使用しなければなりません。 最大の印刷可能文字数は、スペース文字を含めて 64 です。 そのような WRITE ステートメントでは、行送りの抑止を指定することはできません。

ID と整数は、 他の WRITE AFTER ADVANCING ステートメントの場合と同じ意味を持っています。 ただし、そのような WRITE ステートメントでは、 カードの限界を超えて行位置を増やすことはできません。 そのようにすると異常終了します。

WRITE AFTER ADVANCING ステートメントの簡略名オプションも指定することができます。SPECIAL-NAMES 段落では、環境名と簡略名を以下の表で示したように関連付けることができます。

表 1. SPECIAL NAMES 段落内の環境名の意味
環境名 意味
C02 行 3
C03 行 5
C04 行 7
C05 行 9
... ...
C22 行 21
C12 行 23

Advanced Function Printing

環境名 AFP-5A と関連付けられた簡略名で WRITE ADVANCING 句を使用するときには、印刷サービス機能™ (PSF) 制御文字が、出力レコードの制御文字の位置に入れられます。この制御文字 (X'5A') を使用すると、高機能印刷 (AFP™) サービスを使用することができます。詳細については、印刷サービス機能製品: PSF for OS/390® & z/OS (5655-B17) の資料を参照してください。

索引付きファイル用 WRITE

索引付きファイルに対して WRITE ステートメントを実行する場合、その前に基本レコード・キー (ファイル制御項目で定義した RECORD KEY データ項目) を必要な値に設定しておく必要があります。RECORD KEY 値は、ファイル内で固有でなければならないことに注意してください。

ファイル制御項目の中に ALTERNATE RECORD KEY 節も指定してある場合、 DUPLICATES 句が指定されていない限り、各代替レコード・キーも固有でなければなりません。 DUPLICATES 句が指定されている場合、代替レコード・キー値は固有である必要はありません。 この場合、システムは、後でレコードを順次にアクセスするときに、 保管したときと同じ順序で取り出すことができるようにレコードを保管します。

ファイル制御項目の中に ACCESS IS SEQUENTIAL が指定されている場合、 RECORD KEY 値の昇順にレコードを書き出さなければなりません。

ファイル制御項目の中に ACCESS IS RANDOM または ACCESS IS DYNAMIC が指定されている場合、 レコードはプログラマーが指定した任意の順序で書き出すことができます。

相対ファイル用 WRITE

相対レコード OUTPUT ファイルの場合、WRITE ステートメントによって以下の操作が行われます。

  • ACCESS IS SEQUENTIAL が指定されている場合。

    書き込まれる最初のレコードは、 相対レコード番号 1 を持ち、2 番目のレコードは相対レコード番号 2 を持ち、 3 番目のレコードは相対レコード番号 3 を持つ、というようになります。

    ファイル制御項目の中で RELATIVE KEY が指定されていれば、 WRITE ステートメントの実行時に、書き込まれたばかりのレコードの相対レコード番号が、 RELATIVE KEY の中に入れられます。

  • ACCESS IS RANDOM または ACCESS IS DYNAMIC を指定した場合は、 WRITE ステートメントを発行する前に、 このレコードの希望する相対レコード番号を RELATIVE KEY に入れておかなければなりません。 WRITE ステートメントが実行されると、 このレコードはファイルの中の指定された相対レコード番号の位置に入れられます。

I-O ファイルの場合、 ACCESS IS RANDOM または ACCESS IS DYNAMIC のいずれかを指定する必要があります。 WRITE ステートメントは新規レコードをファイルに挿入します。 WRITE ステートメントを発行する前に、 このレコードの希望する相対レコード番号を RELATIVE KEY に入れておかなければなりません。 WRITE ステートメントが実行されると、 このレコードはファイルの中の指定された相対レコード番号の位置に入れられます。


ご利用条件 | フィードバック

このインフォメーション・センターでは Eclipse テクノロジーが採用されています。(http://www.eclipse.org)