手続き部 (PROCEDURE DIVISION)

手続き部 (PROCEDURE DIVISION)

一般的な考慮事項

一般的な考慮事項

2 進データ項目

OPM COBOL/400 では、2 進データ項目に、ピクチャー文節で記述された値を超える値が指定された場合、結果は予測不能になります。 一般的には、この項目が使用される場合、ピクチャー文節で記述された実際の桁数に切り捨てられる場合と、 切り捨てられない場合とがあります。 通常それは、値のコピーにパックされた中間結果が使用されたかどうかによって異なります。

ILE COBOL でも結果は予測不能ですが、OPM COBOL/400 から生成される結果とは異なるものとなります。

8 バイト 2 進データの位置合わせ

OPM COBOL/400 では、*SYNC オプションが CRTCBLPGM コマンドの GENOPT パラメーターに指定されている場合、8 バイト 2 進数項目は 4 バイト境界に位置合わせされます。

ILE COBOL では、*SYNC オプションが CRTCBLMOD または CRTBNDCBL コマンドの OPTION パラメーターに指定されている場合、8 バイト 2 進数項目は 8 バイト境界に位置合わせされます。

重複した段落名

重複した段落名が COBOL プログラム中に存在すると、OPM COBOL/400 コンパイラーは重大度 20 のメッセージを生成します。

同様の状況下で、ILE COBOL コンパイラーは重大度 30 のエラー・メッセージを出します。

添え字の数

項目に指定された添え字の数が適切でない場合 (過多、過少、添え字が必要な項目に指定されていない、添え字が不必要な項目に指定されている、 という場合)、ILE COBOL では重大度 30 のメッセージが生成されます。

同じ状況下で、OPM COBOL/400 は重大度 20 のメッセージを生成します。

セグメント化

セグメント化は ILE COBOL ではサポートされていません。 したがって、セグメント数の構文検査は実行されません。

共通句

共通句

(NOT) ON EXCEPTION 句

DISPLAY ステートメントには、(NOT) ON EXCEPTION 句が追加されました。 それらの句が追加されたことによってコンパイル時エラーが出ないようにするために、 有効範囲を区切る END-DISPLAY を追加することが必要になる可能性があります。

以下に例を示します。

         ACCEPT B AT LINE 3 COLUMN 1
           ON EXCEPTION
               DISPLAY "IN ON EXCEPTION"
           NOT ON EXCEPTION
               MOVE A TO B
         END-ACCEPT.

ACCEPT ステートメントに対して ON EXCEPTION 句と NOT ON EXCEPTION 句の両方が指定されました。 しかし、下に示すように、END-DISPLAY がない場合、NOT ON EXCEPTION は DISPLAY ステートメントの一部であると見なされます。

          ACCEPT B AT LINE 3 COLUMN 1
            ON EXCEPTION
               DISPLAY "IN ON EXCEPTION"
               END-DISPLAY
            NOT ON EXCEPTION
               MOVE A TO B
         END-ACCEPT.
INVALID KEY 句

ILE COBOL では、相対ファイルの順次アクセスに INVALID KEY 句を使用できません。 これらの状況下では無効キーの意味が不確定だからです。 この状況下では、ILE COBOL コンパイラーは重大度 30 のエラー・メッセージを出します。

OPM COBOL/400 コンパイラーは、この場合にメッセージを出しません。

ON SIZE ERROR 句

ILE COBOL で算術演算および条件式を使用する際、ON SIZE ERROR が指定されていない場合にサイズ・エラーが生じると、結果は予測できません。 その結果は、OPM COBOL/400 の場合とは違う可能性があります。

ILE COBOL で算術演算および条件式を使用する際、ON SIZE ERROR が指定されていない場合にゼロ除算が生じると、結果は予測できません。 その結果は、OPM COBOL/400 の場合とは違う可能性があります。

DECLARATIVE プロシージャー

ILE プロシージャーとして組み込まれた宣言

ILE COBOL では、DECLARATIVE プロシージャーはそれぞれ ILE プロシージャーです。 したがって、それぞれの DECLARATIVE プロシージャーは、他の宣言から独立したもので、ILE COBOL プログラムの非宣言部分とは独立して、独自の呼び出しで実行されます。 その結果、メッセージの送受信、RCLRSC CL コマンド、および指定変更などの、 呼び出し依存システム機能の使用方法は、ILE COBOL と OPM COBOL/400 では異なります。

別の宣言から宣言を呼び出す

