このセクションでは、SEARCH ALL ステートメントを持ち、以下のいずれかのコンパイラーでコンパイルされたプログラムに対して必要な処置について説明します。
- APAR PK16765 用 PTF のインストール前の Enterprise COBOL リリース V3R4
- Enterprise COBOL リリース V3R1 から V3R3
- COBOL (OS/390 および VM 版)
- COBOL (MVS および VM 版)
- COBOL/370
- VS COBOL II
- OS/VS COBOL
このような処置が必要になるのは、上記にリストされたコンパイラーと以下のコンパイラーとの間での SEARCH
ALL ステートメントの動作の変更のためです。
- Enterprise COBOL V4R1
- APAR PK16765 用の PTF のインストール後の Enterprise COBOL V3R4
これらの 2 つのコンパイラーは、SEARCH ALL ステートメントに対する動作が同じなので、このセクションではこれらのより新しいコンパイラーを共に
Enterprise COBOL V4R1 と呼びます。
Enterprise COBOL V4R1 では、SEARCH
ALL ステートメントのインプリメンテーションでのエラーが訂正されています。以前のリリースの COBOL の SEARCH ALL ステートメントには、キー比較論理にエラーがありました。このエラーが、意図していたものとは異なる結果をまねきました。特に、比較では IF ステートメントまたは順次 SEARCH ステートメントと同じ結果が作成されませんでした。
長さの不一致の問題: 検索引数がテーブル・キーより長くなる
SEARCH ALL ステートメントの比較では、キーが SEARCH 引数より短いと、英数字キーにはブランクが埋め込まれ、数字キーには先行ゼロが加えられます。ただし、V3R3 とそれ以前のリリースでは場合によっては、SEARCH ALL で引数の余分の文字が無視されました。例えば、「ABCDEF」を含む 01 ARG PIC X(6) の英数字検索引数は、値「ABCD」をともなう 05 MY-KEY PIC X(4) のテーブルまたは配列のキーと、誤って一致してしまいます。「ABCD 」(ブランクあり) を含む検索引数は期待通りに一致となります。
数字の検索引数およびキーの場合にも同様の問題が発生しました。例えば、「123456」を含む01 ARG PIC 9(6) の検索引数は、値「3456」をともなう 05 MY-KEY PIC 9(4) のテーブルまたは配列のキーと、誤って一致してしまいます。003456 を含む検索引数は期待通りに一致となります。
符号の不一致の問題: 符号付き数字引数と符号なし数字キー
第 2 の問題が発生するのは、検索引数が符号付き数字項目で、テーブル・キーが符号なし数字項目の場合です。検索引数のランタイム値が -1234 などの負数である場合、V3R3 と以前のリリースでコンパイルされたプログラムでは、1234 のテーブル・キーが一致となります。こうした比較は、通常の COBOL 比較条件の規則を使用して行われると、-1234 などの負の引数は符号なしのテーブル・キーと一致することはありません。
修正処置:
Enterprise COBOL V4R1 が上記の問題を訂正します。
ただし、以前のリリースでコンパイルされたアプリケーションには、間違った動作に依存するものもあります。これらのアプリケーションを特定し、修正してから、
Enterprise COBOL V4R1 に移行する必要があります。
こうした修正の影響を受けるプログラムおよび SEARCH ALL ステートメントの特定に役立つように、以下のコンパイラーおよびランタイム警告診断が出されます。
- コンパイラー・メッセージ: Enterprise COBOL V4R1
コンパイラーは、以下のコンパイラー診断を生成します。実際に影響があるかどうかは、実行時の引数の内容によります。
- IGYPG3189-W。テーブル・キーより長い検索引数を持つ (つまり第 1 の問題が生じる可能性がある) すべての SEARCH ALL ステートメントについて出されます。
- IGYPG3188-W。検索引数が符号付き数字項目で、テーブル・キーが符号なし数字項目である (つまりプログラムで第 2 の問題が生じる可能性がある) 場合に出されます。
- ランタイム・メッセージ : 以下のランタイム・メッセージが生成されます。これらのランタイム・メッセージのいずれかを生成するプログラムは、変更の影響を受けます。
- IGZ0194W。余分のバイトがブランクまたはゼロでない検索引数を持つすべての SEARCH ALL ステートメントについて出されます。
- IGZ0193W。検索引数が負の値の符号付き数字項目で、テーブル・キーは符号なし数字項目の場合に出されます。
バージョン 4 へマイグレーションするには:
アプリケーションを Enterprise COBOL V4R1 に移行するには、以下の一連の手順のいずれかを行います。
- コンパイラー・メッセージについて処置を行います。
- プログラムを Enterprise COBOL V4R1 でコンパイルします。
- コンパイラー・メッセージ IGYPG3188-W または IGYPG3189-W で示された SEARCH ALL ステートメントを検討します。このようなステートメントは影響を受けている可能性があります。
- ランタイム・メッセージについて処置を行います。
- アプリケーションをテスト環境で実行します。
- ランタイム・メッセージ IGZ0193W または IGZ0194W を生成する SEARCH ALL ステートメントを検討します。
影響を受ける SEARCH ALL ステートメントを特定したら、以下の手順でアプリケーション・ロジックを適切に調整します。
- 検索引数がテーブル・キーより長い SEARCH ALL ステートメントの場合、以下のいずれかの処置を行います。
- 必ず、キーの長さを超えている引数のバイトが、スペースまたはゼロになるようにします。
- 引数をキーと同サイズの一時データ項目に移し、その一時項目を検索引数として使用します。
- 参照/修正によって比較範囲を制限します。
以下に例を示します。
上記の 2 番目と 3 番目の処置によって、将来警告メッセージは表示されなくなります。
- 検索引数が符号付きで、テーブル・キーが符号なしである SEARCH ALL ステートメントの場合、必ず検索引数を正数値に正しく初期設定してから、SEARCH ステートメントを実行します。COBOL プログラム内の固有のアプリケーション・ロジックによっては、以下のいずれかの変更を行うことができます。
- 引数のデータ記述を符号なしに変更します。
- 検索引数を符号なしの一時変数に移し、その一時変数を SEARCH ALL ステートメントで使用します。
いずれかの処置によって、将来警告メッセージは表示されなくなります。