【COBOL学習|豆知識】COBOLでもスマートに!テーブル(ALL)指定による一括処理の極意

1. 導入:なぜ(ALL)指定が重要なのか

COBOL開発の現場で、テーブル(配列)内の最大値や最小値を求めたり、合計を出したりする際、皆さんはどうしていますか? おそらく多くの現場では、PERFORM文でインデックスを回しながら、IF文で大小比較を行うコーディングをしていることでしょう。しかし、その手法は冗長で、バグの温床になりがちです。
COBOLの組込関数である「(ALL)」指定を活用すれば、複雑なループ処理をたった1行で記述できます。これは可読性を高めるだけでなく、メンテナンス効率を劇的に向上させる、現代的なCOBOLプログラミングの必須テクニックです。

2. 基礎知識:(ALL)指定とは何か

通常、COBOLでテーブルの要素を特定するには「WS-TABLE(I)」のように添字を指定します。しかし、組込関数(MAX, MIN, SUM, MEANなど)の引数として「(ALL)」という添字を指定すると、コンパイラは「このテーブルの全要素を、個別の引数として関数に渡す」という処理を行います。
例えば、要素数5のテーブルに対して「FUNCTION MAX(TABLE(ALL))」と記述すると、内部的には「FUNCTION MAX(TABLE(1), TABLE(2), TABLE(3), TABLE(4), TABLE(5))」と展開されたかのように振る舞います。これにより、プログラマはループ構造を意識することなく、宣言的に処理を記述できるのです。

3. 実装と解決策

この機能を使うためには、対象の関数が「ALL添字」をサポートしているか確認する必要があります。主に、統計処理を行う関数(MAX, MIN, SUM, MEAN, ORD-MAX, ORD-MIN)で利用可能です。
ロジックを簡潔にするコツは、テーブルのサイズを意識せずに関数を適用することです。ただし、テーブルの有効なデータ数がテーブル全体のサイズと異なる場合(例えば100個の枠のうち10個しかデータが入っていない場合)は、別途「部分参照」と組み合わせて範囲を指定する必要があります。

4. サンプルプログラム

以下に、テーブル内の最大値と合計を求める実用的なコード例を示します。

IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE-ALL-TABLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
  • 10個の数値を持つテーブルを定義
01 WS-DATA-TBL OCCURS 10 PIC S9(04) VALUE 0. 01 WS-MAX PIC S9(04). 01 WS-SUM PIC S9(08). PROCEDURE DIVISION.
  • テストデータの設定
MOVE 10 TO WS-DATA-TBL(1) MOVE 55 TO WS-DATA-TBL(2) MOVE 30 TO WS-DATA-TBL(3) MOVE 99 TO WS-DATA-TBL(4) MOVE 20 TO WS-DATA-TBL(5)
  • (ALL)を使用して最大値を取得
  • ループを記述する必要はなく、1行で完結します
COMPUTE WS-MAX = FUNCTION MAX(WS-DATA-TBL(ALL))
  • (ALL)を使用して全要素の合計を取得
COMPUTE WS-SUM = FUNCTION SUM(WS-DATA-TBL(ALL)) DISPLAY "最大値: " WS-MAX DISPLAY "合計値: " WS-SUM GOBACK.

5. 応用・注意点

現場で活用する際の最大の注意点は、「空のテーブルや、データが入っていない要素の扱い」です。
例えば、先ほどのサンプルで「WS-DATA-TBL(6)〜(10)」には初期値の0が入っています。もし負の数を取り扱う場合、0が含まれているとMAX関数が正しく機能しない可能性があります。また、関数によっては引数がすべて空の場合にエラーとなるものもあります。
実務では、OCCURS DEPENDING ON句を活用し、有効なデータ数のみを関数に渡すように設計するのがベテランの技です。簡潔に書けるからこそ、その「範囲」を正しく制御することを忘れないようにしてください。

コメント

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