Rational Developer for System z
Enterprise COBOL for z/OS バージョン 4.1 コンパイラーおよびランタイム 移行ガイド


OS/VS COBOL から変更された言語エレメント

Enterprise COBOL では、COBOL 85 標準に準拠するために、以下の OS/VS COBOL 言語エレメント が変更されました。いくつかの言語エレメントは、言語の構文が変更されています。また、言語の構文は変更されていなくても、実行結果が異なる可能性がある (セマンティ クスが変更されている) 言語エレメントもあります。

リストされているそれぞれの言語エレメントごとに、結果の違いと必要な処置が 簡単に説明されています。さらに、必要な場合には、説明内容を明確にするためのコーディング例も示されています。
ALPHABETIC クラスの変更
OS/VS COBOL では、大文字とスペース文字だけが ALPHABETIC であると見なされました。

Enterprise COBOL では、大文字、小文字、およびスペース文字が ALPHABETIC であると見なされます。

OS/VS COBOL プログラムで ALPHABETIC クラス・テストを使用しており、テストされるデ ータに大文字と小文字が混在していると、実行結果が異なる可能性があります。このような場合は、OS/VS COBOL の ALPHABETIC テストの代わり に Enterprise COBOL の ALPHABETIC-UPPER クラス・テストを使用すると、同じ結果を得る ことができます。

ALPHABET 文節の変更 : ALPHABET キーワード
OS/VS COBOL では、ALPHABET 文節内でキーワード ALPHABET が使用できませんでした。

Enterprise COBOL では、ALPHABET キーワードは必須です。

算術ステートメントの変更
Enterprise COBOL では、以下の算術項目の精度が向上しました。
  • 浮動小数点データ項目の使用
  • 浮動小数点リテラルの使用
  • 分数による指数の表記

したがって、これらの項目を含んでいる算術ステートメントの場合、Enterprise COBOL は OS/VS COBOL よ りも正確な結果を提供する可能性があります。これらの変更がアプリケーションに悪影響を与えないことを確認するために、アプリケ ーションをテストする必要があります。

ASSIGN 文節の変更
Enterprise COBOL は、以下の形式の ASSIGN 文節だけをサポートします。
ASSIGN TO assignment-name
ここで、assignment-name は以下の形式にすることができます。
QSAM ファイル
[comments-][S-]name
VSAM 順次ファイル
[comments-][AS-]name
VSAM 索引付きファイルまたは相対ファイル
[comments-]name
LINE SEQUENTIAL ファイル
[comments-]name

OS/VS COBOL プログラムで別の形式の ASSIGN 文節、または別の形式 の assignment-name を使用している場合は、それを、Enterprise COBOL で サポートされる形式に準拠するように変更しなければなりません。

PICTURE 文節内の B 記号 : 評価の変更
OS/VS COBOL は、英字項目の定義における PICTURE 記号 A および B を受け入れました。

Enterprise COBOL は PICTURE 記号 A だけを受け入れます (記号 A と記号 B の両方を含んでいる PICTURE は、英数字編集項目を定義します)。

この変更により、以下のものの評価について、OS/VS COBOL と Enterprise COBOL の間で実行の違いが生じる可能性があります。
  • CANCEL ステートメント
  • CALL ステートメント
  • クラス・テスト
  • STRING ステートメント
CALL ステートメントの変更
OS/VS COBOL は、CALL ステートメントの USING 句における段落名、セクション名、およびファ イル名を受け入れました。

Enterprise COBOL の CALL ステートメントの USING 句では、プロシージャー名は受け入れられ ず、QSAM ファイル名だけが受け入れられます。したがって、プロシージャー名は除去しなければならず、さらに、CALL ステートメントの USING 句で使 用するファイル名が QSAM 物理順次ファイルの名前であることを確認する必要があります。

アセンブラー・プログラムを呼び出し、プロシージャー名を渡す OS/VS COBOL プログラムを 移行するためには、アセンブラー・ルーチンを書き直す必要があります。OS/VS COBOL プログラムでは、アセンブラー・ルーチンを、パラメーターとして渡された段落名 からアドレス (またはアドレスのリスト) を受け取るように書くことができます。アセンブラー・ルーチンは、エラーが発生した場合、このアドレスを使用してメイン プログラム内の代替位置に戻ることができます。

Enterprise COBOL では、アセンブラー・ルーチンを、数値を割り当てて起点に戻るように コーディングしてください。アセンブラー・プログラム内でエラーが発生した場合、この数値を使用して呼び出しル ーチン内の代替位置に進むことができます。

たとえば、OS/VS COBOL の以下のアセンブラー・ルーチンは Enterprise COBOL では無効です。
CALL "ASMMOD" USING PARAMETER-1,
                    PARAGRAPH-1,
                    PARAGRAPH-2,
NEXT STATEMENT.
 . . .
PARAGRAPH-1.
 . . .
PARAGRAPH-2.
上記のサンプル・コードは、Enterprise COBOL でコンパイルするには、以下の例のように書き換える必要があります。
CALL "ASMMOD" USING PARAMETER-1,
                    PARAMETER-2.
IF PARAMETER-2 NOT = 0
   GOTO PARAGRAPH-1,
        PARAGRAPH-2,
        DEPENDING ON PARAMETER-2.

