ダイアログマネージャの使用

ダイアログマネージャは、アプリケーションコンポーネントの実行を制御する WebFOCUS 言語の一部です。ダイアログマネージャのコマンドおよび変数を使用することで、アプリケーションのフローを制御することができます。プロシジャの実行を動的に制御できるため、柔軟にアプリケーションを設計することができます。また、ダイアログマネージャを使用すると、プロシジャに変数を使用し、実行時にその値を指定することもできます。

次の説明は、ダイアログマネージャの代表的な使用方法です。

  • 変数によるプロシジャのカスタマイズ   変数を使用してプロシジャの実行を動的に変更したり、システムから情報を取得したりすることができます。
  • プロシジャ実行順序の制御   リクエストの条件付き実行、プログラムループを使用した繰り返し実行、別のプロシジャの呼び出しを行えます。
  • HTML Web ページの拡張   プロシジャに HTML コマンドを追加して、Web ページの機能を拡張することができます。
  • オペレーティングシステムコマンドの発行   オペレーティングシステムコマンドを発行して、リクエストを実行する環境をセットアップすることができます。
  • パスワードの管理   パスワードの割り当ておよび変更を直接実行することができます。
  • アプリケーションへのメッセージの送信   プロシジャの処理中にアプリケーションにメッセージを送信し、プロシジャの目的、結果、役立つ情報などを表示することができます。

ダイアログマネージャの IF、GOTO、LABEL、REPEAT を作成することができます。また、ダイアログマネージャキャンバスを開き、その他の項目を手動で作成することもできます。

ダイアログマネージャ変数の概要

プロシジャに変数を追加し、実行時に変数値のユーザ入力を要求することができます。これにより、プロシジャの実行ごとに入力値を変更することで、ユーザによるプロシジャのカスタマイズが可能になります。変数は次の 2 つに分類されます。

  • ローカル変数とグローバル変数   ローカル変数およびグローバル変数の値は、実行時に指定する必要があります。ローカル変数の値は、1 つのプロシジャでのみ保持されます。グローバル変数の値は、明示的にクリアしない限り、複数のプロシジャで保持されます。ローカル変数を作成するには、変数名の先頭にアンパサンド (&) を 1 つ付けます。グローバル変数を作成するには、変数名の先頭に 2 つのアンパサンド (&&) を付けます。
  • システム変数と統計変数   システム変数および統計変数の値は、プロシジャが変数を参照する際にシステムから自動的に渡されます。システム変数および統計変数は、名前の先頭にアンパサンド (&) が 1 つ付いています。たとえば、&LINES は、生成された出力行数を示す変数です。&DATE は、現在の日付を示す変数です。

ダイアログマネージャの処理

ダイアログマネージャのストアドプロシジャにコマンドおよび変数を追加することで、実行時にユーザ入力と環境条件に基づいてアプリケーションをカスタマイズすることができます。

WebFOCUS App Studio では、ストアドプロシジャは「プロシジャ」と呼ばれます。

  1. 実行するプロシジャが呼び出されると、コマンドプロセッサから処理が開始されます。
  2. FOCEXEC プロセッサがプロシジャの各行を読み取ります。読み取られた行に変数がある場合、変数に現在値が割り当てられます。
  3. ダイアログマネージャで読み取られたダイアログマネージャコマンドはすぐに実行されます。
  4. ダイアログマネージャコマンドが含まれていないコマンド行が完全に展開され、-SET コマンドまたは入力要求により変数の値が解決されると、そのコマンド行はコマンド実行スタックに配置されます。
  5. ダイアログマネージャ実行コマンドおよび統計変数は、現在スタックされているコマンドのすべてを WebFOCUS コマンドプロセッサに転送します。

プロシジャの実行準備が完了するまでに、次の処理が実行されます。

  • すべての変数に値が割り当てられ、これらの値が、変数が含まれたコマンド行に統合されます。
  • ダイアログマネージャコマンドにより、WebFOCUS コマンドが正しい実行順序に配置されます。
  • この時点で WebFOCUS コマンドプロセッサにはダイアログマネージャコマンドは存在しなくなります。存在するのは、スタックに配置された WebFOCUS コマンド行のみです。

-TYPE コマンドを使用して、プロシジャの処理中にメッセージを画面に送信することができます。通常、このメッセージは次の目的で使用されます。

  • プロシジャの目的を説明する。
  • プロシジャの結果またはプロシジャのテスト中の計算結果を表示する。
  • その他の役立つ情報を表示する。
  • 値の入力を要求する際に、指定する情報のタイプを提示する。

