WRITE(書き出し)文

WRITE(書き出し)文は、論理レコードを出力ファイルまたは入出力両用ファイルに書き出す。順ファイルに関しては、論理ページ内での縦方向の行の位置付けにもWRITE文を使用できる。

標準COBOL定義の一部を構成するにもかかわらず、X/OpenのCOBOL言語定義では、ADVANCING指定中の呼び名は明示的に除外されている。したがって、X/OpenのCOBOLに準拠する原始プログラム内では呼び名を使用するべきではない。

一般形式

形式 1 (レコード順ファイル
dialm.gifおよび行順ファイル)

形式 2 (レコード順ファイル)

形式 3 (レコード順ファイル)

形式 4 (相対ファイルおよび索引ファイル)

指令とランタイム・スイッチ

  1. 予約語リストにフラグを付けたり修正したりするコンパイラ指令に加えて、下記の指令によって、この項に記述した構文または意味が影響を受ける可能性がある。

    • WRITE-LOCK - 複数のレコード・ロックを使用しているときに、WRITE文にレコード・ロックを取得させる

    • FDCLEAR - WRITE文の後で、レコード領域の内容を予知できるようにする。

  2. 下記のランタイム・スイッチによって、この項に記述した意味が影響を受ける可能性がある。

    • N - 行順レコードを書くときに、制御文字の前への空文字の挿入を制御する。

    • T - 行順レコードを書くときに、タブ文字の挿入を制御する。

構文規則

すべての形式 (すべてのファイル)
  1. 一意名-1が関数一意名である場合は、英数字関数を参照すること。一意名-1が関数一意名でない場合は、レコード名と一意名-1が同じ記憶領域を指してはならない。

  2. レコード名は、データ部のファイル節内の論理レコードの名前であり、修飾してもよい。

  3. レコード名に、浮動小数点数項目を指定してもよい。

  4. 一意名-1は、浮動小数点数項目として定義してもよい。
形式 1 (レコード順ファイル)
  1. 特殊名段落に記述すると、TABの代わりに、利用者が定義した呼び名を使用できる。(環境部の章の特殊名段落節を参照。)

  2. ADVANCING指定中に一意名-2を使用する場合、一意名-2は基本整数データ項目の名前とする。

  3. 整数または一意名-2のデータ項目の値は、ゼロであってもよい。

  4. 整数は符号付きでもよい。

  5. END-OF-PAGE指定をした場合、該当するファイルのファイル記述項中にLINAGE句を指定する。

  6. 語、END-OF-PAGEとEOPは同義語である。

  7. ファイル記述項にLINAGE句を指定したファイルにレコードを書き出すときは、ADVANCING呼び名指定をすることはできない。

  8. 1つのWRITE文中に、ADVANCING PAGEとEND-OF-PAGEを共に指定してはならない。

    この制限は無視してよい。

    呼び名の代わりに、それに相当する機能名を使用してもよい。

形式 2 (レコード順ファイル)
  1. ファイル記述項にLINAGE句を指定したファイルにレコードを書き出すときは、この形式は使用できない。

  2. あるファイルにレコードを書き出すためにこの形式のWRITE文を使用する場合、そのファイルに適用するWRITE文はすべてこの形式にする。

  3. AFTER POSITIONING指定に使用する一意名-2は、1文字の英数字項目として定義しておく。(指定できる値については、一般規則18を参照)
形式 4 (相対ファイルおよび索引ファイル)
  1. 該当するファイルに適用できるUSE手続きを指定しなかった場合、INVALID KEY指定をする。

    この規則は強制しない。

一般規則

すべての形式 (すべてのファイル)
  1. FROM指定をしたWRITE文を実行することは、下記の順に処理を行うことと同じである

    1. MOVE文の規則に従って、下記の文を実行する。
       MOVE 一意名-1 TO レコード名
    2. FROM指定をしない同じWRITE文を実行する。

    暗黙のMOVE文を実行する前のレコード領域の内容は、このWRITE文の実行には影響を及ぼさない。

    WRITE文の実行が終了した後で、レコード領域のデータは利用できなくなることがあるが、一意名-1のデータはそのまま残っている。(一般規則13を参照)

  2. ファイル位置指示子は、WRITE文の実行の影響を受けない。

  3. WRITE文を実行すると、その対象のファイルに対応するFILE STATUSデータ項目を指定してあれば、それが更新される。(手続き部入出力状態節を参照。)

  4. ファイル中のレコードの最大の大きさは、ファイルを作成したときに決定される。この大きさを後で変更してはならない。

  5. ファイル中の論理レコードを格納する大記憶装置上の文字位置の数は、そのレコードの論理記述に定義した文字位置の数と、等しくてもよいし異なっていてもよい

  6. WRITE文が実行されると、論理レコードが書き出される。

  7. WRITE文の実行が不成功に終わると、レコード名に対応するファイルの入出力状態が更新される。次いで、そのファイルに適用できるUSE AFTER EXCEPTION手続きが指定してあればその手続きが実行され、その後でUSE文の規則に従って制御が移される。(前述のUSE(使用)文節を参照。)
