1. PERFORM

PERFORMステートメントは、プログラムの実行中にプログラムの制御を明示的に1つ以上の別のプロシージャに移すときに使用します。PERFORMステートメントに制御が移された位置でプロシージャが終了されると、プログラムの制御はPERFORMステートメントの次に移されます。

PERFORMステートメントの使用方法には、以下の2つの方法があります。

  • out-of-line PERFORMステートメント

    out-of-line PERFORMステートメントは、PERFORMステートメント内にステートメントを記述するのではなく、記述されているプロシージャを呼び出す方法です。したがって、処理するプロシージャ名を必ず指定しなければなりません。

  • in-line PERFORMステートメント

    in-line PERFORMステートメントは、プロシージャ名を指定せず、PERFORMステートメント内にステートメントを直接使用する方法です。したがって、ステートメントの終了を示すために、END-PERFORM句を必ず指定する必要があります。

PERFORMステートメントには、以下の4タイプがあります。

基本PERFORMステートメント

PERFORMステートメントの最も基本となるタイプであり、PERFORM内で呼び出したプロシージャを1回実行します。PERFORMで呼び出したプロシージャが終了されると、PERFORMステートメントの次のステートメントが順次処理されます。ただし、PERFORMステートメントで自身のプロシージャを呼び出すことはできません。

figure pd perform format1
Figure 1. 基本PERFORMステートメントの形式

以下は、ステートメントの各設定項目についての説明です。

  • procedure-name-1、procedure-name-2

    • procedure-name-1とprocedure-name-2のいずれも手続き部内で使用するプロシージャ名である必要があります。

    • procedure-name1と2の両方が’使用される場合、それのいずれかが宣言型プロシージャ内に定義されたプロシージャであれば、もう1つのプロシージャも宣言型プロシージャ内に定義されていなければなりません。

    • procedure-name-1が使用された場合、imperative-statement-1とEND-PERFORMを指定することができません。

    • procedure-name-1を省略した場合、imperative-statement-1とEND-PERFORMを必ず指定します。

  • imperative-statement-1

    • PERFORMによって実行されるステートメントです。

プログラムの実行中にout-of-line PERFORMステートメントが現れると、プログラムの制御はprocedure-name-1の最初のステートメントに移されます。その後、procedure-name-1の実行が終わると、プログラムの制御はPERFORMステートメントの次のステートメントに移されます。

プロシージャを実行した後、制御が戻される時点は以下のとおりです。

  • procedure-name-1が段落であり、procedure-name-2が指定されていない場合、procedure-name-1の最後のステートメントを実行した後、制御はPERFORMステートメントに戻されます。

  • procedure-name-1がセクションであり、procedure-name-2が指定されていない場合、procedure-name-1セクション内にある最後の段落の最後のステートメントを実行した後、制御はPERFORMステートメントに戻されます。

  • procedure-name-2が指定されており、段落である場合、procedure-name-2の段落の最後のステートメントを実行した後、制御を戻します。

  • procedure-name-2が指定されており、セクションである場合、procedure-name-2のセクション内にある最後の段落の最後のステートメントを実行した後、制御を戻します。

procedure-name-1とprocedure-name-2の両方を指定した場合、PERFORMステートメントは、procedure-name-1から始まり、procedure-name-2まで実行します。したがって、プログラムの実行順は、procedure-name-1が先で、procedure-name-2はその後で実行される必要があります。

PERFORMステートメントは、PERFORMステートメントによって実行されるプロシージャ内に含まれることができます。

TIMES句を使用したPERFORMステートメント

PERFORMステートメントの2番目のタイプは、TIMES句に指定した識別子または整数で指定した回数だけプロシージャを呼び出すか、命令ステートメントを実行するタイプです。

PERFORMステートメントが終了すると、プログラムの制御はPERFORMステートメントの次のステートメントに移されます。procedure-name-1を指定した場合は、imperative-statement-1とEND-PERFORMを指定することはできません。

figure pd perform format2
Figure 2. TIME句を使用したPERFORMステートメントの形式

