Cobol-table-processing

提供:Dev Guides
移動先:案内検索

COBOL-テーブル処理

COBOLの配列はテーブルと呼ばれます。 配列は線形データ構造であり、同じタイプの個々のデータ項目のコレクションです。 テーブルのデータ項目は内部的にソートされます。

テーブル宣言

テーブルはデータ部で宣言されています。 Occurs 句は、テーブルを定義するために使用されます。 Occurs句は、データ名定義の繰り返しを示します。 02から49までのレベル番号でのみ使用できます。 Redefinesでは発生句を使用しないでください。 一次元と二次元の表の説明は次のとおりです-

一次元テーブル

1次元テーブルでは、 occurs 句は宣言で1回だけ使用されます。 WSTABLEは、テーブルを含むグループアイテムです。 WS-Bは、10回出現するテーブル要素に名前を付けます。

構文

以下は、一次元のテーブルを定義するための構文です-

01 WS-TABLE.
   05 WS-A PIC A(10) OCCURS 10 TIMES.

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A PIC A(10) VALUE 'TUTORIALS' OCCURS 5 TIMES.

PROCEDURE DIVISION.
   DISPLAY "ONE-D TABLE : "WS-TABLE.
STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

ONE-D TABLE : TUTORIALS TUTORIALS TUTORIALS TUTORIALS TUTORIALS

二次元テーブル

両方のデータ要素が可変長である2次元テーブルが作成されます。 参考のため、構文を確認してから、テーブルの分析を試みてください。 最初の配列(WS-A)は1〜10回発生し、内部配列(WS-C)は1〜5回発生します。 WS-Aの各エントリには、WS-Cの対応する5つのエントリがあります。

構文

以下は、2次元テーブルを定義するための構文です-

01 WS-TABLE.
   05 WS-A OCCURS 10 TIMES.
      10 WS-B PIC A(10).
      10 WS-C OCCURS 5 TIMES.
         15 WS-D PIC X(6).

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A OCCURS 2 TIMES.
         10 WS-B PIC A(10) VALUE ' TUTORIALS'.
         10 WS-C OCCURS 2 TIMES.
            15 WS-D PIC X(6) VALUE ' POINT'.

PROCEDURE DIVISION.
   DISPLAY "TWO-D TABLE : "WS-TABLE.

STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

TWO-D TABLE :  TUTORIALS POINT POINT TUTORIALS POINT POINT

添字

テーブルの個々の要素には、添え字を使用してアクセスできます。 添え字の値の範囲は、1からテーブルの出現回数までです。 添字には任意の正数を指定できます。 データ分割での宣言は必要ありません。 occurs句で自動的に作成されます。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A OCCURS 3 TIMES.
         10 WS-B PIC A(2).
         10 WS-C OCCURS 2 TIMES.
            15 WS-D PIC X(3).

PROCEDURE DIVISION.
   MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE.
   DISPLAY 'WS-TABLE  : ' WS-TABLE.
   DISPLAY 'WS-A(1)   : ' WS-A(1).
   DISPLAY 'WS-C(1,1) : ' WS-C(1,1).
   DISPLAY 'WS-C(1,2) : ' WS-C(1,2).
   DISPLAY 'WS-A(2)   : ' WS-A(2).
   DISPLAY 'WS-C(2,1) : ' WS-C(2,1).
   DISPLAY 'WS-C(2,2) : ' WS-C(2,2).
   DISPLAY 'WS-A(3)   : ' WS-A(3).
   DISPLAY 'WS-C(3,1) : ' WS-C(3,1).
   DISPLAY 'WS-C(3,2) : ' WS-C(3,2).

STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

WS-TABLE  : 12ABCDEF34GHIJKL56MNOPQR
WS-A(1)   : 12ABCDEF
WS-C(1,1) : ABC
WS-C(1,2) : DEF
WS-A(2)   : 34GHIJKL
WS-C(2,1) : GHI
WS-C(2,2) : JKL
WS-A(3)   : 56MNOPQR
WS-C(3,1) : MNO
WS-C(3,2) : PQR

索引