この例では、アセンブラー・プログラム (ASMMOD) を、代替位置に分岐しないように変更 します。その代わりに、エラーがなければ数値ゼロ、エラーが発生すればゼロ以外の戻り値を呼び出し ルーチンに渡すようにします。ゼロ以外の戻り値は、COBOL プログラム内のどの段落がエラー条件を処理するのかを判 別するために使用されます。

多くの COBOL プログラマーが、特定のエラーまたは条件が存在するときに制御を取得するために、390 SPIE 機構を使用するアセンブラー・プログラムをコーディングしています。これらのルーチンは、SPIE ルーチンに渡された名前を持つ段落で COBOL プログラムに制御 を渡すことができます。これらのユーザー作成 SPIE ルーチンを使用するアプリケーションは、言語環境プログラムの条件処理を使 用するように変換してください。

簡略複合比較条件の変更
以下の 3 つの考慮事項が、簡略複合比較条件に影響を与えます。
  • NOT および論理演算子 / 関係演算子の評価
  • 括弧の評価
  • オプション・ワード IS

以下のセクションでこれらを説明します。

NOT および論理演算子/関係演算子の評価 LANGLVL(1) を指定した OS/VS COBOL は、以下のように、簡略複合比較条件内での NOT の使用を受け入れます。
  • 比較条件のサブジェクトだけが暗黙指定されているときは、NOT は論理演算子である と見なされます。以下に例を示します。
    A = B AND NOT LESS THAN C OR D
    これは以下と同等です。
    ((A = B) AND NOT (A < C) OR (A < D))
  • サブジェクトと関係演算子の両方が暗黙指定されているときは、NOT は関係演算子の 一部であると見なされます。
    以下に例を示します。
    A > B AND NOT C
    これは以下と同等です。
    A > B AND A NOT > C
LANGLVL(2) を用いる OS/VS COBOL および Enterprise COBOLでは、簡略複合比較 条件内の NOT は以下のように見なされます。
  • NOT GREATER THAN、NOT >、NOT LESS THAN、NOT <、NOT EQUAL TO、および NOT = の形 の場合は、関係演算子の一部であると見なされます。以下に例を示します。
    A = B AND NOT LESS THAN C OR D
    これは以下と同等です。
    ((A = B) AND (A NOT < C) OR (A NOT < D))
  • その他の位置にある NOT は、論理演算子であると見なされます (したがって、否定比較条件になります)。以下に例を示します。
    A > B AND NOT C
    これは以下と同等です。
    A > B AND NOT A > C

LANGLVL(1) を用いる OS/VS COBOL から移行する場合、予期したとおりの実行結果を得るようにするためには、すべての簡略複合条件を、簡略化 しない完全な形に展開してください。

括弧の評価: OS/VS COBOL は、簡略複合比較条件内での括弧の使用を受け入れました。

Enterprise COBOL は、ほとんどの括弧の使用を IBM 拡張としてサポートします。ただし、いくつかの違いがあります。
  • 簡略複合比較条件の有効範囲内では、Enterprise COBOL は括弧の内側の関係演算子をサポート しません。以下に例を示します。
    A = B AND  ( < C OR D)
  • 比較条件内での括弧の誤った使用の一部は、OS/VS COBOL では受け入れられました が、Enterprise COBOL では受け入れられません。以下に例を示します。
    (A = 0 AND B) = 0
オプション・ワード IS: OS/VS COBOL は、簡略複合比較条件内のオブジェクトの直前にあるオプション・ワード IS を受け入れました。以下に例を示します。
A = B OR IS C AND IS D

Enterprise COBOL は、オプション・ワード IS のこの用法を受け入れません。Enterprise COBOL では、このように使用されているワード IS を削除してください。

注: Enterprise COBOL では、オプション・ワード IS を簡略複合比較条件内の関係演算子の一部として使 用することが許可されます。以下に例を示します。
A = B OR IS = C AND IS = D
関連した名前を指定した COPY ステートメント
LANGLVL(1) を用いる OS/VS COBOL では、COPY ステートメントの前に 01 レベルの標識を付けること ができました。この 01 レベルの名前は COPY メンバー内の 01 レベルの名前を置き換え ることになります。たとえば、COPY メンバー MBR-A の内容が以下の場合、
01 RECORD-A.
   05 FIELD-A...
   05 FIELD-B...
次のような COPY ステートメントを使用すると、
01  RECORD1 COPY MBR-A.
結果のソースは次のようになります。
01  RECORD1.
    05 FIELD-A...
    05 FIELD-B...
Enterprise COBOL はこの COPY ステートメントを受け入れません。Enterprise COBOL でコンパイルするためには、以下のステートメントを使用してください。
01  RECORD1.
    COPY MBR-A REPLACING ==01 RECORD-A== BY == ==.
CURRENCY-SIGN 文節の変更 : 「/」、「=」、および「L」文字
LANGLVL(1) を用いる OS/VS COBOL は、CURRENCY-SIGN 文節内 の '/' (スラッシュ) 文字、'L' 文字、および '=' (等号) を受け入れました。

Enterprise COBOL は、これらの文字を有効として受け入れません。さらに、Enterprise COBOL は、DBCS データ項目を使用するプログラムの場合に、文字 G を受け入 れません。

CURRENCY SIGN 文節にこれらの文字がある場合は、これらの文字を除去しなければなりません。

ENTRY ポイントへの動的 CALL ステートメント
OS/VS COBOL では、場合によっては、CANCEL を介在させずにサブプログラムの代替入り口点への動的 CALL ステートメントを使用することができました。

