Rational Developer for System z
COBOL for Windows バージョン 7.5 言語解説書


PERFORM ステートメント

PERFORM ステートメントは、1 つまたは複数のプロシージャーに明示的に制御を移し、指定されたプロシージャーの実行終了後に、 PERFORM ステートメントの次にある実行可能ステートメントに制御を戻します。

PERFORM ステートメントは、次のいずれかになります。

行外 PERFORM ステートメント
プロシージャー名-1 が指定されたとき。
行内 PERFORM ステートメント
プロシージャー名-1 が省略されたとき。

行内 PERFORM ステートメントは、END-PERFORM 句によって区切る必要があります。

行内フォーマットと行外フォーマットを合わせて使用することはできません。 例えば、プロシージャー名-1 を指定した場合、命令ステートメントと END-PERFORM 句は指定できません。

PERFORM ステートメントのフォーマットには、次の 4 種類があります。

基本 PERFORM ステートメント

基本 PERFORM ステートメント内で参照されるプロシージャー (単数または複数) が 1 回実行されると、 制御は PERFORM ステートメントの後続の次の実行可能ステートメントに渡されます。

注: PERFORM ステートメントではそれ自体を実行することはできません。 再帰的 PERFORM ステートメントでは、予測できない結果が生じる可能性があります。

フォーマット 1
構文図を読む構文図をスキップする>>-PERFORM------------------------------------------------------>
 
>--+-プロシージャー名-1--+---------------------------------+-+-><
   |                     '-+-THROUGH-+--プロシージャー名-2-' |  
   |                       '-THRU----'                       |  
   '-+----------------------+--END-PERFORM-------------------'  
     '-命令ステートメント-1-'                                   
 
プロシージャー名-1プロシージャー名-2
手続き部の中のセクションまたは段落を指名しなければなりません。

プロシージャー名-1 およびプロシージャー名-2 を両方指定する場合、いずれか一方が宣言型プロシージャーの中のプロシージャー名であれば、 両方が、同じ宣言型プロシージャーの中のプロシージャー名でなければなりません。

プロシージャー名-1 を指定した場合、命令ステートメント-1 と END-PERFORM 句を指定することはできません。

プロシージャー名-1 を省略した場合、命令ステートメント-1 と END-PERFORM 句を指定する必要があります。

命令ステートメント-1
行内 PERFORM ステートメントで実行されるステートメント

行内 PERFORM ステートメントは、行外 PERFORM ステートメントと同じ一般規則に従って機能しますが、 行内 PERFORM ステートメントでは行内 PERFORM に含まれるステートメントが、プロシージャー名-1 (プロシージャー名-2 が指定されている場合は、プロシージャー名-1 からプロシージャー名-2) の範囲内にあるステートメントの代わりに実行されるところだけが異なります。 行内 または行外 という語が特に明示されていない限り、行外 PERFORM ステートメントに適用される規則はすべて、行内 PERFORM ステートメントにも適用されます。

行外 PERFORM ステートメントが実行される度に、プロシージャー名-1 という名前を持つプロシージャーの最初のステートメントに制御が移されます。 そして必ず PERFORM ステートメントの次にあるステートメントに制御は戻されます。制御がどの地点で戻されるかは、次のようにして決定されます。

プロシージャー名-1プロシージャー名-2 との間で保持しなければならない唯一の関係は、連続する一連の処理が、プロシージャー名-1 によって指名されるプロシージャーから始まり、プロシージャー名-2 によって指名されるプロシージャーの実行によって終了するということだけです。

PERFORM ステートメントを、実行されるプロシージャーの中で指定することができます。 戻る地点への論理パスが 2 つ以上ある場合、 EXIT ステートメントだけからなる段落の名前をプロシージャー名-2 として指定することができます。その場合、戻り点へのすべてのパスは、この段落に導かれます。

