可変長レコード - 不正な長さの READ
当初、 V5.1Enterprise COBOL は COBOL 以前のコンパイラと比較して長さが間違ったREADの動作を変更しました。しかし、 V5.1Enterprise COBOL 現在のサービスが適用された状態 V5.2、およびそれ以降のバージョンでは、新しいコンパイラオプションによってその動作を変更できます。 VLR(COMPAT|STANDARD) このオプションは、サービスが適用されていない V5.1COBOL 標準準拠の動作を得るか、以前 COBOL のコンパイラと互換性のある動作を得るかを制御するために導入されました。 プログラムにレコード長衝突を引き起こす文 READ が含まれている場合、以前のバージョンから Enterprise COBOL 5および6 への移行を容易にします。
85 COBOL 標準では、READステートメントの処理の一部として以下の規則が指定されています。読み取られるレコード内の文字位置の数が、ファイルのレコード記述項目によって指定された最小サイズより小さい場合、読み取られた最後の有効な文字の右側にあるレコード域の部分は未定義です。 読み取られたレコード内の文字位置の数が、file-name-1 のレコード記述項目で指定されている最大サイズよりも大きい場合、
最大サイズより右にあるレコード部分は切り捨てられます。 いずれの場合も、 読み取り ステートメントが成功し、レコード長の矛盾が発生したことを示す I-O 状況値 04 がSecure Electronic Transactionになります。
READ `STATEMENT` 文 04 で `STATUS` 値が取得されます。 ただし、プログラムが以下のいずれかのコンパイラーでコンパイルされている場合は、状況値 00 を受け取ります。
これは、READ ステートメントの非標準の結果です。- VS COBOL II V1.3 (APAR PN34704 用 PTF をインストール済み)
- VS COBOL II V1.4 (APAR PN38730 用 PTF をインストール済み)
- COBOL/370 V1.1 または V1.2 (APAR PN36445 用 PTF をインストール済み)
- COBOL for OS/390® & VM, V2
- Enterprise COBOL V3 または V4
VLR(COMPAT) コンパイラオプションで利用可能にすることができます。VLR(COMPAT)を指定すると、File Status 00whenREADステートメントでレコード長の競合または誤った長さの READ
が検出されます。プログラムが
誤った長さのREAD
を実行し、可変長レコードファイルのFile Status=0読み取り後にコードがチェックを行う場合、そのコードは「ゼロ」パスを取るでしょう。これは Enterprise COBOL、 V4 およびそれ以前のバージョンと同様です。注: この設定により、長さが正しくない READ 状態で発生する可能性がある入出力の問題を隠すことができます。VLR(COMPAT)オプションの使用には注意が必要です。 また、READステートメントが正しいかどうかを確認してください。VLR(STANDARD)を指定すると、File Status 04whenREADステートメントでレコード長の競合または誤った長さの READ
が検出されます。 この設定を使用すると、FS=04を確認してから、レコード内の未定義データにアクセスしないようにコードを追加することができます。また、切り捨てられたレコードの一部を参照しようとしたときに保護例外が発生しないようにすることもできます。プログラムが
誤った長さの READ
を実行し、可変長レコード・ファイルの読み取り後にコードがFile Status=0をチェックする場合、コードは「ゼロ以外」のパスを取ります。FS=0をテストするためにコードを変更できますが、FS=4およびその他の値はすべて失敗したREADになります。FS=4の場合、変数または保護例外の不良データを回避するためのコードを追加できます。
VLR(基準) を使用すると、詳細に信頼性の高い符号化が生成され、I/Oの問題が少なる結果になります。これは、 長さの読み取り
が発生したときにファイル状況が通知するからです。 新規~コンパイラー・メッセージ MSGIGYP3178は、プログラムが 長さの 読み取り
の可能性を持っているかどうかの通知~別で、I/Oの問題を回避することをヘルプします。 このメッセージは、VLR(COMPAT)からVLR(STANDARD)への移行の際に、ファイル定義(FD)を修正することで解決できる可能性のある間違った長さのREADを
示すために使用できます。 また、実行のためにはプログラムの修正を必須とするように、メッセージの重大度を上げることもできます。 これを行うには、EXIT コンパイラー・オプションの MSGEXIT サブオプションを使用して、メッセージ MSGIGYP3178 の重大度を I (RC=0) から S (RC=12)、E (RC=8)、または W (RC=4) に変更します。 このメッセージの表示が不要な場合は、メッセージを完全に抑止することができます。