1. 導入:なぜループ処理をやめるべきなのか
長年COBOLの現場にいると、配列(テーブル)の合計を求めるために、PERFORM文でループを回して加算していくロジックを数多く目にします。しかし、手書きのループ処理はコード量が増えるだけでなく、添字の管理ミスによる「添字範囲外エラー」を誘発する温床にもなりがちです。COBOLの組込関数である「SUM関数」を活用すれば、コードは劇的に短縮され、可読性と保守性が飛躍的に向上します。今回は、現場で即戦力となるSUM関数の効率的な使い方を解説します。
2. 基礎知識:SUM関数とは
SUM関数は、引数として指定した数値データ、あるいはテーブル要素の合計を算出する組込関数です。
特に重要なのが「ALL」というキーワードです。これを使うことで、テーブルの最初から最後までを自動的に指定できます。従来のように、OCCURS句の回数に合わせてループを制御する必要がなくなるため、テーブルのサイズ変更が発生した際にもプログラムの修正箇所を最小限に抑えることができます。
3. 実装・解決策
実装のポイントは「COMPUTE文」との組み合わせです。SUM関数は直接データ項目に値を代入するのではなく、COMPUTE文の右辺として記述します。
注意点として、SUM関数は引数が空の場合や、数値として不適切なデータが含まれているとエラーになる可能性があるため、入力データの妥当性チェックを事前に行うのがベテランの作法です。
4. サンプルプログラム
以下のコードは、10件の売上データが格納されたテーブルの合計値を一括で算出する例です。そのままコピーして、コンパイル・テストを行ってみてください。
IDENTIFICATION DIVISION.
PROGRAM-ID. SUM-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
- 10件の売上テーブルを定義
01 WS-SALES-TABLE.
05 WS-SALES-VAL PIC 9(07) OCCURS 10 TIMES.
01 WS-TOTAL-SALES PIC 9(09).
PROCEDURE DIVISION.
- テスト用に値をセット
MOVE 100 TO WS-SALES-VAL(1)
MOVE 200 TO WS-SALES-VAL(2)
MOVE 300 TO WS-SALES-VAL(3)
- 残りは0で初期化されている前提
- SUM関数による合計算出(ループ不要!)
- ALLを指定することで全要素を自動集計します
COMPUTE WS-TOTAL-SALES = FUNCTION SUM(WS-SALES-VAL(ALL))
- 結果の表示
DISPLAY “合計金額は: ” WS-TOTAL-SALES
STOP RUN.
5. 応用・注意点
現場で活用する際の注意点を2点挙げます。
・データ型の制限
SUM関数は数値項目に対して有効です。もしテーブル内に英字や混在データが含まれていると実行時エラーになるため、テーブル定義は必ず数値型(PIC 9やPIC S9など)で宣言してください。
・演算結果の桁あふれ
SUM関数で合計を出す際は、受け取り側の項目(WS-TOTAL-SALES)の桁数が、個々の要素の合計値よりも十分に大きいことを確認してください。COMPUTE文は桁あふれ時に例外が発生する可能性があるため、余裕を持った定義を心がけましょう。
ループ処理を減らすことは、バグを減らすことと同義です。ぜひ、次回の保守案件から積極的にSUM関数を取り入れてみてください。

コメント