形式 1 (レコード順ファイル)
  1. TABに関連づけられた呼び名が指定されている場合、用紙の標準の垂直タブ位置へと移動する結果となる。

  2. END-OF-PAGE指定をしたWRITE文の実行中に印刷プログラムの論理的な末尾に達すると、END-OF-PAGE指定中の無条件文-1が実行される。論理ページの大きさは、該当ファイルに関するファイル記述中の、該当レコードのLINAGE句に指定する。

  3. LINAGE句を指定してあると、WRITE文を実行した結果LINAGE句の整数-2またはデータ名-2のデータ項目に定義した値以上にLINAGE-COUNTERの値が達すると、END-OF-PAGE指定をしたWRITE文が実行されたときにページ終了条件が発生する。この場合、書き出し操作に続いて、そのWRITE文のEND-OF-PAGE指定中の無条件文が実行される。

    WRITE文(END-OF-PAGE指定があってもなくても)の実行結果が現在のページ本体に収まりきらないときは、自動的にページあふれ条件が発生する。

    ページあふれ条件とは、WRITE文を実行すると、LINAGE句の整数-2に指定した値またはデータ名-2に指定したデータ項目の値をLINAGE-COUNTERの値が超えることである。ページあふれが発生する場合、レコードの書き出しと改ページのどちらを先にするかは、BEFOREとAFTERのどちらを指定したかによる。改ページされると、装置はLINAGE句の指定に従って、次の論理ページの最初の行に位置付け直される。END-OF-PAGE句中に無条件文を指定してあると、レコードの書き出しと装置の位置付け直しが済んだ後で、その無条件文が実行される。

    LINAGE句に整数-2もデータ名-2にも指定していないと、ページあふれ条件とは別にページ終了条件が発生することはない。この場合、ページあふれ条件とページ終了条件は同時に発生する。

    LINAGE句に整数-2またはデータ名-2を指定してある場合で、WRITE文を実行したときに、LINAGE句の整数-2に指定した値またはデータ名-2に指定したデータ項目の値、およびLINAGE句の整数-1に指定した値またはデータ名-1に指定したデータ項目の値の両方を、LINAGE-COUNTERの値が同時に超えるときは、整数-2またはデータ名-2は指定されてないように処理は進められる。

形式 1 (行順ファイル)
  1. ADVANCING指定をしないと、使用しているオペレーティングシステムのテキスト・エディタの方式に従って、自動的に1行が行送りされる(通常はBEFORE ADVANCING 1 LINEが想定される)。

  2. 順ファイルの外部的に定義されている境界を超えて書き出しを行おうとすると、例外条件が発生する。このとき、レコード領域の内容は影響を受けず、下記の例外処理が行われる。

    1. 該当するファイルに対応するFILE STATUSデータ項目を指定してあると、その値が区域外書き出しを表わすように設定される。(手続き部入出力状態節を参照。)

    2. 該当するファイルに適応できるUSE AFTER STANDARD EXCEPTION宣言を明示的または暗黙的に指定してあると、その宣言手続きが実行される。

    3. 該当するファイルに適応できるUSE AFTER STANDARD EXCEPTION宣言を明示的にも暗黙的にも指定してないと、結果はどうなるかわからない。

  3. 複数の物理リール/ユニットにまたがる出力ファイルのリール/ユニットの終わりが検出されると、WRITE文は下記の操作を行う。

    1. 標準のリール/ユニット終了手続き

    2. リール/ユニットの交換手続き

    3. 標準のリール/ユニット開始手続き

  4. レコード長が固定のファイルに長さの異なるレコードを再定義して収めている場合、バッファ領域全体がファイルに書き込まれることを知っている必要がある。したがって、現在のレコードが前のレコードよりも短い場合には、空白を埋める必要がありうる。

  5. NOT END-OF-PAGE指定をしたWRITE文の実行が正常に進み、その間にページ終了条件が発生しないと、入出力処理の後で制御は無条件文-2に移される。

