1. 導入:なぜ「強引な転記」が危険なのか
COBOLの現場で、英数字項目(X)から数字項目(9)へ値を移すシーンは頻繁にあります。しかし、何も考えずにMOVE文を記述するのは非常に危険です。中身が数字である保証がないまま実行すると、システムが突然異常終了(アベンド)を起こし、夜中に保守担当者が呼び出される……という悲劇を招きかねません。本記事では、安全に転記を行うための「プロの作法」を解説します。
2. 基礎知識:データ型と「暗黙の型変換」の罠
COBOLには、文字を扱う「英数字項目(PIC X)」と、数値を扱う「数字項目(PIC 9)」があります。
多くのコンパイラでは、英数字項目から数字項目への転記が文法上許されていますが、これはあくまで「コンパイルを通す」ためのものです。プログラム実行時に、もし英数字項目の中に「A」や「 」(スペース)のような非数字データが含まれていた場合、コンピュータは計算不可と判断し、プログラムが強制終了します。これを防ぐのが「データチェック」の工程です。
3. 実装/解決策:IF NUMERICによるガード
最も確実な方法は、転記を行う直前に「その値が本当に数字として扱えるか」を判定することです。COBOLには、このための強力な判定用構文「IF NUMERIC」が用意されています。これにより、転記前の安全確認を確実に行うことができます。
4. サンプルプログラム
以下のコードを参考に、安全な転記処理を実装してください。
01 WS-WORK-AREA.
05 WS-INPUT-X PIC X(5) VALUE “12345”. > チェック対象の英数字項目
05 WS-RESULT-9 PIC 9(5) VALUE 0. > 転記先の数字項目
PROCEDURE DIVISION.
> 転記前に必ずNUMERIC判定を行う
IF WS-INPUT-X IS NUMERIC THEN
MOVE WS-INPUT-X TO WS-RESULT-9
DISPLAY “転記成功: ” WS-RESULT-9
ELSE
> 数字以外の値が入っていた場合の異常処理
DISPLAY “エラー: 数字以外のデータが含まれています [” WS-INPUT-X “]”
END-IF.
5. 応用・注意点:現場での防衛策
現場で役立つ補足情報として、以下の点に注意してください。
・符号の扱い:転記先の数字項目に符号(S)が付いている場合、英数字項目に「+」や「-」が含まれているかどうかも考慮する必要があります。
・空白(スペース)の扱い:IF NUMERIC判定において、空白は「数字」とはみなされません。入力データが「 123」のように空白を含んでいる場合は、転記前に編集(EDIT)処理やトリミングが必要になるケースが多いです。
・移植性の確保:コンパイラによっては「英数字から数字へのMOVE」そのものをコンパイルエラーにする厳格な設定もあります。どんな環境でも動くプログラムを目指すなら、面倒でも「IF NUMERIC」を挟む習慣をつけることが、結果として最も効率的なデバッグ回避策となります。
「動くコード」を書くのは初心者ですが、「壊れないコード」を書くのがベテランの仕事です。ぜひ今日から取り入れてみてください。

コメント