導入:なぜSUM関数の安全な扱いが重要なのか
COBOLの組込関数であるSUMは、配列(テーブル)内の数値を手軽に合計できる非常に便利な機能です。しかし、現場で長年見ていると、この関数が原因でプログラムが異常終了(アベンド)するケースに遭遇することがあります。その最大の原因は「非数値データ」の混入です。計算対象に空白(SPACES)やゴミデータが含まれていると、演算エラーが発生します。安定したシステムを構築するために、SUM呼び出し前の「守り」の技術を学びましょう。
基礎知識:SUM関数と数値項目の仕組み
COBOLの数値項目は、内部的に「ゾーン形式」や「パック形式」などで管理されています。SUM関数はこれらの項目を算術演算しますが、もし項目内に数字以外の文字(空白など)が入っていると、計算機はそれが数字なのか判断できず、数値変換例外でアベンドしてしまいます。特に、テーブル定義をした際に初期化を忘れると、メモリ上のゴミデータが集計対象となり、思わぬバグを生む原因となります。
実装/解決策:二段構えの防衛策
安全に集計を行うためには、以下の二段構えが鉄則です。
1. INITIALIZEの徹底:テーブルを定義した際、プログラムの開始時点で必ず数値を0で初期化すること。
2. NUMERICチェックの実施:ループ処理などで値を加算、あるいはSUM関数を呼び出す前に、その項目が数字のみで構成されているかを確認すること。
サンプルプログラム
以下は、非数値データが混入していないかを確認し、安全に合計を算出するプログラム例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. SUM-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
- 集計対象のテーブル定義
01 TABLE-DATA.
05 WS-VAL PIC 9(05) OCCURS 5 TIMES.
01 WS-TOTAL PIC 9(07) VALUE 0.
01 WS-IDX PIC 9(01).
PROCEDURE DIVISION.
MAIN-PROCEDURE.
- 1. 最初に必ず初期化を行う
INITIALIZE TABLE-DATA.
MOVE 100 TO WS-VAL(1).
MOVE 200 TO WS-VAL(2).
- ※ WS-VAL(3)以降は初期化により 0 になっている
- 2. NUMERICチェックを行いながら集計する例
PERFORM VARYING WS-IDX FROM 1 BY 1 UNTIL WS-IDX > 5
IF WS-VAL(WS-IDX) IS NUMERIC THEN
CONTINUE
ELSE
- 非数値の場合は 0 として扱う(またはエラー処理へ)
MOVE 0 TO WS-VAL(WS-IDX)
END-IF
END-PERFORM.
- 3. 安全を確認した上でSUM関数を呼び出す
COMPUTE WS-TOTAL = FUNCTION SUM(WS-VAL(ALL)).
DISPLAY “合計値: ” WS-TOTAL.
STOP RUN.
応用・注意点:現場でのトラブル回避
現場でよくあるミスは、外部ファイルから読み込んだデータをそのまま集計に使ってしまうことです。外部データは予期せぬ文字が含まれることが多いため、必ず読み込み直後に数値チェックを行い、不正な値は「0」に置き換えるか、エラーログを出力して処理をスキップする設計にしましょう。また、パフォーマンスを気にしてチェックを省きたくなる気持ちは分かりますが、「アベンドして全停止するリスク」と「微々たる処理時間の増分」を天秤にかければ、必ずチェックを入れるべきというのがベテランの結論です。

コメント