手続き部では、実行用プログラムの処理手順を書く。手続き部は、データ部の後に書く。
処理を書く必要がない場合、手続き部を省略することができる。(*1)
(*1) SIT COBOLは、手続き部は必須である。
手続き部は、宣言部分と手続き部分で構成する。
宣言部分は、DECLARATIVESで始まり、END
DECLARATIVESで終わる。
手続き部分は、1つの段落、連続したいくつかの段落の組、1つの節、または連続したいくつかの節の組で構成する。節に属するすべての段落は、節の中にまとめて書く。
PROCEDURE DIVISION.
{ 節名 SECTION.
[段落名.
[ 完結文 ] … ] … } …
PROCEDURE DIVISION.
[段落名.
[ 完結文 ] … ] …
PROCEDURE DIVISION.
DECLARATIVES.
{ 節名 SECTION.
USE文
[段落名.
[ 完結文 ] … ] … } …
END DECLARATIVES.
{ 節名 SECTION.
[段落名.
[ 完結文 ] … ] … } …
(※) SIT COBOLは、手続き部分の節名と段落名の両方を省略することができる。
節は、節の見出し(“節名 SECTION.”)といくつかの段落で構成する。段落は、省略することもできる。節の範囲は、節の見出しから以下のいずれかの地点までの部分である。
段落は、段落名といくつかの完結文で構成する。段落名の後には、分離符の終止符を書かなければならない。完結文は、省略することもできる。段落の範囲は、段落名から以下のいずれかの地点までの部分である。
完結文は、いくつかの文で構成し、分離符の終止符で終わる。手続き部に書いた文は、原則として、プログラムに書いた順に実行される。
文には、条件文、無条件文および翻訳指示文の3種類がある。
(*1) SIT COBOLはインタプリタであり、実行直前に解釈される文である。
条件文は、文の最後に明示範囲符を書くことにより、無条件文にすることができる。「明示範囲符」とは、“END-動詞”の形式の語である。例えば、ON
SIZE
ERROR指定付きのADD文は、END-ADD指定なしのときは条件文、END-ADD指定付きのときは無条件文である。
無条件文は、そのいくつかを連続して書くことができる。無条件文の間には、分離符を書くこともできる。“書き方”で“無条件文-n”と示しているところには、分離符の終止符を含まない、いくつかの連続した無条件文を書くことができる。
下表に、条件文と無条件文を示する。
文 | 条件文と無条件の区別 |
ACCEPT文 | 無条件文 |
ADD文 |
ON SIZE ERROR 指定またはNOT ON SIZE ERROR
指定付きの場合、条件文(*1)。 これらのどの指定もない場合、無条件文。 |
ALTER文 | 無条件文 |
CALL文 |
ON OVERFLOW 指定、ON EXCEPTION指定またはNOT ON
EXCEPTION指定付きの場合、条件文(*1)。 これらのどの指定もない場合、無条件文。 |
CANCEL文 | 無条件文 |
CLOSE文 | 無条件文 |
COMPUTE文 |
ON SIZE ERROR 指定またはNOT ON SIZE ERROR 指定付きの場合、条件文(*1)。
これらのどの指定もない場合、無条件文。 |
CONTINUE文 | 無条件文 |
DELETE文 |
INVALID KEY 指定またはNOT INVALID KEY 指定付きの場合、条件文(*1)。 これらのどの指定もない場合、無条件文。 |
DISPLAY文 |
ON EXCEPTION指定またはNOT ON EXCEPTION指定付きの場合、条件文(*1)。 これらのどの指定もない場合、無条件文。 |
DIVIDE文 |
ON SIZE ERROR 指定またはNOT ON SIZE ERROR
指定付きの場合、条件文(*1)。 これらのどの指定もない場合、無条件文。 |
EVALUATE文 | 条件文(*1) |
EXIT文 | 無条件文 |
EXIT PERFORM文 | 無条件文 |
EXIT PROGRAM文 | 無条件文 |
GO TO文 | 無条件文 |
IF文 | 条件文(*1) |
INITIALIZE文 | 無条件文 |
INSPECT文 | 無条件文 |
MERGE文 | 無条件文 |
MOVE文 | 無条件文 |
MULTIPLY文 |
ON SIZE ERROR 指定またはNOT ON SIZE ERROR
指定付きの場合、条件文(*1)。 これらのどの指定もない場合、無条件文。 |
OPEN文 | 無条件文 |
PERFORM文 | 無条件文 |
READ文 |
AT END指定、NOT AT END指定、INVALID KEY 指定またはNOT INVALID KEY
指定付きの場合、条件文(*1)。 これらのどの指定もない場合、無条件文。 |
RELEASE文 | 無条件文 |
RETURN文 | 条件文(*1) |
REWRITE文 |
INVALID KEY 指定またはNOT INVALID KEY 指定付きの場合、条件文(*1)。 これらのどの指定もない場合、無条件文。 |
SEARCH文 | 条件文(*1) |
SET文 | 無条件文 |
SORT文 | 無条件文 |
START文 |
INVALID KEY 指定またはNOT INVALID KEY 指定付きの場合、条件文(*1)。 これらのどの指定もない場合、無条件文。 |
STOP文 | 無条件文 |
STRING文 |
ON OVERFLOW 指定またはNOT ON OVERFLOW 指定付きの場合、条件文(*1)。 これらのどの指定もない場合、無条件文。 |
SUBTRACT文 |
ON SIZE ERROR 指定またはNOT ON SIZE ERROR
指定付きの場合、条件文(*1)。 これらのどの指定もない場合、無条件文。 |
UNLOCK文 | 無条件文 |
UNSTRING文 |
ON OVERFLOW 指定またはNOT ON OVERFLOW 指定付きの場合、条件文(*1)。 これらのどの指定もない場合、無条件文。 |
WRITE文 |
INVALID KEY 指定、NOT INVALID KEY 指定、END-OF-PAGE 指定またはNOT
END-OF-PAGE
指定付きの場合、条件文(*1)。 これらのどの指定もない場合、無条件文。 |
(*1) 文の最後に明示範囲符を書くことにより、無条件文になる。
次の実行文でない文に制御の明示的な移行を起こす文を、「手続き分岐文」という。手続き分岐文には、以下のものがある。
完結文には、完結文を構成する文の種類によって、条件完結文、無条件完結文および翻訳指示完結文の3種類がある。
文の範囲を明に指定するために、明示範囲符または分離符の終止符を書くことができる。
明示範囲符は、以下の語である。
明示範囲符を書くと、明示範囲符に対応する文の範囲が終了する。以下に、明示範囲符を使って文の範囲を指定する例を示す。
000000 IF A = 1 THEN ...[1]
000000 MOVE A TO B
000000 IF X = 1 THEN ...[2]
000000 MOVE X TO Y
000000 ELSE
000000 MOVE Z TO Y
000000 END-IF ...[2] の IF文の明示範囲符
000000 END-IF ...[1] の IF文の明示範囲符
分離符の終止符を書くと、分離符の終止符の前にあるすべての文の範囲が終了する。以下に、分離符の終止符を使って文の範囲を指定する例を示す。
000000 IF A = 1 THEN ...[1]
000000 MOVE A TO B
000000 IF X = 1 THEN ...[2]
000000 MOVE X TO Y
000000 ELSE
000000 MOVE Z TO Y. ... 分離符の終止符により、[1]および[2] の IF文が終了する。
手続き部の見出しは、手続き部の最初に書く。USING指定を書くと、呼ぶプログラムからパラメタを受け取ることができ、RETURNING指定を書くと、呼ばれたプログラムに結果を返すことができる。
PROCEDURE DIVISION
[ USING {データ名-1} … ]
[ RETURNING データ名-2 ].
こでは、文に関する共通の規則、および文に共通に書くことができる指定について説明する。
算術式は、算術演算子と一意名または定数を組み合わせて書く。算術式は、以下の5種類である。
算術演算子には、二項演算子と単項演算子がある。算術演算子を下表に示す。
分類 | 演算子 | 意味 |
二項演算子 | + | 加算 |
- | 減算 | |
* | 乗算 | |
/ | 除算 | |
** | べき乗(*1) | |
単項演算子 | + | 数字定数の+1を掛けることと同じ |
- | 数字定数の-1を掛けることと同じ |
— | 後続する要素 | ||||
先行する要素 | 一意名または定数 | ( |
単項演算子 +,- |
二項演算子 +,-,*,/,** |
) |
単項演算子 +,- |
○ | ○ | — (*1) | — | — |
( | ○ | ○ | ○ | — | — |
二項演算子 +,-,*,/,** |
○ | ○ | ○ | — | — |
) | — | — | — | ○ | ○ |
一意名または定数 | — | — | — | ○ | ○ |
(*2) SIT COBOLは、単項演算子の直前に左括弧を書かなくともよい。すなわち、’COMPUTE K = I * - J’のような書き方もできる。
1番目: 単項演算子の+、-
2番目: **
3番目: *、/
4番目:
二項演算子の+、-
条件式は、条件が成立している(真である)かまたは成立していない(偽である)かを表す値(真理値)を持つ。条件式は、真理値を検査することによって、プログラムの流れを制御するために使う。条件式は、EVALUATE文、IF文、PERFORM文およびSEARCH文に書くことができる。
条件式には、以下の種類がある。
条件式 | 単純条件 | 比較条件 |
字類条件 | ||
条件名条件 | ||
スイッチ条件 | ||
正負条件 | ||
複合条件 |
比較条件は、2つの作用対象を比較するために使う。作用対象として、一意名、定数、算術式または指標名を書くことができる。
{ 一意名-1 | 定数-1 | 算術式-1 | 指標名-1 }
{ IS [ NOT ] GREATER THAN |
IS [ NOT ] LESS THAN |
IS [ NOT ] EQUAL TO |
IS [ NOT ] > |
IS [ NOT ] < |
IS [ NOT ] = |
IS GREATER THAN OR EQUAL TO |
IS >= |
IS LESS THAN OR EQUAL TO |
IS <= }
{ 一意名-2 | 定数-2 | 算術式-2 | 指標名-2 }
(備考)
“>”、“<”、“=”、“>=”および“<=”は、他の記号との混同を避けるために、下線を付けてはならない。
比較演算子 | 意味 |
IS [NOT] GREATER THAN およびIS [NOT] > | 左辺が右辺より大きい[左辺が右辺より大きくない](*1) |
IS [NOT] LESS THAN およびIS [NOT] < | 左辺が右辺より小さい[左辺が右辺より小さくない](*1) |
IS [NOT] EQUAL TO およびIS [NOT] = | 左辺が右辺と等しい[左辺が右辺と等しくない](*1) |
IS GREATER THAN OR EQUAL TO およびIS >= | 左辺が右辺より大きいか等しい (*2) |
IS LESS THAN OR EQUAL TO およびIS <= | 左辺が右辺より小さいか等しい (*3) |
字類条件は、データ項目の内容の字類を検査するために使う。
一意名-1 IS [ NOT ] {
NUMERIC |
ALPHABETIC |
ALPHABETIC-LOWER |
ALPHABETIC-UPPER |
字類名
}
(※) SIT COBOLは、字類名を指定することはできない。
字類検査の種類 | 字類検査の内容 |
NUMERIC 検査 | 一意名-1の内容が数字0、1、2、3、…、9だけからなる、またはこれらに演算符号を付けたものである場合。(*1) |
ALPHABETIC検査 | 一意名-1の内容が英大文字A、B、C、…、Zと空白からなる、または英小文字a、b、c、…、zと空白からなる、または英大文字と英小文字と空白の組合せからなる場合。 |
ALPHABETIC-LOWER検査 | 一意名-1の内容が英小文字a、b、c、…、zと空白からなる場合。 |
ALPHABETIC-UPPER検査 | 一意名-1の内容が英大文字A、B、C、…、Zと空白からなる場合。 |
字類名検査 | 一意名-1の内容が、特殊名段落のCLASS 句で指定した文字の組からなる場合。 |
条件名条件は、条件変数の値が条件名の値と等しいかどうかを調べるために使う。
条件名-1
000000 02 MONTH PICTURE 99. ... [1]
000000 88 SPRING VALUE 3 THRU 5. ... [2]
000000 88 SUMMER VALUE 6 THRU 8. ... [2]
000000 88 FALL VALUE 9 THRU 11. ... [2]
000000 88 WINTER VALUE 12, 1, 2. ... [2]
[図の説明]
[1] 条件変数(MONTH)の定義
[2]
条件名(SPRING、SUMMER、FALLおよびWINTER)の定義
[1] IF SPRING … → IF MONTH >= 3 AND <= 5 と等価
[2] IF SUMMER
… → IF MONTH >= 6 AND <= 8 と等価
[3] IF FALL … → IF MONTH >= 9
AND <= 11 と等価
[4] IF WINTER … → IF MONTH = 12 OR 1 OR 2
と等価
スイッチ状態条件は、外部スイッチのオンとオフの状態を調べるために使う。
条件名-1
(※) SIT COBOLはスイッチ状態条件は未サポートである。(サポート予定あり)
正負条件は、算術式の代数値がゼロより大きいか、小さいかまたは等しいかを調べるために使う。
算術式-1 IS [ NOT ] { POSITIVE | NEGATIVE | ZERO }
必要語 | 意味 |
POSITIVE | ゼロより大きい |
NEGATIVE | ゼロより小さい |
ZERO | ゼロに等しい |
複合条件は、単純条件と論理演算子を組み合わせて書く。
複合条件は、否定条件と組合せ条件で構成する。否定条件は、単純条件または複合条件の前に、論理演算子NOTを書いたものである。組合せ条件は、単純条件または複合条件を、論理演算子ANDまたはORでつないだものである。
複合条件の真理値は、個々の条件の真理値を評価し、すべての論理演算子を順に作用させた結果の真理値である。
論理演算子の意味を、下表に示す。
論理演算子 | 意味 | 真理値 |
NOT | 論理否定 |
NOT の後の条件が偽の場合、真理値は真。 NOT の後の条件が真の場合、真理値は偽。 |
AND | 論理積 |
AND の左辺と右辺の両方の条件が真の場合、真理値は真。 AND の左辺と右辺の一方または両方の条件が偽の場合、真理値は偽。 |
OR | 論理和 |
ORの左辺と右辺の一方または両方の条件が真の場合、真理値は真。 ORの左辺と右辺の両方の条件が偽の場合、真理値は偽。 |
否定条件は、条件の真理値を逆転するために使う。
NOT 条件-1
組合せ条件は、論理積または論理和を求めるために使う。
条件-1 { { AND | OR } 条件-2 } …
— | 後続する要素 | |||||
先行する要素 | 単純条件 | AND | OR | NOT | ( | ) |
単純条件 | — | ○ | ○ | — | — | ○ |
AND | ○ | — | — | ○ | ○ | — |
OR | ○ | — | — | ○ | ○ | — |
NOT | ○ | — | — | — | ○ | — |
( | ○ | — | — | ○ | ○ | — |
) | — | ○ | ○ | — | — | ○ |
“条件-1 AND 条件-2 AND … 条件-n”の評価は、条件-1, 条件-2を順に評価していき、偽となった時点で真偽値は偽として評価を完了する。最後の条件-nまで真であった場合は真偽値は真となる。
“条件-1 OR 条件-2 OR … 条件-n”の評価は、条件-1, 条件-2を順に評価していき、真となった時点で真偽値は真として評価を完了する。最後の条件-nまで偽であった場合は真偽値は偽となる。
“条件-1 OR 条件-2 AND 条件-3”の評価順序は、条件-1が真の場合は真偽値は真として評価を完了する。条件-1が偽だった場合は、条件-2を評価し偽の場合は真偽値は偽として評価を完了する。条件-2が真だった場合は、続けて条件-3を評価し、真だったときは真偽値を真、偽だったときは真偽値を偽として評価を完了する。
“(条件-1 OR NOT 条件-2) AND 条件-3 AND 条件-4” の評価は、まず括弧内の真偽値を評価し偽だった場合は真偽値が偽として評価を完了する。真だった場合は、条件-3の評価を行う。以下、同様である。
比較条件と論理演算子を組み合わせた複合条件を、「組合せ比較条件」という。組合せ比較条件の中に、論理演算子の評価順序を変更するための括弧がない場合、組合せ条件の一部を省略して書くことができる。
組合せ条件の省略方法として、以下の2つがある。
比較条件 {{ AND | OR } [ NOT ] [ 比較演算子 ]右辺 } …
組合せ比較条件を略記した書き方 | 組合せ比較条件を略記しない書き方 |
a > b AND NOT < c OR d | ((a > b) AND (a NOT < c)) OR (a NOT < d) |
a NOT EQUAL b OR c | (a NOT EQUAL b) OR (a NOT EQUAL c) |
NOT a = b OR c | (NOT (a = b)) OR (a = c) |
NOT (a GREATER b OR < c) | NOT ((a GREATER b) OR (a < c)) |
NOT (a NOT > b AND c AND NOT d) | NOT (((a NOT > b) AND (a NOT > c)) AND(NOT (a NOT > d))) |
ここでは、比較条件の比較の規則について説明する。比較では、比較条件の左辺と右辺の組合せによって、以下のいずれかの規則が適用される。
文字比較、数字比較および日本語文字比較の規則が適用される場合の作用対象の組合せは、下表のとおりである。
— | 条件の左辺(右辺) | ||||||
条件の右辺(左辺) | 集団 |
英字 英数字(*1) 英数字編集 数字編集 |
日本語 日本語編集 |
外部10進 |
2進 内部10進 |
算術式(*2) | |
集団項目 | 文字比較 | 文字比較 | 文字比較 | 文字比較 | 文字比較 | — | |
英字項目 英数字項目(*1) 英数字編集項目 数字編集項目 文字定数(*3) |
文字比較 | 文字比較 | — | 文字比較 | — | — | |
日本語項目(*4) 日本語編集項目 日本語定数(*5) |
文字比較 | — | 日本語文字比較 | 文字比較 | — | — | |
表意定数 SPACE |
文字比較 | 文字比較 | 日本語文字比較 | 文字比較 | — | — | |
表意定数 HIGH-VALUE LOW-VALUE QUOTE |
文字比較 | 文字比較 | — | 文字比較 | — | — | |
表意定数 ZERO |
文字比較 | 文字比較 | — | 数字比較 | 数字比較 | 数字比較 | |
外部10進項目 | 文字比較 | 文字比較 | — | 数字比較 | 数字比較 | 数字比較 | |
2進数 内部10進数 |
文字比較 | — | — | 数字比較 | 数字比較 | 数字比較 | |
数字定数 | 文字比較 | 文字比較(*6) | — | 数字比較 | 数字比較 | 数字比較 | |
算術式(*2) | — | — | — | 数字比較 | 数字比較 | 数字比較 |
文字比較の規則は、以下のとおりである。
数字比較の規則は以下のとおりである。
日本語文字比較の規則は、以下のとおりである。
指標比較の規則を、下表に示す。
— | 条件の右辺(左辺) | |||
条件の右辺(左辺) | 指標名 | 指標データ項目 |
数字定数 (整数だけ) |
数字項目 (整数だけ) |
指標名 | 出現番号の比較 | 変換なしの比較 | 出現番号と整数の比較 | 出現番号と整数の比較 |
指標データ項目 | 変換なしの比較 | 変換なしの比較 | — | — |
ここでは、MOVE文の転記の規則を説明する。
文の実行によって、データ項目、定数または算術演算の結果がデータ項目に転記されることがある。転記の規則は、明に書いたMOVE文だけでなく、このような暗黙のMOVE文でも適用される。
転記の規則には、基本項目転記と集団項目転記がある。送出し側と受取り側のいずれか一方または両方が集団項目の場合、集団項目転記の規則が適用される。そうでない場合、基本項目転記の規則が適用される。
基本項目転記では、受取り側の項類および用途によって、以下のいずれかの規則が適用される。
基本項目転記では、必要ならば、内部表現形式の変換、編集または逆編集が行われる。基本項目転記の作用対象の組合せを、下表に示す。
— | 受取り側 | |||
送出し側 | 英字 |
英数字 英数字編集 |
数字 数字編集 |
日本語 日本語編集 |
英字項目 | [1] | [2] | — | [5] |
英数字項目(*1) 文字定数(*2) |
[1] | [2] | [3] | [5] |
英数字編集項目 | [1] | [2] | — | [5] |
数字項目/定数 (整数) |
— | [2] | [3] | [5] |
数字項目/定数 (非整数) |
— | — | [3] | — |
数字編集項目 | — | [2] | [3] | [5] |
日本語項目(*3) 日本語編集項目 日本語定数(*4) |
— | — | — | [4] |
表意定数 ZERO |
— | [2] | [3] | [5] |
表意定数 SPACE |
[1] | [2] | — | [5] |
表意定数 HIGH-VALUE LOW-VALULE |
— | [2] | — | — |
表意定数 QUOTE |
— | [2] | — | — |
(※) SIT COBOLは、[5]に関する基本項目転記を行うことができる。
受取り側が英字項目の場合、標準桁よせ規則に従って、桁よせおよび必要な空白づめが行われる。
受取り側が英数字項目または英数字編集項目の場合、以下の規則が適用される。
受取り側が数字項目または数字編集項目の場合、以下の規則が適用される。
受取り側が日本語項目または日本語編集項目の場合、標準桁よせ規則に従って、桁よせおよび必要な空白づめが行われる。
送出し側が英字項目、英数字項目、文字定数および英数字編集項目の場合、送出し側の半角文字が、全角文字となって受取り側に転記される。
(例) 「MOVE “ABC” TO N3.」(N3はPIC N(3)で定義)においては、N3には、“ABC” が転記される。
送出し側が数字項目、数字定数、数字編集項目の場合は、次のように転記される。
(例) 「MOVE 123 TO N5.」(N5はPIC N(5)で定義)においては、N5には、“00123” が転記される。
送出し側が表意定数のZERO、SPACEの場合は、ALL指定があるとみなされ、それぞれ全角の”0”, 空白に変換されて受取り側に転記される。
送出し側または受取り側のどちらか一方または両方が集団項目の場合、以下の規則が適用される。
ADD文、COMPUTE文、DIVIDE文、MULTIPLY文およびSUBTRACT文の5つを総称して、「算術文」という。算術文に共通する規則は、以下のとおりである。
算術文には、結果の一意名(結果を格納するためのデータ項目)を2つ以上書くことができる。
この場合、算術文の結果は以下の順に計算される。
複数個の答を計算する例を、以下に示す。tempは、コンパイラが用意した一時的な記憶領域を表す。
〔例1〕
000000 ADD a b c TO c d(c) e
上記の計算のしかたは、以下の文を順に実行した場合と同じである。
000000 ADD a b c GIVING temp
000000 ADD temp TO c
000000 ADD temp TO d(c) ... c の値は、直前の加算で変更された値。
000000 ADD temp TO e
〔例2〕
000000 MULTIPLY a(i) BY i a(i)
上記の計算のしかたは、以下の文を順に実行した場合と同じである。
000000 MOVE a(i) TO temp
000000 MULTIPLY temp BY i
000000 MULTIPLY temp BY a(i) ... i の値は、直前の乗算で変更された値。
算術文には、ROUNDED指定を書くことができる。
算術演算の結果の小数部の桁数が、結果の一意名の小数部の桁数より大きい場合、ROUNDED指定の有無に従って、以下の処理が行われる。
結果の一意名の整数部の下位桁をPICTURE句の文字“P”で定義した場合、四捨五入および切捨ては、実際に記憶領域を割り当てられている部分の、最右端の整数部に対して行われる。
算術文を実行すると、桁あふれ条件が発生することがある。桁あふれ条件は、算術文にON SIZE ERROR指定を書くことによって検出することができる。
桁あふれ条件は、以下の場合に発生する。
4.で、結果の一意名に格納できる最大の値とは、PICTURE句の文字列で指定した最大の値である。
結果の一意名が2進項目の場合も、記憶領域に格納できる最大の値ではなく、PICTURE句の文字列で指定した最大の値である。なお、演算結果が、結果の一意名より小数点以下の桁を多く持つ場合、演算結果と同じだけの小数点以下の桁を持つPICTURE句の文字列で指定した最大の値を、結果の一意名に格納できる最大の値とみなす。また、結果の一意名が“P”を含むPICTURE句で定義されている場合、“P”を“9”で置き換えたPICTURE句の文字列で指定した最大の値を、結果の一意名に格納できる最大の値とみなす。
4.の桁あふれ条件は、1つの算術演算の最終結果に格納するときにだけ発生し、中間結果に格納するときは発生しない。ROUNDED指定を書いた場合、四捨五入が行われた後、4.の桁あふれ条件が検査される。
結果の一意名を2つ以上書いた場合、それぞれの算術演算の結果を求めるときに、それぞれ桁あふれ条件が検査される。
桁あふれ条件が発生すると、結果の一意名の値は、以下の値になる。
算術演算の完了後、すなわち結果の一意名のすべての値が決まった後、以下の規則に従って制御が移る。
桁あふれ条件が発生しなかったとき、算術演算の完了後、以下の規則に従って制御が移る。
MOVE文、ADD文およびSUBTRACT文には、CORRESPONDING指定を書くことができる。CORRESPONDING指定は、集団項目に従属するデータ項目で同じデータ名を持つものどうしを対応付ける。CORRESPONDING指定を“CORRESPONDING d1 TO d2”のように書く場合、d1、d2および対応付けるデータ項目は、以下の条件を満足しなければならない。
“CORRESPONDING d1 TO d2”を書いた場合、d1に従属するデータ項目とd2に従属するデータ項目のうち、以下のすべての条件を満足するデータ項目どうしが対応付けられる。
異なるデータ記述項で定義したデータ項目を、1つの文の送出し側項目と受取り側項目に指定した場合、それらが記憶領域の一部または全部を共有するときは、その文の実行結果は規定されない。また、同じデータ記述項で定義したデータ項目を、1つの文の送出し側項目と受取り側項目に指定した場合、その文の実行結果は規定されないことがある。この場合の規則は、各文の一般規則で説明する。
相対ファイルまたは索引ファイルに対して、DELETE文、乱呼出しのREAD文、REWRITE文、START文またはWRITE文を実行すると、無効キー条件が発生することがある。無効キー条件は、これらの入出力文にINVALID KEY指定を書くことによって検出することができる。また、無効キー条件が発生せずに入出力文の実行が成功したことを、NOT INVALID KEY指定を書くことによって検査することができる。ここでは、無効キー条件が発生する可能性のある入出力文の動作を、以下の3つに分類して説明する。
無効キー条件が発生すると、入出力文の実行は不成功に終わる。入出力状態に無効キー条件を示す値が設定された後、入出力文のINVALID KEY指定の有無、および関連するUSE AFTER STANDARD EXCEPTION手続きの有無に従って、制御が移る。無効キー条件が発生したときの制御の移行を、下表に示す。
INVALID KEY指定の有無 | USE AFTER STANDARD EXCEPTION手続きの有無 | 無効キー条件が発生したときの制御の移行 |
あり | あり、または、なし |
[1] ファイルにFILE
STATUS句が指定されている場合は入出力状態の値が設定される。 [2] INVALID KEY指定の無条件文に制御が移る。 [3] 無条件文の実行後、入出力文の最後に制御が移る。(*1) |
なし | あり |
[1] ファイルにFILE
STATUS句が指定されている場合は、入出力状態の値が設定される。 [2] USE手続きが実行される。 [3] 入出力文の最後に制御が移る。 |
なし | なし |
ファイルにFILE
STATUS句が指定されている場合は入出力状態の値が設定され、入出力文の最後に制御が移る。 ファイルにFILE STATUS句が指定されていなかった場合、実行結果は規定されない。(*2) |
無効キー条件以外の例外条件が発生すると、入出力文の実行は不成功に終わる。入出力状態に例外条件を示す値が設定された後、以下に示す規則に従って制御が移る。
(*1): SIT COBOLは、エラーメッセージを表示し、入出力文の最後に制御が移る。
無効キー条件もその他の例外条件も発生しなかったとき、入出力文の実行は成功する。入出力状態にその旨を示す値が設定された後、以下に示す規則に従って制御が移る。
順ファイル、相対ファイルまたは索引ファイルに対して順呼出しのREAD文を実行すると、ファイル終了条件が発生することがある。ファイル終了条件は、READ文にAT
END指定を書くことによって検出することができる。また、ファイル終了条件が発生せずに入出力文の実行が成功したことを、NOT
AT END指定を書くことによって検査することができる。
ここでは、READ文の動作を、以下の3つに分類して説明する。
ファイル終了条件が発生すると、READ文の実行は不成功に終わる。入出力状態にファイル終了条件を示す値が設定された後、READ文のAT END指定の有無、および関連するUSE AFTER STANDARD EXCEPTION手続きの有無に従って、制御が移る。ファイル終了条件が発生したときの制御の移行を、下表に示す。
AT END指定の有無 | USE AFTER STANDARD EXCEPTION手続きの有無 | ファイル終了条件が発生したときの制御の移行 |
あり | あり または、なし |
[1] ファイルにFILE
STATUS句が指定されている場合は、入手力状態を設定する。 [2] AT END指定の無条件文に制御が移る。 [3] 無条件文の実行後、READ文の最後に制御が移る。(*1) |
なし | あり |
[1] ファイルにFILE
STATUS句が指定されている場合は、入手力状態を設定する [2] USE AFTER STANDARD EXCEPTION手続きに制御が移る。 [3] USE AFTER STANDARD EXCEPTION手続きの実行後、READ文の最後に制御が移る。 |
なし | なし |
ファイルにFILE STATUS
句が指定されている場合、入出力状態を設定し、READ文の最後に制御が移る。 ファイルにFILE STATUS 句が指定されていない場合、実行結果は規定されない。(*2) |
ファイル終了条件以外の例外条件が発生すると、READ文の実行は不成功に終わる。入出力状態に例外条件を示す値が設定された後、以下に示す規則に従って制御が移る。
(*2) SIT COBOLは、エラーメッセージを表示し、入出力文の最後に制御が移る。
ファイル終了条件もその他の例外条件も発生しなかったとき、READ文の実行は成功する。入出力状態にその旨を示す値が設定された後、以下に示す規則に従って制御が移る。
字類条件を除いて、手続き部でデータ項目の内容が参照されるとき、データ項目の内容がPICTURE句によるデータ項目の字類または関数による字類と矛盾する場合、手続き部での参照の結果は規定しない。(*1)
(*1) SIT COBOLは、エラーメッセージを出力し、処理を続行する。
この節では、中核の各文について説明する。
ACCEPT 一意名-1 [ FROM 呼び名 ]
ACCEPT 一意名-2 FROM { DATE | DAY | DAY-OF-WEEK | TIME }
ACCEPT 一意名-3 FROM { ENVIRONMENT-VALUE | ENVIRONMENT { 定数-1 | 一意名-4 }}
コンソールより値を読み込み、一意名-1に格納する。
000000 01 氏名 PIC X(20).
000000 01 年齢 PIC 9(2).
000000 :
000000 ACCEPT 氏名. *> コンソールから入力された文字列が文字として「氏名」に格納される
000000 ACCEPT 年齢. *> コンソールから入力された文字列が数字として「年齢」に格納される
システムの現在の日付や時刻を取得して一意名-2に格納する。
000000 01 年月日 PIC 9(6)
000000 :
000000 ACCEPT 年月日 FROM DATE. *> 取得日が2024年12月28日の場合、「年月日」には
000000 *> 241228が格納される
環境変数を取得する
000000 01 環境変数値 PIC X(10).
000000 :
000000 MOVE "XYZ" TO ENVIRONMENT-NAME.
000000 ACCEPT 環境変数値 FROM ENVIRONMENT-VALUE. *> '環境変数値'に、環境変数XYZの値が
000000 *>設定される。
000000 01 環境変数値 PIC X(10).
000000 :
000000 ACCEPT 環境変数値 FROM ENVIRONMENT "XYZ". *>'環境変数値'に、環境変数XYZの値が
000000 *> 設定される。
(サンプルプログラム名:ACCEPT文.cob)
ADD { 一意名-1 | 定数-1 } … TO { 一意名-2 [ ROUNDED ] } …
[ ON SIZE ERROR 無条件文-1 ]
[ NOT ON SIZE ERROR 無条件文-2 ]
[ END-ADD ]
ADD { 一意名-1 | 定数-1 } … TO { 一意名-2 | 定数-2 } GIVING
{一意名-3 [ ROUNDED ] } …
[ ON SIZE ERROR 無条件文-1 ]
[ NOT ON SIZE ERROR 無条件文-2 ]
[ END-ADD ]
ADD { CORRESPONDING | CORR } 一意名-1 TO 一意名-2 [ ROUNDED ]
[ ON SIZE ERROR 無条件文-1 ]
[ NOT ON SIZE ERROR 無条件文-2 ]
[ END-ADD ]
TOの前の各作用対象の和を一意名-2に加える。
(サンプルプログラム名:ADD文-書き方1.cob)
000000 01 A PIC 9(2) VALUE 10. *> Aの初期値は10
000000 01 I PIC 9(2) VALUE 1. *> Iの初期値は1
000000 01 J PIC 9(2) VALUE 2. *> Jの初期値は2
000000 :
000000 ADD 1 TO A. *> Aの結果は、A = A + 1 すなわち、11となる
000000 ADD 1 TO I J. *> I, Jの結果は、それぞれ、2, 3 となる
000000 01 A PIC 99V9 VALUE 0.0. *> Aの小数部は1桁のみ
000000 :
000000 ADD 10.5 0.05 TO A. *> 算術結果は10.55、小数部2桁以下は切り捨てられ、
000000 *> Aには10.5が格納される
000000 ADD 10.5 0.05 TO A ROUNDED. *> 算術結果は10.55、小数部2桁で四捨五入の結果、
000000 *> Aには10.6が格納される
000000 01 A PIC S99V9 VALUE 0.0. *> Aの小数部は1桁のみ
000000 :
000000 ADD -10.5 -0.05 TO A. *> 算術結果は-10.55、小数部2桁以下は切り捨てられ、
000000 *> Aには-10.5が格納される
000000 ADD -10.5 -0.05 TO A ROUNDED. *> 算術結果は-10.55、小数部2桁で四捨五入の結果、
000000 *> Aには-10.6が格納される
000000 01 A PIC 99 VALUE 99. *> Aは整数部2桁で初期値は99
000000 :
000000 ADD 1 TO A *> A = A + 1 の結果、100となるので桁あふれが発生、
000000 ON SIZE ERROR *> ON SIZE ERRORが実行される
000000 DISPLAY "桁あふれ発生" *> "桁あふれ発生"が表示される
000000 DISPLAY "A=" A *> Aの値は変わらず、"A=99"が表示される
000000 END-ADD.
000000 01 A PIC 99 VALUE 99. *> Aは整数部2桁で初期値は99
000000 :
000000 ADD 1 TO A. *> A := A + 1 の結果、100となるので桁あふれが発生。
000000 *> しかし ON SIZE ERROR指定がないので、百の位の1は
000000 *> 無視されAには下2桁の00が設定される
000000 DISPLAY "A=" A. *> "A=0"が表示される
TOの前の各作用対象の和を、TOの後の作用対象に加え、一意名-3に格納する。
(サンプルプログラム名:ADD文-書き方2.cob)
000000 01 A PIC 99 VALUE 99.
000000 01 B PIC 9(5).
000000 :
000000 ADD 1 2 TO A GIVING B. *> COMPUTE B = 1 + 2 + A と同等である。
一意名-1に従属するデータ項目と一意名-2に従属するデータ項目のうち、名前の修飾語の系列が同じものどうしの和を求める。一意名-1に従属するデータ項目を加数、一意名-2に従属するデータ項目を被加数として和を求め、一意名-2に従属するデータ項目に格納する。この結果は、対応する一意名ごとに、別々のADD文を書いた結果と同じである。
(サンプルプログラム名:ADD文-書き方3.cob)
000000 01 X.
000000 03 B PIC X VALUE "A".
000000 03 C.
000000 05 C1 PIC 9 VALUE 1.
000000 05 C2 PIC 9 VALUE 2.
000000 05 FILLER PIC 9 VALUE 3.
000000 03 D.
000000 05 D1 PIC 9 VALUE 4.
000000 05 D2 PIC 9 VALUE 5.
000000 05 FILLER PIC 9 VALUE 6.
000000 03 E PIC 9 VALUE 8.
000000 01 Y.
000000 03 B PIC X.
000000 03 C.
000000 05 C1 PIC 99 VALUE 10.
000000 05 C2 PIC 99 VALUE 10.
000000 03 D REDEFINES C.
000000 05 D1 PIC 99.
000000 05 D2 PIC 99.
000000 03 F.
000000 05 E PIC 99 VALUE 10.
000000
000000 PROCEDURE DIVISION.
000000 :
000000 ADD CORR X TO Y. *> ADD CORR
000000
000000 *> 上記の ADD CORRは下記のADDと同等である。
000000 *> ADD C1 OF C OF X TO C1 OF C OF Y.
000000 *> ADD C2 OF C OF X TO C2 OF C OF Y.
000000
000000 *> 以下のADDは行われない
000000 *> ADD B OF X TO B OF Y. (Bは英数字項目のため)
000000 *> ADD FILLER OF C OF X TO FILLER OF C OF Y. (FILLER項目は対象外であるため)
000000 *> ADD D1 OF D OF X TO D1 OF D OF Y. (D OF YはREDEFINES項目であるため)
000000 *> ADD D2 OF D OF X TO D2 OF D OF Y. (D OF YはREDEFINES項目であるため)
000000 *> ADD E OF X TO E OF F OF Y. (修飾語の系列が違うため)
ALTER { 手続き名-1 TO [ PROCEED TO ] 手続き名-2 } …
※ SIT COBOLは、ALTER文は未サポートである。
CALL { 一意名-1 | 定数-1 } [ USING
{ [ BY REFERENCE ] { 一意名-2 } … |
BY CONTENT { 一意名-2 | 定数-2 } … |
BY VALUE { 一意名-3 | 定数-3 } … } … ]
[ RETURNING 一意名-4 ]
[ ON OVERFLOW 無条件文-1 ]
[ END-CALL ]
CALL { 一意名-1 | 定数-1 } [ USING
{ [ BY REFERENCE ] { 一意名-2 } … |
BY CONTENT { 一意名-2 | 定数-2 } … |
BY VALUE { 一意名-3 | 定数-3 } … } … ]
[ RETURNING 一意名-4 ]
[ ON EXCEPTION 無条件文-1 ]
[ NOT ON EXCEPTION 無条件文-2 ]
[ END-CALL ]
実行単位中の他のプログラムに制御を移す。
ON EXCEPTION指定またはON OVERFLOW指定の有無 | NOT ON EXCEPTION指定の有無 | CALL文の動作 | |
呼ばれるプログラムが実行不可能の場合 | 呼ばれるプログラムが実行可能の場合 | ||
あり | あり |
[1]無条件文-1に制御が移る。 [2]無条件文-1の実行後、CALL文の終わりに制御が移る。*1 |
[1]呼ばれるプログラムに制御が移る。 [2]呼ばれるプログラムから戻った後無条件文-2に制御が移る。 [3]無条件文-2の実行後、CALL文の終わりに制御が移る *2 |
あり | なし |
[1]無条件文-1に制御が移る。 [2]無条件文-1の実行後、CALL文の終わりに制御が移る。*1 |
[1]呼ばれるプログラムに制御が移る。 [2]呼ばれるプログラムから戻った後CALL文の終わりに制御が移る。 |
なし | あり | CALL文の動作は、規定されない。 |
[1]呼ばれるプログラムに制御が移る。 [2]呼ばれるプログラムから戻った後無条件文-2に制御が移る。 [3]無条件文-2の実行後、CALL文の終わりに制御が移る *2 |
なし | なし | CALL文の動作は、規定されない。 |
[1]呼ばれるプログラムに制御が移る。 [2]呼ばれるプログラムから戻った後CALL文の終わりに制御が移る。 |
上記以外の場合、実行単位で2回目以降に呼ばれるプログラムは、そのプログラムから最後に戻ったときと同じ状態になっている。
(*1)
SITCOBOLでは、一意名-1または定数-1には、呼ぶプログラムのファイル名を拡張子を除いて書く。例えば、“SUB001.cob”というプログラムを呼び出す場合には、’CALL
“SUB001” USING …’と記述する。
(*2) 例えば CALL文において「USING BY
VALUE
123.45」と指定した値は、呼ばれるプログラム側では「S9(5)V9(3)」でも「9(5)V9(2)
COMP-3」でも「COMP-1」でも数字項目であれば受け取ることができる。そのときに受け取る値は、それぞれ、+123.45,
123.45, 123 である。
(*3)
call_pathについては、「コマンドでの利用方法」の章を参照されたい。なお、SITCOBOL専用エディタにて操作する場合は、[ファイル]-[環境設定]のCALL1、CALL2、CALL3欄がcall_pathに相当する。
(*4)
呼ばれるプログラムに制御が移ったときに、カレントディレクトリは、その呼ばれるプログラムが存在するディレクトリに移る。また、その呼ばれたプログラムから戻ってきたときに、カレントディレクトリはCALL文が実行される前の状態に戻る。
・別プログラムの呼出し方
000000 01 C-NAME PIC X(20).
000000 :
000000 CALL "ABC". *> "ABC.cob" が呼び出される。
000000*
000000 MOVE "ABC" TO C-NAME.
000000 CALL C-NAME. *> 同じく "ABC.cob"が呼び出される。
(サンプルプログラム名:CALL文-パラメータの受け渡し方.cob)
・パラメタの渡し方、受け取り方
000000 IDENTIFICATION DIVISION.
000010 PROGRAM-ID. CALL-TEST.
000020 DATA DIVISION.
000030 WORKING-STORAGE SECTION.
000040 01 P1 PIC X(20) VALUE "HOKKAIDO".
000050 01 P2 PIC X(10) VALUE "KANAGAWA".
000060 01 P3 PIC 9(5) VALUE 12345.
000070 PROCEDURE DIVISION.
000080
000090 CALL "CALL_SUB1" USING
000100 BY REFERENCE P1
000110 BY CONTENT P2 "TOKYO"
000120 BY VALUE P3 123.45.
000130*
000140 DISPLAY "P1=" P1. *> 'OKINAWA' が表示される。
000150 DISPLAY "P2=" P2. *> 'KANAGAWA'が表示される。
000160 DISPLAY "P3=" P3. *> '12345'が表示される。
000170
000180 STOP RUN.
[サンプルプログラム:CALL_SUB1.cob]
000000 IDENTIFICATION DIVISION.
000010 PROGRAM-ID. CALL_SUB1.
000020 DATA DIVISION.
000030 LINKAGE SECTION. *> 受け取るパラメータは連絡節で定義する。
000040 01 Q1 PIC X(20).
000050 01 Q2 PIC X(10).
000060 01 Q2-2 PIC X(5).
000070 01 Q3 COMP-1.
000080 01 Q3-2 PIC S9(10)V9(3).
000090 PROCEDURE DIVISION USING Q1 Q2 Q2-2 Q3 Q3-2.
000100
000110 DISPLAY "Q1=" Q1. *> 'HOKKAIDO'が表示される。
000120 DISPLAY "Q2=" Q2. *> 'KANAGAWA'が表示される。
000130 DISPLAY "Q2-2=" Q2-2. *> 'TOKYO'が表示される。
000140 DISPLAY "Q3=" Q3. *> '12345'が表示される。Q3はCOMP-1で定義されているが
000150 *> 数字項目であればBY VALUE指定の値は受け取れる。
000160 DISPLAY "Q3-2=" Q3-2. *> '123.45'が表示される。Q3-2はS9(10)V9(3)で定義されているが
000170 *> 数字項目であればBY VALUE指定の値は受け取れる。
000180*
000190 MOVE "OKINAWA" TO Q1. *> Q1は親のP1と領域を共有しているので値'OKINAWA'はP1に反映される。
000200 MOVE "YAMANASHI" TO Q2.*> Q2は親のP2と領域を共有していないので値'YAMANASHI'はP2に反映されない。
000210 MOVE 98765 TO Q3. *> Q3は親のP3と領域を共有していないので値98765はP3に反映されない。
000220
000230 EXIT PROGRAM. *> EXIT PROGRAMで親プログラムに戻る
(サンプルプログラム名:CALL文-INITIAL指定のないプログラムを呼ぶケース.cob)
・INITIAL指定のないプログラムを呼ぶケース
000000 IDENTIFICATION DIVISION.
000010 PROGRAM-ID. CALL-TEST2.
000020 DATA DIVISION.
000030 WORKING-STORAGE SECTION.
000040 01 A PIC 9(5).
000050 PROCEDURE DIVISION.
000060
000070 CALL "CALL_SUB2" USING A.
000080 DISPLAY "A=" A. *> 1が表示される。
000090 CALL "CALL_SUB2" USING A.
000100 DISPLAY "A=" A. *> 2が表示される。
000110 CALL "CALL_SUB2" USING A.
000120 DISPLAY "A=" A. *> 3が表示される。
000130
000140 STOP RUN.
[サンプルプログラム:CALL_SUB2.cob]
000000 IDENTIFICATION DIVISION.
000010 PROGRAM-ID. CALL_SUB2.
000020 DATA DIVISION.
000030 WORKING-STORAGE SECTION.
000040 01 WK-DATA PIC 9(5) VALUE 0.
000050 LINKAGE SECTION.
000060 01 Q1 PIC 9(5).
000070 PROCEDURE DIVISION USING Q1.
000080 ADD 1 TO WK-DATA. *> WK-DATAの値はCALL_SUB2が呼ばれるたびに+1される。
000090 MOVE WK-DATA TO Q1.
000100 EXIT PROGRAM.
(サンプルプログラム:CALL文-INITIAL指定のあるプログラムを呼ぶケース.cob)
・INITIAL指定のあるプログラムを呼ぶケース
000000 IDENTIFICATION DIVISION.
000010 PROGRAM-ID. CALL-TEST3.
000020 DATA DIVISION.
000030 WORKING-STORAGE SECTION.
000040 01 A PIC 9(5).
000050 PROCEDURE DIVISION.
000060
000070 CALL "CALL_SUB3" USING A.
000080 DISPLAY "A=" A. *> 1が表示される。
000090 CALL "CALL_SUB3" USING A.
000100 DISPLAY "A=" A. *> 1が表示される。
000110 CALL "CALL_SUB3" USING A.
000120 DISPLAY "A=" A. *> 2が表示される。
000130
000140 STOP RUN.
[プログラム:CALL_SUB3.cob]
000000 IDENTIFICATION DIVISION.
000010 PROGRAM-ID. CALL_SUB3 IS INITIAL. *> INITIAL指定のプログラム
000020 DATA DIVISION.
000030 WORKING-STORAGE SECTION.
000040 01 WK-DATA PIC 9(5) VALUE 0. *> 呼ばれるたびに0で初期化される。
000050 LINKAGE SECTION.
000060 01 Q1 PIC 9(5).
000070 PROCEDURE DIVISION USING Q1.
000080 ADD 1 TO WK-DATA. *> WK-DATAの値を呼ばれるたびに+1するが
000090 *> 毎回初期化されるので常に1になるだけ。
000100 MOVE WK-DATA TO Q1.
000110 EXIT PROGRAM.
(サンプルプログラム:CALL文-CANCELされたプログラムを呼ぶケース.cob)
・CANCEL文を実行するとINITIAL指定のないプログラムも初期化される
000000 IDENTIFICATION DIVISION.
000010 PROGRAM-ID. CALL-TEST4.
000020 DATA DIVISION.
000030 WORKING-STORAGE SECTION.
000040 01 A PIC 9(5).
000050 PROCEDURE DIVISION.
000060
000070 CALL "CALL_SUB2" USING A.
000080 DISPLAY "A=" A. *> 1が表示される。
000090 CALL "CALL_SUB2" USING A.
000100 DISPLAY "A=" A. *> 2が表示される。
000110
000120 CANCEL "CALL_SUB2". *> CALL_SUB2をキャンセルする。
000130
000140 CALL "CALL_SUB2" USING A. *> 再びCALL_SUB2を呼び出す。
000150 DISPLAY "A=" A. *> CALL_SUB2は初期状態となったので
000160 *> 1が表示される。
000170
000180 STOP RUN.
[プログラム:CALL_SUB2.cob]
前述のCALL_SUB2.cobプログラムに同じ
・存在しないプログラムを呼んだ場合
000000 CALL "not-exist"
000000 ON EXCEPTION
000000 DISPLAY "NG" *> 'not-exist.cob'が存在しない場合、'NG'が表示される。
000000 STOP RUN
000000 END-CALL.
CANCEL { 一意名-1 | 定数-1 } …
次回に呼び出されたときのプログラムの状態を初期状態にする。
上記のb.およびc.を、「暗黙的なCANCEL文」という。
CALL文の「書き方例3」を参照のこと。
COMPUTE { 一意名-1 [ ROUNDED ] } … = 算術式-1
[ ON SIZE ERROR 無条件文-1 ]
[ NOT ON SIZE ERROR 無条件文-2 ]
[ END-COMPUTE ]
算術式-1を演算し、その結果を一意名-1に格納する。
(サンプルプログラム名:COMPUTE文.cob)
000000 01 A PIC 99V9.
000000 01 B PIC 999V9.
000000 01 C PIC 99V9 VALUE 80.1.
000000 :
000000 COMPUTE A B ROUNDED = C + 0.05. *> 算術式の結果は80.15でありAには切り捨てられた
000000 *> 結果である80.1が、BにはROUNDED(四捨五入)の結果
000000 *> である80.2が格納される
000000
000000 COMPUTE A B ROUNDED = C + 20. *> 算術式の結果は100.1である。Aは桁あふれが発生し
000000 *> 下位の00.1格納される。Bにはそのまま100.1が格納される。
000000
000000 COMPUTE A B ROUNDED = C + 25 *> 算術式の結果は105.1でありAは桁あふれが発生しているが
000000 ON SIZE ERROR *> ON SIZE ERROR指定があるので更新はされない。
000000 *> Bにはそのまま125.1が格納される。
000000 DISPLAY "A=" A " B=" B *> 桁あふれが発生したのでON SIZE ERROR指定のDISPLAY文が
000000 : *> 実行され、"A=0.1 B=125.1"が表示される。
000000 END-COMPUTE.
CONTINUE
CONTINUE文は、プログラムの実行に何の影響も与えない。
DISPLAY { 一意名-1 | 定数-1 } … [ UPON 呼び名 ]
少量のデータの表示をする。
000000 01 A PIC S99V99 VALUE 02.10.
000000 01 B PIC S999V9 VALUE -002.1.
000000 01 C PIC X(10) VALUE "A + B = ".
000000 :
000000 DISPLAY C A " + " B. *> "A + B = 2.1 + -2.1" が表示される。
DIVIDE { 一意名-1 | 定数-1 } INTO { 一意名-2 [ ROUNDED ] } …
[ ON SIZE ERROR 無条件文-1 ]
[ NOT ON SIZE ERROR 無条件文-2 ]
[ END-DIVIDE ]
DIVIDE { 一意名-1 | 定数-1 } INTO { 一意名-2 | 定数-2 }
GIVING { 一意名-3 [ ROUNDED ] } …
[ ON SIZE ERROR 無条件文-1 ]
[ NOT ON SIZE ERROR 無条件文-2 ]
[ END-DIVIDE ]
DIVIDE { 一意名-2 | 定数-2 } BY { 一意名-1 | 定数-1 }
GIVING { 一意名-3 [ ROUNDED ] } …
[ ON SIZE ERROR 無条件文-1 ]
[ NOT ON SIZE ERROR 無条件文-2 ]
[ END-DIVIDE ]
DIVIDE { 一意名-1 | 定数-1 } INTO { 一意名-2 | 定数-2 }
GIVING 一意名-3 [ ROUNDED ] REMAINDER 一意名-4
[ ON SIZE ERROR 無条件文-1 ]
[ NOT ON SIZE ERROR 無条件文-2 ]
[ END-DIVIDE ]
DIVIDE { 一意名-2 | 定数-2 } BY { 一意名-1 | 定数-1 }
GIVING 一意名-3 [ ROUNDED ] REMAINDER 一意名-4
[ ON SIZE ERROR 無条件文-1 ]
[ NOT ON SIZE ERROR 無条件文-2 ]
[ END-DIVIDE ]
INTOの前の作用対象で一意名-2を割り、商を一意名-2に格納する。
000000 01 A PIC S999V99 VALUE 100.
000000 01 B PIC S999V99 VALUE 100.
000000 :
000000 DIVIDE 15 INTO A *> A := A / 15 、B := B / 15 の意である。
000000 B ROUNDED. *> Aには初期値100が入っているので15で割った商の6.66が格納される。
000000 *> BはROUNDED指定なので、最終的に四捨五入した結果の、6.67が格納される。
000000 :
000000 DIVIDE 0.001 INTO A *> A := 6.66 / 0.001 の計算結果は 6660 となりAの整数桁数3を
000000 ON SIZE ERROR *> 超えるので桁あふれが発生し、ON SIZE ERROR指定の文が実行される。
000000 *> Aの内容は変わらない
000000 MOVE ...
000000 END-DIVIDE.
INTOの前の作用対象でINTOの後の作用対象を割り、商を一意名-3に格納する。
(サンプルプログラム名:DIVIDE文-書き方2.cob)
000000 01 A PIC S9(5) VALUE 100.
000000 01 B PIC S9(5) VALUE 100.
000000 :
000000 DIVIDE 5 INTO A GIVING B. *> B := A / 5 の意である。Aには100が入っているので5で
000000 *> 割ってBには20が格納される。
BYの前の作用対象をBYの後の作用対象で割り、商を一意名-3に格納する。
(サンプルプログラム名:DIVIDE文-書き方3.cob)
000000 01 A PIC S9(5) VALUE 100.
000000 01 B PIC S9(5) VALUE 100.
000000 :
000000 DIVIDE A BY 5 GIVING B. *> B := A / 5 の意である。Aには100が入っているので5で
000000 *> 割ってBには20が格納される。
INTOの前の作用対象でINTOの後の作用対象を割り、商を一意名-3に格納し、剰余を一意名-4に格納する。
(サンプルプログラム名:DIVIDE文-書き方4.cob)
000000 01 A PIC S9(5) VALUE 100.
000000 01 B PIC S9(5).
000000 01 C PIC S9(5).
000000 :
000000 DIVIDE 15 INTO A GIVING B REMAINDER C.
000000 *> B := A / 15 であり、Aには100が入っているので15で割ってBには6が格納される。
000000 *> Cには、被除数(100) - 商(6) * 除数(15) にて計算された 10が格納される。
000000
000000 DIVIDE 15 INTO -100 GIVING B REMAINDER C.
000000 *> B := -100 / 15 であり、-100 を 15で割ってBには-6が格納される。
000000 *> Cには、被除数(-100) - 商(-6) * 除数(15) にて計算された -10が格納される。
BYの前の作用対象をBYの後の作用対象で割り、商を一意名-3に格納し、剰余を一意名-4に格納する。
(サンプルプログラム名:DIVIDE文-書き方5.cob)
ENTRY 定数-1 USING { データ名-1 } …
※ SIT COBOLは、ENTRY文は未サポートである。
EVALUATE { 一意名-1 | 定数-1 | 式-1 | TRUE | FALSE }
[ ALSO { 一意名-2 | 定数-2 | 式-2 | TRUE | FALSE } ] …
{{ WHEN { ANY | 条件-1 | TRUE | FALSE | [ NOT ] {{ 一意名-3 | 定数-3 | 算術式-1 }
[ { THRU | THROUGH } { 一意名-4 | 定数-4 | 算術式-2 } ]}}
[ ALSO { ANY | 条件-2 | TRUE | FALSE | [ NOT ] {{ 一意名-5 | 定数-5 | 算術式-3 }
[ { THRU | THROUGH } { 一意名-6 | 定数-6 | 算術式-4 } ]}} ] … } …
無条件文-1 } …
[ WHEN OTHER 無条件文-2 ]
[ END-EVALUATE ]
複数の条件を評価し、評価結果に対応する文を実行する。
例えば「数字」が1-3だったら”3以下である”、4-5だったら”3より大きい”と表示するプログラムは次のように書くことができる
000000 EVALUATE 数字
000000 WHEN 1
000000 WHEN 2
000000 WHEN 3
000000 DISPLAY "3以下である"
000000 WHEN 4
000000 WHEN 5
000000 DISPLAY "3より大きい"
000000 END-EVALUATE.
もちろん、下記のように略記を使って書いてもよい
000000 EVALUATE 数字
000000 WHEN 1 OR 2 OR 3
000000 DISPLAY "3以下である"
000000 WHEN 4 OR 5
000000 DISPLAY "3より大きい"
000000 END-EVALUATE.
項番 | 顧客種別 | 購入金額 | 配送料 | |
1 | ゴールド会員 | 3000円以上 | 0円 | |
2 | ゴールド会員 | 3000円未満 | 600円 | |
3 | 一般会員 | 5000円以上 | 300円 | |
4 | 一般会員 | 5000円未満 | 900円 |
Java / C で switch-case文を使うケースに準じた書き方
000000* switch (customerType) {
000000* case "ゴールド会員":
000000* if (totalPrice > 3000)
000000* deliveryFee = 0;
000000* else
000000* deliveryFee = 600;
000000* break;
000000* default: //一般会員
000000* if (totalPrice > 5000)
000000* deliveryFee = 300;
000000* else
000000* deliveryFee = 900;
000000* };
000000*
000000* 上記に対応するEVALUATE文
000000*
000000 EVALUATE 顧客種別
000000 WHEN "ゴールド会員"
000000 IF 購入金額 > 3000
000000 MOVE 0 TO 配送料
000000 ELSE
000000 MOVE 600 TO 配送料
000000 END-IF
000000 WHEN OTHER *> "一般会員"
000000 IF 購入金額 > 5000
000000 MOVE 300 TO 配送料
000000 ELSE
000000 MOVE 900 TO 配送料
000000 END-IF
000000 END-EVALUATE.
次のように記述することもできる。
000000 EVALUATE TRUE
000000 WHEN 会員種別 = "ゴールド会員" AND 購入金額 >= 3000
000000 MOVE 0 TO 配送料
000000 WHEN 会員種別 = "ゴールド会員" AND 購入金額 < 3000
000000 MOVE 600 TO 配送料
000000 WHEN 会員種別 = "一般会員" AND 購入金額 >= 5000
000000 MOVE 300 TO 配送料
000000 WHEN 会員種別 = "一般会員" AND 購入金額 < 5000
000000 MOVE 900 TO 配送料
000000 END-EVALUATE.
ALSOやTHRUを使って、次のように表形式のまま書くこともできる。
(サンプルプログラム名:EVALUATE文.cob)
000000 EVALUATE 会員種別 ALSO 購入金額
000000 WHEN "ゴールド会員" ALSO 0 THRU 3000
000000 MOVE 600 TO 配送料
000000 WHEN "ゴールド会員" ALSO ANY
000000 MOVE 0 TO 配送料
000000 WHEN "一般会員" ALSO 0 THRU 5000
000000 MOVE 900 TO 配送料
000000 WHEN "一般会員" ALSO ANY
000000 MOVE 300 TO 配送料
000000 END-EVALUATE.
EXIT
EXIT PERFORM [ CYCLE ]
EXIT PROGRAM
一連の手続きの共通の出口を指定する。
うちPERFORM文の出口を指定する。
000000 PERFORM 1000 TIMES
000000 READ 入力ファイル AT END
000000 EXIT PERFORM *> PERFORMを抜ける
000000 END-READ
000000 IF 入力レコード = SPACE
000000 EXIT PERFORM CYCLE *> PERFORMの先頭に戻り1000回繰り返したかの検査に入る
000000 END-IF
000000 :
000000 END-PERFORM.
呼ばれるプログラムの論理的な終わりを指定する。
(*1) CALL文の直後に制御が戻ると同時に、カレントディレクトリも、CALL文の実行前の状態に戻る。
CALL文の書き方例を参照のこと。
GENERATE { データ名-1 | 報告書名-1 }
※ SIT COBOLでは、GENERATE文は未サポートである。
報告書記述に従って報告書を作成する。
GO TO 手続き名-1
GO TO { 手続き名-1 } … DEPENDING ON 一意名-1
※ SIT COBOLでは、DEPENDING指定のGO TO文は未サポートである。
制御を手続き名-1に移す
一意名-1の値が1の場合は1番目の手続き名-1、2の場合は2番目の手続き名-1というように、制御を移す。
IF 条件-1 THEN
{ {文-1} … | NEXT SENTENCE }
{ ELSE {文-2} … [ END-IF ] | ELSE NEXT SENTENCE | END-IF }
(サンプルプログラム名:IF文-条件式.cob)
000000* 通常の書き方(IFとEND-IFが呼応)
000000 IF A = B ... [1]
000000 MOVE 1 TO FLG
000000 IF C = D ... [2]
000000 :
000000 END-IF ... [2]の終了
000000 ADD 1 TO FLG
000000 ELSE
000000 :
000000 END-IF. ... [1]の終了
000000* ピリオドで終了する書き方
000000 IF A = B
000000 MOVE 1 TO FLG
000000 IF C = D
000000 ADD 1 TO FLG. *> 最後のピリオドで、すべてのIF文が終わる。
NEXT SENTENCEは、次の完結文への移行、すなわち、ピリオドへの GO TO文と理解すればよい。
000000* NEXT SENTENCE
000000 IF A = B
000000 MOVE 1 TO FLG
000000 IF C = D
000000 NEXT SENTENCE *> IF文を抜けて次の完結文[1]に制御を移す
000000 ELSE
000000 :
000000 END-IF
000000 ADD 1 TO FLG
000000 ELSE
000000 :
000000 END-IF.
000000 MOVE C TO D. ... [1]
INITIALIZE { 一意名-1 } …
一意名-1のデータ項目を初期化する。
(サンプルプログラム名:INITIALIZE文.cob)
INITIATE { 報告書名-1 } …
※ SIT COBOLは、INITIATE文は未サポートである。
報告書の処理を開始する。
INSPECT { 一意名-1 | 定数-6 } TALLYING { 一意名-2 FOR
{ CHARACTERS
[{ BEFORE | AFTER } INITIAL { 一意名-4 | 定数-2 }] … |
{ ALL | LEADING } {{ 一意名-3 | 定数-1 }
[{ BEFORE | AFTER } INITIAL { 一意名-4 | 定数-2 }] … } …
} …
} …
INSPECT 一意名-1 REPLACING
{ CHARACTERS BY { 一意名-5 | 定数-3 }
[{ BEFORE | AFTER } INITIAL { 一意名-4 | 定数-2 }] … |
{ ALL | LEADING | FIRST } {{ 一意名-3 | 定数-1 } BY { 一意名-5 | 定数-2 }
[{ BEFORE | AFTER } INITIAL { 一意名-4 | 定数-2 }] … } …
} …
INSPECT 一意名-1 TALLYING { 一意名-2 FOR
{ CHARACTERS
[{ BEFORE | AFTER } INITIAL { 一意名-4 | 定数-2 }] … |
{ ALL | LEADING } {{ 一意名-3 | 定数-1 }
[{ BEFORE | AFTER } INITIAL { 一意名-4 | 定数-2 }] … } …
} …
} …
REPLACING
{ CHARACTERS BY { 一意名-5 | 定数-3 }
[{ BEFORE | AFTER } INITIAL { 一意名-4 | 定数-2 }] … |
{ ALL | LEADING | FIRST } {{ 一意名-3 | 定数-1 } BY { 一意名-5 | 定数-2 }
[{ BEFORE | AFTER } INITIAL { 一意名-4 | 定数-2 }] … } …
} …
INSPECT 一意名-1 CONVERTING { 一意名-6 | 定数-4 } TO { 一意名-7 | 定数-5 }
[{ BEFORE | AFTER } INITIAL { 一意名-4 | 定数-2 }] …
文字列の出現回数のカウント
(サンプルプログラム名:INSPECT文-書き方1.cob)
(サンプルプログラム名:日本語INSPECT文-書き方1.cob)
“>>>”と”<<<“に囲まれた文字列の数を求める。
000000 MOVE 0 TO T1.
000000 INSPECT "XYZ>>>ABCDEFG<<<*ABC" TALLYING T1 FOR CHARACTERS
000000 AFTER ">>>" BEFORE "<<<".
000000 DISPLAY "T1=" T1. *> T1=7 が表示される
“AB”の出現回数を求める。
000000 MOVE 0 TO T2.
000000 INSPECT "ABCABCDEFDEF" TALLYING T2 FOR ALL "AB".
000000 DISPLAY "T2=" T2. *> T2=2 が表示される
先頭から連続した”DE”の出現回数を求める。
000000 MOVE 0 TO T3.
000000 INSPECT "DEDEFDEDEF" TALLYING T3 FOR LEADING "DE".
000000 DISPLAY "T3=" T3. *> T3=2 が表示される
上記の組み合わせ
000000 MOVE 0 TO T0 T1 T2 T3 T4.
000000 INSPECT "EFABDBCGABCFGG" TALLYING
000000 T0 FOR ALL "AB", ALL "D"
000000 T1 FOR ALL "BC"
000000 T2 FOR LEADING "EF"
000000 T3 FOR LEADING "B"
000000 T4 FOR CHARACTERS.
000000
000000 DISPLAY "T0=" T0. *> T0=3 が表示される
000000 DISPLAY "T1=" T1. *> T1=1 が表示される
000000 DISPLAY "T2=" T2. *> T2=1 が表示される
000000 DISPLAY "T3=" T3. *> T3=0 が表示される
000000 DISPLAY "T4=" T4. *> T4=5 が表示される
文字列の置き換え
(サンプルプログラム名:INSPECT文-書き方2.cob)
(サンプルプログラム名:日本語INSPECT文-書き方2.cob)
“BA”から”BC”の間にある”AB”を”XY”にする。
000000 MOVE "ABABABABC" TO 文字列.
000000 INSPECT 文字列 REPLACING
000000 ALL "AB" BY "XY" AFTER "BA" BEFORE "BC".
000000 DISPLAY "文字列=" 文字列. *> 文字列=ABABXYABC が表示される
先頭から連続した”DE”を”XYZ”に置き換える。
000000 MOVE "DEDEFDEDEF" TO 文字列.
000000 INSPECT 文字列 REPLACING LEADING "DE" BY "XY".
000000 DISPLAY "文字列=" 文字列. *> 文字列=XYXYFDEDEF が表示される
最初に現れた”A”を”X”に置き換える。
000000 MOVE "THIS IS AN APPLE." TO 文字列.
000000 INSPECT 文字列 REPLACING FIRST "A" BY "X".
000000 DISPLAY "文字列=" 文字列. *> 文字列=THIS IS XN APPLE. が表示される
上記の組み合わせ
000000 MOVE "EFABDBCGABCFGG" to 文字列.
000000 INSPECT 文字列 REPLACING
000000 ALL "AB" BY "XY", "D" BY "X"
000000 ALL "BC" BY "VW"
000000 LEADING "EF" BY "TU"
000000 LEADING "B" BY "S"
000000 FIRST "G" BY "R"
000000 FIRST "G" BY "P"
000000 CHARACTERS BY "Z".
000000 DISPLAY "文字列=" 文字列. *> 文字列=TUXYXVWRXYZZPZ が表示される
文字列の出現回数のカウントおよび文字列の置き換え。
置き換える文字列をまとめて指定
(サンプルプログラム名:INSPECT文-書き方4.cob)
(サンプルプログラム名:日本語INSPECT文-書き方4.cob)
“A”, “D”, “F”の文字を小文字に置き換える。
000000 MOVE "ABCDEFGHIJ" TO 文字列.
000000 INSPECT 文字列 CONVERTING "ADF" TO "adf".
000000 DISPLAY "文字列=" 文字列. *> 文字列=aBCdEfGHIJ が表示される
文字列検査の範囲
検査文字列の比較の手順
出現回数の数え方と文字列の置き換え方
MOVE { 一意名-1 | 定数-1 } TO { 一意名-2} …
MOVE { CORRESPONDING | CORR } 一意名-1 TO 一意名-2
(*1) SIT COBOLは、ZEROも書くことができる。このとき、SPACE, ZEROは暗黙のALLが指定され、それぞれ日本語の空白、ゼロと解釈される。
一意名-1に従属するデータ項目と一意名-2に従属するデータ項目のうち、名前の修飾語の系列が同じものどうしを転記する。一意名-1に従属するデータ項目を送出し側作用対象、一意名-2に従属するデータ項目を受取り側作用対象として転記する。この結果は、対応する一意名ごとに、別々のMOVE文を書いた結果と同じである。
(サンプルプログラム名:MOVE_CORR文.cob)
000040 01 X.
000050 03 B PIC X value "A".
000060 03 C.
000070 05 C1 PIC 9 value 1.
000080 05 C2 PIC 9 value 2.
000090 05 filler pic 9 value 3.
000100 03 D.
000110 05 D1 PIC 9 value 4.
000120 05 D2 PIC 9 value 5.
000130 03 E PIC 9 value 8.
000140 03 F.
000150 05 F1 PIC 9 VALUE 6.
000160 05 F2 PIC 9 VALUE 7.
000170 01 Y.
000180 03 B PIC X.
000190 03 C.
000200 05 C1 PIC 9.
000210 05 C2 PIC 9.
000220 03 D REDEFINES C.
000230 05 D1 PIC 9.
000240 05 D2 PIC 9.
000250 03 F PIC 9(2).
000260 03 E PIC 9.
:
000300 MOVE CORR X TO Y.
000000 *> このMOVE CORRで下記の転記がされる
000000 *> MOVE B OF X TO B OF Y.
000000 *> MOVE C1 OF C OF X TO C1 OF C OF Y.
000000 *> MOVE C2 OF C OF X TO C2 OF C OF Y.
000000 *> MOVE E OF X TO E OF Y.
000000 *> MOVE F OF X TO F OF Y. ... どちらか一方が集団項目の場合はOK
000000 *> 下記は受取項目が再定義項目なので実行されない。
000000 *> MOVE D1 OF D OF X TO D1 OF D OF Y.
000000 *> MOVE D2 OF D OF X TO D2 OF D OF Y.
000330 stop run.
MULTIPLY { 一意名-1 | 定数-1 } BY { 一意名-1 [ ROUNDED ]} …
[ ON SIZE ERROR 無条件文-1 ]
[ NOT ON SIZE ERROR 無条件文-2 ]
[ END-MULTIPLY ]
MULTIPLY { 一意名-1 | 定数-1 } BY { 一意名-2 | 定数-2 }
GIVING { 一意名-3 [ ROUNDED ]} …
[ ON SIZE ERROR 無条件文-1 ]
[ NOT ON SIZE ERROR 無条件文-2 ]
[ END-MULTIPLY ]
BYの前の作用対象に一意名-2を掛け、一意名-2に格納する。一意名-2の並びを書いた順に、この乗算を行う。
(サンプルプログラム名:MULTIPLY文.cob)
BYの前の作用対象にBYの後の作用対象を掛け、一意名-3に格納する。一意名-3の並びを書いた順に、この乗算の結果を格納する。
(サンプルプログラム名:MULTIPLY_GIVING文.cob)
PERFORM 手続き名-1 [ { THRU | THROUGH } 手続き名-2 ]
PERFORM
無条件文-1
END-PERFORM
PERFORM 手続き名-1 [ { THRU | THROUGH } 手続き名-2 ]
{ 一意名-1 | 整数-1 } TIMES
PERFORM { 一意名-1 | 整数-1 } TIMES
無条件文-1
END-PERFORM
PERFORM 手続き名-1 [ { THRU | THROUGH } 手続き名-2 ]
[ WITH TEST { BEFORE | AFTER }] UNTIL 条件-1
PERFORM [ WITH TEST { BEFORE | AFTER }] UNTIL 条件-1
無条件文-1
END-PERFORM
PERFORM 手続き名-1 [ { THRU | THROUGH } 手続き名-2 ]
[ WITH TEST { BEFORE | AFTER }]
VARYING { 一意名-2 | 指標名-1 } FROM { 一意名-3 | 指標名-2 | 定数-1 }
BY { 一意名-4 | 定数-2 } UNTIL 条件-1
[ AFTER { 一意名-5 | 指標名-3 } FROM { 一意名-6 | 指標名-4 | 定数-3 }
BY { 一意名-7 | 定数-4 } UNTIL 条件-1 ] …
※ SIT COBOLは AFTER指定は未サポートである。(サポート予定あり)
PERFORM
[ WITH TEST { BEFORE | AFTER }]
VARYING { 一意名-2 | 指標名-1 } FROM { 一意名-3 | 指標名-2 | 定数-1 }
BY { 一意名-4 | 定数-2 } UNTIL 条件-1
[ AFTER { 一意名-5 | 指標名-3 } FROM { 一意名-6 | 指標名-4 | 定数-3 }
BY { 一意名-7 | 定数-4 } UNTIL 条件-1 ] …
無条件文-1
END-PERFORM
※ SIT COBOLでは AFTER指定は未サポートである。(サポート予定あり)
PERFORM 手続き名-1 [ { THRU | THROUGH } 手続き名-2 ] FOREVER
PERFORM FOREVER
無条件文-1
END-PERFORM
文の組を1回だけ実行する
文の組の実行を、特定の回数だけ繰り返す
文の組の実行を、条件を満足するまで繰り返す
文の組の実行を条件を満足するまで繰り返すと同時に、繰り返し回数に応じてデータ項目または指標名の値を変化させる
文の組を繰り返し実行する。この繰り返しは、制御の明示移行を示す分岐文またはEXIT PERFORM文を実行したときに終了する。
(サンプルプログラム名:外PERFORM文-段落.cob)
(サンプルプログラム名:外PERFORM文-節.cob)
(サンプルプログラム名:内PERFORM文.cob)
(サンプルプログラム名:PERFORM文-FOREVER.cob)
SEARCH 一意名-1 [ VARYING { 一意名-2 | 指標名-1 }]
[ AT END 無条件文-1 ]
{ WHEN 条件-1 { 無条件文-2 | NEXT SENTENCE }} …
[ END-SEARCH ]
SEARCH ALL 一意名-1
[ AT END 無条件文-1 ]
WHEN { データ名-1 { IS EQUAL TO | IS = } { 一意名-3 | 定数-1 | 算術式-1 } | 条件名-1 }
[ AND { データ名-1 { IS EQUAL TO | IS = } { 一意名-3 | 定数-1 | 算術式-1 } | 条件名-1 } ] …
{ 無条件文-2 | NEXT SENTENCE }
[ END-SEARCH ]
表要素を順に検索する
昇順または降順に並んでいる表要素を非逐次に検索する
(サンプルプログラム名:SEARCH文.cob)
SET { 指標名-1 | 一意名-1 } … TO { 指標名-2 | 一意名-2 | 整数-1 }
SET { 指標名-3 } … { UP BY | DOWN BY } { 一意名-3 | 整数-2 }
SET { { 呼び名-1 } … TO … { ON | OFF} }
※ SIT COBOLは、書き方3のSET文は未サポートである。(サポート予定あり)
SET { 条件名-1 } … TO TRUE
SET ENVIRONMENT { 定数-1 | 一意名-4 } TO { 定数-2 | 一意名-5 }
表要素の指標を設定する
送り出し側作業対象 | 受け取り側作業対象 | |||
指標名-1 | 一意名-1 | |||
指標データ項目 | 整数項目 | |||
指標名-2 | ○ (a) | ○ (b) | ○ (c) | |
一意名-2 | 指標データ項目 | ○ (a) | ○ (b) | — |
整数項目 | ○ (a) | ○ (b) | — | |
整数-1 | ○ (a) | — | — |
指標の設定は、以下の規則に従って行わる。
指標名の値を増減する
外部スイッチの状態を設定する
条件変数の値を設定する
環境変数に値を設定する
000000 SET ENVIRONMENT "ABC" TO "XYZ". *> 環境変数ABCに値"XYZ"を設定する。
(サンプルプログラム名:環境変数.cob)
STOP RUN
実行を終了する。
(*1) プログラムの終了状態は、Windows では、ERRORLEVELに相当する。
STRING {{ 一意名-1 | 定数-1} … DELIMITED BY { 一意名-2 | 定数-2 | SIZE }} …
INTO 一意名-3 [ WITH POINTER 一意名-4 ]
[ ON OVERFLOW 無条件文-1 ]
[ NOT ON OVERFLOW 無条件文-2 ]
[ END-STRING ]
文字列を連結する
(サンプルプログラム名:STRING文.cob)
(サンプルプログラム名:日本語STRING文.cob) - ##### 書き方例1
000000 01 連結結果 PIC X(10).
000000 01 POINTER-1 COMP-1.
000000 :
000000 STRING "ABCDE" "fghij" DELIMITED BY SIZE INTO 連結結果.
000000 DISPLAY 連結結果. *> "ABCDEfghij"が表示される。
000000 MOVE "**********" TO 連結結果.
000000 MOVE 3 TO POINTER-1.
000000 STRING "ABCDE" DELIMITED BY SIZE INTO 連結結果
000000 POINTER POINTER-1.
000000 DISPLAY 連結結果. *> "**ABCDE***"が表示される。
000000 MOVE "**********" TO 連結結果.
000000 MOVE 3 TO POINTER-1.
000000 STRING "ABCDE" "fghij" DELIMITED BY SIZE INTO 連結結果
000000 POINTER POINTER-1
000000 ON OVERFLOW *> "fghij"が"fgh"までしか格納できずOVERFLOWが発生
000000 DISPLAY 連結結果 *> "**ABCDEfgh" が表示される。
000000 DISPLAY POINTER-1 *> 11が表示される。
000000 END-STRING.
000000 77 ST-COBOL PIC X(5) VALUE "COBOL".
000000 77 ST-IS PIC X(2) VALUE "IS".
000000 77 ST-INTARESTING PIC X(20) VALUE "INTAERESTING.#012345".
000000 77 ST-RESULT PIC X(30) VALUE ALL "=".
000000 :
000000 MOVE 5 TO POINTER.
000000 STRING ST-COBOL SPACE ST-IS SPACE BY DELIMITED BY SIZE
000000 ST-INTERESTING DELIMITED BY "#"
000000 INTO ST-RESULT POINTER POINTER-1.
000000 DISPLAY ST-RESULT. *> "====COBOL IS INTERESTING.====="が表示される。
SUBTRACT { 定数-1 | 一意名-1 }
FROM { 一意名-2 [ ROUNDED ] } …
[ ON SIZE ERROR 無条件文-1 ]
[ NOT ON SIZE ERROR 無条件文-2 ]
[ END-SUBTRACT ]
SUBTRACT { 定数-1 | 一意名-1 } …
FROM { 定数-2 | 一意名-2 } GIVING { 一意名-3 [ ROUNDED ]} …
[ ON SIZE ERROR 無条件文-1 ]
[ NOT ON SIZE ERROR 無条件文-2 ]
[ END-SUBTRACT ]
SUBTRACT { CORRESPONDING | CORR } 一意名-1 FROM 一意名-2 [ ROUNDED ]
[ ON SIZE ERROR 無条件文-1 ]
[ NOT ON SIZE ERROR 無条件文-2 ]
[ END-SUBTRACT ]
FROMの前の各作用対象の和を一意名-2から引き、一意名-2に格納する。一意名-2の並びを書いた順に、この減算を行う。
FROMの前の各作用対象の和を、FORMの後の作用対象から引き、一意名-3に格納する。一意名-3の並びを書いた順に、この減算の結果を格納する。
一意名-1に従属するデータ項目と一意名-2に従属するデータ項目のうち、名前の修飾語の系列が同じものどうしの差を求める。一意名-1に従属するデータ項目を減数、一意名-2に従属するデータ項目を被減数として差を求め、一意名-2に従属するデータ項目に格納する。この結果は、対応する一意名ごとに、別々のSUBTRACT文を書いた結果と同じである。
(サンプルプログラム名:SUBTRACT文-書き方1.cob)
(サンプルプログラム名:SUBTRACT文-書き方2.cob)
(サンプルプログラム名:SUBTRACT文-書き方3.cob)
データ項目の一連の文字を走査して置換する。
TRANSFORM { 一意名-1 | 定数-3 } FROM { 定数-1 | 一意名-2 } TO { 定数-2 | 一意名-3 }
(サンプルプログラム名:TRANSFORM文.cob)
(サンプルプログラム名:日本語TRANSFORM文.cob)
文字列を分解する。
UNSTRING 一意名-1
[ DELIMITED BY [ ALL ] { 一意名-2 | 定数-1 } [ OR [ ALL ] { 一意名-3 | 定数-2 } ] … ]
INTO { 一意名-4 [ DELIMITER IN 一意名-5 ] [ COUNT IN 一意名-6 ]} …
[ WITH POINTER 一意名-7 ]
[ TALLYING IN 一意名-8 ]
[ ON OVERFLOW 無条件文-1]
[ NOT ON OVERFLOW 無条件文-2 ]
[ END-UNSTRING ]
ON OVERFLOW指定の有無 | NOT ON OVERFLOW句の有無 | 制御の移行 | |
転記処理でオーバーフロー条件が発生した場合(*3) | 転記処理でオーバーフロー条件が発生しなかった場合 | ||
あり | あり |
[1]転記が終了し、無条件文-1に制御が移る。 [2]無条件文-1の実行後、UNSTRING文の終わりに制御が移る。(*1) |
[1]すべての転記が終了した後、無条件文-2に制御が移る。 [2]無条件文-2の実行後、UNSTRING文の終わりに制御が移る。(*2) |
あり | なし |
[1]転記が終了し、無条件文-1に制御が移る。 無条件文-1の実行後、UNSTRING文の終わりに制御が移る(*1) |
すべての転記が終了した後、UNSTRING文の終わりに制御が移る |
なし | あり | 転記が終了し、UNSTRING文の終わりに制御が移る。 |
[1]すべての転記が終了した後、無条件文-2に制御が移る。 無条件文-2の実行後、UNSTRING文の終わりに制御が移る。(*2) |
なし | なし | 転記が終了し、UNSTRING文の終わりに制御が移る。 | すべての転記が終了した後、UNSTRING文の終わりに制御が移る。 |
(*1)
無条件文-1に制御の明示移行を起こす手続き分岐または条件文を書いた場合、その文の規則に従って制御が移る。
(*2)
無条件文-2に制御の明示移行を起こす手続き分岐または条件文を書いた場合、その文の規則に従って制御が移る。
(*3)
オーバーフロー条件は、以下の場合に発生する。
(サンプルプログラム名:UNSTRING文.cob)
(サンプルプログラム名:日本語UNSTRING文.cob)
この節では、ファイル入出力操作に関する各文について説明する。
ファイルの処理を終了させる。
CLOSE ファイル名-1 [ ファイル名-2 ] …
大記憶ファイルからレコードを論理的に取り除く。
DELETE ファイル名-1 RECORD
[ INVALID KEY 無条件文-1 ]
[ NOT INVALID KEY 無条件文-2 ]
[ END-DELETE ]
ファイルを使用可能な状態にする。
OPEN {
{ INPUT ファイル名-1 [ WITH LOCK] } …
{ OUTPUT ファイル名-2 [ WITH LOCK] } …
{ I-O ファイル名-3 [ WITH LOCK] } …
{ EXTEND ファイル名-4 [ WITH LOCK] } …
} …
(※) SIT COBOLは、WITH
LOCK指定は未サポートである。(サポート予定)
ファイル名-1~ファイル名-4の並びに、ORGANIZATION句の指定が異なるファイルまたはACCESS MODE句の指定が異なるファイルを指定することもできる。
EXTEND指定を書く場合、ファイル名-4は順呼出し法のファイルでなければならない。
以下で、“ファイル名-n”は、ファイル名-1~ファイル名-4に指定したファイルを表す。
OPEN文の指定 | ファイルが使用可能 | ファイルが使用不可能 |
INPUT | ファイルが開かれる。 | OPEN文は不成功になる。 |
INPUT (不定ファイルの場合) |
ファイルが開かれる。 | ファイルが開かれる。最初の読込みでファイル終了条件または無効キー条件になる。 |
I-O | ファイルが開かれる。 | OPEN文は不成功になる。 |
I-O (不定ファイルの場合) |
ファイルが開かれる。 | OPEN文の実行で、ファイルが生成される。 |
OUTPUT | ファイルが開かれる。ただし、そのファイルにはレコードがない状態。 | OPEN文の実行で、ファイルが生成される。 |
EXTEND | ファイルが開かれる。 | OPEN文は不成功になる。 |
EXTEND (不定ファイルの場合) |
ファイルが開かれる。 | OPEN文の実行で、ファイルが生成される。 |
生成されたファイルは、レコードが存在しない状態になっている。
ファイルからレコードを読む。
レコードを順読みする(順・相対・索引)
READ ファイル名-1 [ NEXT ] RECORD
[ INTO 一意名-1 ]
[ WITH [ NO ] LOCK ]
[ AT END 無条件文-1 ]
[ NOT AT END 無条件文-2 ]
[ END-READ ]
レコードを乱読みする。(相対ファイル)
READ ファイル名-1 RECORD
[ INTO 一意名-1 ]
[ WITH [ NO ] LOCK ]
[ INVALID KEY 無条件文-3 ]
[ NOT INVALID KEY 無条件文-4 ]
[ END-READ ]
レコードを乱読みする。(索引ファイル)
READ ファイル名-1 RECORD
[ INTO 一意名-1 ]
[ WITH [ NO ] LOCK ]
[ KEY IS { データ名-1 } … ]
[ INVALID KEY 無条件文-3 ]
[ NOT INVALID KEY 無条件文-4 ]
[ END-READ ]
(※) SIT COBOLは、WITL
LOCK指定は未サポートである。(サポート予定あり)
(※) SIT
COBOLは、書き方3において、データ名-1を複数指定することはできない。(サポート予定あり)
現在のレコードの大きさは、ファイル名-1のRECORD句の規則に従って決定される。ファイル名-1のファイル記述項に書き方3以外のRECORD句を書いた場合、b.では集団項目転記が行われる。一意名-1に付けた添字は、a.の後b.の前に評価される。a.のREAD文が不成功の場合、暗黙のMOVE文は実行されない。
大記憶ファイル中のレコードを論理的に書き換える。
順に読んだレコードを書き換える。
REWRITE レコード名-1 [ FROM 一意名-1 ]
[ END-REWRITE ]
指定したレコードを書き換える(相対ファイル・索引ファイル)
REWRITE レコード名-1 [ FROM 一意名-1 ]
[ INVALID KEY 無条件文-1 ]
[ NOT INVALID KEY 無条件文-2 ]
[ END-REWRITE ]
レコードを順呼出しするためにファイルを論理的に位置付ける。
START ファイル名-1
[ KEY
{ IS EQUAL TO |
IS = |
IS GREATER THAN |
IS > |
IS NOT LESS THAN |
IS NOT < |
IS GREATER THAN OR EQUAL TO |
IS >= } データ名-1
[ INVALID KEY 無条件文-1 ]
[ NOT INVALID KEY 無条件文-2 ]
[ END-START ]
[備考]
=”、“>”、“<”、“>=”および“<=”は必要語である。ここでは、他の記号との混同を避けるために下線を付けていない。
レコードのファイルへの書き出しを行う。
WRITE レコード名-1 [ FROM { 一意名-1 | 定数-1 } ]
[ END-WRITE ]
WRITE レコード名-1 [ FROM { 一意名-1 | 定数-1 } ]
[ INVALID KEY 無条件文-1 ]
[ NOT INVALID KEY 無条件文-2 ]
[ END-WRITE ]
入出力誤り処理手続きの開始を指定する。
USE [ GLOBAL ] AFTER STANDARD { EXCEPTION | ERROR } PROCEDURE ON
{ {ファイル名-1} … | INPUT | OUTPUT | I-O | EXTEND }
(※) SIT COBOLは、GLOBAL句を指定することはできない。
2つ以上のファイルを併合する。
MERGE ファイル名-1
ON { ASCENDING | DESCENDING } KEY { データ名-1 } …
[ COLLATING SEQUENCE IS 符号系名-1 ]
USING ファイル名-2 { ファイル名-3 } …
{ OUTPUT PROCEDURE IS 手続き名-1 [ { THROUGH | THRU } 手続き名-2 ] |
GIVING { ファイル名-4 } … }
(※) SIT COBOLは、符号系名-1には対応していない。(制限事項)
(※) SIT
COBOLは、GIVING句に複数のファイルを指定することはできない。(制限事項)
(*1) SIT
COBOLは、可変長ファイルには対応していない。(制限事項)
(*2) SIT
COBOLは、SAME AREA句、SAME-SORT/SAME-MERGE
AREA句には対応していない。(制限事項)
(*1) SIT COBOLでは、USE AFTER STANDARD EXCEPTION手続きが書かれていても、実行されることはない。(制限事項)
USING/GIVINGを利用した例と、USING/OUTPUT PROCEDUREを使用した例を示す。
(サンプル: MERGE文.cob)
000000 IDENTIFICATION DIVISION.
000010 PROGRAM-ID. MERGE_01.
000020 ENVIRONMENT DIVISION.
000030 INPUT-OUTPUT SECTION.
000040 FILE-CONTROL.
000050 SELECT F1 ASSIGN TO "F1.txt". *> MERGEの入力と出力に使用
000060 SELECT F2 ASSIGN TO "F2.txt". *> MERGEの入力に使用
000070 SELECT MERGE-F ASSIGN TO "SD1". *> "SD1"はメモのみである
000080 DATA DIVISION.
000090 FILE SECTION.
000100 FD F1.
000110 01 F1-REC.
000120 02 F1-DATA1 PIC X(5).
000130 02 F1-DATA2 PIC S9(3)V9(2).
000140 02 F1-DMY PIC X(10).
000150*
000160 FD F2.
000170 01 F2-REC.
000180 02 F2-DATA1 PIC X(5).
000190 02 F2-DATA2 PIC S9(3)V9(2).
000200 02 F2-DMY PIC X(10).
000210*
000220 SD MERGE-F.
000230 01 MERGE-R.
000240 02 DATA1 PIC X(5). *> マージキー1: 英数字項目
000250 02 DATA2 PIC S9(3)V9(2). *> マージキー2: 数字項目
000260 02 PIC X(10).
000270 WORKING-STORAGE SECTION.
000280 01 WK1. *> マージ用データ1
000290 02 PIC X(20) VALUE "aaaaa,+33, ".
000300 02 PIC X(20) VALUE "aaaaa, 22.12, ".
000310 02 PIC X(20) VALUE "bbbbb,+100, ".
000320 02 PIC X(20) VALUE "bbbbb,-100.00,".
000330 02 PIC X(20) VALUE "ccccc, 123, ".
000340 02 PIC X(20) VALUE "ccccc,-123, ".
000350 02 PIC X(20) VALUE "ddddd,-444.4, ".
000360 02 PIC X(20) VALUE "fffff,-123, ".
000370 02 PIC X(20) VALUE "ggggg, 001, ".
000380 02 PIC X(20) VALUE "zzzzz, 001, ".
000390 01 WK1-RE REDEFINES WK1.
000400 02 W1-DATA PIC X(20) OCCURS 10.
000410 01 WK2. *> マージ用データ2
000420 02 PIC X(20) VALUE "aaaaa, 22.12, ,".
000430 02 PIC X(20) VALUE "bbbbb,+200, ,".
000440 02 PIC X(20) VALUE "ccccc, 50, ,".
000450 02 PIC X(20) VALUE "ccccc,-123, ,".
000460 02 PIC X(20) VALUE "ddddd, 333, ,".
000470 02 PIC X(20) VALUE "fffff, -50, ,".
000480 02 PIC X(20) VALUE "fffff,-200, ,".
000490 02 PIC X(20) VALUE "fffff,-300, ,".
000500 02 PIC X(20) VALUE "ggggg, 0, ,".
000510 02 PIC X(20) VALUE "yyyyy, 0, ,".
000520 01 WK2-RE REDEFINES WK2.
000530 02 W2-DATA PIC X(20) OCCURS 10.
000540 01 I PIC 9(2).
000550 PROCEDURE DIVISION.
000560 MAIN00.
000570* USING句およびGIVING句を使用する例
000580 DISPLAY "*** MERGE USING/GIVING (F1->F2)".
000590 PERFORM データの準備.
000600 DISPLAY "併合前のデータ".
000610 PERFORM データの表示F1.
000620 PERFORM データの表示F2.
000630* マージの実行
000640 MERGE MERGE-F
000650 ASCENDING DATA1 *> DATA1は昇順にマージする
000660 DESCENDING DATA2 *> DATA2は降順にマージする
000670 USING F1 F2
000680 GIVING F1.
000690 DISPLAY "併合後のデータ".
000700 PERFORM データの表示F1.
000710 DISPLAY "".
000720* INPUT USING/OUTPUT PROCEDUREを使用する例
000730 DISPLAY "*** MERGE USING / OUTPUT PROCEDURE".
000740 PERFORM データの準備.
000750 DISPLAY "併合前のデータ".
000760 PERFORM データの表示F1.
000770 PERFORM データの表示F2.
000780 MERGE MERGE-F
000790 ASCENDING DATA1 *> DATA1は昇順にマージする
000800 DESCENDING DATA2 *> DATA2は降順にマージする
000810 USING F1 F2
000820 OUTPUT PROCEDURE マージ済データの受け取り.
000830 DISPLAY "併合後のデータ".
000840 PERFORM データの表示F1.
000850 STOP RUN.
000860*============================================================
000870 データの準備.
000880 OPEN OUTPUT F1.
000890 PERFORM VARYING I FROM 1 UNTIL I > 10
000900 UNSTRING W1-DATA(I) *> W1-DATA(I)を','で分離しF1-DATA1、F1-DATA2、F1-DMYに設定
000910 DELIMITED BY ","
000920 INTO F1-DATA1, F1-DATA2
000930 MOVE ALL "-" TO F1-DMY
000940 WRITE F1-REC
000950 END-PERFORM.
000960 CLOSE F1.
000970*
000980 OPEN OUTPUT F2.
000990 PERFORM VARYING I FROM 1 UNTIL I > 10
001000 UNSTRING W2-DATA(I) *> W2-DATA(I)を','で分離しF2-DATA1、F2-DATA2、F2-DMYに設定
001010 DELIMITED BY ","
001020 INTO F2-DATA1, F2-DATA2
001030 MOVE ALL "+" TO F2-DMY
001040 WRITE F2-REC
001050 END-PERFORM.
001060 CLOSE F2.
001070*-----------------------------------------------------------
001080 データの表示F1.
001090 DISPLAY "F1 DATA".
001100 OPEN INPUT F1.
001110 PERFORM FOREVER
001120 READ F1 *> F1よりデータの読込み
001130 AT END
001140 EXIT PERFORM
001150 END-READ
001160 DISPLAY F1-REC *> READしたデータの表示
001170 END-PERFORM
001180 CLOSE F1.
001190*
001200 データの表示F2.
001210 DISPLAY "F2 DATA".
001220 OPEN INPUT F2.
001230 PERFORM FOREVER
001240 READ F2 *> F2よりデータの読込み
001250 AT END
001260 EXIT PERFORM
001270 END-READ
001280 DISPLAY F2-REC *> READしたデータの表示
001290 END-PERFORM
001300 CLOSE F2.
001310*-----------------------------------------------------------
001320 マージ済データの受け取り
001330* マージ済のデータを受け取り、F1に書き出す
001340 OPEN OUTPUT F1.
001350 PERFORM FOREVER
001360 RETURN MERGE-F *> RETURN文によるデータの受け取り
001370 AT END
001380 EXIT PERFORM
001390 END-RETURN
001400 WRITE F1-REC FROM MERGE-R *> 受け取ったデータの書き出し
001410 END-PERFORM.
001420 CLOSE F1.
MERGE文の実行は、大きく3つのフェーズに分かれる。
1つ目のフェーズは、ソートワーク(マージ対象のデータを溜め込む領域)へのデータの引き渡しである。このフェーズを「併合操作の最初の段階」という。
2つ目のフェーズは、そのソートワーク上のデータのマージである。このフェーズを「併合操作」という。
そして、3つ目のフェーズは、ソートされたソートワーク上のデータの受け取りである。このフェーズを「併合操作の最後の段階」という。
以下、簡単に上記のプログラムの説明をする。
マージするデータは、WK1、WK2として用意されており、この例ではCSV形式(カンマ区切り)のデータとなっている。(000280-000380行および000410-000510行)
「データの準備」段落(000870-001060行)では、これらのWK1およびWK2をファイルF1,
F2に書き込むため、UNSTRING文を使ってW-DATAの各要素を、カンマ(,)で区切り、それをF1のレコード領域のF1-DATA1、F1-DATA2に設定し(F2の場合はレコード領域F2-DATA1、F2-DATA2に設定し)、さらにF1-DMYにALL
“+”を設定し、それからWRITE文で出力している。
最初のMERGE文(000640-000680行)では、USING句にF1、F2が指定されているので、1フェーズ目で、そのF1、F2のデータをソートワークに引き渡す。
なお、入力データであるF1、F2は、ASCENDING/DESCENDING KEYで指定した順にあらかじめ整列されていなければならず、そのため、F1、F2の生成データであるWK1、WK2は、その順序に並んでいることに注意されたい。
次に2フェーズ目でソートワーク上のデータをマージする。これはSIT
COBOLの中で行われるので、特に何もしなくてよい。最後に3フェーズ目で、GIVING句に指定されたファイルF1にデータを受け渡す。
マージキーは、1-5桁目のデータDATA1がASCENDING指定なので昇順、6-10桁目のデータDATA2がDESCENDINGなので降順で指定されている。指定されたキー順にマージされるので、まずは、DATA1の昇順にレコードを並べ、DATA1の値が同じレコードでは、DATA2の値が降順となるように並ぶ。
もし、キーの順序を、DESCENDING
DATA2 ASCENDING
DATA1としたら、まずはDATA2の降順にレコードを並べ、さらにDATA1の昇順にレコードを並べることになるので、全く異なるマージ結果となる。
2つ目のMERGE文(000780-820行)では、1フェーズ目で、USING句にF1、F2が指定されているので、1フェーズ目で、そのF1、F2のデータをソートワークに引き渡す。
そして2フェーズ目で、ソートワーク上のデータがマージされ、3フェーズ目で、今度は、OUTPUT
PROCEDUREに指定された「マージ済データの受け取り」段落(001340-001420行)が実行され、その中のRETURN文で、ソートワークの中のデータを1つ1つ受け取る。受け取ったレコードは、F1に書き出している。
実行したときの出力結果は次のとおりである。
*** MERGE USING/GIVING (F1->F2)
併合前のデータ
F1 DATA
aaaaa03300----------
aaaaa02212----------
bbbbb10000----------
bbbbb1000p----------
ccccc12300----------
ccccc1230p----------
ddddd4444p----------
fffff1230p----------
ggggg00100----------
zzzzz00100----------
F2 DATA
aaaaa02212++++++++++
bbbbb20000++++++++++
ccccc05000++++++++++
ccccc1230p++++++++++
ddddd33300++++++++++
fffff00000++++++++++
fffff2000p++++++++++
fffff3000p++++++++++
ggggg00000++++++++++
yyyyy00000++++++++++
併合後のデータ
F1 DATA
aaaaa03300----------
aaaaa02212----------
aaaaa02212++++++++++
bbbbb20000++++++++++
bbbbb10000----------
bbbbb1000p----------
ccccc12300----------
ccccc05000++++++++++
ccccc1230p----------
ccccc1230p++++++++++
ddddd33300++++++++++
ddddd4444p----------
fffff00000++++++++++
fffff1230p----------
fffff2000p++++++++++
fffff3000p++++++++++
ggggg00100----------
ggggg00000++++++++++
yyyyy00000++++++++++
zzzzz00100----------
*** MERGE USING / OUTPUT PROCEDURE
併合前のデータ
F1 DATA
aaaaa03300----------
aaaaa02212----------
bbbbb10000----------
bbbbb1000p----------
ccccc12300----------
ccccc1230p----------
ddddd4444p----------
fffff1230p----------
ggggg00100----------
zzzzz00100----------
F2 DATA
aaaaa02212++++++++++
bbbbb20000++++++++++
ccccc05000++++++++++
ccccc1230p++++++++++
ddddd33300++++++++++
fffff00000++++++++++
fffff2000p++++++++++
fffff3000p++++++++++
ggggg00000++++++++++
yyyyy00000++++++++++
併合後のデータ
F1 DATA
aaaaa03300----------
aaaaa02212----------
aaaaa02212++++++++++
bbbbb20000++++++++++
bbbbb10000----------
bbbbb1000p----------
ccccc12300----------
ccccc05000++++++++++
ccccc1230p----------
ccccc1230p++++++++++
ddddd33300++++++++++
ddddd4444p----------
fffff00000++++++++++
fffff1230p----------
fffff2000p++++++++++
fffff3000p++++++++++
ggggg00100----------
ggggg00000++++++++++
yyyyy00000++++++++++
zzzzz00100----------
ここで、6-10カラム目(F1-DATA2)は、S9(3)V9(2)
という数字データ項目(外部10進数)なので、5桁の最初の3桁が整数部で、後の2桁が小数部である。また、正負については最後の5桁目(全体の10カラム目)で表現(重ね符号)されている。
上記のデータの中には、5桁目(全体の10カラム目)が’p’となっているものがあるが、これはASCIIコードでは、0x70
であり’7’は負、’0’は下1桁の数字を表している。例えば、’1230p’は、-123.00
を示している。
重ね符号を含むデータの表現方法については、USAGE句で決められている。詳しくは、「データ部のUSAGE句」を参照されたい。
整列操作の最初の段階にレコードを引き渡す。
RELEASE レコード名-1 [ FROM { 一意名-1 | 定数-1 } ]
(*1) SIT COBOLは、入出力管理段落にSAME RECORD AREA句を指定することはできない。(制限事項)
整列または併合操作の最後の段階から、整列または併合されたレコードを引き取る。
RETURN ファイル名-1 RECORD [ INTO 一意名-1 ]
AT END 無条件文-1
[ NOT AT END 無条件文-2 ]
[ END-RETURN ]
(*1) SIT COBOLは、ファイル名-1のファイル記述項にRECORD VARYING句を書くことはできない。
キー項目の値の順にレコードを整列する。
SORT ファイル名-1
{ ON { ASCENDING | DESCENDING } KEY { データ名-1 }… }…
[ WITH DUPLICATES IN ORDER ]
[ COLLATING SEQUENCE IS 符号系名-1 ]
{ INPUT PROCEDURE IS 手続き名-1 [ { THROUGH | THRU } 手続き名-2 ] |
USING { ファイル名-2 } … }
{ OUTPUT PROCEDURE IS 手続き名-3 [ { THROUGH | THRU } 手続き名-4 ] |
GIVING { ファイル名-3 } … }
(※) SIT COBOLは、符号系名-1には対応していない。(制限事項)
(※) SIT
COBOLは、DUPLICATS句には対応していない。(制限事項)
(※) SIT
COBOLは、GIVING句に複数のファイルを指定することはできない。(制限事項)
(*1) SIT
COBOLは、ファイル名-1、ファイル名-3として可変長ファイルを指定することはできない。(制限事項)
(*2)
SIT COBOLは、SAME AREA句には対応していない。(制限事項)
(*1) SIT COBOLでは、USE AFTER STANDARD EXCEPTIONが書かれていても実行されない。(制限事項)
USING/GIVINGを利用した例と、INPUT PROCEDURE/OUTPUT PROCEDUREを使用した例を示す。
(サンプル: SORT文.cob)
000000 IDENTIFICATION DIVISION.
000010 PROGRAM-ID. SORT_01.
000020 ENVIRONMENT DIVISION.
000030 INPUT-OUTPUT SECTION.
000040 FILE-CONTROL.
000050 SELECT F1 ASSIGN TO "F1.txt". *> SORTの入力と出力に使用
000060 SELECT SORT-F ASSIGN TO "SD1". *> "SD1"はメモのみである
000070 DATA DIVISION.
000080 FILE SECTION.
000090 FD F1.
000100 01 F1-REC.
000110 02 F1-DATA1 PIC X(5).
000120 02 F1-DATA2 PIC S9(3)V9(2).
000130 02 F1-DMY PIC X(10).
000140*
000150 SD SORT-F.
000160 01 SORT-R.
000170 02 DATA1 PIC X(5). *> ソートキー1: 英数字項目
000180 02 DATA2 PIC S9(3)V9(2). *> ソートキー2: 数字項目
000190 02 PIC X(10).
000200 WORKING-STORAGE SECTION.
000210 01 WK1. *> ソート用データ
000220 02 PIC X(20) VALUE "ddddd, 333, ".
000230 02 PIC X(20) VALUE "ccccc,-123, ".
000240 02 PIC X(20) VALUE "aaaaa, 22.12, ".
000250 02 PIC X(20) VALUE "ggggg, 001, ".
000260 02 PIC X(20) VALUE "bbbbb,-100.00,".
000270 02 PIC X(20) VALUE "ddddd,-444.4, ".
000280 02 PIC X(20) VALUE "ccccc, 123, ".
000290 02 PIC X(20) VALUE "aaaaa,+33, ".
000300 02 PIC X(20) VALUE "ggggg, 0, ".
000310 02 PIC X(20) VALUE "bbbbb,+100, ".
000320 01 WK2 REDEFINES WK1.
000330 02 W-DATA PIC X(20) OCCURS 10.
000340 01 I PIC 9(2).
000350 PROCEDURE DIVISION.
000360 MAIN00.
000370* USING句およびGIVING句を使用する例
000380 DISPLAY "*** SORT USING/GIVING".
000390 PERFORM データの準備.
000400 DISPLAY "整列前のデータ".
000410 PERFORM データの表示.
000420* ソートの実行
000430 SORT SORT-F
000440 ASCENDING DATA1 *> DATA1は昇順にソートする
000450 DESCENDING DATA2 *> DATA2は降順にソートする
000460 USING F1
000470 GIVING F1.
000480 DISPLAY "整列後のデータ".
000490 PERFORM データの表示.
000500 DISPLAY "".
000510
000520* INPUT PROCEDURE/OUTPUT PROCEDUREを使用する例
000530 DISPLAY "*** SORT INPUT PROCEDURE / OUTPUT PROCEDURE".
000540 PERFORM データの準備.
000550 DISPLAY "整列前のデータ".
000560 PERFORM データの表示.
000570 SORT SORT-F
000580 DESCENDING DATA1 *> DATA1は降順にソートする
000590 ASCENDING DATA2 *> DATA2は昇順にソートする
000600 INPUT PROCEDURE データの入力
000610 OUTPUT PROCEDURE ソート済データの受け取り.
000620 DISPLAY "整列後のデータ".
000630 PERFORM データの表示.
000640 STOP RUN.
000650*============================================================
000660 データの準備.
000670 OPEN OUTPUT F1.
000680 PERFORM VARYING I FROM 1 UNTIL I > 10
000690 UNSTRING W-DATA(I) *> W-DATA(I)を','で分離しF1-DATA1、F1-DATA2に設定
000700 DELIMITED BY ","
000710 INTO F1-DATA1, F1-DATA2
000720 MOVE ALL "+" TO F1-DMY
000730 WRITE F1-REC
000740 END-PERFORM.
000750 CLOSE F1.
000760*-----------------------------------------------------------
000770 データの表示.
000780 OPEN INPUT F1.
000790 PERFORM FOREVER
000800 READ F1 *> F1よりデータの読込み
000810 AT END
000820 EXIT PERFORM
000830 END-READ
000840 DISPLAY F1-REC *> READしたデータの表示
000850 END-PERFORM
000860 CLOSE F1.
000870*-----------------------------------------------------------
000880 データの入力.
000890* F1のデータをSORTワークに引き渡す
000900 OPEN INPUT F1.
000910 PERFORM FOREVER
000920 READ F1
000930 AT END
000940 EXIT PERFORM
000950 END-READ
000960 RELEASE SORT-R FROM F1-REC *> RELEASE文によるデータの引き渡し
000970 END-PERFORM
000980 CLOSE F1.
000990*-----------------------------------------------------------
001000 ソート済データの受け取り
001010* ソート済のデータを受け取り、F1に書き出す
001020 OPEN OUTPUT F1.
001030 PERFORM FOREVER
001040 RETURN SORT-F *> RETURN文によるデータの受け取り
001050 AT END
001060 EXIT PERFORM
001070 END-RETURN
001080 WRITE F1-REC FROM SORT-R *> 受け取ったデータの書き出し
001090 END-PERFORM.
001100 CLOSE F1.
SORT文の実行は、大きく3つのフェーズに分かれる。
1つ目のフェーズは、ソートワーク(ソート対象のデータを溜め込む領域)へのデータの引き渡しである。このフェーズを「整列操作の最初の段階」という。
2つ目のフェーズは、そのソートワーク上のデータのソートである。このフェーズを「整列操作」という。
そして、3つ目のフェーズは、ソートされたソートワーク上のデータの受け取りである。このフェーズを「整列操作の最後の段階」という。
以下、簡単に上記のプログラムの説明をする。
ソートするデータは、W-DATAとして用意されており、この例ではCSV形式(カンマ区切り)のデータとなっている。(000210-000310行)
「データの準備」段落(000660-000750行)では、これらのW-DATAをファイルF1に書き込むため、UNSTRING文を使ってW-DATAの各要素を、カンマ(,)で区切り、それをF1のレコード領域のF1-DATA1、F1-DATA2に設定し、さらにF1-DMYにALL
“+”を設定し、それからWRITE文で出力している。
最初のSORT文(000430-000470行)では、USING句にF1が指定されているので、1フェーズ目で、そのF1のデータをソートワークに引き渡す。
次に2フェーズ目でソートワーク上のデータをソートする。これはSIT
COBOLの中で行われるので、特に何もしなくてよい。最後に3フェーズ目で、GIVING句に指定されたファイルF1にデータを受け渡す。
ソートキーは、1-5桁目のデータDATA-1がASCENDING指定なので昇順、6-10桁目のデータDATA-2がDESCENDINGなので降順で指定されている。指定されたキー順にソートされるので、まずは、DATA-1の昇順にレコードを並べ、DATA-1の値が同じレコードでは、DATA-2の値が降順となるように並ぶ。
もし、キーの順序を、DESCENDING
DATA-2 ASCENDING
DATA-1としたら、まずはDATA-2の降順にレコードを並べ、さらにDATA-1の昇順にレコードを並べることになるので、全く異なるソート結果となる。
2つ目のSORT文(000570-610行)では、1フェーズ目で、INPUT
PROCEDUREに指定された「データの入力」段落(000880-000980行)が実行され、その中のRELEASE文によりデータをソートワークに引き渡す。
そして2フェーズ目で、ソートワーク上のデータがソートされ、3フェーズ目で、今度は、OUTPUT
PROCEDUREに指定された「ソート済データの受け取り」段落(001000-001100行)が実行され、その中のRETURN文で、ソートワークの中のデータを1つ1つ受け取る。受け取ったレコードは、F1に書き出している。
ソートキーは、DATA-1がDESCENDING指定、DATA-2がASCENDINGなので、最初のSORT文とはソート結果が異なる。
実行したときの出力結果は次のとおりである。
*** SORT USING/GIVING
整列前のデータ
ddddd33300++++++++++
ccccc1230p++++++++++
aaaaa02212++++++++++
ggggg00100++++++++++
bbbbb1000p++++++++++
ddddd4444p++++++++++
ccccc12300++++++++++
aaaaa03300++++++++++
ggggg00000++++++++++
bbbbb10000++++++++++
整列後のデータ
aaaaa03300++++++++++
aaaaa02212++++++++++
bbbbb10000++++++++++
bbbbb1000p++++++++++
ccccc12300++++++++++
ccccc1230p++++++++++
ddddd33300++++++++++
ddddd4444p++++++++++
ggggg00100++++++++++
ggggg00000++++++++++
*** SORT INPUT PROCEDURE / OUTPUT PROCEDURE
整列前のデータ
ddddd33300++++++++++
ccccc1230p++++++++++
aaaaa02212++++++++++
ggggg00100++++++++++
bbbbb1000p++++++++++
ddddd4444p++++++++++
ccccc12300++++++++++
aaaaa03300++++++++++
ggggg00000++++++++++
bbbbb10000++++++++++
整列後のデータ
ggggg00000++++++++++
ggggg00100++++++++++
ddddd4444p++++++++++
ddddd33300++++++++++
ccccc1230p++++++++++
ccccc12300++++++++++
bbbbb1000p++++++++++
bbbbb10000++++++++++
aaaaa02212++++++++++
aaaaa03300++++++++++
ここで、6-10カラム目(F1-DATA2)は、S9(3)V9(2)
という数字データ項目(外部10進数)なので、5桁の最初の3桁が整数部で、後の2桁が小数部である。また、正負については最後の5桁目(全体の10カラム目)で表現(重ね符号)されている。
上記のデータの中には、5桁目(全体の10カラム目)が’p’となっているものがあるが、これはASCIIコードでは、0x70
であり’7’は負、’0’は下1桁の数字を表している。例えば、’1230p’は、-123.00
を示している。
重ね符号を含むデータの表現方法については、USAGE句で決められている。詳しくは、「データ部のUSAGE句」を参照されたい。
キー項目の値の順にテーブル(OCCURS句を持つ項目)を整列する。
SORT テーブル名-1
{ ON { ASCENDING | DESCENDING } KEY { データ名-1 }… }…
[ WITH DUPLICATES IN ORDER ]
[ COLLATING SEQUENCE IS 符号系名-1 ]
(※) SIT COBOLは、符号系名-1には対応していない。(制限事項)
(※) SIT
COBOLは、DUPLICATS句には対応していない。(制限事項)
(サンプル: テーブルソート.cob)
000000 IDENTIFICATION DIVISION.
000010 PROGRAM-ID. TABLE_SORT001.
000020 DATA DIVISION.
000030 WORKING-STORAGE SECTION.
000040 01 A.
000050 02 AA.
000060 03 PIC x(30) VALUE "55555aaaaa".
000070 03 PIC x(30) VALUE "44444bbbbb".
000080 03 PIC x(30) VALUE "11111bbbbb".
000090 03 PIC x(30) VALUE "33333ccccc".
000100 03 PIC x(30) VALUE "44444ccccc".
000110 03 PIC x(30) VALUE "22222bbbbb".
000120 03 PIC x(30) VALUE "44444aaaaa".
000130 02 AA-RE REDEFINES AA OCCURS 7.
000140 03 A-TABLE.
000150 04 DATA1 PIC 9(5).
000160 04 DATA2 PIC X(5).
000170 04 PIC X(20).
000180 01 I PIC 9.
000190 PROCEDURE DIVISION.
000200 MAIN00.
000210 SORT A-TABLE
000220 ASCENDING DATA1
000230 DESCENDING DATA2.
000240 PERFORM VARYING I FROM 1 UNTIL I > 7
000250 DISPLAY A-TABLE(I)
000260 END-PERFORM.
000270 STOP RUN.
テーブルソートの実行は、大きく3つのフェーズに分かれる。
1つ目のフェーズは、テーブルの各要素(レコード)のソートワーク(ソート対象のデータを溜め込む領域)へのデータの引き渡しである。このフェーズを「整列操作の最初の段階」という。
2つ目のフェーズは、そのソートワーク上のデータのソートである。このフェーズを「整列操作」という。
そして、3つ目のフェーズは、ソートされたソートワーク上のデータの受け取りである。このフェーズを「整列操作の最後の段階」という。
以下、簡単に上記のプログラムの説明をする。
ソートするデータは、AAとして用意されており、これを、A-REで再定義している。(00050-000170行)
SORT文(000210-000230行)では、SORT文にA-TABLEが指定されている。A-TABLEは、A-REに含まれる項目であり、7つの要素を持つ1次元のテーブル(表)である。
1フェーズ目で、そのA-TABLEの各要素である、A-TABLE(1),
A-TABLE(2),…A-TABLE(7)のデータをソートワークに引き渡す。
次に2フェーズ目でソートワーク上のデータをソートする。これはSIT
COBOLの中で行われるので、特に何もしなくてよい。
最後に3フェーズ目で、A-TABLEの各要素に整列された順にデータを受け渡す。
ソートキーは、1-5桁目のデータDATA-1がASCENDING指定なので昇順、6-10桁目のデータDATA-2がDESCENDINGなので降順で指定されている。指定されたキー順にソートされるので、まずは、DATA-1の昇順にレコードを並べ、DATA-1の値が同じレコードでは、DATA-2の値が降順となるように並ぶ。
もし、キーの順序を、DESCENDING
DATA-2 ASCENDING
DATA-1としたら、まずはDATA-2の降順にレコードを並べ、さらにDATA-1の昇順にレコードを並べることになるので、全く異なるソート結果となる。
実行したときの出力結果は次のとおりである。
11111bbbbb
22222bbbbb
33333ccccc
44444ccccc
44444bbbbb
44444aaaaa
55555aaaaa