プロシジャ実行順序の制御

     

次の方法を使用して、プロシジャの実行順序を制御することができます。

  • 無条件分岐   コントロールをラベルに転送します。
  • 条件分岐   テスト結果に基づいてコントロールをラベルに転送します。
  • ループ   1 つの関数をプロシジャ内で繰り返し実行します。
  • 別のプロシジャの呼び出し   別のプロシジャの一部または全体を現在のプロシジャに組み込みます。

無条件分岐

-GOTO コマンドを使用して、指定したラベルにコントロールを転送する無条件分岐を実行することができます。

ダイアログマネージャは、プロシジャの検索をはじめて実行する際に、検出したラベルのアドレスをすべて記録します。これにより、これらのラベルを次に使用する際に即座に見つけることができます。ダイアログマネージャが -GOTO コマンドで指定されたラベルのアドレスを記録していない場合、ダイアログマネージャはプロシジャを順方向へ検索し、ターゲットラベルを見つけます。ラベルが見つからない場合、ダイアログマネージャはプロシジャの先頭から検索を開始します。

-GOTO と関連付けられていないラベルを検出しても、ダイアログマネージャは何も実行しません。-GOTO に対応するラベルが見つからない場合、プロシジャの実行が中断し、メッセージが表示されます。

無条件分岐

-GOTO label 
  .
  .
  .
-label [TYPE text]

説明

-label

ユーザが定義する名前で、最大長は 64 バイトです。埋め込みブランクや、その他のダイアログマネージャコマンド名を含めることはできません。数値演算または論理演算、関数と混同しやすい語、あるいは CONTINUE などの予約語は使用しないでください。

label のテキストは、プロシジャ内の -GOTO コマンドの前後に記述することができます。

注意:-GOTO コマンドで label を指定する場合、label の前にハイフン (-) は必要ありません。

TYPE text

メッセージを画面に送信します。

無条件分岐

次の例では、各行の先頭に「-*」と入力する代わりに、無条件分岐を使用することで、すべての WebFOCUS コードをコメントアウトします。

-GOTO DONE
TABLE FILE SALES
PRINT UNIT_SOLD RETURNS
BY PROD_CODE,CITY
END 
-RUN 
-DONE

条件分岐

条件分岐は、-IF... GOTO コマンドを使用して変数値をテストし、テスト結果に基づいて指定したラベルにコントロールを転送します。これにより、リクエストの実行を制御できるため、プロシジャで実行する部分と実行しない部分を選択することで動的なプロシジャの作成が可能になります。

たとえば、稼動中のデータソースから抽出ファイルが作成されたかどうかを確認することができます。抽出ファイルが存在する場合は、プログラムはその抽出ファイルに対して一連のレポートを実行します。抽出ファイルが存在しない場合は、プログラムはレポートを回避して分岐し、ログファイルにメッセージを書き込みます。

注意:通常、-IF テストでは、テストごとにターゲットラベルを指定する必要はありません。ただし、一連のテストが互いにネストされた複合 IF テストでは、テストごとにターゲットラベルを指定する必要があります。

条件分岐

-IF expression [THEN] {GOTO label1|CONTINUE} [ELSE IF...] [ELSE {GOTO label2|CONTINUE}] ;

説明

expression