以下は、ステートメントの各設定項目についての説明です。

  • identifier-1

    • 整数項目を指定する必要があります。

    • identifier-1が正数ではなく、0または負数の場合、PERFORMステートメントは実行されず、PERFORMステートメントの次のステートメントが実行されます。

    • PERFORMステートメントが実行された後は、identifier-1を変更してもプロシージャの実行回数は変更されません。

  • integer-1

    • 正の整数である必要があります。

UNTIL句を使用したPERFORMステートメント

PERFORMステートメントの3番目のタイプは、UNTIL句がTRUEになるまで、プロシージャまたは命令ステートメントを実行するタイプです。

UNTIL句で指定した条件がTRUEの場合、プログラムの制御はPERFORMステートメントの次のステートメントに移されます。procedure-name-1を指定した場合は、imperative-statement-1とEND-PERFORMを指定することができません。

figure pd perform format3
Figure 3. UNTIL句を使用したPERFORMステートメントの形式
figure pd perform format3 phrase1
Figure 4. UNTIL句を使用したPERFORMステートメントの形式 : 句

以下は、ステートメントの各設定項目についての説明です。

  • condition-1

    • OFCOBOLで共通して使用できる条件です。

    • ステートメントの条件が真であれば、PERFORMステートメントは実行されません。

TEST BEFORE句を指定した場合、ステートメントを実行する前に、該当する条件をチェックします。TEST AFTER句を指定した場合は、条件文を実行する前に、少なくとも1回はステートメントを実行します。TEST BEFORE句またはTEST AFTER句を指定していない場合は、TEST BEFORE句が指定されたものとみなされます。条件が真であれば、PERFORMステートメントの次の実行可能なステートメントが実行されます。

VARYING句を使用したPERFORMステートメント

PERFORMステートメントの4番目のタイプです。1つ以上の変数を使用して、該当する変数を増やしたり減らしたりしながら、指定した条件が真になるまでプロシージャまたは命令ステートメントを実行するタイプです。

procedure-name-1を指定した場合、imperative-statement-1とEND-PERFORMを指定することができません。procedure-name-1が省略されると、AFTER句を指定することができません。

figure pd perform format4
Figure 5. VARYINGを使用したPERFORMステートメントの形式
figure pd perform format4 phrase1
Figure 6. VARYINGを使用したPERFORMステートメントの形式 : 句1
figure pd perform format4 phrase2
Figure 7. VARYINGを使用したPERFORMステートメントの形式 : 句2
figure pd perform format4 phrase3
Figure 8. VARYINGを使用したPERFORMステートメントの形式 : 句3

以下は、ステートメントの各設定項目についての説明です。

  • identifier-2からidentifier-7

    • 数字データ項目である必要があります。

    • 浮動小数点データ項目も指定可能です。

  • literal-1からliteral-4

    • 数字リテラルである必要があります。

    • 浮動小数点データ項目も指定可能です。

  • condition-1、condition-2

    • OFCOBOL内で共通して使用できる条件です。

    • ステートメントの条件が真であれば、PERFORMステートメントは実行されません。

識別子の変更

TEST BEFORE句の指定有無に応じて、ステートメントを実行する前に該当する条件をチェックします。TEST AFTER句を指定した場合は、条件文を実行する前に、少なくとも1回はステートメントを実行します。TEST BEFORE句またはTEST AFTER句を指定していない場合は、TEST BEFORE句が指定されていると想定します。