ILE COBOL では、前の宣言が何らかの理由によって呼び出されていない場合、 その宣言は入出力エラーによって別の宣言から呼び出されることがあります。

OPM COBOL/400 では、宣言が入出力エラーによって別の宣言から呼び出されることはありません。

クラス条件式

ILE COBOL では、クラス条件式の ID として、1 つまたは複数の符号付き数値基本項目を含むグループ項目は使用できません。

短縮された条件式

ILE COBOL では、短縮された結合関係条件に括弧は使用できません。 OPM COBOL/400 では、この規則は要求されていません。

形象定数と形象定数の比較

OPM COBOL/400 では、形象定数を別の形象定数と比較すると、 重大度 20 のエラー・メッセージが出され、そのステートメントは受け入れられます。

ILE COBOL で形象定数を別の形象定数と比較すると、 重大度 30 のエラー・メッセージが出され、そのステートメントは拒否されます。

ゾーン項目と非数値項目との比較

ゾーン項目と非数値項目とを比較すると、OPM COBOL/400 では重大度 20 のメッセージが出されます。 ILE COBOL ではそのようなメッセージは出ません。

関係式での NOT

"A NOT NOT = B" という式は、OPM COBOL/400 では受け入れられますが、 重大度 20 のメッセージが生成されます。

同じ状況下で、ILE COBOL は重大度 30 のメッセージを生成します。

NOT LESS THAN OR EQUAL TO

ILE COBOL では、OPM COBOL/400 で許容されないいくつかの形式の条件式が使用できます。 特に、その中には NOT LESS THAN OR EQUAL および NOT GREATER THAN OR EQUAL が含まれます。

特殊レジスター

DEBUG-ITEM 特殊レジスター

ILE COBOL では、DEBUG-ITEM 特殊レジスターのサポートはなくなりました。 見つかった場合、それは構文検査されるだけです。

LINAGE-COUNTER 特殊レジスター

OPM COBOL/400 で LINAGE 文節に整数を指定した場合、LINAGE-COUNTER は 2 バイト 5 桁の 2 進数項目として定義されます。

ILE COBOL で LINAGE 文節に整数を指定した場合、LINAGE-COUNTER は 4 バイト 9 桁の 2 進数項目として定義されます。

WHEN-COMPILED 特殊レジスター

OPM COBOL/400 では、WHEN-COMPILED 特殊レジスターを使用できるのは MOVE ステートメントだけです。

ILE COBOL では、WHEN-COMPILED 特殊レジスターは任意のステートメントに使用することができます。

拡張 ACCEPT および DISPLAY ステートメント

コンパイル時の考慮事項

OPM COBOL/400 では、拡張 ACCEPT および DISPLAY ステートメントを使用可能にするために、CRTCBLPGM コマンドの GENOPT パラメーターに EXTACCDSP の値を指定する必要があります。 ILE COBOL では、CRTCBLMOD/CRTBNDCBL コマンドに EXTACCDSP オプションはありません。 ILE COBOL では、拡張 ACCEPT および DISPLAY ステートメントは、常に使用可能です。 ILE COBOL では PROCESS ステートメントの EXTACCDSP オプション はなくなったので、PROCESS ステートメントにこのオプションを指定している OPM COBOL/400 プログラムを ILE COBOL コンパイラーでコンパイルした場合、 そのプログラムは異なる動作をすることがあります。 ILE COBOL コンパイラーは、SPECIAL NAMES 段落中の CONSOLE IS CRT を検索することによって、 または形式 7 の ACCEPT ステートメントか形式 3 の DISPLAY ステートメントにある句を検索することによって、ACCEPT または DISPLAY ステートメントが拡張されているかどうかを判別します。

ILE COBOL では、以下の語は常に COBOL に予約されています。

OPM COBOL/400 の場合、DISPLAY ステートメントでは固定テーブルのみサポートされます。 ILE COBOL では、ACCEPT および DISPLAY ステートメントはともに、どのテーブルもサポートします。

ILE COBOL では、拡張 ACCEPT および DISPLAY ステートメントで参照変更データがサポートされます。 これは OPM COBOL/400 ではサポートされていません。

OPM COBOL/400 では、基本 DBCS 文字セットに加えて拡張文字セットを使用できるようにするには、*NOUNDSPCHR オプションを使用する必要があります。 ILE COBOL では、*NOUNDSPCHR または *UNDSPCHR のどちらを使用しても、DBCS 文字を適切に管理できます。