有効な式です。リテラルにブランクまたはカンマ (,) が含まれていない場合は、一重引用符 (') で囲む必要はありません。

THEN

コマンドを読みやすくするための任意指定の語句です。

label1

ユーザが定義する名前で、-IF テストが TRUE の場合にこのラベルに制御が渡されます。この名前の最大長は 64 バイトです。埋め込みブランクや、その他のダイアログマネージャコマンド名を含めることはできません。数値演算または論理演算、関数と混同しやすい語、あるいは CONTINUE などの予約語は使用しないでください。

label のテキストは、プロシジャ内の -IF 条件の前後に記述することができます。

CONTINUE

-IF コマンドのセミコロン (;) に続くコマンドに移動します。

注意:-IF ステートメントのラベルとして CONTINUE を使用することはできません。

ELSE IF

複合 -IF テストを指定します。-IF コマンドを終了する場合は、すべてのロジックが指定されたことを表すセミコロン (;) を末尾に追加する必要があります。

ELSE GOTO label2

-IF テストに失敗した場合にコントロールを label2 に渡します。

コマンドが複数行に及ぶ場合は、継続行の先頭にハイフン (-) と 1 つ以上のブランクを追加する必要があります。

ユーザ入力に基づく条件分岐

次の例では、1 つ目のレポートリクエストまたは 2 つ目のレポートリクエストのいずれかが実行されますが、両方は実行されません。このプロシジャを実行するには、ユーザが &PROC 変数の値を入力する必要があります。ユーザは、「SALES」または「EMPLOYEE」のいずれかの値を入力することができます。

1. -IF &PROC EQ 'EMPLOYEE' GOTO EMPLOYEE; 
2. -SALES
   TABLE FILE SALES
   SUM UNIT_SOLD
    BY PROD_CODE
   END 
3. -EXIT
   -EMPLOYEE
   TABLE FILE EMPLOYEE
   PRINT PLANT_NAME
    BY DEPARTMENT
   END

プロシジャは、次のように処理されます。

  1. ユーザが &PROC に対して「SALES」という値を入力します。-IF テストが完了します。&PROC の値が「EMPLOYEE」でないため、テストは失敗し、コントロールが後続行の -SALES に渡されます。

    仮に &PROC の値が「EMPLOYEE」であった場合、コントロールは -EMPLOYEE に渡されます。

  2. WebFOCUS コードが処理され、後で実行するためにスタックされます。
  3. -EXIT は、スタックコマンドを実行します。出力結果が画面に送信され、プロシジャが終了します。

    -EMPLOYEE ラベルより下のリクエストは実行されません。

注意:プロシジャにグローバル変数が含まれており、-EXIT コマンドで終了する場合、グローバル変数の値は記録されません。このため、後続のプロシジャの実行を、存在するグローバル変数の値に依存させることはできません。

プロシジャでのループの実行

 

-REPEAT コマンドを使用してプロシジャ内にループを作成することにより、同一の処理を繰り返し実行することができます。ループは、さまざまな処理に使用することができます。たとえば、ループを使用してインデックス付き変数に値を挿入したり、1 つ目のリクエストの結果を 2 つ目のリクエストに使用したりできます。

処理ループは、指定した回数だけ実行したり、条件が満たされるまで実行したりすることができます。ループは、次のいずれかが発生した場合に終了します。

  • ループが完了した場合。
  • -EXIT コマンドが発行された場合。
  • -GOTO が発行されて、ループ外のラベルに移動する場合。

    注意:プロシジャ内で別の -GOTO を発行して再度ループに戻った場合、そのループは前回の終了位置から続行されます。

-SET コマンドを使用すると、別の方法でループを実装することができます。

ヒント:固定レコード長 (80 バイト) 以外の変数が使用されたプロシジャでは、ループの処理中に、-REPEAT または -GOTO コマンドのターゲットとして指定されたラベルの検索に時間を要します。この場合、実行速度を向上させるには、ループの代わりに EX または -INCLUDE コマンドを使用する方法を検討してください。

ループの指定

-REPEAT label n TIMES

または

-REPEAT label WHILE condition;

または

-REPEAT label FOR &variable [FROM fromval] [TO toval] [STEP s]

説明

label

繰り返し実行するコード (ループ) を指定します。2 つのループのラベル名が異なる場合、一方のラベルに他方のラベルのループを含めることができます。

n TIMES

ループを実行する回数を指定します。n の値には、ローカル変数、グローバル変数、定数のいずれかを指定することができます。変数を指定した場合、評価は 1 回に限定されるため、ループの実行回数を変更することはできません。ループを途中で終了するには、-EXIT を使用します。

WHILE condition;

ループを実行する条件を指定します。条件は、True または False を返す論理式です。条件が True の場合にループが実行されます。

注意:条件の後にセミコロン (;) を続ける必要があります。

&variable

ループの実行が開始されるたびにテストされる変数です。実行ごとに変数値が s ずつ増加します。fromval および toval の値が指定されている場合は、それらの値と比較されます。ループが実行されるのは、&variable が fromval 値以上の場合、または &variable が toval 値以下の場合のみです。

fromval

ループの実行を開始するたびに &variable と比較する定数です。デフォルト値は 1 です。

toval

ループの実行を開始するたびに &variable と比較する値です。デフォルト値は 1,000,000 です。

STEP s

ループの実行が終了するたびに &variable に累積する定数です。正または負の値を指定することができます。デフォルトの増分値は 1 です。

注意:パラメータの FROM、TO、STEP は、任意の順序で使用することができます。

ループの繰り返し

次の例は、-REPEAT の構文要素を示しています。

-REPEAT label n TIMES

以下はその例です。

-REPEAT LAB1 2 TIMES
-TYPE INSIDE
-LAB1 TYPE OUTSIDE

出力結果は次のとおりです。

INSIDE
INSIDE
OUTSIDE
-REPEAT label WHILE condition;

以下はその例です。

-SET &A = 1;
-REPEAT LABEL WHILE &A LE 2;
-TYPE &A
-SET &A = &A + 1;
-LABEL TYPE END: &A

出力結果は次のとおりです。

1
2
END:3
-REPEAT label FOR &variable FROM fromval TO toval STEP s

以下はその例です。

-REPEAT LABEL FOR &A STEP 2 TO 4
-TYPE INSIDE &A
-LABEL TYPE OUTSIDE &A

出力結果は次のとおりです。

INSIDE 1
INSIDE 3
OUTSIDE 5

プロシジャでの変数の使用

プロシジャに動的な変数代入を使用することで、実行時に変数値の入力を要求するプロシジャを作成することができます。この変数には文字列または数値が格納されます。この変数は、プロシジャの任意の位置に配置することができます。たとえば、フィールド、コマンド、説明テキスト、ファイル名を参照する変数を作成することができます。

注意:ダイアログマネージャ変数には、文字データのみが格納されます。関数または式からダイアログマネージャ変数に数値が返された場合、その値は整数に切り捨てられ、文字フォーマットに変換されてから変数に格納されます。

変数は次の 2 つに分類されます。

  • ローカル変数およびグローバル変数の値は、実行時に指定します。ローカル変数の値は、そのプロシジャでのみ有効ですが、グローバル変数の値は、セッション中に実行されるプロシジャすべてで有効になります。

    先頭の 2 つのアンパサンド (&&) は、その変数がグローバル変数であることを示します。その他すべてのダイアログマネージャ変数は、1 つのアンパサンド (&) で始まります。

  • システム変数、統計変数、特殊変数の値は、システムが自動的に割り当てます。

1 つのプロシジャで使用可能なローカル変数、グローバル変数、システム変数、統計変数、特殊変数、インデックス変数の最大数は 1024 個です。およそ 40 個の変数は、WebFOCUS で使用するために予約されています。

変数は、プロシジャでのみ使用することができます。レポートの作成時に変数を直接使用した場合、その変数は無視されます。

クエリを実行して、使用する各タイプの変数の値を取得することができます。

変数の値は、さまざまな方法で指定することができます。

ローカル変数およびグローバル変数の名前規則

システム変数および統計変数は事前に名前が定義された変数ですが、ローカル変数およびグローバル変数の名前はユーザが定義します。ローカル変数およびグローバル変数には、次の名前規則が適用されます。

  • ローカル変数名の前には、必ずアンパサンド (&) を 1 つ付けます。この変数は、名前付き変数または位置変数のいずれかにすることができます。

    位置変数は、1 つのアンパサンド (&) と後続の数字で構成されます (例、&1)。位置変数の値は、実行時にプロシジャに渡されます。

  • グローバル変数名の前には、必ずアンパサンド (&) を 2 つ付けます。
  • 変数名の最大文字数は 100 バイトです。
  • 変数名にブランクを含めることはできません。
  • 変数の値にブランク、カンマ (,)、等号 (=) が含まれている可能性がある場合は、変数を参照する際にその変数を一重引用符 (') で囲みます。
  • 変数名には、A から Z、0 から 9、アンダースコア (_) の各文字を任意に組み合わせて使用することができます。変数名の先頭には英文字を使用する必要があります。
  • 変数に名前ではなく数字を割り当てることで、位置変数を作成することができます。
  • 変数名にはアンダースコア (_) を使用することはできますが、プラス記号 (+)、マイナス記号 (-)、アスタリスク (*)、スラッシュ (/)、ピリオド (.)、アンパサンド (&)、セミコロン (;) の特殊文字を使用することはできません。

変数名の指定

&[&]name

説明

&

ローカル変数であることを示します。1 つのアンパサンド (&) の後に数字を指定すると、位置変数になります。

&&

グローバル変数であることを示します。

name

変数名です。割り当てる名前は、ダイアログマネージャの規則に準拠する必要があります。

ローカル変数

ローカル変数は、変数名の先頭に付けられた 1 つのアンパサンド (&) で識別されます。ローカル変数の値は、1 つのプロシジャでのみ有効です。

ローカル変数の使用

ここでは、「SALESREPORT」というプロシジャについて考察します。このプロシジャでは、ローカル変数として &CITY、&CODE1、&CODE2 が使用されています。

TABLE FILE SALES
HEADING CENTER
"MONTHLY REPORT FOR &CITY"
"PRODUCT CODES FROM &CODE1 TO &CODE2"
" "
SUM UNIT_SOLD AND RETURNS AND COMPUTE
RATIO/D5.2 = 100 * (RETURNS/UNIT_SOLD);
BY CITY
IF CITY EQ &CITY
BY PROD_CODE
IF PROD_CODE IS-FROM &CODE1 TO &CODE2
END

このプロシジャを呼び出した際に、次の値を入力するとします。

EX SLRPT CITY = STAMFORD, CODE1=B10, CODE2=B20

ダイアログマネージャは、各変数に対して次のように値を代入します。

TABLE FILE SALES
HEADING CENTER
"MONTHLY REPORT FOR STAMFORD"
"PRODUCT CODES FROM B10 TO B20"
" "
SUM UNIT_SOLD AND RETURNS AND COMPUTE
RATIO/D5.2 = 100 * (RETURNS/UNIT_SOLD);
BY CITY
IF CITY EQ STAMFORD
BY PROD_CODE
IF PROD_CODE IS-FROM B10 TO B20
END

プロシジャの実行が終了した時点で、STAMFORD、B10、B20 のそれぞれの値は失われます。

グローバル変数

グローバル変数は、ローカル変数とは異なり、変数値が一度指定されると、-SET コマンドで別の値が設定されるか、LET CLEAR コマンドで値がクリアされない限り、WebFOCUS セッション中は変数値が保持されます。グローバル変数は、作業セッションの開始時に値を収集し、後続の複数のプロシジャで使用できるという点で便利です。特定のグローバル変数を使用するすべてのプロシジャには、WebFOCUS セッションを終了しない限り、変数の現在値が渡されます。

グローバル変数を定義するには、変数名の先頭に 2 つのアンパサンド (&&) を追加します。グローバル変数とローカル変数に同一の名前を使用することも可能です。これらの変数は互いに区別され、それぞれに異なる値を格納することができます。

グローバル変数の使用

次の例は、「&&CITY」、「&&CODE1」、「&&CODE2」という 3 つのグローバル変数を使用する方法を示しています。ここでは、最初のプロシジャ PROC1 で変数に値が代入されます。それぞれの値が保持されて、2 つ目のプロシジャ PROC2 に渡されます。

TABLE FILE SALES
HEADING CENTER
"MONTHLY REPORT FOR &&CITY"
SUM UNIT_SOLD AND RETURNS AND COMPUTE
RATIO/D5.2 = 100 * (RETURNS/UNIT_SOLD);
BY CITY
IF CITY EQ &&CITY
BY PROD_CODE
IF PROD_CODE IS-FROM &&CODE1 TO &&CODE2
END
EX PROC2
TABLE FILE SALES
HEADING CENTER
"MONTHLY REPORT FOR &&CITY AND PRODUCT &&CODE1"
PRINT UNIT_SOLD AND RETURNS AND COMPUTE
RATIO/D5.2 = 100 * (RETURNS/UNIT_SOLD);
BY CITY
IF CITY EQ &&CITY
IF PROD_CODE EQ &&CODE1
END

変数値およびパラメータ値のクエリ

2 つのダイアログマネージャコマンドを使用して、次のことを行えます。

  • すべてのタイプのローカル変数、グローバル変数、システム変数の値を表示する。
  • パラメータの値を変数に格納する。格納された値は、? SET コマンドを使用して検索することができます。設定を確認することができます。

また、以下のクエリ (?) コマンドを発行することで、次の変数の値を表示することもできます。

  • グローバル変数   グローバル変数の値は WebFOCUS セッション中は保持されるため、値を確認したい場合にクエリコマンドを使用すると便利です。構文は次のとおりです。
    ? &&
  • 統計変数   クエリコマンドを実行して、すべての統計変数の現在値を検索することができます (&FOCDISORG および &FOCERRNUM を除く)。構文は次のとおりです。
    ?STAT

変数値の表示

ストアドプロシジャから、ダイアログマネージャのすべての変数 (ローカル、グローバル、システム、統計) に対してクエリを実行することができます。構文は次のとおりです。

-? &[&variablename]

説明

&

このコマンドを単独で発行すると、すべてのタイプの変数が表示されます。

variablename

変数名です。アンパサンド (&) を含みます。指定した文字列で始まる変数のみが表示されます。

コマンドを実行すると、次のメッセージとともに、現在定義されている変数および値のリストが表示されます。

CURRENTLY DEFINED & VARIABLES:

ローカル変数はプロシジャの外部に存在しないため、WebFOCUS コマンドラインから同様のクエリを実行することはできません。