1. 導入:なぜ「数値の比較」に注意が必要なのか?
COBOLの世界では、長年稼働しているシステムほど、様々な形式のデータが混在しています。例えば、画面入力用の「表示形式(DISPLAY)」と、計算用の「圧縮形式(COMP-3)」を直接比較する場面は日常的です。もし、数値の比較規則を正しく理解していないと、期待した通りに条件分岐せず、重大なバグにつながります。今回は、数値比較のルールを正しく理解し、安全にコーディングするための作法を解説します。
2. 基礎知識:COBOLの比較の仕組み
COBOLの比較演算において、数値同士を比較する場合、たとえ「内部表現(USAGE)」や「桁数」が異なっていても、コンパイラは自動的に小数点位置を揃え、論理的な数値の大きさとして判定を行います。
ここで重要なのが「PICTURE句」の定義です。特に符号を示す「S」の有無は非常に重要です。もし符号なし(Sなし)の項目同士を比較する場合、負の数は正の数として扱われるなど、予期せぬ挙動を引き起こす可能性があります。また、USAGEが異なっても比較は可能ですが、実行時に変換処理が発生するため、パフォーマンスを考慮するなら、可能な限り定義を揃えるのがベテランの作法です。
3. 実装と解決策
数値を比較する際は、以下の2点を徹底してください。
1. 符号の定義を合わせる:比較する両方の項目に「S」を付け、符号付き数値として比較するように統一します。
2. USAGEを意識する:頻繁に比較を行う項目同士は、可能な限りUSAGE(データ形式)を統一し、計算コストを抑えます。
4. サンプルプログラム
以下は、異なる形式のデータを比較する際の基本的なサンプルです。コピーして動作確認に役立ててください。
IDENTIFICATION DIVISION.
PROGRAM-ID. COMPARE-SAMPLE.
WORKING-STORAGE SECTION.
- 画面入力などを想定した表示用データ
01 WS-AMT-DISPLAY PIC 9(05) VALUE 12345.
- 計算用データ(圧縮形式)
01 WS-AMT-COMP3 PIC S9(05) COMP-3 VALUE 12345.
PROCEDURE DIVISION.
- 数値としての論理比較
- USAGEが異なっていても、値が等しければTRUEとなる
IF WS-AMT-COMP3 = WS-AMT-DISPLAY
DISPLAY “値は等しいです。”
ELSE
DISPLAY “値が異なります。”
END-IF.
- 符号付き比較のチェック
IF WS-AMT-COMP3 > 0
DISPLAY “正の数です。”
END-IF.
GOBACK.
5. 応用・注意点:現場で役立つアドバイス
現場で最も多いトラブルは「桁あふれ」や「データ形式の不一致による異常終了」です。特に、比較対象のデータに「数字以外の文字(空白やスペース)」が含まれていると、数値比較時にシステムエラー(データ例外)が発生することがあります。
回避策のヒント:
数値比較を行う直前には、必ず「IF WS-DATA IS NUMERIC」という構文を使って、そのデータが正しく数値として扱える状態かチェックする癖をつけましょう。これにより、予期せぬデータ混入による異常終了を未然に防ぐことができます。基本を疎かにせず、常に堅牢なコードを書くことを心がけてください。

コメント