GTM-MML4VXJ
Skip to main content

FUJITSU Software NetCOBOL
プログラミング時のワンポイントアドバイス

具体的な事例を元に、COBOLプログラムを作成する上で、間違えやすいポイントおよび対策について説明します。
なお、ここでは、Windows (x86) NetCOBOLを例に説明しています。

入力ミスを防止しよう

ここでは、CHECKオプションのオペランド「NUMERIC」を使って、入力ミスが防止できるポイントをご紹介します。

CHECK機能の効果 ~オペランドNUMERICを使用したときに得られる効果~

数字のデータ例外および除数のゼロにより、アプリケーション運用時にエラーが発生する場合があります。この場合、事前にCHECK機能を利用すると、これらの時間を大幅に短縮することが可能となります。

  • 数字に数字以外が入った場合、通常はそのまま誤った計算結果が出力されるが、 CHECKオプションを使えば、転記や計算時点で、エラーが検出され、データ破壊 という重大問題を防げること
  • 入力ミスで0が入る、または、計算結果が0になるようなデータが 入力された場合、通常はOSレベルで0除算を検出し、アプリケーションが異常 終了してしまうため、業務への影響が大きい。さらに、OSのメッセージからは、 0除算が原因とわかりにくい。 CHECKオプションを使えば、割り算の実行前にチェックされるため、 アプリケーションの突然の終了を防げ、エラー原因もメッセージに明示される こと

属性形式に合った値が数字項目に入っているかおよび除数がゼロでないか、具体的な例をあげ、説明していきます。

プログラム例

[数字のデータ例外および除数のゼロを参照する可能性があるプログラム]
プログラム例

現象

プログラムではDISPLAY文でコンソールに出力しており、プログラムを実行すると、入力した値により、以下の内容が表示されます。


[計算可能な数字を入力した正しい使い方をした場合のコンソール画面]
誤った使い方した場合のコンソール画面


[数字項目に文字を入力した誤った使い方をした場合のコンソール画面]
誤った使い方した場合のコンソール画面

[除数に誤って0を入力した場合のコンソール画面:診断機能が無効]
誤った使い方した場合のコンソール画面

[除数に誤って0を入力した場合のコンソール画面:診断機能が有効]
誤った使い方した場合のコンソール画面

図中のモザイク部分は、ファイルパス名または日付が表示されます。

原因

プログラムでは、本来数字が入力される項目NUM1およびNUM2に、文字が入力されてしまったために、データ例外となってしまいました。さらに除数となる数値NUM2に0が入力されたために、アプリケーションが異常終了してしまいました。

対処

以下の処理を追加します。括弧付き数字は、例中の数字と対応します。

  • 入力した項目が数値であるかの判定 (1)
  • 除数となる項目を入力した後に、ゼロであるかどうかの判定 (2)

[エラー検出後の改善の例]
エラー検出後の改善の例

「CHECKオプション」の使い方

このような問題点をプログラムの運用開始前に検出するために、「CHECK機能」を利用します。数字のデータ例外および除数のゼロ検査を行う場合は、「NUMERIC」を指定します。また、「メッセージ表示回数」については、「1」(デフォルト値)を「5」に変更して指定しています。

翻訳オプション NUMERICの追加

今回のプログラムでCHECK機能を使用した場合、実行時には以下のメッセージが表示されます。

[ 数字項目に文字を入れた場合のメッセージ ]

JMP0828I-E [PID:00000E60 TID:00000FD4] 属性と異なる形式のデータが格納されています。PGM=JM02. LINE=19.1.OPD=NUM1

JMP0828I-E [PID:00000E60 TID:00000FD4] 属性と異なる形式のデータが格納されています。PGM=JM02. LINE=22.1.OPD=NUM2

JMP0828I-E [PID:000008F8 TID:00000AD4] 属性と異なる形式のデータが格納されています。PGM=JM02. LINE=23.1.OPD=NUM1

JMP0828I-E [PID:000008F8 TID:00000AD4] 属性と異なる形式のデータが格納されています。PGM=JM02. LINE=23.1.OPD=NUM2

[ 除数にゼロが指定された場合のメッセージ ]

JMP0829I-E [PID:00000F44 TID:00000B88] 除数にゼロが指定されています。PGM=JM02. LINE=23.1.OPD=NUM2

メッセージの「LINE=」にはエラーが発生した行番号が示されます。また、「OPD=」には、データ名とデータの次元数が表示されますので、異常箇所の特定が容易です。
プログラムの行番号は、翻訳オプションに「PRINT」および「SOURCE」のオプションを指定することで、翻訳リストに表示されますので、メッセージの表示と比較してください。 なお、プログラム例は行番号付きの翻訳リストです。
実際の添字の値は、対話型デバッガで確認することができます。DISPLAY文で表示することも可能ですが、プログラムの動きを見るため、対話型デバッガの使用をお勧めします。