Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き

第 3 章: 条件構造および制御構造

目次に戻る


概要

この章では、テストおよびテスト条件に対する応答を扱う条件構造および制御構造について説明しています。こうした構造は、プログラムの流れを更新し、必要に応じてアクションを反復する手段も提供します。

条件構造

Developer's Toolkit は、次の 2 つの条件構造を提供しています。

制御構造

Developer's Toolkit は、プログラムの流れを更新するための幾つかの構造を提供しています。

IF ステートメント

IF ステートメントの形式

Developer's Toolkit の IF ステートメントの一般形式は次の通りです。

IF <condition> THEN 
  <statement-list> 
ELSIF <2nd condition> THEN 
  <statement-list> 
ELSE 
  <statement-list> 
  END; 

ELSIF および ELSE ステートメントは、条件が 1 つしかテストされない場合には不要です。

IF の例

この構造の使用例は次の通りです。

IF (age < 18) OR (age > 90) THEN 
  WRITELN('Improper age, please re-enter'); 
  END; 
IF display = 'CGA' THEN 
  LoadCGADriver; 
ELSIF display = 'MCGA' THEN 
  LoadMCGADriver; 
ELSIF display = 'EGA' THEN 
  LoadEGADriver; 
ELSE 
  LoadVGADriver; 
  END; 
IF processor = '8086' THEN 
  maxMem := 640000; 
  operatingSystem := 'DOS'; 
ELSE 
  maxMem := 16000000; 
  operatingSystem := 'OS/2'; 
(* operatingSystem is a string *) 
  END;


True 条件

IFELSIF には、常にブール条件が続きます。条件が TRUE と評価された場合には、IF の後のステートメントが実行され、そうでない場合には、ELSIF が実行されます。

False 条件

条件が FALSE に評価された場合には、次の 3 つのうちの 1 つが起こります。

短絡ブール評価

Developer's Toolkit は、短絡ブール評価を使用します。 これは、2 つの文節を評価した場合には、次のようになるということを意味します。


WHEN ステートメント

WHEN ステートメントは、特殊な形式の IF ステートメントで、変数または式の値に基づいてアクションを実行できるようにします。

IF ステートメントの例

次の IF ステートメントを考えてください。

IF i*j = 1 THEN 
  WriteOne; 
ELSIF i*j = 2 THEN 
  WriteTwo; 
ELSIF i*j = 3 THEN 
  WriteThree; 
ELSE 
  WriteOther; 
  END; 

上の例では、式 i*j から戻された値を検査することの中には、各入力値の式を計算し直すことが含まれます。i*j が 3 より大きくなっている場合には、式 i*j が 3 回評価されます。

このメソッドには、2 つのマイナスの副次作用があります。

代替メソッドとして、i*j の値をローカル変数に割り当て、IF ステートメント中のその値を使用することができます。

WHEN ステートメントの例

保守とパフォーマンスの両方のよりよいソリューションとして、IF ステートメントの代わりに WHEN ステートメントを使用することができます。

Developer's Toolkit の WHEN ステートメントは、以下に示しているように条件を評価するよりよい方法を提供しています。

WHEN i*j IS 1 THEN 
  WriteOne; 
ELSWHEN 2 THEN 
  WriteTwo; 
ELSWHEN 3 THEN 
  WriteThree; 
ELSE 
  WriteOther; 
  END; 

WHEN ステートメントは、式を 1 回評価してから、それをテスト値のそれぞれに比較します。式は、単純データ・タイプまたはストリングでなければなりません。

注: ストリングで使用される時には、WHEN は、大文字小文字の区別がありません。

次の例で示したコンマで区切られた形式を使用することによって、複数のテスト値を指定することもできます。

WHEN i*j IS 1,2,3 DO 
  WriteOne; 
ELSWHEN 4,5,6 DO 
  WriteTwo; 
ELSWHEN 7,8,9 DO 
  WriteThree; 
ELSE 
  WriteOther; 
  END; 

FOR ループ

FOR ループ構造は、1 つまたは複数のステートメントを事前に定義された回数実行するために使用されます。FOR 構造は、次の形式を取ります。

FOR <loop-parameter>:=<lo-bound> TO <hi-bound> DO 
  <statement-list> 
  END; 

この形式の継続は、次の表に示しています。

継続 説明
<loop-parameter> <lo-bound> と <hi-bound> の間 (両者を含む) の値に割り当てられた整数変数
<lo-bound> ループの先頭で 1 回評価され、<loop-parameter> に割り当てられた整数式
<hi-bound> ループの先頭で 1 回評価され、ループを通過するたびに <loop-parameter> の値と比較される整数式
<statement-list> <lo-bound> と <hi-bound> の間 (両者を含む) の <loop-parameter> のすべての値に対して実行される Developer's Toolkit の 1 つまたは複数のステートメント