Enterprise COBOL では、介在する CANCEL が常に必要です。これらのプログラムを移行するときは、サブプログラムの代替 ENTRY ポイントを参照する 動的 CALL ステートメントの間に介在する CANCEL を追加してください。

EXIT PROGRAM/GOBACK ステートメントの変更
OS/VS COBOL では、EXIT PROGRAM または GOBACK ステートメントが実行されるときに、その中 の PERFORM ステートメントが範囲の終わりに達していないと、その PERFORM ステートメントは未完了の状態のままに なりました。

Enterprise COBOL では、EXIT PROGRAM または GOBACK ステートメントが実行されるとき には、その中のすべての PERFORM ステートメントが範囲の終わりに達しているものと見なされます。

FILE STATUS 文節の変更
Enterprise COBOL では、状況キーの値が、OS/VS COBOL から受け取られるもの から変更されました。
  • QSAM ファイルについては、表 1 を参照してください。
  • VSAM ファイルについては、表 2 を参照してください。

OS/VS COBOL プログラムで、実行の進路を判別するために状況キー値を使用している場 合は、プログラムを、新しい状況キー値を使用するように変更しなければなりません。Enterprise COBOL ファイル状況コードの詳細については、「Enterprise COBOL 言語解説書」を参照してください。

表 1. 状況キーの値 : QSAM ファイル
OS/VS Enterprise COBOL 意味
(未定義) 04 誤長レコード。正常終了。
(未定義) 05 オプション・ファイルが使用できません。正常終了。
(未定義) 07 OPEN または CLOSE に NO REWIND/REEL/UNIT/FOR REMOVAL が指定されましたが、ファイ ルがリール / 装置メディア上にありません。正常終了。
00 00 正常終了。
10 10 At END (次の論理レコードがありません)。正常終了。
30 30 永続エラー。
34 34 永続エラー。ファイル境界違反。
90 90 その他のエラー (これ以上の情報はありません)。
90 35 非オプション・ファイルが使用できません。
90 37 装置タイプの矛盾。
90 39 固定ファイル属性の矛盾。OPEN が失敗します。
90 96 ファイル識別がありません (ファイル用の DD ステートメントがありません)。
92 38 WITH LOCK でクローズされたファイルに対して OPEN が試みられました。
92 41 OPEN モードのファイルに対して OPEN が試みられました。
92 42 OPEN モードでないファイルに対して CLOSE が試みられました。
92 43 最後の入出力ステートメントが READ でないときに REWRITE が試みられました。
92 44 異なるサイズのレコードで順次ファイル・レコードの再書き込みが試みられました。
92 46 有効な次のレコードがない状況で順次 READ が試みられました。
92 47 ファイルが OPEN INPUT または I-O モードでないときに READ が試みられました。
92 48 ファイルが OPEN OUTPUT、I-O、または EXTEND モードでないときに WRITE が試みられま した。
00 48 ファイルが OPEN I-O モードのときに WRITE が試みられました。
92 49 ファイルが OPEN I-O モードでないときに DELETE または REWRITE が試みられました。
92 92 論理エラー。
表 2. 状況キーの値 : VSAM ファイル
OS/VS Enterprise COBOL 意味
(未定義) 14 相対ファイルの順次 READ で、相対レコード番号のサイズが相対キーにとって大きすぎま した。
00 00 正常終了。
00 04 誤長レコード。正常終了。
00 05 オプション・ファイルが使用できません。正常終了。
00 35 非オプション・ファイルが使用できません。ファイルが空のときに発生する可能性があります。
02 02 重複キーがあり、DUPLICATES が指定されています。正常終了。
10 10 At END (次の論理レコードがありません)。正常終了。
21 21 VSAM 索引付きまたは相対ファイルのキーが無効です。シーケンス・エラー。
22 22 VSAM 索引付きまたは相対ファイルのキーが無効です。重複キーおよび重複は許可されま せん。
23 23 VSAM 索引付きまたは相対ファイルのキーが無効です。レコードが見つかりません。
24 24 VSAM 索引付きまたは相対ファイルのキーが無効です。ファイル境界を超える書き込み が試みられました。

Enterprise COBOL: 相対ファイルへの WRITE で、相対レコード番号のサイズが相対キーにとって大 きすぎました。

30 30 永続エラー。
90 37 大容量記憶装置上にないファイルのオープンが試みられました。
90 90 その他のエラー (これ以上の情報はありません)。
91 91 VSAM パスワード障害。
92 41 OPEN モードのファイルに対して OPEN が試みられました。
92 42 OPEN モードでないファイルに対して CLOSE が試みられました。
92 43 最後の入出力ステートメントが READ または DELETE でないときに REWRITE が試みられました。
92 47 ファイルが OPEN INPUT または I-O モードでないときに READ が試みられました。
92 48 ファイルが OPEN OUTPUT、I-O、または EXTEND モードでないときに WRITE が試みられま した。
92 49 ファイルが OPEN I-O モードでないときに DELETE または REWRITE が試みられました。
93 93 VSAM リソースが使用可能ではありません。
93 96 35 非オプション・ファイルが使用できません。
94 46 有効な次のレコードがない状況で順次 READ が試みられました。
95 39 固定ファイル属性の矛盾。OPEN が失敗します。
95 95 VSAM ファイル情報が無効または不完全です。
96 96 ファイル識別がありません (この VSAM ファイル用の DD ステートメントがありません)。
97 97 OPEN ステートメントの実行が正常に終了しました。ファイルの保全性が検査されました。
IF . . . OTHERWISE ステートメントの変更
OS/VS COBOL では、次のような非標準形式の IF ステートメントを使用できました。
IF condition THEN statement-1 OTHERWISE statement-2
Enterprise COBOL では、次のような標準形式の IF ステートメントだけが使用できます。
IF condition THEN statement-1 ELSE statement-2

