VARYING 句は、1 つまたは複数の ID または指標名の値を所定の規則に従って増大または減少させます。 (VARYING 句の規則を参照してください。)
VARYING 句を指定した PERFORM ステートメント (形式 4) では、7 次元テーブル全体を逐次検索できます。
PERFORM ステートメント - 形式 4 >>-PERFORM------------------------------------------------------> >--+-プロシージャー名-1--+---------------------------------+--| 句 3 |-+->< | '-+-THROUGH-+--プロシージャー名-2-' | | '-THRU----' | '-| 句 3 |--命令ステートメント-1--END-PERFORM-----------------------' 句 3: |--+----------------------------+--VARYING--+-ID-2-----+--------> '-+------+--TEST--+-BEFORE-+-' '-指標名-1-' '-WITH-' '-AFTER--' >--FROM--+-ID-3-------+--BY--+-ID-4-------+--UNTIL--条件-1------> +-指標名-2---+ '-リテラル-2-' '-リテラル-1-' >--+--------------+---------------------------------------------| | .----------. | | V | | '---| 句 4 |-+-' 句 4: |--AFTER--+-ID-5-----+--FROM--+-ID-6-------+--BY----------------> '-指標名-3-' +-指標名-4---+ '-リテラル-3-' >--+-ID-7-------+--UNTIL--条件-2--------------------------------| '-リテラル-4-'
関連情報
UNTIL 句内に指定された条件が満たされると、PERFORM ステートメントに続く次の実行可能ステートメントに制御権が渡されます。
条件-1 または条件-2 に指定されている任意のオペランドが、添え字付きであるか、参照変更されているか、または関数 ID である場合、 その添え字、参照修飾子、または関数は、条件がテストされるたびに評価されます。
+----------------------------------IBM 拡張----------------------------------+
浮動小数点データ項目および浮動小数点リテラルは、数字データ項目または数字リテラルが指定できるところではどこでも使用できます。
+------------------------------End of IBM 拡張-------------------------------+
TEST BEFORE が指定されると、指定されたすべての条件が最初の実行前にテストされます。 実行すべきステートメントは、指定されたすべてのテストが失敗した場合にだけ実行されます。 TEST AFTER が指定されると、実行すべきステートメントは、条件がテストされる前に少なくとも 1 回実行されます。 条件-1 に指定されたオペランドに関連する添え字付けは、条件がテストされるたびに評価されます。
TEST BEFORE 句も TEST AFTER 句も指定しない場合には、TEST BEFORE 句が想定されます。
オペランドを増大または減少させる方法は、指定される変数の数によって異なります。 以下の説明では、ID-n という表現を使用する場合、 指標名-n にも等しく当てはまります (ただし、ID-n が BY 句の対象である場合を除きます)。
ID-2 あるいは ID-5 が添え字付けされている場合、添え字は、ID によって参照されるデータ項目の内容が設定または増補されるたびに 評価されます。 ID-3、ID-4、ID-6、または ID-7 が添え字付けされている場合、 添え字は、ID によって参照されるデータ項目の内容が設定または増補操作に使用されるたびに評価されます。
このセクションでは、PERFORM ステートメントを使用して 1 つの ID を変更する方法を記述する例を示します。
PERFORM procedure-name-1 THROUGH procedure-name-2 VARYING identifier-2 FROM identifier-3 BY identifier-4 UNTIL condition-1
PERFORM ステートメントの実行終了時には、 ID-2 は、最後に使用された設定値を増加 / 減少値分超える値をもちます (ただし、PERFORM ステートメントの実行開始時に条件-1 が真であった場合には、 ID-2 に ID-3 の現行値が入ります)。
図 16 は、TEST BEFORE 句を使用して ID を変更する場合の PERFORM ステートメントの論理を示したものです。 図 17 は、TEST AFTER 句を使用して ID を変更する場合の PERFORM ステートメントの論理を示したものです。
図 16. TEST BEFORE を使用して 1 つの ID を変更する場合
図 17. TEST AFTER を使用して 1 つの ID を変更する場合
このセクションでは、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
PERFORM ステートメントの実行終了時には、次のようになります。
図 18 は、TEST BEFORE 句を使用して 2 つの ID を変更する場合の PERFORM ステートメントの論理を示したものです。 図 19 は、TEST AFTER 句を使用して 2 つの ID を変更する場合の PERFORM ステートメントの論理を示したものです。
図 18. TEST BEFORE を使用して 2 つの ID を変更する場合
上の図では、ID-5 と ID-2 が関係をもたないことを想定してします。 一方が他方に依存している場合 (たとえば添え字を介して)、結果は予測できますが、一般的に望ましいものではありません。
図 19. TEST AFTER を使用して 2 つの ID を変更する場合
このセクションでは、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-5 が ID-7 だけ増やされるたびに ID-8 が完全なサイクルを通過し、 次に ID-2 が変更されるたびに ID-5 が完全なサイクルを通過します。
PERFORM ステートメントの実行終了時には、次のようになります。
図 20 は、3 つの ID を変更する場合の PERFORM ステートメントの論理を示したものです。
図 20. 形式 4 の PERFORM ステートメントの論理 - 3 つの ID を変更する場合
上の図では、ID-5 と ID-2 が関係をもたないことを想定してします。 一方が他方に依存している場合 (たとえば添え字を介して)、結果は予測できますが、一般的に望ましいものではありません。
上の図では、さらに、ID-8 と ID-5 が関係をもたないことも想定しています。 一方が他方に依存している場合 (たとえば添え字を介して)、結果は予測できますが、一般的に望ましいものではありません。
VARYING 句を使用するときは、最高 4 つまでの AFTER 句を追加することによって、上記の例を合計 6 個の AFTER 句を持つように拡張できます。
このセクションでは、PERFORM ステートメントを使用して 4 つ以上の ID を変更する方法を記述する例を示します。
指定される変数の数に関係なく、次の規則が適用されます。