実行されるプロシージャー中に別の PERFORM ステートメントが含まれているとき、組み込まれた PERFORM ステートメントに関連する一連のプロシージャーは、 最初の PERFORM ステートメントにより実行されるプロシージャーの中に完全に含まれているか、または完全に外側になければなりません。 すなわち、実行開始点が、別のアクティブな PERFORM ステートメントにより実行されるプロシージャーの範囲内にある PERFORM ステートメントは、 別のアクティブな PERFORM ステートメントの出口点を通りすぎて制御を渡すことはできません。 ただし、2 つ以上のアクティブな PERFORM ステートメントには、共通出口を持たせることができます。

以下の図は、PERFORM ステートメントの有効な実行シーケンスを示したものです。

説明の開始。この図は、有効な PERFORM ステートメントの実行シーケンスを示しています。説明の終わり。

詳細へのリンク。

PERFORM ステートメント以外の手段によって一連のプロシージャーに制御が渡される場合、それらのプロシージャーを参照する PERFORM ステートメントが何もないかのように、 制御は出口点を通りすぎて次の実行可能ステートメントに渡されます。

 

END-PERFORM

行内 PERFORM ステートメントの範囲を区切ります。 この範囲内の最後のステートメントが実行されると、行内 PERFORM の実行が完了します。

TIMES 句を指定した PERFORM

TIMES 句付きの PERFORM ステートメントの中で参照された ID-1 または整数-1 の中の値によって指定した回数だけ実行されます。 ついで、PERFORM ステートメントの後にある次の実行可能ステートメントに渡されます。

フォーマット 2
構文図を読む構文図をスキップする>>-PERFORM------------------------------------------------------>
 
>--+-プロシージャー名-1--+---------------------------------+--+-ID-1---+--TIMES-+-><
   |                     '-+-THROUGH-+--プロシージャー名-2-'  '-整数-1-'        |  
   |                       '-THRU----'                                          |  
   '-+-ID-1---+--TIMES--+----------------------+--END-PERFORM-------------------'  
     '-整数-1-'         '-命令ステートメント-1-'                                   
 

プロシージャー名-1 を指定した場合、命令ステートメント-1 と END-PERFORM 句を指定することはできません。

ID-1
ここには整数項目を指定しなければなりません。 ID-1 をウィンドウ化日付フィールドにすることはできません。

PERFORM ステートメントが開始されたときに、ID-1 が 0 または負数である場合、制御は PERFORM ステートメントの次のステートメントに移されます。

PERFORM ステートメントが開始された後で ID-1 が変更されても、そのプロシージャーを実行する回数は変更されません。

整数-1
正の符号付き整数にできます。

 

UNTIL 句を指定した PERFORM

UNTIL 句を伴うフォーマットでは、参照される手順は、UNTIL 句によって指定された条件が真になるまで 実行されます。 条件が真になると、制御は、 PERFORM ステートメントの後にある次の実行可能ステートメントに渡されます。

フォーマット 3
構文図を読む構文図をスキップする>>-PERFORM------------------------------------------------------>
 
>--+-プロシージャー名-1--+---------------------------------+--| 句 1 |-+-><
   |                     '-+-THROUGH-+--プロシージャー名-2-'           |  
   |                       '-THRU----'                                 |  
   '-| 句 1 |--+----------------------+--  END-PERFORM-----------------'  
               '-命令ステートメント-1-'                                   
 
句 1:
 
|--+----------------------------+--UNTIL--条件-1----------------|
   '-+------+--TEST--+-BEFORE-+-'                 
     '-WITH-'        '-AFTER--'                   
 

プロシージャー名-1 を指定した場合、命令ステートメント-1 と END-PERFORM 句を指定することはできません。

条件-1
条件式に説明してある条件ならばどの条件でも使用できます。PERFORM ステートメントが開始される時点で条件が真であれば、 指定されたプロシージャーは実行されません。

条件-1 に指定されたオペランドに関連付けられた添え字がある場合には、 条件がテストされるたびに評価されます。

TEST BEFORE 句が指定されているかまたは想定されている場合、条件がテストされない限り、ステートメントは何も実行されません (DO WHILE に対応したもの)。

