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. 初心者がハマりやすい「無限ループ」
帳票を出力し続け、いつまで経っても終わらない、あるいは同じページが何万枚も出続けてしまう現象を無限ループと言います。
これは、「次のデータへ進む」という指示を書き忘れたときに起こります。 同じデータを何度も何度も印刷しようとしてしまうのです。 「一回印刷したら、次のデータを取りに行く」という手順が正しくループ(繰り返し)の中に組み込まれているか、必ず確認しましょう。
まとめ
COBOLで請求書や売上一覧、給与明細などの帳票を作成するときは、プログラムが正常に終了することだけではなく、出力された内容が正しいことまで確認する必要があります。帳票出力で発生するトラブルには、プログラムが途中で異常終了するエラーだけでなく、金額の表示がおかしい、文字が途中で切れる、ページ番号が更新されない、同じ内容が繰り返し出力されるといった問題もあります。そのため、COBOLの帳票出力エラーを調査するときは、エラーの種類を整理して原因を順番に切り分けることが大切です。
初心者が最初に覚えておきたいのは、エラーが発生したときにプログラム全体を一度に見直そうとしないことです。数値計算で異常終了したのであればデータ項目や計算処理を確認し、帳票ファイルを開けないのであればファイル状態を確認します。帳票の見た目だけがおかしいのであれば、出力項目の桁数や位置、編集用の項目を確認します。このように症状から確認場所を絞り込むことで、COBOLのトラブルシューティングを進めやすくなります。
データ例外が発生したら数値項目を確認する
COBOLで数値計算を行う場合、数値として定義された項目には正しい数値データが入っている必要があります。数値項目へ想定していない文字や不正な内容が入った状態で計算を行うと、データ例外によって処理が異常終了する原因になります。メインフレームでCOBOLを扱うときに見かけるデータ例外では、どの項目を使ってどの計算を行っていたのかを確認することが重要です。
また、作業用の数値項目については、使用する前に適切な初期値を設定しておくことも基本です。合計金額を計算する項目であれば、計算開始前にゼロを設定してから加算処理を行うようにします。
WORKING-STORAGE SECTION.
01 WS-TOTAL-AMOUNT PIC 9(09) VALUE ZERO.
PROCEDURE DIVISION.
MOVE ZERO TO WS-TOTAL-AMOUNT
ADD 1500 TO WS-TOTAL-AMOUNT
DISPLAY WS-TOTAL-AMOUNT
STOP RUN.
帳票出力で計算結果がおかしい場合は、出力部分だけではなく、その値を作成している計算処理まで戻って確認します。帳票に表示された値は、それ以前の処理で作られた結果だからです。どの項目から値を受け取り、どの計算を行い、どの編集項目へ移動しているのかを順番に追うと原因を見つけやすくなります。
桁あふれと帳票の表示形式を確認する
COBOLの帳票では、項目の桁数をあらかじめ定義して使用します。そのため、想定している最大値より実際の値が大きくなると、帳票へ正しく表示できないことがあります。特に売上金額、請求金額、合計金額などは、運用開始後にデータ量が増える可能性も考えて設計する必要があります。
帳票用の項目では、単純な数値項目とは別に、カンマや通貨記号などを含めた編集形式を利用することがあります。帳票に不自然な記号が表示された場合は、計算結果そのものだけでなく、出力用の編集項目が値を正しく表現できる大きさになっているか確認します。
WORKING-STORAGE SECTION.
01 WS-AMOUNT PIC 9(09) VALUE 1234567.
01 WS-PRINT-AMOUNT PIC ZZ,ZZZ,ZZ9.
PROCEDURE DIVISION.
MOVE WS-AMOUNT TO WS-PRINT-AMOUNT
DISPLAY WS-PRINT-AMOUNT
STOP RUN.
帳票レイアウトを設計するときは、現在使用しているデータだけを基準にするのではなく、業務上どこまで値が大きくなる可能性があるのかを考えることが重要です。ただし、必要以上に大きな項目を作ればよいという意味ではありません。帳票の横幅や他の項目との位置関係もあるため、業務上必要な最大値とレイアウトの両方を確認します。
ファイル状態を確認して入出力エラーを調べる
COBOLの帳票出力では、帳票を書き込むファイルを開き、レコードを書き込み、最後にファイルを閉じるという処理を行うことがあります。ファイルを正しく開けなければ、そのあとの帳票出力を続けることはできません。
そこで役立つのがFILE STATUSによるファイル状態の確認です。ファイル操作の結果を状態コードとして受け取れるようにしておけば、OPENやREADなどの処理が正常に行われたかを確認できます。
FILE-CONTROL.
SELECT PRINT-FILE ASSIGN TO "OUTPUT.TXT"
FILE STATUS IS WS-STATUS.
WORKING-STORAGE SECTION.
01 WS-STATUS PIC X(02).
PROCEDURE DIVISION.
OPEN OUTPUT PRINT-FILE
IF WS-STATUS NOT = "00"
DISPLAY "FILE ERROR: " WS-STATUS
STOP RUN
END-IF
CLOSE PRINT-FILE
STOP RUN.
状態コードが正常を示していなければ、ファイル名、割り当て、利用環境、JCLの指定などを確認します。実際のメインフレーム環境では、COBOLプログラム側のSELECT句だけでなく、JCLのDDステートメントによるデータセットの割り当ても関係します。そのため、帳票ファイルを開けない場合はCOBOLだけを確認するのではなく、JCLとの連携も確認することが大切です。
なお、ファイル状態コードの具体的な意味は、ファイルの種類や処理内容などを踏まえて確認する必要があります。状態コードだけを見て原因を決めつけるのではなく、どのファイル操作の直後にその状態になったのかを合わせて調べることが重要です。
帳票が出力されても内容が正しいとは限らない
COBOLプログラムが正常終了して帳票ファイルが作成されても、それだけで処理が正しいとは判断できません。氏名が途中で切れている、金額の位置がずれている、ページ番号が更新されない、見出しと明細の位置が合わないといった論理エラーが残っている可能性があります。
論理エラーは、プログラムが異常終了しないため見落としやすい問題です。コンピュータから見ると命令どおり処理できていても、その命令自体が帳票の仕様と違っていれば、利用者にとっては間違った帳票になります。
そのため、帳票出力のテストでは正常終了したかどうかだけではなく、項目の開始位置、文字数、金額の表示、見出し、改ページ、ページ番号、明細の件数などを確認します。特に最大桁数の金額や長い氏名など、レイアウトが崩れやすいデータを使って確認すると問題を発見しやすくなります。
金額計算では端数処理のルールを確認する
請求書や売上帳票など、お金を扱うCOBOLプログラムでは計算精度にも注意が必要です。消費税や割合を使った計算では小数部分が発生することがあり、その値を四捨五入するのか、切り捨てるのか、切り上げるのかによって最終的な金額が変わります。
COBOLには計算結果を丸めるためにROUNDEDを使用できる場合があります。重要なのはROUNDEDを使うこと自体ではなく、業務で決められている計算方法とプログラムの処理を一致させることです。
WORKING-STORAGE SECTION.
01 WS-PRICE PIC 9(07)V99 VALUE 1250.00.
01 WS-RATE PIC V99 VALUE 0.10.
01 WS-TAX PIC 9(07) VALUE ZERO.
PROCEDURE DIVISION.
COMPUTE WS-TAX ROUNDED = WS-PRICE * WS-RATE
DISPLAY WS-TAX
STOP RUN.
金額を扱う帳票では、わずかな差でも請求金額や会計処理に影響することがあります。そのため、端数処理をプログラマの判断だけで決めるのではなく、帳票の仕様や業務ルールを確認して実装することが大切です。
無限ループでは終了条件とREAD処理を確認する
帳票処理で同じ明細が何度も出力され続ける場合は、繰り返し処理の終了条件を確認します。ファイルから1件ずつデータを読み込んで帳票を作成する処理では、現在のレコードを出力したあとに次のレコードを読み込む必要があります。
次のデータを読み込む処理が抜けていたり、ファイルの終わりを示す条件が正しく更新されなかったりすると、同じデータを繰り返し処理する原因になります。
PERFORM UNTIL WS-EOF = "Y"
READ INPUT-FILE
AT END
MOVE "Y" TO WS-EOF
NOT AT END
PERFORM PRINT-PROCESS
END-READ
END-PERFORM
このような処理では、READによって次のレコードへ進み、ファイルの終わりに到達したら終了を示す値を設定します。無限ループが疑われる場合は、繰り返し条件だけを見るのではなく、その条件を変化させる処理が実際に実行されているかまで確認します。
帳票を大量に出力するプログラムで無限ループが発生すると、同じ内容が大量に作成される可能性があります。そのため、テストでは少ない件数の入力データを用意し、想定した件数だけ明細が出力されることも確認しておくと原因を発見しやすくなります。
エラーメッセージは原因を探すための重要な情報
COBOLの実行中にエラーが発生すると、英語のメッセージや状態を示す情報が表示されることがあります。初心者には難しく見えますが、エラーメッセージは問題の原因を探すための重要な手掛かりです。
エラーが発生したら、最初にどの処理で止まったのかを確認します。次に、表示されたエラーの種類や関連するメッセージを確認し、その処理で使用していた項目やファイルを調べます。数値計算中であれば数値項目、ファイル操作中であればファイル状態やJCL、帳票編集中であればPIC句や出力項目を確認するというように、エラーが起きた場所から調査範囲を絞ります。
プログラムへ確認用のDISPLAYを追加して、処理の途中にある値を表示する方法も原因調査に役立ちます。どのレコードまで処理できたのか、計算前の値が何だったのか、ファイル状態がどうなっているのかなどを確認すれば、問題が発生した場所を見つけやすくなります。
帳票出力エラーは順番を決めて調査する
COBOLの帳票出力エラーを効率よく解決するには、思いついた場所を無作為に変更するのではなく、一定の順番で調査することが大切です。まず、プログラムが異常終了したのか、それとも正常終了したものの帳票内容がおかしいのかを確認します。
異常終了している場合は、エラーメッセージや停止した処理を確認します。数値計算であればデータ項目、ファイル操作であればFILE STATUSやJCLの割り当てを調べます。正常終了している場合は、帳票レイアウト、PIC句、編集項目、ページ番号、明細件数、計算結果などを確認します。
次に、問題を再現できる入力データを用意します。毎回違う条件でテストすると、修正によって直ったのか、入力データが変わったため問題が発生しなかったのか判断しにくくなります。同じ入力条件で修正前と修正後を比較することで、変更の効果を確認しやすくなります。
COBOLの帳票出力におけるトラブルシューティングでは、データ例外、桁あふれ、ファイル入出力エラー、論理エラー、計算精度、無限ループなど、問題の種類ごとに確認する場所が異なります。重要なのは、エラーを怖がってプログラム全体を変更するのではなく、症状を観察して原因の候補を絞り込むことです。
数値項目には正しいデータが入っているか、必要な項目は初期化されているか、PIC句の桁数は十分か、帳票ファイルを正常に開けているか、ファイル状態を確認しているか、端数処理は業務ルールと一致しているか、繰り返し処理には正しい終了条件があるかを順番に確認します。この基本を身につけることで、COBOLの帳票出力でエラーが発生した場合にも、落ち着いて原因を探しやすくなります。
また、帳票処理ではプログラムが止まらないことと帳票が正しいことは別の問題です。正常終了していても、文字が切れていたり、金額が間違っていたり、同じ明細が重複していたりすれば正しい帳票とはいえません。プログラムの終了状態と帳票の内容を両方確認することが、COBOLの帳票出力テストとエラー対策では重要です。
生徒
「帳票出力でエラーが起きたら、最初に何を確認すればいいですか?」
先生
「まず、プログラムが途中で異常終了したのか、それとも正常終了したけれど帳票の内容がおかしいのかを確認します。そこを分けるだけでも調べる場所をかなり絞れます。」
生徒
「数値計算の途中で止まった場合は、何を確認するんですか?」
先生
「計算に使っている項目の定義と中身を確認します。数値として扱う項目へ想定していないデータが入っていないか、必要な初期化が行われているかを調べます。」
生徒
「プログラムは止まらないのに、金額の表示がおかしい場合はどうしますか?」
先生
「PIC句や帳票用の編集項目を確認します。計算結果を格納する項目に十分な桁数があるか、帳票へ表示する編集形式が値に合っているかを調べましょう。」
生徒
「ファイルを開けない場合は、COBOLプログラムだけを確認すればいいですか?」
先生
「メインフレームでJCLと連携している場合は、COBOL側だけではなくJCLのDDステートメントやデータセットの割り当ても確認します。FILE STATUSを用意しておけば、ファイル操作後の状態を調査する手掛かりにもなります。」
生徒
「帳票が作成できたら、それでテスト完了ではないんですね。」
先生
「はい。氏名が途中で切れていないか、金額が正しいか、項目の位置がずれていないか、ページ番号や明細件数が正しいかまで確認します。正常終了と正しい帳票出力は分けて考える必要があります。」
生徒
「消費税などで金額が少しずれる場合は、端数処理を確認するんですね。」
先生
「そのとおりです。四捨五入、切り捨て、切り上げのどれを使うのかは業務ルールによって決まります。プログラムの計算方法が帳票の仕様と一致しているか確認することが大切です。」
生徒
「同じ明細がずっと出力される場合は、無限ループを疑えばいいですか?」
先生
「確認する価値があります。次のレコードをREADしているか、ファイルの終わりで終了条件が変化しているかを確認します。繰り返し条件だけでなく、その条件を変化させる処理を見ることがポイントです。」
生徒
「エラーメッセージが難しそうで、今まではあまり読んでいませんでした。」
先生
「エラーメッセージには、どのような問題が発生したのかを調べるための情報が含まれています。停止した場所やエラーの種類を確認して、その周辺で使用しているデータやファイルを調べると原因を絞り込みやすくなります。」
生徒
「帳票出力のトラブルシューティングは、エラーの種類ごとに確認する場所を変えるのが大切なんですね。」
先生
「はい。データ例外、桁あふれ、ファイル入出力、帳票レイアウト、端数処理、無限ループというように問題を分けて考えます。症状を確認し、原因を絞り込み、修正後に同じ条件で再確認することがCOBOLの帳票出力エラーを解決する基本です。」