OPM COBOL/400 コンパイラーは、画面の容量よりも長いデータ項目を検出すると、重大度 30 のエラー・メッセージを出します。 ILE COBOL コンパイラーは、このようなエラー・メッセージは出しません。

ILE COBOL は、COLUMN 句の ID または整数が 8 桁を超える場合、重大度 30 のエラー・メッセージを出します。 OPM COBOL/400 は、エラー・メッセージを出しません。

拡張 DISPLAY ステートメントの中の、構文が検査されるだけの句については、ILE COBOL コンパイラーは PROMPT、BACKGROUND-COLOR、および FOREGROUND-COLOR 句の完全な構文検査を実行します。 これらの句のどれかのコーディングが誤っている場合、ILE COBOL コンパイラーは重大度 30 のエラー・メッセージを出します。 OPM COBOL/400 コンパイラーでは、PROMPT、BACKGROUND-COLOR、および FOREGROUND-COLOR 句に対する完全な構文検査は行われず、コンパイル時エラー・メッセージは出されません。

実行時の考慮事項

OPM COBOL/400 では、拡張 ACCEPT の操作中には PRINT キーが使用できなくなります。 ILE COBOL では、PRINT KEY は、常に無条件で使用可能です。

OPM COBOL/400 で、SIZE 句がサポートされるのは DISPLAY ステートメントだけです。 ILE COBOL では、SIZE 句は ACCEPT と DISPLAY の両方のステートメントでサポートされます。 指定されたサイズが PICTURE 文節のデータ長で暗黙のうちに指定されたサイズを超えている場合、OPM COBOL/400 は英数字データの位置調整を行うのに左側にブランクを埋め込みます。 ILE COBOL は常に右側にブランクを埋め込みます。

OPM COBOL/400 では、データ項目が画面内に入りきらない場合、エラー・メッセージ LBE7208 が出されます。 ILE COBOL では、画面に入りきらない英数字データは切り捨てられ、画面に入りきらない数値データは表示されません。 実行時エラーは出されません。

3174 または 3274 遠隔制御装置に接続されたワークステーション上で ACCEPT 操作を完了するために HELP および CLEAR キーが使用された場合、ILE COBOL では実行時エラーが出されます。 OPM COBOL/400 ではこの ACCEPT 操作が正常に終了して、実行時エラーは出されません。

OPM COBOL/400 では、ACCEPT ステートメントで処理されたフィールドのすべてが常に更新されます。 ILE COBOL では、1 つの ACCEPT ステートメントごとに、ユーザーが ENTER キーを押す前に変更したフィールドだけが更新されます。 そのため、2 つのコンパイラーは次の 3 つの状況で異なる処理を行います。

CALL ステートメント

CALL ステートメント

CALL/CANCEL リテラルまたは ID での小文字

OPM COBOL/400 では、CALL/CANCEL リテラルまたは ID に小文字を含めることができます。 ただし、引用符付きのシステム名 (拡張名) でないプログラム・オブジェクト名には小文字を使用できません。 その結果 CALL/CANCEL 操作は正常に終了しません。

ILE COBOL では、CRTCBLMOD および CRTBNDCBL コマンドの OPTION パラメーターの値として *MONOPRC と *NOMONOPRC の 2 つが新たにサポートされています。 デフォルト値である *MONOPRC では、CALL/CANCEL リテラルまたは ID に使用されている小文字がすべて大文字に変換されます。 *NOMONOPRC 値は、CALL/CANCEL リテラルまたは ID に使用されている小文字を大文字に変換しないことを指定します。

USING 句でファイル名を渡す

OPM COBOL/400 および ILE COBOL のどちらにおいても、ファイル名を CALL ステートメントの USING 句に渡すことが可能です。 ただし、OPM COBOL/400 は FIB (ファイル情報ブロック) へのポインターを渡しますが、ILE COBOL は NULL ポインターへのポインターを渡します。

再帰呼び出し

ILE COBOL では、再帰的プログラムを再起呼び出しすることができます。ILE COBOL は、 非再帰的プログラムで再帰を検出すると実行時エラー・メッセージを生成します。

OPM COBOL/400 は、再帰を防止しません。 しかし、OPM COBOL/400 で再帰を実行しようとすると、予測不能の結果になることがあります。

CANCEL ステートメント