TEST AFTER 句が指定されている場合、実行されるステートメントは、 条件がテストされる前に少なくとも 1 回は実行されます (DO UNTIL に対応したもの)。

どちらの場合も、 条件が真ならば、PERFORM ステートメントの後にある次の実行可能ステートメントに制御は移されます。 TEST BEFORE 句も TEST AFTER 句も指定されていない場合、TEST BEFORE 句が想定されます。

VARYING 句を指定した PERFORM

VARYING 句は、ある一定の規則に従って、1 つまたは複数の ID や指標名の値を増やすか、または減らします。 (VARYING 句の規則を参照。)

フォーマット 4 の VARYING 句指定の PERFORM ステートメントは、7 次元のテーブル全体をシリアル検索することができます。

フォーマット 4
構文図を読む構文図をスキップする>>-PERFORM------------------------------------------------------>
 
>--+-プロシージャー名-1--+---------------------------------+--| 句 1 |--| 句 2 |-+-><
   |                     '-+-THROUGH-+--プロシージャー名-2-'                     |  
   |                       '-THRU----'                                           |  
   '-| 句 1 |--命令ステートメント-1--END-PERFORM---------------------------------'  
 
句 1:
 
|--+----------------------------+--VARYING--+-ID-2-----+-------->
   '-+------+--TEST--+-BEFORE-+-'           '-指標名-1-'  
     '-WITH-'        '-AFTER--'                           
 
>--FROM--+-ID-3-------+--BY--+-ID-4-------+--UNTIL--条件-1------|
         +-指標名-2---+      '-リテラル-2-'                 
         '-リテラル-1-'                                     
 
句 2:
 
   .-----------------------------------------------------.  
   V                                                     |  
|----AFTER--+-ID-5-----+--FROM--+-ID-6-------+--| 句 3 |-+------|
            '-指標名-3-'        +-指標名-4---+              
                                '-リテラル-3-'              
 
句 3:
 
|--BY--+-ID-7-------+--UNTIL--条件-2----------------------------|
       '-リテラル-4-'                 
 

プロシージャー名-1 を指定した場合、命令ステートメント-1 と END-PERFORM 句を指定することはできません。 プロシージャー名-1 を省略した場合、AFTER 句を指定することはできません。

ID-2 から ID-7
これらは数字基本項目を指名する必要があります。これらの ID は、ウィンドウ化日付フィールドにはできません。
リテラル-1 からリテラル-4
これらは数字リテラルを表さなくてはなりません。
条件-1条件-2
条件式に説明してある条件ならばどの条件でも使用できます。PERFORM ステートメントが開始される時点で条件が真であれば、 指定されたプロシージャーは実行されません。

UNTIL 句で指定した条件が満たされると、 制御は PERFORM ステートメントの後にある次の実行可能ステートメントに渡されます。

条件-1 または条件-2 に指定されるオペランドのいずれかが、添え字付き、参照変更、または関数 ID である場合、その添え字、参照修飾子、または関数は、条件がテストされるたびに評価されます。

数字データ項目または数字リテラルを指定できる場所であればどこでも、浮動小数点データ項目および浮動小数点リテラルも使用できます。

TEST BEFORE 句が指定されていると、指定されているすべての条件がテストされない限り、最初の実行は行われず、しかも指定した条件がすべて 満たされないときに限り、 実行されるステートメントが実行されます。TEST AFTER 句が指定されていると、実行されるステートメントは、 条件がテストされる前に少なくとも 1 回は実行されます。

TEST BEFORE 句も TEST AFTER 句も指定されていない場合、TEST BEFORE 句が想定されます。

ID の変更

オペランドがどのようにして増加したり減少したりするかは、 指定する変数の個数によって異なります。以下の説明では、ID-n についての説明はすべて指標名-n にも当てはまります (ただし、ID-n が BY 句のオブジェクトであるときは別です)。

