OLAP DMLプログラム内のGOTOコマンドは、プログラム内の文の実行順序を変更します。
パラメータ
「ラベルの構成のガイドライン」に従って構成された、プログラム中の他の位置にあるラベルの名前。プログラムの実行は、指定したラベルの直後の行に分岐します。
GOTOに指定するlabelの後にはコロンを付ける必要はありません。ただし、プログラムの他の位置にある実際のラベルの後にはコロンを付けます。
使用上の注意
ラベルの構成のガイドライン
特定の位置に分岐する制御構造を使用する場合、位置を明確に識別するためにその位置のラベルを指定する必要があります。ラベルを作成するには、次のガイドラインに従います。
ラベルの最初の文字は、英字、ピリオド(.
)、アンダースコア(_
)のいずれかであることが必要です。
ラベルの残りの文字には、英字、数字、ピリオドまたはアンダースコアの任意の組合せを使用できます。
ラベルの直後にはコロン(:
)を付ける必要があります。
ラベルの最初の8バイトは、一意である必要があります(使用するキャラクタ・セットによって、1バイトが1文字ではない場合もあります)。(使用するキャラクタ・セットによって、1バイトが1文字ではない場合もあります。)ラベルは最大3999バイト(テキスト行の最大長からラベルを識別するコロンの1バイトを差し引いた値)です。ただし、ラベル名の最初の8バイトのみが使用されるので、最初の8バイトが一意ではない場合、8バイトを超えるラベル名に関しては問題が発生することがあります。
不明なGOTOラベル
labelに対応する実際のラベルが同じプログラムの他の位置に存在しない場合、エラーとともに実行が停止します。
IFおよびWHILEとともに使用するGOTO
次の構文に基づいて、GOTO文をIF...THEN...ELSEまたはWHILEと組み合せて使用することにより、条件分岐を設定できます。
IF boolean-expression
THEN GOTO label1
ELSE GOTO label2
ただし、プログラミング論理の明確性を保つために、GOTOの使用は最小限にしてください。GOTOはほとんどの場合、FOR、IF...THEN...ELSEまたはWHILEを使用した単独または複数の条件実行文で置き換えることができます。また、同じプログラム内で異なるケースを処理するSWITCHコマンドを使用することもできます。
FORとともに使用するGOTO
FORループでGOTO文を使用すると、ループ内での分岐やループ外への分岐が可能です。GOTO文およびラベルがどこにあるかによって、文の実行順序が変更されます。
同じループ内のラベルに分岐するFORループのGOTOは、現行のディメンション・ステータスに影響を与えずにそのラベルで実行を継続します。その後のループの繰返しは普通に継続されます。ループの終端、すなわちDOEND文の直前に分岐するには、GOTOのかわりにCONTINUE文の使用を検討します。
ループの外側のラベルに分岐するFORループのGOTOは、FOR文の処理を終了します。指定されたラベルで実行が継続され、ディメンション・ステータスはループ前の状態にリストアされます。ループのDOENDの直後の文に分岐するには、GOTOのかわりにBREAK文の使用を検討します。
FORループの外側のGOTO文を使用してループ内(すなわちループの内側のラベル)に分岐すると、ループの残りが1回実行された後にエラーが発生します。
TEMPSTAT文とGOTO文
プログラムのFORループ処理内部で、DO ... DOEND句がTEMPSTATの後に続く場合、DOEND、BREAK、GOTOのいずれかが検出されると、ステータスはリストアされます。
GOTO文の代替方法
GOTOはプログラム内での分岐を簡単に行えますが、多用するとプログラムの論理が不明瞭になってフローがわかりにくくなります。特に複数のラベルがあったり、多くのコードをスキップするGOTO文がある複雑なプログラムを使用する場合は、このような状況が発生しやすくなります。
プログラムの論理を明確に保つために、GOTOの使用は最小限にします。
GOTO文が最良のプログラミング方法であることもありますが、多くの場合はさらに適した代替方法があります。次に例を示します。
通常、FOR文の中のGOTO文は、そのかわりとなる文をIF...THEN...ELSEコマンドの中のDO文とDOEND文の間に配置することで代用できます。
各セットの文が長い場合、または各セットの文をプログラム内の複数の場所で使用する場合、そのセットをサブプログラムに配置することを検討します。この場合、異なる2つのプログラムからどちらかを選択するには、IF...THEN...ELSEコマンドを使用でき、多数の異なるプログラムからいずれかを選択するには、SWITCHコマンドを使用できます。
FORコマンドで値をループ処理する方法については、例9-137「値をループ処理するFOR文の使用方法」を参照してください。FORループ内でのDO ... DOENDの使用方法については、例9-138「FORループでのDO/DOENDの使用方法」を参照してください。
例
例9-144 IFとともに使用するGOTO
次の例は、プログラムを実行するときにユーザーが指定する引数によって、3つの地域のうちの1つに関するレポートを生成するプログラムです。ユーザーがEAST
、WEST
またはCENTRAL
を指定すると、対応するラベルに実行が分岐し、ラベルに続く文(文グループ1、2または3)が実行されます。ユーザーがそれ以外の引数を指定した場合、実行はargerror
ラベルに分岐し、その後の文によってエラー処理が行われます。
DEFINE flexrpt PROGRAM PROGRAM IF NOT INLIST('East\nWest\nCentral', UPCASE(ARG(1))) THEN GOTO argerror SWITCH &UPCASE(ARG(1)) DO CASE 'EAST': ..." (statement group 1) BREAK CASE 'WEST': ... "(statement group 2) BREAK CASE 'CENTRAL': ..." (statement group 3) BREAK DOEND argerror: ..." statements to handle error) END