以下は、識別子の変更についての説明です。

  • 1つの識別子が変更された場合

    • identifier-2またはidentifier-5に添え字が付いている場合、データ項目が設定されるか、変更されるたびに値を評価します。

    • identifier-3、identifier-4、identifier-6、identifier-7に添え字が付いている場合にも、各データの値を設定または変更するたびに値を評価します。

    • 以下は、TEST BEFORE句を使用したPERFORMステートメントのフローチャートです。

      figure pd perform varying1
      Figure 9. TEST BEFORE句を使用したPERFORMステートメントのフローチャート
    • 以下は、TEST AFTER句を使用したPERFORMステートメントのフローチャートです。

      figure pd perform varying2
      Figure 10. TEST AFTER句を使用したPERFORMステートメントのフローチャート
  • 2つの識別子が変更された場合

    • 以下のようなPERFORMステートメントがあると想定した場合、OFCOBOLでは、以下の順でPERFORMステートメントをチェックします。

      figure pd perform varying5

      1. IDENTIFIER-2はIDENTIFIER-3に、IDENTIFIER-5はIDENTIFIER-6に、それぞれの値が初期化されます。

      2. CONDITION-1の結果に応じて、以下のように処理されます。

        • CONDITION-1がTRUEの場合、PERFORMステートメントを終了して、PERFORMステートメントの次のステートメントを実行します。

        • CONDITION-1がFALSEの場合は、以下の3から7までのステップを実行します。

      3. CONDITION-2の結果に応じて、以下のように処理されます。

        • CONDITION-2がTRUEの場合、IDENTIFIER-2にIDENTIFIER-4を加算し、IDENTIFIER-5がIDENTIFIER-6の現行値に設定され、ステップ2が繰り返されます。

        • CONDITION-2がFALSEの場合は、以下の4から6までのステップを実行します。

      4. PROCEDURE-NAME-1からPROCEDURE-NAME-2までのプロシージャを実行します。

      5. IDENTIFIER-5にIDENTIFIER-7を加算します。

      6. CONDITION-2がTRUEになるまで、3から5までのステップを繰り返します。

      7. CONDITION-1がTRUEになるまで、2から6までのステップを繰り返します。

        PERFORMステートメントが終了すると、IDENTIFIER-5には、終了時点のIDENTIFIER-6の現行値が入っています。IDENTIFIER-2は、最後の増分または減分の値を持つことになります。

    • 以下は、TEST BEFORE句を使用したPERFORMステートメントのフローチャートです。

      figure pd perform varying3
      Figure 11. TEST BEFORE句を使用したPERFORMステートメントのフローチャート
    • 以下は、TEST AFTER句を使用したPERFORMステートメントのフローチャートです。

      figure pd perform varying4
      Figure 12. TEST AFTER句を使用したPERFORMステートメントのフローチャート
  • 3つの識別子を変更する場合

    • 3つの識別子を使用するPERFORMステートメントでの処理は、2つの識別子を使用するPERFORMステートメントでの処理と同様に動作します。ただし、IDENTIFIER-5がIDENTIFIER-7の分だけ増えるたびに、IDENTIFIER-8にIDENTIFIER-10を加算した後、CONDITION-3をチェックする手順が追加されます。

      figure pd perform varying6

    • PERFORMステートメントが終了すると、IDENTIFIER-5とIDENTIFIER-8は、終了時点のIDENTIFIER-6とIDENTIFIER-9の現行値を持つことになります。IDENTIFIER-2は、最後に増分または減分された値を持ちます。

    • 3つ以上の場合は、前述の例にAFTER句が追加された処理となります。

PERFORMステートメントでのVARYING句は、識別子の数とは関係なく、以下のような規則が適用されます。

  • VARYING句またはAFTER句の中に指標名を指定した場合

    • 指標名に対する初期化の値を増加または減少させるときは、OFCOBOLの指標名の規則に従います。

    • FROM句では、識別子またはリテラルが正の整数である必要があります。

    • BY句の識別子は整数である必要があり、リテラルは0以外の整数でなければなりません。

  • FROM句の中に指標名を指定した場合

    • VARYING句またはAFTER句の識別子は必ず整数で指定します。識別子は内部的にSETステートメントを介して初期化されます。

    • BY句での識別子は正の整数である必要があり、リテラルは0以外の整数でなければなりません。

  • BY句での識別子とリテラルは、必ず0以外の値を指定します。

  • VARYING句、FROM句、BY句の中で識別子または指標名を変更することは、PERFROMステートメントのプロシージャを実行する回数を変更することになります。