COBOL プログラムは、最初のフラット ファイルからレコードを読み取り、それを 2 番目のフラット ファイルの最初のレコードと比較します。ただし、最初のフラット ファイルの最初のレコードが 2 番目のフラット ファイルのレコードと一致しないため、Cobol プログラムは無限ループに入ります。どうすれば修正できますか?
3 に答える
各ループの最後での一般的なシーケンシャルファイルの一致では、1つ以上のレコードを読み取る必要があります。
- 最初のキー>=2番目のキーの場合、2番目のファイルから読み取ります。
- 2番目のキー>最初のキーの場合、最初のファイルから読み取ります。
2つのファイル間の1対nの関係に応じて、多くのバリエーションがあります。ただし、ループの最後で何かを読む必要があります。
ファイルの終わりでは、最後に読み取られたレコードがレコード領域に残ります。したがって、ファイルの終わりの状況をチェックしないと、プログラムは単独で実行を停止しません。
プログラムのどこかで論理エラーのようなにおいがします。それが何であるかを言うのは難しい。しかし、私にはいくつかのアイデアがあります...
無限ループの考えられる原因:
- ファイル終了条件のチェックの失敗
- ファイルの終わりに適切に反応しない
- ファイルの終わりをテストしますが、他のすべての条件が「成功した」読み取りであると想定しています
ファイルの終わりは、各 I/O 操作の後にファイル ステータスをテストすることによって判断されることがあります。File Status は、読み取り/書き込み中のファイルに関連付けられたオプションの 2 文字のデータ項目です。これは、プログラムの FILE-CONTROL 段落で指定されます。例えば:
SELECT file-name ASSIGN TO dd-name FILE STATUS fstatus
ここで:file-name
は、OPEN/READ/WRITE/CLOSE ステートメントで参照する名前です。dd-name
外部ファイル名 (JCL からの DDNAME) です。fstatus
WORKING-STORAGE で宣言された 2 文字のデータ項目です。
ファイル ステータスは、すべてのファイル I/O 操作で設定されます。例えば:
READ file-name
fstatus
読み取るレコードがこれ以上ない場合、 をファイルの終わりに設定します。File Status 変数は で実際には参照されませんがREAD
、設定されていることに注意してください。
ファイル ステータス値は 2 文字であり、ISO COBOL 標準で定義されています。これらは、すべての COBOL 実装で同じである必要があります。例外は、最初の文字が '9' であるファイル ステータス値です。これらは実装に依存します。IBM Enterprise COBOL ファイルのステータス値へのリンク は次のとおりです。ファイルの終わりの値は「10」です。これは、すべての COBOL 実装で同じである必要があります。
あなたのプログラムは入力ファイルごとにファイルステータスを持っていると思いますが、それをチェックしたり、適切に反応したりしていません。たとえば、プログラムはファイルの終わりだけをチェックし、他の条件はチェックしない場合があります。
IF fstatus = '10'
PERFORM END-OF-FILE-LOGIC
ELSE
PERFORM NORMAL-LOGIC
END-IF
このアプローチの問題点は、通常のリターン (fstatus = '00') と、ファイルの終わり以外のすべてのエラー条件を、READ が成功したかのように処理することです。次のようなものを用意することをお勧めします:
EVALUATE fstatus
WHEN '10'
PERFORM END-OF-FILE-LOGIC
WHEN '00'
PERFORM NORMAL-LOGIC
WHEN OTHER
PERFORM UNEXPECTED-ERROR
END-EVALUATE
READ
ファイルの終わりに達したときに何をすべきかを指定する命令形式のステートメントがあります。次のようになります。
READ file-name AT END PERFORM END-OF-FILE-LOGIC END-READ
繰り返しますが、ファイル ステータスが の FILE-CONTROL セクションで指定されていて、ファイルfile-name
の終わり以外のエラーが発生した場合、プログラムは「通常の」ロジックを続行しようとしますが、これはまさに間違ったことです。