インデックスを使用してテーブル要素にアクセスすることもできます。 インデックスは、テーブルの先頭からの要素の変位です。 インデックスは、INDEXED BY句を使用してOccurs句で宣言されます。 インデックスの値は、SETステートメントとPERFORM Varyingオプションを使用して変更できます。

構文

以下は、テーブルでインデックスを定義するための構文です-

01 WS-TABLE.
   05 WS-A PIC A(10) OCCURS 10 TIMES INDEXED BY I.

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A OCCURS 3 TIMES INDEXED BY I.
         10 WS-B PIC A(2).
         10 WS-C OCCURS 2 TIMES INDEXED BY J.
            15 WS-D PIC X(3).

PROCEDURE DIVISION.
   MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE.
   PERFORM A-PARA VARYING I FROM 1 BY 1 UNTIL I >3
   STOP RUN.

   A-PARA.
   PERFORM C-PARA VARYING J FROM 1 BY 1 UNTIL J>2.

   C-PARA.
   DISPLAY WS-C(I,J).
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

ABC
DEF
GHI
JKL
MNO
PQR

セットステートメント

Setステートメントは、インデックス値を変更するために使用されます。 Set動詞は、インデックス値を初期化、インクリメント、またはデクリメントするために使用されます。 [検索]および[すべて検索]で使用して、テーブル内の要素を見つけます。

構文

以下は、Setステートメントを使用するための構文です-

SET I J TO positive-number
SET I TO J
SET I TO 5
SET I J UP BY 1
SET J DOWN BY 5

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A OCCURS 3 TIMES INDEXED BY I.
         10 WS-B PIC A(2).
         10 WS-C OCCURS 2 TIMES INDEXED BY J.
            15 WS-D PIC X(3).

PROCEDURE DIVISION.
   MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE.
   SET I J TO 1.
   DISPLAY WS-C(I,J).
   SET I J UP BY 1.
   DISPLAY WS-C(I,J).

STOP RUN.

上記のCOBOLプログラムを実行する JCL

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

ABC
JKL

サーチ

検索は、テーブル内の要素を見つけるために使用される線形検索方法です。 ソート済みのテーブルとソートされていないテーブルの両方で実行できます。 Index句で宣言されたテーブルにのみ使用されます。 インデックスの初期値から始まります。 検索された要素が見つからない場合、インデックスは自動的に1ずつ増加し、テーブルの最後まで続きます。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A PIC X(1) OCCURS 18 TIMES INDEXED BY I.
   01 WS-SRCH PIC A(1) VALUE 'M'.

PROCEDURE DIVISION.
   MOVE 'ABCDEFGHIJKLMNOPQR' TO WS-TABLE.
   SET I TO 1.
   SEARCH WS-A
      AT END DISPLAY 'M NOT FOUND IN TABLE'
      WHEN WS-A(I) = WS-SRCH
      DISPLAY 'LETTER M FOUND IN TABLE'
   END-SEARCH.

STOP RUN.

上記のCOBOLプログラムを実行する JCL

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

LETTER M FOUND IN TABLE

すべて検索

すべて検索は、テーブル内の要素を見つけるために使用されるバイナリ検索方法です。 [すべて検索]オプションを使用するには、テーブルを並べ替える必要があります。 インデックスは初期化を必要としません。 バイナリ検索では、テーブルは2つの半分に分割され、検索された要素の半分が存在するかどうかを判断します。 このプロセスは、要素が見つかるか終了に達するまで繰り返されます。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-RECORD OCCURS 10 TIMES ASCENDING KEY IS WS-NUM INDEXED BY I.
      10 WS-NUM PIC 9(2).
      10 WS-NAME PIC A(3).

PROCEDURE DIVISION.
   MOVE '12ABC56DEF34GHI78JKL93MNO11PQR' TO WS-TABLE.
   SEARCH ALL WS-RECORD
     AT END DISPLAY 'RECORD NOT FOUND'
     WHEN WS-NUM(I) = 93
     DISPLAY 'RECORD FOUND '
     DISPLAY WS-NUM(I)
     DISPLAY WS-NAME(I)

END-SEARCH.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

RECORD FOUND
93
MNO