本文へスキップ
BecomeCoder

COBOLコース · 第6章 表を扱う ― OCCURSと配列 · レッスン32

多次元の表 ― OCCURSのネスト

ローカル実施

導入

「3人の生徒 × 4科目分の点数」のような、行と列を持つデータを扱いたいことがあります。これは OCCURSを入れ子にする ことで実現できます。他の言語での2次元配列に相当します。

説明

       01  WS-CLASS-SCORES.
           05  WS-STUDENT       OCCURS 3 TIMES.
               10  WS-SUBJECT   PIC 9(3)   OCCURS 4 TIMES.
  • 外側の OCCURS 3 TIMES … 3人の生徒。
  • 内側の OCCURS 4 TIMES … 各生徒につき4科目分の点数。

つまり WS-SUBJECT 全体では 3 × 4 = 12個の点数を持つ「表の中の表」になります。アクセスするときは、添字を2つ、外側から順にカッコで指定します。

       01  WS-I                 PIC 9(1).
       01  WS-J                 PIC 9(1).

       PROCEDURE DIVISION.
           MOVE 85 TO WS-SUBJECT(1, 1).
      *>  1人目の生徒の、1科目目の点数

           PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 3
               PERFORM VARYING WS-J FROM 1 BY 1 UNTIL WS-J > 4
                   DISPLAY WS-SUBJECT(WS-I, WS-J)
               END-PERFORM
           END-PERFORM.
  • WS-SUBJECT(1, 1) … 1人目・1科目目。WS-SUBJECT(WS-I, WS-J) のように、外側の添字(生徒)→内側の添字(科目)の順にカンマで並べます。
  • 二重の PERFORM VARYING(レッスン28の AFTER 句を使えば1文でも書けます)で、表全体を走査できます。
      *> AFTER句を使って1文で二重ループを書く場合
           PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 3
               AFTER WS-J FROM 1 BY 1 UNTIL WS-J > 4
                   DISPLAY WS-SUBJECT(WS-I, WS-J)
           END-PERFORM.

OCCURSはさらに深く3階層・4階層とネストすることも可能です(例: 「支店 × 部署 × 月」の3次元)。実務では2〜3階層までの利用が多く、それ以上は第7・8章で学ぶファイルやデータベースへ切り出すほうが現実的です。

試すには

3人分×3科目分の点数表を宣言し、WS-SUBJECT(2, 3) に好きな点数をMOVEしてから、二重ループで表全体をDISPLAYしてみましょう。