FOR の例

次の例は、FOR ステートメントの一番簡単な使い方を示したものです。この例では、ストリングが 10 回画面に書き込まれます。 i 変数の値は、ステートメント・リスト内では使用されません。

FOR i:=1 TO 10 DO 
  WinWriteLN(myWindow,'Hello'); 
  END; 

次の例は少し複雑になっています。

FOR i:=j TO k*3 DO 
  WinWriteLN(myWindow,'i = ' & i); 
  END; 

: 下限が上限に等しい場合には、ステートメント・リストが 1 回実行されます。下限が上限より大きくなっている場合には、ステートメント・リストはまったく実行されません。

DOWNTO の使用

キーワード DOWNTO は、次の例で示しているように、高い値から低い値のほうにループを実行するために、TO の代わりに使用することができます。

FOR i:=10 DOWNTO 1 DO 
  WinWriteLN(myWindow,i); 
  END;


リスト中での FOR の使用

FOR ステートメントは、タイプ LIST の変数で使用される 2 番目の形式をもっています。

FOR <list-parameter> DO 
  <statement-list> 
  END; 

ここでは、ステートメント・リストは、リスト・パラメーター中の各メンバーに 1 回実行されます。 リスト・パラメーターの現在の要素ポインター $Current は、リスト中の最初の要素を示すように初期化されています。ステートメント・リストの実行の終わりで、要素ポインターが前に進みます。これにより、リスト中のすべての要素に 1 つまたは複数のステートメントが実行できるようになります。

次の例を考えてください。

ListInsert(myList,'One'); 
ListInsert(myList,'Two'); 
ListInsert(myList,'Three'); 
FOR myList DO 
  WinWriteLN(myWindow,myList[$Current]); 
  END; 

REPEAT ループ

REPEAT ループ構造は、1 セットのステートメントを 1 回実行してから、一定の条件が True となるまで、それらを実行し続けます。
REPEAT ループ構造は、次の形式をもちます。

REPEAT 
  <statement-list> 
UNTIL <condition>; 

次のコードは、ストリング 'Hello' を 10 回画面に書き込みます。

i:=1; 
REPEAT 
  WinWriteLN(myWindow,'Hello'); 
  i:=i + 1; 
UNTIL i > 10; 

ブール式

前の例では、<condition> は、ループのたびに評価されるブール式です。FALSE と評価されると、<statement-list> 中のステートメントがもう一度実行されます。
ブール式は、次のものによって結合された文節からなります。

文節は、関係演算子 (=、>、<、など) によって区切られた互換データ・タイプの 2 つの式からなります。

WHILE ループ

WHILE ループ構造は REPEAT ループ構造と似ていますが、出口条件がループの終わりではなく、ループの先頭でテストされます。 REPEAT ループ構造中のステートメントは、少なくとも 1 回実行されることを保証されていますが、WHILE ループ構造中のステートメントは、ループ条件が最初に False である場合にはまったく実行されません。

WHILE ループ構造は次の形式をもちます。

WHILE <condition> DO 
  <statement-list> 
  END; 

次のプログラムでは、ストリング 'Hello' が 10 回画面に書き込まれます。

i:=1; 
WHILE i <= 10 DO 
  WinWriteLN('Hello'); 
  i:=i + 1; 
  END; 

Exit および ExitLoop ステートメント

Exit

Exit ステートメントは、関数またはプロシージャーに対する呼び出しから出るために使用することができます。出されると、FORREPEAT、または WHILE ループの内部にある場合にも、これは現行ルーチンを完全に終結します。

ExitLoop

その名前が暗示するように、ExitLoop ステートメントは、終了条件が True となる前にループから出るために使用することができます。

次の例では、ループは、EMPLOYEES データベース・テーブルからすべての行を読み取って印刷するようにセットアップされています。1 より小さい値を戻した (したがってエラーまたは結果セットの終わりを示した) ために SQLFetch ステートメントが失敗した場合には、 ExitLoop ステートメントでループの実行が終結します。ループの直後に続くステートメントが次に実行されるステートメントです。

ExitLoop の例

次の例は、ExitLoop の使い方を示したものです。

VARIABLES 
  i: Integer; 
  cursor: SQLCursor; 
  employee: EmployeeRecord; 
ACTIONS 
  i:=SQLSelect(cursor,'SELECT * FROM EMPLOYEES'); 
  WHILE i > 0 DO 
    i:=SQLFetch(cursor,employee); 
    IF i < 1 THEN 
      ExitLoop; 
  END; 
    PrintEmployee(employee); 
  END; 
  SQLCloseCursor(cursor);

Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き

目次に戻る

著作権