OLAP DMLプログラムでは、FORコマンドにより1つ以上のディメンションが指定され、このディメンションのステータスに基づいて、1つ以上の文の反復処理が制御されます。FOR文を含めたこれらの文は通常、FORループと呼ばれます。
パラメータ
1つ以上のディメンションで、その現行のステータスによって1つ以上の文の反復処理が制御されます。文は、現行のステータスにある指定されたディメンションの値の各組合せに対して繰り返されます。複数のディメンションを指定した場合、最初のディメンションが最後に変化します。ディメンションのかわりにコンポジットを指定できます。
繰り返される文。2つ以上の文を繰り返すには、それらをDOとDOENDで囲みます。
DO
statement1
...
statementN
DOEND
FORの後で文を1つのみ繰り返す場合、DOおよびDOENDはオプションです。
使用上の注意
FORディメンション
FOR文は、指定したディメンションのステータスにある値をループします。最後のディメンション値の後、ディメンション・ステータスはループ前のステータスにリストアされ、次の文のプログラム実行が再開されます。
ループ内のステータス
TEMPSTATコマンドは、FORループ内またはREPORT文によって自動的に生成されるループ内でループするディメンションを制限します。
ソート不可
現行のステータスがFORループを定義および制御するので、ループ内でFORディメンションをソートできません。
代入文と他のループ文
OLAP DML代入文(SET)および他の一部のOLAP DML文は、自動的にディメンション・ステータスをループし、FORループより効率的です。代入文などのこのような文をループに入れることによって不必要なループが発生しないように注意してください。
分岐
BREAK、CONTINUEおよびGOTOの各文を使用すると、FORループ内での分岐またはFORループ外への分岐が可能なため、文の実行順序を変更できます。
FOR文のネスト
対応するDOおよびDOEND文を必要に応じて指定することによって、FOR文をFORループ内で任意の深さまでネストできます。
例
例9-136 FORループのDOによるROWコマンドの繰返し
レポート・プログラムで、3か月の各月におけるテントの売上数量を表示するとします。次のようにFOR文をDO/DOENDシーケンスとともに使用して、monthディメンションの各値に対し、ROWコマンドおよびBLANKコマンドを繰り返します。
LIMIT product TO tents
LIMIT month TO 'Jan96' TO 'Mar96'
ROW district
ROW UNDER '-' VALONLY name.product
BLANK
FOR month
DO
ROW INDENT 5 month WIDTH 6 UNITS
BLANK
DOEND
このプログラムの行によって次のレポートが生成されます。
BOSTON
3-Person Tents
--------------
Jan96 307
Feb96 209
Mar96 277
例9-137 値をループ処理するFOR文の使用方法
FORコマンドは、ディメンションの現行のステータスの各値に対してコマンドをループして実行します。FOR文を実行する前に、ディメンションを目的の値に制限する必要があります。たとえば、各製品の価格を表示する一連の出力行を生成できます。
LIMIT month TO FIRST 1
LIMIT product TO ALL
FOR product
SHOW JOINCHARS('Price for ' product ': $' price)
各出力行の形式は、次のとおりです。
Price for TENTS: $165.50
データが多次元である場合、FOR文に複数のディメンションを指定して処理順序を制御できます。たとえば、次の文を使用すると、unitsデータのディメンション値が処理される順序を制御できます。
FOR month district product units = ...
この代入文を実行すると、monthディメンションが最後に変化し、districtディメンションがその前に変化し、productディメンションが最初に変化します。したがって、最初の地区のすべての製品に対してループが実行されてから次の地区が実行され、最初の月のすべての地区に対して実行されてから次の月が実行されます。
FORループ内では、ループの文が実行される間、指定した各ディメンションは一時的に単一の値に制限されます。そのため、ループ内でディメンション値の組合せを限定できます。
例9-138 FORループでのDO/DOENDの使用方法
売上数量の実績値がunitsという名前の変数に格納され、売上数量の目標値がunits.planという名前の変数に格納される場合、コードをループに入れることによって、ディメンション値の同じ組合せに対する両方の数値を比較できます。
LIMIT month TO FIRST 1
LIMIT product TO ALL
LIMIT district TO ALL
FOR district product
DO
IF (units.plan - units)/units.plan GT .1
THEN SHOW JOINCHARS(-
'Unit sales for ' product ' in ' -
district ' are not within 10% of plan.')
DOEND
このコードの各行は次のように処理されます。
データが特定の月に制限されます。
すべての地区および製品がステータスに入れられ、FORループに入ります。
FORループで、実績値が目標値と比較されます。BostonにおけるTentsの売上数量が目標値の10%を超えて下回る場合、次のメッセージが現行の出力ファイルに送信されます。
Unit sales for TENTS in BOSTON are not within 10% of plan.
すべての製品の処理が終わると、最初の地区のFORループが完了します。
次の地区のループが実行されていきます。
FORループが実行される間、FOR文で指定される各ディメンションは一時的に単一の値に制限されることに注意してください。FORループでdistrictを指定してproductを指定しない場合、FORループが実行される間、productのすべての値はステータスにあります。したがって、IF...THEN...ELSEコマンドでは、productディメンションの最初の値に関してのみ、データの比較が行われます。