したがって、非標準形式の IF...OTHERWISE ステートメントを含んでいる OS/VS COBOL プログラム は、標準形式の IF...ELSE ステートメントに変更する必要があります。

JUSTIFIED 文節の変更
LANGLVL(1) を用いる OS/VS COBOL では、データ記述記入項目で VALUE 文節と一緒 に JUSTIFIED 文節が指定されると、初期データは右寄せされます。以下に例を示します。
77  DATA-1 PIC X(9) JUSTIFIED VALUE "FIRST".
この結果、"FIRST" は DATA-1 の右端の 5 つの文字位置を占めます。
bbbbFIRST
Enterprise COBOL では、JUSTIFIED 文節は、データ項目内のデータの初期配置に影響を与えません。英字または英数字項目について VALUE と JUSTIFIED の両方の文節が指定されると、初期値 はデータ項目内で左寄せされます。以下に例を示します。
77  DATA-1 PIC X(9) JUSTIFIED VALUE "FIRST".
この結果、"FIRST" は DATA-1 の左端の 5 つの文字位置を占めます。
FIRSTbbbb
Enterprise COBOL で結果が変わらないようにするために は、DATA-1 の 9 つすべての文字位置を占めるリテラル値を指定することができます。以下に例を示します。
77  DATA-1 PIC X(9) JUSTIFIED VALUE "    FIRST".
これは、DATA-1 の値を右寄せしています。
bbbbFIRST
MOVE ステートメントおよび比較 : 位取りの変更
LANGLVL(1) を用いる OS/VS COBOL では、MOVE ステートメント内の送信フィールドまたは比較内の フィールドが位取りされた整数であり (つまり、右端の PICTURE 記号が文字 P であり)、受信フィールド (または比較されるフィールド) が英数字または数字編集である場合、後続ゼロ (0) は切り捨てられます。
たとえば、以下の MOVE ステートメント
05  SEND-FIELD     PICTURE 999PPP VALUE 123000.
05  RECEIVE-FIELD  PICTURE XXXXXX.
    . . .
    MOVE SEND-FIELD TO RECEIVE-FIELD.
RECEIVE-FIELD には値 123bbb (左寄せされた) が入ります。ここでは、b は 1 つのブランク文字を表しています。

Enterprise COBOL の場合、MOVE ステートメントでは後続ゼロが転送され、比較ではそれらが組み込まれます。

たとえば、以下の MOVE ステートメント
05  SEND-FIELD     PICTURE 999PPP VALUE 123000.
05  RECEIVE-FIELD  PICTURE XXXXXX.
    . . .
    MOVE SEND-FIELD TO RECEIVE-FIELD.
が実行されると、RECEIVE-FIELD には値 123000 が入ります。
グループ項目に対する数値クラス・テスト
OS/VS COBOL では、IF NUMERIC クラス・テストを、1 つ以上の符号付き基本項目を 含んでいるグループ項目と共に使用できました。
たとえば、IF grp1 IS NUMERIC。 ここで、grp1 はグループ項目です。
01 grp1.
   03 yy PIC S99.
   03 mm PIC S99.
   03 dd PIC S99.

Enterprise COBOL では、IF NUMERIC クラス・テストを符号付き従属項目を持つグループ項 目に対して使用すると、S レベルのメッセージが出されます。

数値データの変更
Enterprise COBOL は、10 進データ用に生成されたコードを変更するために NUMPROC コンパ イラー・オプションを使用します。NUMPROC(MIG) は、OS/VS COBOL の場合と非常に類似した処理を引き起こしますが、すべてのケースで 結果が同じであるとは限りません。MOVE ステートメント、比較、および算術ステートメントの結果は、OS/VS COBOL の場合と異なる可能性があります (特に、フ ィールドが初期設定されていない場合)。

たとえば、Enterprise COBOL では負のゼロを結果として生成しませんが、OS/VS COBOL は生成する可能性がありました。 さらに、Enterprise COBOL では NUMPROC(MIG) を指定した入力データの無効な符号を修正しませんが、OS/VS COBOL プログラムでは、入力データの矛盾する符号を修正していました。

データ例外を利用して、無効な内容の 10 進データ項目を識別したり、 異常終了させたりしているプログラムは、10 進データ項目内のデータを検証するクラス・テストを使用するように変更が必要な場合があります。

OCCURS DEPENDING ON 文節 : ASCENDING および DESCENDING KEY 句
OS/VS COBOL は、OCCURS DEPENDING ON 文節の ASCENDING および DESCENDING KEY 句内の 可変長キーを IBM 拡張として受け入れていました。

Enterprise COBOL では、ASCENDING または DESCENDING KEY 句内に可変長キーを指定できません。

