【COBOL学習|初心者向け】【COBOL初心者向け】SUM関数の「桁あふれ」を回避する!安全な集計テクニック

なぜSUM関数の「桁あふれ」に注意が必要なのか?

業務システムにおいて、売上データの集計や在庫数の合計など、数値の計算は避けて通れません。COBOLには便利な組込関数「SUM」がありますが、初心者が陥りやすい罠が「桁あふれ(ON SIZE ERROR)」です。集計元のデータは収まっていても、それらを合計した結果が、格納先の変数の桁数を超えてしまうことは珍しくありません。このTipsでは、安全にSUM関数を使うための考え方を解説します。

基礎知識:SUM関数の仕組み

SUM関数は、指定した複数の引数を合計する関数です。重要なポイントは、「戻り値の桁数は、引数の中で最大の桁数を持つ項目と同等か、それ以上になる」という仕様です。つまり、小さな桁数の項目をたくさん足し合わせても、結果が格納先の変数の桁数を超えてしまえば、プログラムは異常終了やデータ欠落を起こします。COBOLでは、この「数値が入り切らない状態」を制御するために「ON SIZE ERROR」という仕組みが用意されています。

実装と解決策:安全な集計手順

集計を行う際は、以下の2点を徹底してください。
1. 受取り側の変数は、合計値が最大何桁になるかを予測し、余裕を持って定義する。
2. 計算時には必ず「ON SIZE ERROR」句を記述し、桁あふれが発生した際の処理(エラーメッセージ表示や異常終了回避)を実装する。

サンプルプログラム:安全な集計の実装例

以下のコードを参考に、ご自身の環境で試してみてください。

IDENTIFICATION DIVISION.
PROGRAM-ID. SUM-EXAMPLE.

DATA DIVISION.
WORKING-STORAGE SECTION.

  • 集計元のデータ(3桁)

01 WS-TABLE.
05 WS-VAL PIC 9(3) OCCURS 3 TIMES VALUE 900.

  • 合計値を格納する変数(桁あふれを防ぐため、余裕を持って5桁で定義)

01 WS-TOTAL PIC 9(5).

PROCEDURE DIVISION.

  • SUM関数を使用して合計を計算する

COMPUTE WS-TOTAL = FUNCTION SUM(WS-TABLE(1) WS-TABLE(2) WS-TABLE(3))

  • 桁あふれが発生した場合の処理

ON SIZE ERROR
DISPLAY “エラー:合計値が変数範囲を超えました。”
NOT ON SIZE ERROR
DISPLAY “合計値は:” WS-TOTAL ” です。”
END-COMPUTE.

STOP RUN.

応用・注意点:現場での心得

現場で長くコードを書いていると、「このデータならこの桁数で十分だろう」という思い込みが最も危険です。特に「配列(テーブル)の全要素をSUMで合計する」ような場合は、将来的に配列の要素数が増える可能性も考慮すべきです。

また、計算結果の精度を維持するため、演算を行う変数のPIC句はできるだけ合わせることも基本です。もし計算結果が小数の場合、固定小数点数と浮動小数点数が混在すると予期せぬ誤差が生じることもあるため、設計段階で「最大何桁まで扱うか」を定義書で明確にしておくことが、バグを防ぐ一番の近道ですよ。

コメント

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