形式 1 (レコード順ファイル
dialm.gifおよび行順ファイル)
  1. ADVANCING指定およびEND-OF-PAGE指定は、共に印刷ページ上での各行の縦方向の位置を制御する働きをする。

    ADVANCING指定をしないと、リスト装置(PRINTERまたはPRINTER-1)に向けて出力されたときに、AFTER ADVANCING 1 LINEを指定してあったかのように、自動的に行送りされる。ADVANCING指定をすると、下記のように行送りされる。

    1. 一意名-2を指定すると、その現在の値に等しい行数だけ、印刷ページ上で行送りされる。

    2. 整数を指定すると、その値に等しい行数だけ、印刷ページ上で行送りされる。

    3. 呼び名を指定すると、環境部の章の特殊名段落節に指定した内容に従って、行送りされる。

    4. BEFORE指定を使用すると、該当する行が出力された後に、上記のa, b, cの規則に従って行送りされる。

    5. AFTER指定を使用すると、上記のa, b, cの規則に従って行送りされた後で、該当する行が出力される。

    6. PAGEを指定すると、装置が(使用された指定により)前または次の論理ページに位置付け直される。該当する行の出力と改ページのファイル記述項中にLINAGE句を指定してあるレコード順ファイルにレコードを書き出すと、 LINAGE句の指定に従って、装置は次の論理ページ上に書き出し可能な最初の行に位置付け直される。

  2. 1つのWRITE文中に、ADVANCINGとEND-OF-PAGEを共に指定してはならない。
形式 1、2、および 3 (順ファイル)
  1. WRITE文を実行するときは、対象ファイルをOUTPUTモードまたはEXTENDモードで開いておく。(手続き部 - MERGE - OPENの章のOPEN(開く)文節を参照。)

  2. WRITE文の実行によって書き出された論理レコードは、レコード領域内で利用できなくなる。ただし、SAME RECORD AREA句中に該当するファイルを指定してある場合、または区域外書き出しのためにWRITE文の実行が不成功に終わった場合は、そのレコード領域は元のまま残っている。

    SAME RECORD AREA句を指定してある場合、論理レコードは レコード名に対応するファイルのものとしてだけではなく、SAME RECORD AREA句中に指定した他のファイルのレコードとしても使用できる。

形式 2 (レコード順ファイル)
  1. WRITE文中にAFTER POSITIONING指定をすると、システムはレコードの先頭の文字位置に適切な文字を転記してから、レコードをファイルに書き出す。このため、この先頭の文字位置は空けておくこと。AFTER POSITIONINGに一意名-2を指定をすると、その値がレコードの先頭の文字位置に転記される。その値は下記のどれかとする。

    一意名-2
    意味
    (空白) 1行改行
    0 2行改行
    - 3行改行
    + 改行なし
    1-9 それぞれ、チャネル1-9へ飛ぶ
    A, B, C それぞれ、チャネル10, 11, 12へ飛ぶ
    V, W ポケット1または2を選択

    AFTER POSITIONINGに整数を指定をすると、出力レコードの先頭に転記される文字は下記のようになる。

    整数
    出力文字
    意味
    0 1 チャネル1へ飛ぶ
    1 (空白) 1行改行
    2 0 2行改行
    3 - 3行改行

  2. END-OF-PAGE指定は、指定しても注記になり、実行されることはない。

形式 3 (レコード順ファイル)
  1. 順ファイルの外部的に定義されている境界を超えて書き出しを行おうとすると、無効キー条件が発生する。COBOLシステムによって無効キー条件が検出されると、WRITE文の実行は不成功に終わる。このとき、レコード領域の内容は影響を受けない。該当するファイルに対応するFILE STATUSデータ項目を指定してあると、その原因を表わす値がその項目に設定される。実行 は、無効キー条件に関する規則に従って続行される。(手続き部の章の入出力状態節を参照。)