OCCURS DEPENDING ON 文節 : 受け取り項目の値の変更
OS/VS COBOL では、OCCURS DEPENDING ON (ODO) オブジェクトの現行値が送り出し項目と 受け取り項目の両方について常に使用されます。
Enterprise COBOL では、送り出し項目については ODO オブジェクトの現行値が 使用されます。受け取り項目については、以下の長さが使用されます。
  • グループ項目に ODO のサブジェクトとオブジェクトの両方が含まれており、同じレコー ド内でそのグループ項目の後に非従属データ項目が続いていない場合は、項目の最大長が 使用されます。
  • グループ項目に ODO のサブジェクトとオブジェクトの両方が含まれており、同じレコー ド内でそのグループ項目の後に非従属データ項目が続いている場合は、受け取り項目の実際の 長さが使用されます。
  • グループ項目に ODO のサブジェクトが含まれているが、オブジェクトが含まれていない 場合は、項目の実際の長さが使用されます。

最大長が使用されるときは、テーブルがデータを受け取る前に ODO オブジェクトを初期 設定する必要はありません。位置が ODO オブジェクトの値によって異なる項目については、それらを CALL ステートメント の USING 句で使用する前に、OCCURS DEPENDING ON 文節のオブジェクトを設定する ことが必要です。Enterprise COBOL のもとでは、可変位置ではない可変長グループの場合、項目 が CALL ステートメントの USING BY REFERENCE 句で使用されるときに、そのオブジェクトを設定する 必要はありません。これは、上記の 2 番目の中黒で記述されているグループについても該当します。

以下に例を示します。
01  TABLE-GROUP-1
    05  ODO-KEY-1 PIC 99.
    05  TABLE-1 PIC X(9)
        OCCURS 1 TO 50 TIMES DEPENDING ON ODO-KEY-1.
01  ANOTHER-GROUP.
    05  TABLE-GROUP-2.
        10  ODO-KEY-2 PIC 99.
        10  TABLE-2 PIC X(9)
            OCCURS 1 to 50 TIMES DEPENDING ON ODO-KEY-2.
    05  VARIABLY-LOCATED-ITEM PIC X(200).
    . . .
PROCEDURE DIVISION.
    . . .
   MOVE SEND-ITEM-1 TO TABLE-GROUP-1
    . . .
   MOVE ODO-KEY-X TO ODO-KEY-2
   MOVE SEND-ITEM-2 TO TABLE-GROUP-2.

TABLE-GROUP-1 が受け取り項目であるときには、Enterprise COBOL は、その項 目についての最大数の文字位置 (TABLE-1 の 450 バイト + ODO-KEY-1 の 2 バイト) を移動 します。したがって、SEND-ITEM-1 データを TABLE-1 に移動する前に、TABLE-1 の長さを初期設定する 必要はありません。

しかし、レコード記述の中で、TABLE-GROUP-2 の後には非従属データ 項目 VARIABLY-LOCATED-ITEM が続いています。この場合には、Enterprise COBOL は ODO-KEY-2 内の実際の値を使用して TABLE-GROUP-2 の長さを 計算します。ユーザーは、SEND-ITEM-2 データをグループ受け取り項目に移動する前 に、ODO-KEY-2 をその有効な現在の長さに設定しなければなりません。

ON SIZE ERROR 句 : 中間結果の変更
OS/VS COBOL の場合、DIVIDE および MULTIPLY ステートメントの SIZE ERROR 句は中間結果と最終結 果の両方に適用されました。

Enterprise COBOL の場合、DIVIDE および MULTIPLY ステートメントの SIZE ERROR 句は 最終結果にのみ適用されます。これは、COBOL 74 標準と COBOL 85 標準間の 変更です。この変更は既存のプログラムに影響を与える場合と与えない場合があります。

したがって、OS/VS COBOL プログラムが中間結果の SIZE ERROR 検出に依存している場合 は、プログラムを変更することが必要になる可能性があります。

オプション・ワード IS
OS/VS COBOL プログラムの場合、簡略複合比較条件内のオブジェクトの直前に オプション・ワード IS があっても、MIGR メッセージは出されませんでした。以下に例を示します。
A = B OR IS C AND IS D

Enterprise COBOL は、オプション・ワード IS のこの用法を受け入れません。Enterprise COBOL では、このように使用されているワード IS を削除してください。

注: Enterprise COBOL では、オプション・ワード IS を簡略複合比較条件内の関係演算子の一部として使 用することが許可されます。以下に例を示します。
A = B OR IS = C AND IS = D
PERFORM ステートメント : VARYING/AFTER 句の変更
OS/VS COBOL では、VARYING/AFTER が指定された PERFORM ステートメントで、内部条件が TRUE と してテストされると、2 つのアクションが起こります。
  1. 内部条件に関連した ID/ 指標が、その現在の FROM 値に設定されます。
  2. 外部条件に関連した ID/ 指標が、その現在の BY 値だけ増大されます。

Enterprise COBOL では、そのような PERFORM ステートメントで、内部条件が TRUE とし てテストされると、以下のアクションが起こります。

  1. 外部条件に関連した ID/ 指標が、その現在の BY 値だけ増大されます。
  2. 内部条件に関連した ID/ 指標が、その現在の FROM 値に設定されます。
次の例は、結果の違いを示しています。
PERFORM ABC VARYING X FROM 1 BY 1 UNTIL X > 3
             AFTER Y FROM X BY 1 UNTIL Y > 3
OS/VS COBOL では、ABC は以下の値で 8 回実行されます。
X:  1  1  1  2  2  2  3  3
Y:  1  2  3  1  2  3  2  3
Enterprise COBOL では、ABC は以下の値で 6 回実行されます。
X:  1  1  1  2  2  3
Y:  1  2  3  2  3  3
以下のように、ネストされた PERFORM ステートメントを使用することによって、OS/VS COBOL の場合 と同じ処理結果を得ることができます。
MOVE 1 TO X, Y, Z
PERFORM EX-1 VARYING X FROM 1 BY 1 UNTIL X > 3
. . .
EX-1.
    PERFORM ABC VARYING Y FROM Z BY 1 UNTIL Y > 3.
    MOVE X TO Z.