ILE COBOL では、CANCEL ステートメントが取り消すのは、同じ活動化グループ内の ILE COBOL プログラムのみです。 ILE COBOL では、活動化グループ (実行単位) レベルで、呼び出されたプログラム・オブジェクトのリストが維持管理されています。 取り消そうとするプログラムがこのリストに存在しない場合、その取り消しは無視されます。

OPM COBOL/400 では、取り消そうとするプログラムがライブラリー・リストに存在しない場合、CANCEL ステートメントでエラー・メッセージが出されます。

COMPUTE ステートメント

場合によっては、ILE COBOL で累乗を計算した結果が、OPM COBOL/400 で累乗を計算した結果と多少異なることがあります。

仮数が負の値で指数が負の小数値である累乗式に COMPUTE ステートメントを実行すると、OPM COBOL/400 は未定義の結果になります。 同じ状況下で、ILE COBOL は CEE2020 例外を生成します。

DELETE ステートメント

OPM COBOL/400 では、DELETE ステートメント上でファイルに対して無効なレコード様式が使用される場合、ファイル状況が 90 に設定されます。

ILE COBOL 用では、DELETE ステートメント上でファイルに対して無効なレコード様式が使用される場合、ファイル状況が 9K に設定されます。

EVALUATE ステートメント

OPM COBOL/400 では、ZERO THRU 英字 id に WHEN 句が指定された場合、そのステートメントは受け入れられ、診断メッセージは出されません。

同様の状況下で、ILE COBOL は重大度 30 のエラー・メッセージを出します。

注:
ILE COBOL では、英字 id THRU 英字 id の場合はこの規則は緩和されています。 英字 ID に含めることができるのは英字だけだからです。

IF ステートメント

OPM COBOL/400 では、IF ステートメントのネストの深さの限度は 30 です。

ILE COBOL では、IF ステートメントのネストの深さに実際的な限度はありません。

OPM COBOL/400 では、END-IF 句と同じ IF ステートメント内で NEXT SENTENCE 句を使用した場合、 制御が END-IF 句に続くステートメントに渡されます。

ILE COBOL では、同じ状況下で、制御は次の分離文字ピリオドに続くステートメント、すなわち、次の文の最初のステートメントに渡されます。

注:
OPM「AS/400 V3 言語 : COBOL/400 解説書」の資料には、予想される動作が、ILE COBOL 用の場合に実際に発生する動作と同じであることが示されています。

INSPECT ステートメント

ILE COBOL では、INSPECT ステートメントでの参照変更がサポートされています。

OPM COBOL/400 にはこのサポートが含まれません。

MOVE ステートメント

MOVE ステートメント

英数字リテラルおよび索引名

英数字リテラルを索引名に移動すると、OPM COBOL/400 は重大度 20 のエラー・メッセージを出します。 同様の状況下で、ILE COBOL は重大度 30 のエラー・メッセージを出します。

英数字値および数字編集リテラル

数字だけを含む英数字値を数字編集リテラルに移動する場合 (たとえば、MOVE "12.34" TO NUMEDIT)、OPM COBOL/400 はリテラルをデフォルトの 0 にします。 同様の状況下で、ILE COBOL は重大度 30 のエラー・メッセージを出します。

ブール値

OPM COBOL/400 では、ブール値を参照変更された英字 ID に移動できます。 ILE COBOL では、これは実行できず、重大度 30 のエラー・メッセージが出されます。

CORRESPONDING 句

ILE COBOL の MOVE、ADD、および SUBTRACT CORRESPONDING ステートメントは、対応する項目を判別するために OPM COBOL/400 とは異なるアルゴリズムを使用します。 OPM COBOL/400 ではメッセージが出されない状況下でも、ILE COBOL では重大度 30 のエラー・メッセージが生成されることがあります。

     01 A.
        05  B.
          10  C PIC X(5).
        05  C PIC X(5).
     01 D.
        05  B.
          10  C PIC X(5).
        05  C PIC X(5).
MOVE CORRESPONDING A TO D.

OPM COBOL/400 はメッセージを出しませんが、ILE COBOL はメッセージ LNC1463 を出します。

ソース・ストリングとターゲット・ストリングが重なっている場合

MOVE ステートメントでソース・ストリングとターゲット・ストリングが重なり合っている場合、結果は予測できません。 移動の仕方は、同様の状況下で OPM COBOL/400 を使用した場合と異なることがあります。

OPEN ステートメント

OPEN ステートメント

動的ファイル作成

動的ファイル作成に関連して、互換性に関する考慮事項が 2 つあります。

