本文へスキップ
BecomeCoder

COBOLコース · 第3章 データを表す ― PICTURE句とレベル番号 · レッスン16

集団項目 ― 複数フィールドをまとめる(構造体相当)

ローカル実施

導入

前のレッスンで触れた「集団項目」は、他の言語での 構造体(struct)レコード型 に近い考え方です。複数の関連するデータを、1つのまとまりとして扱えます。

説明

       01  WS-PERSON.
           05  WS-NAME          PIC X(10).
           05  WS-AGE           PIC 9(3).
           05  WS-SALARY        PIC 9(6)V99.

WS-PERSON という集団項目の中に、WS-NAMEWS-AGEWS-SALARY という3つの基本項目がまとまっています。この3つのメモリ領域は、連続した1つの領域として確保されます。

graph TD
    G["01 WS-PERSON(集団項目・合計19バイト)"] --> N["05 WS-NAME<br/>PIC X(10)<br/>10バイト"]
    G --> A["05 WS-AGE<br/>PIC 9(3)<br/>3バイト"]
    G --> S["05 WS-SALARY<br/>PIC 9(6)V99<br/>6バイト"]

ここで面白いのは、WS-PERSON を丸ごと1つの変数として扱えることです。

      *> 集団項目ごと、別の集団項目へコピーできる
           MOVE WS-PERSON TO WS-PERSON-BACKUP.

      *> 個別のフィールドだけを扱うこともできる
           MOVE "TANAKA" TO WS-NAME.

WS-PERSON 自体には PIC 句がありません。PICTURE句を持つのは末端の基本項目だけで、集団項目は「子項目をまとめた領域全体」を指す名前です。この二重の使い方——「全体をまとめて扱う」と「個別のフィールドだけ扱う」を自在に切り替えられるのが、COBOLのデータ構造の強みです。

集団項目は何階層でもネストできます(01 の下に 05、さらにその下に 10 を置く、など)。複雑な帳票データやファイルのレコード定義では、この階層構造がよく使われます。

試すには

01 WS-PERSON を丸ごと DISPLAY すると、WS-NAMEWS-AGEWS-SALARY の中身が隙間なく連結された1つの文字列として表示されます。「メモリ上で連続している」という図のイメージと一致することを確認してみましょう。