ABC.
PROGRAM COLLATING SEQUENCE 文節の変更
OS/VS COBOL では、PROGRAM COLLATING SEQUENCE 文節の alphabet-name で 指定された照合シーケンスは、INSPECT、STRING、および UNSTRING ステートメントの実行中に暗黙 に実行される比較に適用されます。

Enterprise COBOL では、alphabet-name で指定された照合シーケンスは、これらの暗黙の比較には使用されません。

READ および RETURN ステートメントの変更 : INTO 句
送信フィールドを、READ または RETURN...INTO identifier ステートメントに関連付けられた移動に合わせて選択する場合、OS/VS COBOL および Enterprise COBOL では、送信フィールドとして FD または SD から異なるレコードを選択することができます。このことは、レコード記述が PICTURE 文節を持っているときに、暗黙の基本 MOVE にのみ影 響を与えます。
RERUN 文節の変更
RERUN 文節が指定されると、OS/VS COBOL では最初のレコードでチェックポイントが取 られますが、Enterprise COBOL では取られません。
RESERVE 文節の変更
OS/VS COBOL は、以下の形式の FILE CONTROL 段落 RESERVE 文節をサポートしました。
RESERVE NO ALTERNATE AREA
RESERVE NO ALTERNATE AREAS
RESERVE integer ALTERNATE AREA
RESERVE integer ALTERNATE AREAS
RESERVE integer AREA
RESERVE integer AREAS
Enterprise COBOL は、以下の形式の RESERVE 文節だけをサポートします。
RESERVE integer AREA
RESERVE integer AREAS

OS/VS COBOL プログラムで RESERVE integer ALTERNATE AREA また は RESERVE integer ALTERNATE AREAS 形式を使用している場合、Enterprise COBOL のもとで同等 の処理を得るためには、integer + 1 AREA(S) を指定した RESERVE 文節を使用 しなければなりません。つまり、OS/VS COBOLRESERVE 2 ALTERNATE AREAS 句 は、Enterprise COBOLRESERVE 3 AREAS と同等です。

LANGLVL(1) を用いる OS/VS COBOL のもとでは、RESERVE integer AREAS 形式の解釈 は、Enterprise COBOL におけるこの形式の解釈と異なります。

LANGLVL(1) を使用し、RESERVE integer AREA または RESERVE integer AREAS 形式を 使用している場合、Enterprise COBOL のもとで同等の処理を得るために は、integer + 1 AREA(S) を指定した RESERVE 文節を使用しなければなりませ ん。

予約語リストの変更
Enterprise COBOLOS/VS COBOL では予約語リストに違いがあります。COBOL 予約語の比較に予約語の完全なリストが記載されています。
SEARCH ステートメントの変更
OS/VS COBOL では、ASCENDING および DESCENDING KEY データ項目 を SEARCH ステートメントの WHEN 比較条件のサブジェクトまたはオブジェク トとして指定することができました。

Enterprise COBOL では、WHEN 句のデータ名 (WHEN 比較条件のサブジェクト) は、このテーブル・エレメント内の ASCENDING または DESCENDING KEY データ項目でなければならず、identifier-2 (WHEN 比較条件のオブジェクト) はこのテーブル・エレメントに対応する ASCENDING または DESCENDING のキー・データ項目であってはなりません。

OS/VS COBOL は以下のコードを受け入れましたが、Enterprise COBOL では受け入れません。
WHEN VAL = KEY-1 ( INDEX-NAME-1 )
  DISPLAY "TABLE RECORDS OK".
以下の SEARCH の例は、Enterprise COBOL と OS/VS COBOL の両方で実行 することができます。
01  VAL  PIC X.
01  TABLE-01.
    05  TABLE-ENTRY
           OCCURS 100 TIMES
           ASCENDING KEY IS KEY-1
           INDEXED BY INDEX-NAME-1.
        10  FILLER PIC X.
        10  KEY-1 PIC X.
    SEARCH ALL TABLE-ENTRY
        AT END DISPLAY "ERROR"
      WHEN KEY-1 ( INDEX-NAME-1 ) = VAL
        DISPLAY "TABLE RECORDS OK".
セグメント化の変更 : 独立セグメント内の PERFORM ステートメント
LANGLVL(1) を用いる OS/VS COBOL では、独立セグメント内の PERFORM ステートメントで永続セグメ ントを参照している場合、その独立セグメントは、実行されたプロシージャーが終了する たびに初期設定されます。

LANGLVL(2) を用いる OS/VS COBOL では、独立セグメント内の PERFORM ステートメントで永続セグメ ントを参照している場合、PERFORM ステートメントのそれぞれの実行ごとに 1 回だけ、実行される プロシージャーに制御が渡されます。

Enterprise COBOL では、コンパイラーはオーバーレイを実行しません。した がって、上記の規則は適用されません。

プログラム・ロジックが OS/VS COBOL におけるこれらのセグメント化規則のインプリメンテー ションのいずれかに依存している場合は、プログラムを書き直さなければなりません。

