導入
前のレッスンで触れた「集団項目」は、他の言語での 構造体(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-NAME・WS-AGE・WS-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-NAME・WS-AGE・WS-SALARY の中身が隙間なく連結された1つの文字列として表示されます。「メモリ上で連続している」という図のイメージと一致することを確認してみましょう。