COBOLの帳票出力エラーを解決!原因別トラブルシューティング完全ガイド
生徒
「先生、COBOLで帳票を出力するプログラムを作ってみたのですが、途中で止まったり、数字が変な記号になったりしてしまいます…。」
先生
「帳票出力では、計算ミスやファイルの扱いのミスでエラーが起きやすいんです。特に初心者の方は、データの型が合っていないことが多いですね。」
生徒
「エラーが出るとどうしていいか分からなくて。原因を調べるコツはありますか?」
先生
「はい、エラーにはパターンがあります。代表的な原因と対策を、初心者の方にも分かりやすく解説していきますね!」
1. 帳票出力エラーとは?
COBOLのプログラムで、請求書や一覧表などの帳票(ちょうひょう)を作るときに発生する不具合を指します。 パソコンを触ったことがない方にとって、エラーとは「機械がへそを曲げて動かなくなった状態」に見えるかもしれません。 しかし、実際にはプログラムが「指示が矛盾していて、これ以上進めません!」と助けを求めている状態なのです。
帳票出力のエラーは、大きく分けて「プログラムが途中で止まる致命的なもの」と、「止まらないけれど見た目が崩れるもの」の二つがあります。 これらを解決する作業をトラブルシューティング、またはデバッグと呼びます。 原因を正しく突き止めることが、プログラミング上達の第一歩です。
2. 代表的なエラー:データ例外(SOC7)
COBOLで最も有名なエラーの一つが、データ例外(データれいがい)です。 メインフレームという大型コンピュータの世界では「SOC7(ソックセブン)」とも呼ばれます。
これは、簡単に言うと「計算できないものを計算させようとした」ときに起こります。 例えば、算数のテストで「りんご + 5 = ?」と聞かれたら困りますよね。 コンピュータも同じで、数字が入るべき場所に文字(漢字やアルファベット)が入っていたり、何も入っていない空っぽ(スペース)の状態で足し算を行おうとすると、このエラーで止まってしまいます。
箱(変数)の中に、最初から正しい数字(0など)を入れておくことです。これを忘れると、中身がゴミのようなデータになり、計算エラーの原因になります。
3. 桁あふれと編集エラー
帳票の金額欄に「********」のように星印が並んだり、数字が途切れて表示されたりすることがあります。 これは桁あふれ(けたあふれ)と呼ばれる現象です。
例えば、1,000円までしか入らないお財布に、1,500円を無理やり入れようとするようなものです。 COBOLでは、あらかじめ「この項目は最大6桁まで」と決めて定義します。 もし計算結果が7桁になってしまうと、入りきらなかった分が消えてしまったり、エラー記号が表示されたりします。
これを防ぐには、定義(PIC句)を見直して、将来的に大きな数字が入っても大丈夫なように余裕を持って設計することが大切です。
4. ファイル入出力のエラー(ステータスキー)
帳票を出力するには、結果を書き込むための「ファイル」を開く必要があります。 ここで「ファイルが見つかりません」や「別の人が使っているので開けません」というトラブルがよく起こります。
COBOLにはファイル状態(ステータスキー)という仕組みがあります。 ファイル操作をした直後に、「成功したかな?」という結果を数字で教えてくれるのです。
- 00: 成功。問題ありません。
- 10: データの終わり。読み込むものがもうありません。
- 30: ファイルが物理的に存在しない。
この数字を確認することで、どこで何が起きているのかを素早く判断できます。
5. 実際にエラーをチェックするプログラム例
ファイルを開くときにエラーが起きていないかを確認する、簡単なコードの書き方を見てみましょう。
IDENTIFICATION DIVISION.
PROGRAM-ID. ERROR-CHECK.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT PRINT-FILE ASSIGN TO "OUTPUT.TXT"
FILE STATUS IS WS-STATUS.
DATA DIVISION.
FILE SECTION.
FD PRINT-FILE.
01 PRINT-REC PIC X(80).
WORKING-STORAGE SECTION.
01 WS-STATUS PIC X(02).
PROCEDURE DIVISION.
OPEN OUTPUT PRINT-FILE.
* ステータスキーが "00" でなければエラーと判断
IF WS-STATUS NOT = "00" THEN
DISPLAY "エラー発生! 状態コード: " WS-STATUS
STOP RUN
END-IF.
MOVE "テスト印刷" TO PRINT-REC
WRITE PRINT-REC.
CLOSE PRINT-FILE.
STOP RUN.
6. 実行結果の確認(正常時と異常時)
もしファイルが正しく開けた場合は、何も表示されずに終了します。 しかし、何らかの理由でファイルが開けなかった場合は、以下のように画面にメッセージが出ます。
エラー発生! 状態コード: 30
この「30」という数字を見るだけで、「あ、ファイル名が間違っているか、ファイルを作る場所がないんだな」とトラブルの原因を特定できるわけです。
7. トラブルを未然に防ぐ3つのポイント
帳票出力のエラーで悩まないために、日頃から意識すべきポイントを紹介します。
① 常に初期化する
数字の箱(変数)を使う前には、必ず MOVE ZERO TO ... のようにして0を入れておきましょう。空っぽの状態での計算は厳禁です。
② 桁数をケチらない
合計金額などの項目は、想定される最大の数字よりも1〜2桁多めに定義しておくと、桁あふれエラーを回避できます。
③ 異常を想定する
「ファイルは必ず開けるはずだ」と思わず、もし開けなかったらどうするか(エラーメッセージを出す等)を書いておくのがプロの仕事です。
8. レイアウトの崩れ(論理エラー)
コンピュータが止まるわけではないけれど、出力された紙を見ると「名前が半分切れている」「ページ番号がずっと1のまま」といったことがあります。 これを論理エラー(ろんりエラー)と言います。
これは、コンピュータの故障ではなく、私たちが書いた「指示書(プログラム)」に間違いがある場合に起こります。 例えば、「名前を30文字分表示する」と決めたのに、実際には10文字分のスペースしか用意していなかった場合などです。
帳票の設計図(レイアウト図)をしっかり確認し、一行に何文字まで入るのか、各項目は何文字目から始まるのかを、定規で測るように正確にプログラミングする必要があります。
9. 計算精度のトラブル
消費税の計算などで、1円のズレが発生することがあります。 これは「端数処理(はすうしょり)」という問題です。 四捨五入するのか、切り捨てるのかを明確に指示しないと、プログラムは独自の判断で動いてしまいます。
COBOLには ROUNDED という「四捨五入してね」という便利な命令があります。
お金を扱う帳票では、1円の違いが大きな問題になるため、計算のルールを統一することが極めて重要です。
10. エラーメッセージの読み解き方
エラーが起きたとき、画面には英語や謎の数字がたくさん並ぶことがあります。 これを見て「うわっ!」と閉じてしまいたくなりますが、実はここに宝の地図が隠されています。
多くのエラーメッセージには、「何行目でエラーが起きたか」「どんな種類の不都合か」が書かれています。 まずは一番上の行と、数字が書いてある部分を探してみてください。 そこをヒントに自分のプログラムを見直すと、意外と単純な打ち間違いだったりすることに気づくはずです。
11. 初心者がハマりやすい「無限ループ」
帳票を出力し続け、いつまで経っても終わらない、あるいは同じページが何万枚も出続けてしまう現象を無限ループと言います。
これは、「次のデータへ進む」という指示を書き忘れたときに起こります。 同じデータを何度も何度も印刷しようとしてしまうのです。 「一回印刷したら、次のデータを取りに行く」という手順が正しくループ(繰り返し)の中に組み込まれているか、必ず確認しましょう。