導入: なぜ多重ループを1文で書く必要があるのか
COBOLの現場において、配列(テーブル)処理は避けて通れません。特に2次元や3次元のデータを扱う際、従来のような入れ子のPERFORM文を書くと、コードが縦に長くなり、END-PERFORMの書き忘れやインデントの乱れといった可読性低下を招きます。今回解説する「PERFORM VARYING … AFTER」構文を活用すれば、多重ループを1文で簡潔に記述でき、ロジックの構造が直感的に把握できるようになります。
基礎知識: AFTER句の仕組み
PERFORM VARYING … AFTER 文は、複数の変数を連動させてループを回すための機能です。重要なポイントは「記述順」です。
VARYINGで指定した変数が「外側のループ」、AFTERで指定した変数が「内側のループ」として動作します。つまり、後に記述された変数ほど変化のスピードが速いというルールです。この動作は、数学における行列の添字操作や、多次元配列の初期化処理と非常に相性が良い仕組みになっています。
実装/解決策: 効率的な記述方法
この構文を使う最大のメリットは、制御構造を「1つの論理的なブロック」として扱える点です。ネストを深くせず、フラットに記述することで、バグの混入リスクを下げることができます。特に、テーブルの全要素を走査して合計を出したり、検索を行ったりする際に非常に強力です。
サンプルプログラム: 2次元テーブルの合計値算出
以下は、3×3のテーブルから値を読み込み、合計値を算出する実用的なサンプルコードです。そのままコピーして、環境に合わせてコンパイル・テストしてください。
000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. MULTI-LOOP-SAMPLE.
000300 DATA DIVISION.
000400 WORKING-STORAGE SECTION.
000500 01 WS-TABLE.
000600 05 WS-ROW OCCURS 3 TIMES.
000700 10 WS-COL OCCURS 3 TIMES PIC 9(02) VALUE 10.
000800 01 WS-I PIC 9(01).
000900 01 WS-J PIC 9(01).
001000 01 WS-SUM PIC 9(04) VALUE 0.
001100 PROCEDURE DIVISION.
001200 MAIN-PROCEDURE.
001300 多重ループでテーブルの全要素を加算する
001400 PERFORM CALC-PARA
001500 VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 3
001600 AFTER WS-J FROM 1 BY 1 UNTIL WS-J > 3.
001700 DISPLAY “合計値: ” WS-SUM.
001800 STOP RUN.
001900 CALC-PARA.
002000 ここがループの内部処理(WS-Jが先に変化する)
002100 ADD WS-COL(WS-I, WS-J) TO WS-SUM.
応用・注意点: 現場で役立つポイント
1. 制御変数の初期化に注意
PERFORM文が終了すると、制御変数は「終了条件を超えた値」で保持されます。別の処理で再利用する場合は、必ず初期化を行うか、ローカルな変数として定義することを推奨します。
2. 複雑すぎるネストは避ける
規格上は複数のAFTERを繋げて多層ループを作れますが、あまりに階層を深くすると、逆にデバッグが困難になります。可読性を保つため、多くても3階層程度に留めるのが現場の知恵です。
3. 変数の型
制御変数(VARYING/AFTERで指定するもの)には、PIC 9系の数値項目を使用してください。計算誤差や予期せぬ動作を防ぐための基本です。
この構文をマスターして、すっきりと保守性の高いCOBOLコードを目指しましょう。

コメント