1. 導入:なぜ「ON SIZE ERROR」が重要なのか
COBOLは、銀行の勘定系システムなど、1円の狂いも許されない業務で長年使われてきた言語です。計算処理において、桁あふれ(オーバーフロー)が発生した際、何も対策をせずに処理を続行すると、誤ったデータがデータベースに書き込まれてしまいます。
「ON SIZE ERROR」は、計算結果が受け入れ先の変数のサイズを超えてしまった時に、自動的にエラー処理へ分岐させるための機能です。この仕組みを使うことで、プログラムが暴走したり、誤った会計データを生成したりするリスクを未然に防ぐことができます。
2. 基礎知識:桁あふれとは何か
COBOLでは、変数(データ項目)を定義する際に、PIC句で桁数を厳密に指定します。例えば、PIC 9(3)と定義された変数に「1000」を格納しようとすると、入りきらない分が溢れてしまいます。これが「桁あふれ」です。
「ON SIZE ERROR」を記述しておくと、この溢れが発生した瞬間に、指定した手続き(段落や処理)へ制御を移し、元の変数の値をそのまま維持させることができます。計算結果が不正なまま上書きされることを防ぐ、COBOLならではの安全装置と言えます。
3. 実装と論理フロー
この制御構文を使う際は、以下の2点を意識してください。
・計算結果の格納先:エラー発生時、結果は格納先に書き込まれません。
・END-ADDなどの終了符号:構造化プログラミングを維持するため、必ず「END-ADD」や「END-COMPUTE」といったスコープ終了符号を記述してください。これにより、IF文などの他の制御構造と混ざることなく、論理フローを明確に保てます。
4. サンプルプログラム
以下のコードは、数値を加算する際にサイズエラーを判定する実用例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. SIZE-ERR-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-VAL-A PIC 9(3) VALUE 900.
01 WS-VAL-B PIC 9(3) VALUE 200.
01 WS-RESULT PIC 9(3).
PROCEDURE DIVISION.
> 900 + 200 は 1100 となり、WS-RESULT(3桁)には入りきらない
ADD WS-VAL-A TO WS-VAL-B GIVING WS-RESULT
ON SIZE ERROR
DISPLAY “エラー:計算結果が桁あふれしました。”
PERFORM ERR-LOG-ROUTINE
NOT ON SIZE ERROR
DISPLAY “計算成功:結果は ” WS-RESULT
END-ADD.
STOP RUN.
ERR-LOG-ROUTINE.
> ここにエラー発生時のリカバリ処理を記述します
DISPLAY “ログ出力:異常値を検知したため処理を中断します。”.
5. 応用・注意点:現場でのテクニック
現場でよく遭遇する落とし穴として、「ON SIZE ERRORは除算のゼロ除算エラーは補足できない」という点があります。この構文はあくまで「サイズ(桁数)の超過」を検知するものです。
また、計算結果だけでなく、途中経過も含めて厳密に管理したい場合は、計算の精度を十分に確保した作業領域(ワークエリア)を定義し、最後に転記する設計が望ましいです。初心者のうちは、計算先の変数を少し大きめに定義する癖をつけておくと、思わぬバグを減らすことができます。安全な計算処理は、堅牢なシステムを作るための第一歩です。ぜひ活用してください。

コメント