形式 4 (相対ファイルおよび索引ファイル)
  1. WRITE文を実行するとき、対象ファイルをOUTPUT, I-O, EXTENDのどれかのモードで開いておく。索引ファイルを順呼出し法で処理する場合、 入出力モードで開いてはならない。(環境部の章のファイル管理記述項および手続き部 - MERGE - OPENの章の章のOPEN(開く)文節を参照。)

  2. WRITE文の実行によって書き出された論理レコードは、SAME RECORD AREA句中に該当するファイルを指定してある場合、または無効キー条件のためにWRITE文の実行が不成功に終わった場合にだけ、引続きレコード領域内のものが利用できる。

    SAME RECORD AREA句を指定してある場合、論理レコードは、 レコード名に対応するファイルのものとしてだけではなく、SAME RECORD AREA句中に指定した他のファイルのレコードとしても使用できる。

  3. 無効キー条件が検出されると、WRITE文の実行は不成功に終わる。このとき、レコード領域の内容は影響を受けない。該当するファイルに対応するFILE STATUSデータ項目を指定してあると、その原因を表わす値がその項目に設定される。 実行 は、 無効キー条件に関する規則に従って続行される。(手続き部の章の入出力状態節を参照。)

形式 4 (相対ファイル)
  1. 出力モードで開いたファイルに関しては、下記のどちらかの方法でレコードを書き出すことができる。

    1. 順呼出し法を採る場合、WRITE文によってレコードが書き出される。最初に書き出されるレコードの相対レコード番号は1番とされ、以降レコードが書き出される順に相対レコード番号が1つずつ繰り上げられる。該当するファイルのファイル管理記述項にRELATIVE KEYデータ項目を指定してあると、WRITE文の実行中に書き出されたレコードの相対レコード番号がオペレーティングシステムによってRELATIVE KEYデータ項目に収められる。

    2. 乱呼出し法または動的呼出し法を採る場合、WRITE文を実行するのに先立って、プログラム中でRELATIVE KEYデータ項目に相対レコード番号を設定しておく。つまり、レコード領域中のレコードをRELATIVE KEYデータ項目に関係付けておく。次いで、WRITE文を実行することによって、そのレコードがファイルに書き出される。

  2. 入出力両用モードで開き、乱呼出し法または動的呼出し法で処理するファイルに関しては、レコード領域中のレコードを書き出す先の相対レコード番号をランタイム要素中でRELATIVE KEYデータ項目に設定しておく。次いで、WRITE文を実行すると、そのレコード領域の内容がファイルに書き出される。

  3. 下記の場合に、無効キー条件が発生する。

    1. 乱呼出し法または動的呼出し法を採る場合、RELATIVE KEYデータ項目が指すレコードが既に存在する。

    2. 外部的に定義されているファイル境界を超えて、レコードの書き出しが試みられた。
形式 4 (索引ファイル)
  1. WRITE文を実行すると、レコード領域の内容が書き出される。オペレーティングシステムはレコードキーの内容を使用して、以降どのレコードキーを通じてでもそのレコードを呼び出すことができるようにする。

  2. 主レコードキーの値は、ファイル中の全レコードを通じて一意とする。

  3. 主レコードキーに指定したデータ項目は、WRITE文を実行するのに先立って、ランタイム要素中で希望する値に設定しておく。

  4. 順呼出し法でファイルを処理する場合、主レコードキーの値の昇順に順次レコードを書き出すこと。

  5. 乱呼出し法または動的呼出し法を採る場合、任意の順序でレコードを書き出せる。

  6. 索引ファイルのファイル管理記述項にALTERNATE RECORD KEY句を指定した場合、併せてDUPLICATES指定をしてあれば、副レコードキーの値は一意でなくてもよい。副レコードキーの値が重複する場合、オペレーティングシステムは、それらが書き出された順に呼び出されるようにする。

  7. 下記のどれかの場合に、無効キー条件が発生する。

    1. 出力モードで開いたファイルに順呼出し法を適用しているとき、前に書き出したレコードの主レコードキーの値よりも、書き出そうとするレコードの主レコードキーの値が大きくない。

    2. 出力モードまたは入出力両用モードで開いたファイルの場合、書き出そうとするレコードと主レコードキーの値が等しいレコードが、ファイル中に既に存在する。

    3. 出力モードまたは入出力両用モードで開いたファイルの場合、キーの重複を許していないのに、書き出そうとするレコードと副レコードキーの値が等しいレコードが、ファイル中に既に存在する。

    4. 外部的に定義されたファイル境界を超えて、レコードの書き出しが試みられた。

  8. WRITE文の実行が正常にまたは不成功に終わった後、制御がどのように移されるかは、INVALID KEY指定とNOT INVALID指定の有無に左右される。(手続き部の章の無効キー条件節を参照。)