導入
「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してみましょう。