FORMATFILE のオープン

ILE COBOL では、FORMATFILE をオープンできるのは OUTPUT の場合のみです。 FORMATFILE に出力レコードを書き込むには、WRITE ステートメントを使用できます。

OPM COBOL/400 では、FORMATFILE は INPUT、I-O、および OUTPUT 用としてオープンできます。

OPTIONAL ファイルに対する OPEN OUTPUT または OPEN I-O

ILE COBOL では、ファイルの編成が INDEXED である場合に、OPTIONAL ファイルに対して OPEN OUTPUT または OPEN I-O を実行して、ファイルが存在しない場合、ファイルは作成されません。

OPM COBOL/400 では、ファイルが作成されます。

PERFORM ステートメント

ILE COBOL では、PERFORM ステートメントの VARYING...AFTER 句で、id-2id-5 の設定前に増分されます。 OPM COBOL/400 では、id-5id-2 の増分前に設定されます。

AFTER 句の指定された形式 4 の PERFORM ステートメントの結果は、ILE COBOL と OPM COBOL/400 とでは異なります。 次の例を考えてみます。

     PERFORM PARAGRAPH-NAME-1
             VARYING X FROM 1 BY 1 UNTIL X > 3
                     AFTER Y FROM X BY 1 UNTIL Y > 3.

OPM COBOL/400 では、PARAGRAPH-NAME-1 は (X,Y) 値が (1,1)、(1,2)、 (1,3)、(2,1)、(2,2)、(2,3)、(3,2)、(3,3) の場合について実行されます。

ILE COBOL では、PARAGRAPH-NAME-1 は (X,Y) 値が (1,1)、(1,2)、(1,3)、 (2,2)、(2,3)、(3,3) の場合について実行されます。

READ ステートメント

READ ステートメント

AT END は相対ファイルのランダム読み取りでは使用できない

ILE COBOL では、相対ファイルのランダム読み取りに AT END 句を使用できません。 このような状況ではランダム読み取りの意味が不確定だからです。 この状況下では、ILE COBOL コンパイラーは重大度 30 のエラー・メッセージを出します。

OPM COBOL/400 コンパイラーは、この場合にメッセージを出しません。

エラー・メッセージ

ILE COBOL では、READ ステートメントを FORMATFILE に対して実行しようとした場合、FORMAT 句に対してエラー・メッセージ LNC0651 ではなく LNC1408 が出されます。

読み取り用装置が DATABASE 以外のものである場合、エラー・メッセージ LNC1408 が出されます。 装置が DATABASE であっても ORGANIZATION が索引編成でない場合、エラー・メッセージ LNC0651 が出されます。

REWRITE ステートメント

OPM COBOL/400 では、REWRITE ステートメント上でファイルに対して無効なレコード様式が使用される場合、ファイル状況が 90 に設定されます。

ILE COBOL では、REWRITE ステートメント上でファイルに対して無効なレコード様式が使用される場合、ファイル状況が 9K に設定されます。

SET ステートメント

条件名を TRUE に設定し、関連した条件変数が編集項目である場合、OPM COBOL/400 は、条件変数に移動される際に条件名の値を編集します。

ILE COBOL は、条件名の値が条件変数に移動される際に編集を行いません。

SORT/MERGE ステートメント

SORT/MERGE ステートメント

GIVING 句と SAME AREA/SAME RECORD AREA 文節

ILE COBOL では、GIVING 句に関連したファイル名は、同じ SAME AREA または SAME RECORD AREA 文節では指定できません。 ILE COBOL コンパイラーは、この状況が検出されると、重大度 30 のエラー・メッセージを出します。

OPM COBOL/400 コンパイラーは、この場合にメッセージを出しません。

STOP RUN ステートメント

ILE 活動化グループで STOP RUN が出されると、暗黙のうちに COMMIT が実行されます。OPM COBOL/400 では、そのようにはなりません。

注:
ジョブ・デフォルト活動化グループ (*DFTACTGRP) で出された STOP RUN では、暗黙の COMMIT は実行されません。

STRING/UNSTRING ステートメント

OPM COBOL/400 では、STRING/UNSTRING 操作での暗黙の関係条件の真値を判別するために、PROGRAM COLLATING SEQUENCE が使用されます。

ILE COBOL では、STRING/UNSTRING 操作での暗黙の関係条件の真値を判別する際、PROGRAM COLLATING SEQUENCE は無視されます。