【COBOL学習|初心者向け】COBOLで多次元ループをスマートに!PERFORM VARYINGとAFTER句の活用術

導入:なぜ多重ループの制御が重要なのか

COBOLで業務システムを開発していると、売上集計や在庫管理などで「支店別・月別・商品別」といった多次元のデータを扱う場面に頻繁に出くわします。もしこれをバラバラのPERFORM文で書くと、ネストが深くなりすぎてコードが読みづらくなり、保守性が大幅に低下してしまいます。そんな時、PERFORM文のVARYING句とAFTER句を組み合わせることで、複雑な多重ループを1つの文でスッキリと記述できます。今回は、この効率的な制御構文について解説します。

基礎知識:PERFORM VARYINGとAFTER句の仕組み

COBOLのPERFORM文におけるVARYING句は、変数の値を変化させながら繰り返し処理を行うためのものです。さらにAFTER句を続けることで、その変数が一周するたびに、次に指定した変数を変化させるという「多重ループ」を構築できます。COBOL 2002規格では、このAFTER句を最大6回まで繋げることができ、合計7次元までのループを1文で制御可能です。これにより、ループの開始・終了条件が1箇所にまとまり、可読性が向上します。

実装・解決策:多次元制御の考え方

多重ループの制御では「一番右(最後)に指定した変数」が最も高速に変化し、一番左に指定した変数が最も低速で変化するというルールを理解することが鍵です。例えば3次元配列を処理する場合、一番外側のループから順に指定していくことで、数学的なマトリックス処理が非常にシンプルに記述できます。

サンプルプログラム:3次元配列の初期化処理

以下のコードは、3次元のテーブル(配列)を0で初期化する例です。そのままコピーして、コンパイル・実行の参考にしてください。

IDENTIFICATION DIVISION.
PROGRAM-ID. LOOP-SAMPLE.

DATA DIVISION.
WORKING-STORAGE SECTION.

  • 3次元配列の定義 (支店 2 × 月 3 × 商品 4)

01 TABLE-AREA.
05 BRANCH OCCURS 2 TIMES.
10 MONTH-DATA OCCURS 3 TIMES.
15 ITEM-DATA OCCURS 4 TIMES PIC 9(5).

01 I PIC 9(1).
01 J PIC 9(1).
01 K PIC 9(1).

PROCEDURE DIVISION.
> PERFORM VARYING で一番外側のループ(支店)を指定
> AFTER で中側のループ(月)、さらにAFTERで一番内側のループ(商品)を指定
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 2
AFTER J FROM 1 BY 1 UNTIL J > 3
AFTER K FROM 1 BY 1 UNTIL K > 4

> 各要素に0を代入する
MOVE 0 TO ITEM-DATA(I, J, K)

END-PERFORM.

DISPLAY “初期化が完了しました。”
GOBACK.

応用・注意点:現場で役立つポイント

1. 可読性の限界:技術的には7次元まで可能ですが、あまりに深くネストさせると、どの変数が何を指しているのか開発者が混乱します。3〜4次元を超えて複雑になる場合は、あえてPERFORMを分けるか、処理を独立した段落(PARAGRAPH)に切り出すことを検討してください。
2. 変数の初期化忘れ:AFTER句のループを抜けた後、インデックスとして使用した変数は「最大値+増分値」の状態になっています。ループ終了後に再度その変数を使う場合は、必ず再初期化(MOVE 1 TO Iなど)を行う習慣をつけましょう。
3. コンパイラの対応状況:古いCOBOL環境ではAFTER句の回数制限が異なる場合があります。現場の環境に合わせて、まずは2〜3次元から使い始めるのが安全です。

コメント

タイトルとURLをコピーしました