ID-2 または ID-5 に添え字が付いているときは、 その添え字は ID によって参照されたデータ項目の内容が設定されるか、または増えていくたびに評価されます。ID-3ID-4ID-6、または ID-7 に添え字が付いているときは、 その添え字は ID によって参照されたデータ項目の内容が設定や増加の操作で使用されるたびに評価されます。

以下の図に、ID を TEST BEFORE 句を使用して変更するときの PERFORM ステートメントの論理を示します。

説明の開始。この図は、ID を TEST BEFORE 句を使用して変更するときの PERFORM ステートメントを示しています。説明の終わり。

詳細へのリンク。

以下の図に、ID を TEST AFTER 句を使用して変更するときの PERFORM ステートメントの論理を示します。

説明の開始。この図は、ID を TEST AFTER 句を使用して変更するときの PERFORM ステートメントを示しています。説明の終わり。

詳細へのリンク。

2 つの ID の変更

PERFORM PROCEDURE-NAME-1 THROUGH PROCEDURE-NAME-2
      VARYING IDENTIFIER-2 FROM IDENTIFIER-3
            BY IDENTIFIER-4 UNTIL CONDITION-1
         AFTER IDENTIFIER-5 FROM IDENTIFIER-6
            BY IDENTIFIER-7 UNTIL CONDITION-2
  1. ID-2 および ID-5 が、その初期値である ID-3 および ID-6 にそれぞれ設定されます。
  2. 条件-1 が、次のようにして評価されます。
    1. 偽であれば、ステップ 3 から 7 が実行されます。
    2. 真であれば、制御は、直接 PERFORM ステートメントの後にあるステートメントに渡されます。
  3. 条件-2 が、次のようにして評価されます。
    1. 偽であれば、ステップ 4 から 6 が実行されます。
    2. 真であれば、ID-2ID-4 だけ増やされ、ID-5ID-6 の現行値に設定され、ステップ 2 が繰り返されます。
  4. プロシージャー名-1 およびプロシージャー名-2 が 指定されていれば、1 回だけ実行されます。
  5. ID-5ID-7 だけ増やされます。
  6. 条件-2 が真になるまで、ステップの 3 から 5 を繰り返します。
  7. 条件-1 が真になるまで、ステップの 2 から 6 を繰り返します。

PERFORM ステートメントの実行終了時には、次のようになっています。

以下の図に、2 つの ID を TEST BEFORE 句を使用して変更するときの PERFORM ステートメントの論理を示します。

説明の開始。この図は、2 つの ID を TEST BEFORE 句を使用して変更するときの PERFORM ステートメントを示しています。2 つの ID の変更については上記のテキストで説明しています (TEST BEFORE はデフォルトです)。説明の終わり。

以下の図に、2 つの ID を TEST AFTER 句を使用して変更するときの PERFORM ステートメントの論理を示します。

説明の開始。この図は、2 つの ID を TEST AFTER 句を使用して変更するときの PERFORM ステートメントを示しています。説明の終わり。

詳細へのリンク。

3 つの ID の変更

PERFORM PROCEDURE-NAME-1 THROUGH PROCEDURE-NAME-2
      VARYING IDENTIFIER-2 FROM IDENTIFIER-3
            BY IDENTIFIER-4 UNTIL CONDITION-1
          AFTER IDENTIFIER-5 FROM IDENTIFIER-6
            BY IDENTIFIER-7 UNTIL CONDITION-2
          AFTER IDENTIFIER-8 FROM IDENTIFIER-9
            BY IDENTIFIER-10 UNTIL CONDITION-3

この場合の動作も、次の点を除けば 2 つの ID の場合と同じです。すなわち、ID-8 は、ID-5ID-7 だけ増やされるたびに完全なサイクルで処理され、一方、ID-2 が変更されるたびに完全なサイクルで処理されます。

PERFORM ステートメントの実行終了時には、次のようになっています。

4 つ以上の ID の変更

AFTER 句を 4 つまで追加して、 上記の例と同じように PERFORM ステートメントによる処理ができます。

VARYING 句の規則

指定する変数の個数には関係なく、次の規則が適用されます。


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

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