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ステートメントで自身のプロシージャを呼び出すことはできません。
以下は、ステートメントの各設定項目についての説明です。
-
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を指定することはできません。
以下は、ステートメントの各設定項目についての説明です。
-
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を指定することができません。
以下は、ステートメントの各設定項目についての説明です。
-
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句を指定することができません。
以下は、ステートメントの各設定項目についての説明です。
-
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 9. TEST BEFORE句を使用したPERFORMステートメントのフローチャート -
以下は、TEST AFTER句を使用したPERFORMステートメントのフローチャートです。
Figure 10. TEST AFTER句を使用したPERFORMステートメントのフローチャート
-
-
2つの識別子が変更された場合
-
以下のようなPERFORMステートメントがあると想定した場合、OFCOBOLでは、以下の順でPERFORMステートメントをチェックします。

-
IDENTIFIER-2はIDENTIFIER-3に、IDENTIFIER-5はIDENTIFIER-6に、それぞれの値が初期化されます。
-
CONDITION-1の結果に応じて、以下のように処理されます。
-
CONDITION-1がTRUEの場合、PERFORMステートメントを終了して、PERFORMステートメントの次のステートメントを実行します。
-
CONDITION-1がFALSEの場合は、以下の3から7までのステップを実行します。
-
-
CONDITION-2の結果に応じて、以下のように処理されます。
-
CONDITION-2がTRUEの場合、IDENTIFIER-2にIDENTIFIER-4を加算し、IDENTIFIER-5がIDENTIFIER-6の現行値に設定され、ステップ2が繰り返されます。
-
CONDITION-2がFALSEの場合は、以下の4から6までのステップを実行します。
-
-
PROCEDURE-NAME-1からPROCEDURE-NAME-2までのプロシージャを実行します。
-
IDENTIFIER-5にIDENTIFIER-7を加算します。
-
CONDITION-2がTRUEになるまで、3から5までのステップを繰り返します。
-
CONDITION-1がTRUEになるまで、2から6までのステップを繰り返します。
PERFORMステートメントが終了すると、IDENTIFIER-5には、終了時点のIDENTIFIER-6の現行値が入っています。IDENTIFIER-2は、最後の増分または減分の値を持つことになります。
-
-
以下は、TEST BEFORE句を使用したPERFORMステートメントのフローチャートです。
Figure 11. TEST BEFORE句を使用したPERFORMステートメントのフローチャート -
以下は、TEST AFTER句を使用したPERFORMステートメントのフローチャートです。
Figure 12. TEST AFTER句を使用したPERFORMステートメントのフローチャート
-
-
3つの識別子を変更する場合
-
3つの識別子を使用するPERFORMステートメントでの処理は、2つの識別子を使用するPERFORMステートメントでの処理と同様に動作します。ただし、IDENTIFIER-5がIDENTIFIER-7の分だけ増えるたびに、IDENTIFIER-8にIDENTIFIER-10を加算した後、CONDITION-3をチェックする手順が追加されます。

-
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ステートメントのプロシージャを実行する回数を変更することになります。