SELECT OPTIONAL 文節の変更
LANGLVL(1) を用いる OS/VS COBOL では、ファイル制御記入項目に SELECT OPTIONAL 文節が指定されると、ファイルが使用可能でない場合にプログラムが失敗します。Enterprise COBOL では、ファイル制御記入項目に SELECT OPTIONAL 文節が 指定されると、ファイルが使用可能でない場合にプログラムが失敗せず、ファイル状況コード 05 が戻されます。USERMOD は、VSAM の場合のこの動作に影響を与えることができます。詳細については、言語環境プログラム インストールおよびカスタマイズを参照してください。
SORT 特殊レジスター
SORT-CORE-SIZE、SORT-FILE-SIZE、SORT-MESSAGE、および SORT-MODE-SIZE 特殊レジス ターは、Enterprise COBOL のもとでサポートされ、デフォルト以外の値を持っている場合 に SORT インターフェースで使用されます。ただし、実行時には、個々の SORT 特殊レジスターは、SORT-CONTROL ファイルに組み込まれ ている制御ステートメントの対応するパラメーターによってオーバーライドされ、メッセージが出されます。さらに、プログラム内で設定されたそれぞれの SORT 特殊レジスターごとに、コンパイラ ー警告メッセージ (W レベル) が出されます。

OS/VS COBOL では、SORT-RETURN 特殊レジスターに、SORT の正常終了 (RC=0)、USING また は GIVING ファイルに関する OPEN または入出力エラー (RC=2 ~ RC=12)、および SORT の 失敗 (RC=16) を表すコードが入る可能性があります。Enterprise COBOL では、SORT-RETURN 特殊レジスターに、SORT の正常終了 (RC=0) および 失敗 (RC=16) を表すコードだけが入ります。

ソース言語のデバッグの変更
Enterprise COBOL および OS/VS COBOL では、USE FOR DEBUGGING 宣言を使用して ソース言語をデバッグすることができます。 有効なオペランドを表 3 に示します。Enterprise COBOL で無効な オペランドは、OS/VS COBOL プログラムから除去しなければなりません。Debug Tool を使用して、 同じデバッグ結果が得られるようにしてください。
表 3. USE FOR DEBUGGING 宣言 : 有効なオペランド
デバッグ・オペランド

プロシージャーが
実行されるとき

OS/VS COBOL Enterprise COBOL
procedure-name-1 procedure-name-1 指定されたプロシージャーのそれぞれの実行の直前。

指定されたプロシージャーを参照している ALTER ステートメントの実行の直後。

ALL PROCEDURES ALL PROCEDURES 最外部プログラム内のそれぞれの非デバッグ・プロシージャーの実行の直前。

最外部プログラム内のそれぞれの ALTER ステートメント (宣言型プロシージャー内の ALTER ステートメントを除く) の 実行の直後。

file-name-n (なし) 詳細については、「IBM VS COBOL for OS/VS」を参照してください。
ALL REFERENCES OF identifier-n (なし) 詳細については、「IBM VS COBOL for OS/VS」を参照してください。
cd-name-1 (なし) 詳細については、「IBM VS COBOL for OS/VS」を参照してください。
コンパイル時にフラグ設定される範囲外添え字
Enterprise COBOL は、許容される最大値よりも大きいかまたは 1 よりも小さいリテラル添え 字または指標値がコーディングされている場合は、エラー (RC = 8) メッセージを出します。このメッセージは、SSRANGE オプションが指定されているかどうかに関係なく生成されます 。

OS/VS COBOL は、同等のエラー・メッセージを出しませんでした。

UNSTRING ステートメント : 添え字の評価の変更
OS/VS COBOL の UNSTRING ステートメントでは、DELIMITED BY、INTO、DELIMITER IN、およ び COUNT IN フィールドについて、関連した添え字付け、指標付け、または長さ計算の評価は 、データが受け取り項目に転送される直前に行われます。
これらのフィールドの場合、Enterprise COBOL UNSTRING ステートメントで、関連した添え字付け、指標付け、または長さ計算の評価は (区切り文字送り出しフィールドの検査の直前 に) 1 回だけ行われます。以下に例を示します。
01  ABC     PIC  X(30).
01  IND.
    02 IND-1 PIC 9.
01  TAB.
    02 TAB-1 PIC X OCCURS 10 TIMES.
01  ZZ      PIC  X(30).
 . . .
    UNSTRING ABC DELIMITED BY TAB-1 (IND-1) INTO IND ZZ.

OS/VS COBOL では、添え字 IND-1 は、2 番目の受け取り項目 ZZ が充てんされる前に再評価され ます。

Enterprise COBOL では、添え字 IND-1 は、UNSTRING ステートメントの実行の開始時 に 1 回だけ評価されます。

LANGLVL(1) を用いる OS/VS COBOL では、UNSTRING の DELIMITED BY ALL 句が指定され ると、任意の区切り文字の 2 つ以上の連続するオカレンスが、1 つのオカレンスであ るかのように扱われます。最初のオカレンスは、収容可能な限り多く、現行の区切り文字受信フィールド (指定されている場合) に移動されます。それ以降の各オカレンスは、そのオカレンス全体が収容される場合にのみ移動されます。OS/VS COBOL におけるこの句の動作の詳細については、「IBM VS COBOL for OS/VS」を参照してください。

Enterprise COBOL では、任意の区切り文字の 1 つ以上の連続するオカレンス は、1 つのオカレンスであるかのように扱われ、この 1 つのオカレンスが 区切り文字受信フィールド (指定されている場合) に移動されます。

たとえば、ID-SEND に 123**45678**90AB が入っている場合、
UNSTRING ID-SEND DELIMITED BY ALL "*"
    INTO ID-R1 DELIMITER IN ID-D1 COUNT IN ID-C1
         ID-R2 DELIMITER IN ID-D2 COUNT IN ID-C2
         ID-R3 DELIMITER IN ID-D3 COUNT IN ID-C3
LANGLVL(1) を用いる OS/VS COBOL では、以下の結果になります。
ID-R1  123       1D-D1  **        ID-C1  3
ID-R2  45678     1D-D2  **        ID-C2  5
ID-R3  90AB      1D-D3            ID-C3  4
Enterprise COBOL では、以下の結果になります。
ID-R1  123       1D-D1  *         ID-C1  3
ID-R2  45678     1D-D2  *         ID-C2  5
ID-R3  90AB      1D-D3            ID-C3  4
UPSI スイッチ
OS/VS COBOL では、UPSI スイッチおよび UPSI に関連した簡略名への参照を使用できまし た。Enterprise COBOL では、条件名だけを使用できます。

たとえば、SPECIAL-NAMES 段落で条件名が定義されている場合、以下のものは同等です。

OS/VS COBOL
Enterprise COBOL

SPECIAL-NAMES.                SPECIAL-NAMES.
    UPSI-0 IS MNUPO               UPSI-0 IS MNUPO
                                   ON STATUS IS UPSI-0-ON
                                   OFF STATUS IS UPSI-0-OFF
        . . .                       . .  .
PROCEDURE DIVISION            PROCEDURE DIVISION
        . . .                       . .  .
    IF UPSI-0 = 1 ...              IF UPSI-0-ON ...
    IF MNUPO = 0 ...               IF UPSI-0-OFF ...
VALUE 文節の条件名
OS/VS COBOL のリリース 2.4 より前のリリースでは、VALUE 文節の条件名について 、英数字フィールドを数値で初期設定することができました。以下に例を示します。
01 FIELD-A.
    02   LAST-YEAR  PIC XX VALUE 87.
    02   THIS-YEAR  PIC XX VALUE 88.
    02   NEXT-YEAR  PIC XX VALUE 89.
Enterprise COBOL は、この言語拡張を受け入れません。したがって、上記の例を訂正するには、以下の例のように、VALUE 文節に英数字値をコーデ ィングしなければなりません。
01 FIELD-A.
    02   LAST-YEAR  PIC XX VALUE "87".
    02   THIS-YEAR  PIC XX VALUE "88".
    02   NEXT-YEAR  PIC XX VALUE "89".
WHEN-COMPILED 特殊レジスター
Enterprise COBOL および OS/VS COBOL は、WHEN-COMPILED 特殊レジスターの使用をサポートしま す。この特殊レジスターの使用規則は、両方のコンパイラーで同じです。ただし、データの形式が異なります。
OS/VS COBOL では、形式は次のとおりです。
hh.mm.ssMMM DD, YYYY  (hour.minute.secondMONTH DAY, YEAR)
Enterprise COBOL では、形式は次のとおりです。
MM/DD/YYhh.mm.ss  (MONTH/DAY/YEARhour.minute.second)
WRITE AFTER POSITIONING ステートメント
OS/VS COBOL では、 AFTER POSITIONING 句と一緒にサポートされていましたが、Enterprise COBOL ではサポートされていません。

Enterprise COBOL では、WRITE...AFTER ADVANCING ステートメントを使用すれ ば、WRITE...AFTER POSITIONING と類似した動作を得ることができます。以下の 2 つの例は、OS/VS COBOL の POSITIONING 句と、Enterprise COBOL の同等の句を示していま す。

リテラルを指定して WRITE . . . AFTER ADVANCING を使用する場合:
   OS/VS COBOL                                Enterprise COBOL 

AFTER POSITIONING 0                      AFTER ADVANCING PAGE
AFTER POSITIONING 1                      AFTER ADVANCING 1 LINE
AFTER POSITIONING 2                      AFTER ADVANCING 2 LINES
AFTER POSITIONING 3                      AFTER ADVANCING 3 LINES
リテラル以外を指定して WRITE...AFTER ADVANCING を使用する場合:
WRITE OUTPUT-REC AFTER POSITIONING SKIP-CC.


   OS/VS COBOL                                Enterprise COBOL 
                            SKIP-CC


AFTER POSITIONING SKIP-CC      1         AFTER ADVANCING PAGE
AFTER POSITIONING SKIP-CC     ' '        AFTER ADVANCING 1 LINE
AFTER POSITIONING SKIP-CC      0         AFTER ADVANCING 2 LINES
AFTER POSITIONING SKIP-CC      -         AFTER ADVANCING 3 LINES
注: Enterprise COBOL では、チャネル・スキップは、SPECIAL-NAMES への参照によってのみサポ ートされます。
CCCA を使用すると、WRITE . . . AFTER POSITIONING ステートメントを自動的に変換できます。たとえば、次のステートメントが指定されているとします。
WRITE OUTPUT-REC AFTER POSITIONING n.

n がリテラルである場合は、CCCA は上記の例 を WRITE...AFTER ADVANCING n LINES に変更します。n が ID である場合は、SPECIAL-NAMES が生成され、セクションがプログラムの終わりに 追加されます。


ご利用条件 | フィードバック

このインフォメーション・センターでは Eclipse テクノロジーが採用されています。(http://www.eclipse.org)