マクロ・ランタイムによるマクロ画面の処理方法

このセクションでは、マクロ・ランタイムがマクロ画面を処理するときに発生するアクティビティーについて説明します。 この時点でこのトピックを読むのは煩わしいかもしれませんが、このトピックは重要であり、いずれこのトピックが疑問点になります。 この章の最初の部分 (『概要』) を読み終えたら、具体的な疑問が生じるまで、残りの部分をスキップすることもできます。

概要

例として使用するシナリオ

この章では、例として、単純マクロの記録と再生で記録したマクロのシナリオを使用します。 このマクロには、2 つのマクロ画面 (Screen1 と Screen2) しか含まれていません。

このシナリオは、マクロ・ランタイムが Screen1 のすべてのアクションを実行し、次に処理するマクロ画面を検索する準備ができている段階から始まります。

Screen1 は、「ISPF 基本オプション・メニュー」を処理するマクロ画面です (図 5 を参照)。 表 9 は、Screen1 の内容の概念視点を示しています。

表 9. マクロ画面 Screen1 の内容
<screen> エレメント Screen1 に含まれている XML エレメント XML エレメントの内容
<description> ディスクリプター:
  • 入力禁止標識がクリアされます (入力は禁止されません)。
<actions> アクション:
  1. テキスト・カーソルを行 4、列 16 に移動する。
  2. '3[enter]' と入力する。
<nextscreens> このマクロ画面の後に表示されるマクロ画面の名前:
  • Screen2

Screen2 は、「ユーティリティー選択パネル (Utility Selection Panel)」を処理するマクロ画面です (図 6 を参照)。表 10 は、Screen2 の内容の概念視点を示しています。

表 10. マクロ画面 Screen2 の内容
<screen> エレメント Screen2 に含まれている XML エレメント XML エレメントの内容
<description> ディスクリプター:
  • 入力禁止標識がクリアされます (入力は禁止されません)。
  • 80 個のフィールドがあります。
  • 3 つの入力フィールドがあります。
<actions> アクション (ホスト・アプリケーションは、正しい入力フィールドにテキスト・カーソルを事前に配置します):
  1. '4[enter]' と入力する。
<nextscreens> このマクロ画面の後に表示されるマクロ画面の名前:
  • (なし。これは、このマクロの最後のマクロ画面です。)

マクロ画面の処理ステージ

マクロの再生中に、マクロ・ランタイムは、マクロが終了するまで、同じ 3 つのステージのアクティビティーを何度もループします。

図 18. マクロ画面の処理ステージ
  1. 次に処理するマクロ画面を決定する。
  2. 選択したマクロ画面を新しい現行マクロ画面にする。
  3. 新しい現行マクロ画面の <actions> エレメントのアクションを実行する。

ステージ 1 の詳細

ステージ 1 には、ステージ 2 や 3 より詳しい説明が必要です。ステージ 1 自体に次の 3 つのステップがあります。

図 19. ステージ 1 の 3 つのステップ

上記の各ステップには、有効な次画面のリストが必要です。

有効な次画面のリストは、マクロ画面名を保持できるリストです。 マクロ・ランタイムは、マクロ再生の始め (最初のマクロ画面を再生する前) にこのリストを作成し、マクロ再生が完了した後、このリストを破棄します。 最初、このリストは空です (この章で後述する一時画面を除く)。

マクロの再生中、マクロ・ランタイムが次に処理するマクロ画面を決定する必要があるたびに、マクロ・ランタイムは、有効な次画面のリストを使用して、3 つのステップ 1(a)、1(b)、および 1(c) を実行します。

プロセス全体 (3 つの全ステージ) の概要

ステージ 1 では、マクロ・ランタイムは、次に処理するマクロ画面を決定します。 上記のセクションで説明したように、ステージ 1 には 3 つのステップがあります。

ステップ 1(a) では、マクロ・ランタイムは、現行のマクロ画面の後に表示される可能性があるマクロ画面の名前を収集し、これらの名前を有効な次画面のリストに追加します。 このリストには、このような画面が 1 つしかない場合もあれば、複数ある場合もあります。 このシナリオの例では、マクロ・ランタイムは、Screen1 の <nextscreens> エレメントを調べ、1 つの名前 (Screen2) を見付け、その名前をリストに追加します (表 9 を参照)。

ステップ 1(b) では、マクロ・ランタイムは、リスト上の各マクロ画面を定期的に調べて、その画面がアプリケーション画面と一致するかどうかを判別します。

ここでは、時間的要因があります。 マクロ・ランタイムが現行のマクロ画面でアクションを実行したばかりなので (Screen1 で、<actions> エレメントの最後のアクションとして '3[enter]' を入力)、ホスト・アプリケーションは、セッション・ウィンドウを変更中です。この結果、古いアプリケーション画面 (「ISPF 基本オプション・メニュー」) ではなく、新しいアプリケーション画面 (「ユーティリティー選択パネル (Utility Selection Panel)」) を表示します。 しかし、この変更は、即時に行われるわけではありません。 この変更には数百ミリ秒かかり、ホストから数パケット分のデータが必要になる場合があります。

したがって、ステップ 1(b) では、OIA 行またはセッション・ウィンドウの表示スペースが更新されるたびに、マクロ・ランタイムは、有効な次画面のリストに指定されたマクロ画面 (単数または複数) を調べて、それらのいずれかが現行の状態のアプリケーション画面と一致するかどうかを判別します。

最終的に、マクロ・ランタイムがリスト上のマクロ画面のいずれかをアプリケーション画面と一致させることができるまで、セッション・ウィンドウは更新されます。

ステップ 1(c) では、マクロ・ランタイムは、有効な次画面のリストからすべてのマクロ画面名を除去します (一時画面がある場合は、それを除く)。

ステージ 2 では、マクロ・ランタイムは、選択されたマクロ画面 (ステップ 1(b) でアプリケーション画面と一致した画面) を、新しい現行マクロ画面にします。

最後にステージ 3 では、マクロ・ランタイムは、Screen2 の <actions> エレメントのアクションを実行します。

概要の結論

初めて本書をお読みになる場合は、この時点で、この章の残りの部分をスキップして、次の章に進むことができます。 後で、マクロ・ランタイムがマクロ画面を処理する方法について疑問が生じた場合に、この章に戻って残りの部分をお読みください。

この章の残りの部分では、概要で説明したのと同じ処理手順を説明していますが、各ステップについてもっと詳しく記載しています。

ステージ 1: 次に処理するマクロ画面を決定する

前述のように、ステージ 1 には 3 つのステップがあります。すなわち、有効な次画面のリストへのマクロ画面名の追加、画面認識の実行、および有効な次画面のリストからのマクロ画面名の除去です。

有効な次画面のリストへのマクロ画面名の追加 (ステップ 1(a))

このステップでは、マクロ・ランタイムは、候補のマクロ画面の名前を、有効な次画面のリストに入れます。

有効な次画面

ホスト・アプリケーションがセッション・ウィンドウにアプリケーション画面を表示しているときに、ユーザー入力が行われた場合、通常、数個のアプリケーション画面 (多くの場合は、1 つだけ) が次に表示されます。

このシナリオの例では、現行のマクロ画面は Screen1、現行のアプリケーション画面は「ISPF 基本オプション・メニュー」、入力は「3」と Enter キーです (表 9 を参照)。 このコンテキストでは、1 つのアプリケーション画面 (「ユーティリティー選択パネル (Utility Selection Panel)」) だけが次に表示されます。 したがって、有効な次画面のリストに追加する必要があるのは、1 つのマクロ画面の名前 (Screen2) だけです。

しかし、ちょっと待ってください。 「ISPF 基本オプション・メニュー」には、約 30 の入力が可能です (15 のオプション、6 つのメニュー選択項目、および 8 つのファンクション・キー)。 リストには、たった 1 つではなく、30 個のマクロ画面名があるはずです。

有効な次画面のリストに通常、1 つまたは数個の名前しかない理由は、なんらかの特定のタスクを達成することを目的とする一連の命令をマクロが実行していることです。Screen1 では、その命令の目的は、「ISPF 基本オプション・メニュー」から、「ユーティリティー選択パネル (Utility Selection Panel)」に切り替えることです。 この変更を行うために必要なアクションが実行され ('3[enter]')、予想されたアプリケーション画面が表示されるのをマクロ画面は待機します。

マクロ・ランタイムによる候補マクロ画面名の選択方法

このセクションでは、マクロ・ランタイムが、有効な次画面のリストに入れるマクロ画面名を選択する方法を説明します。 次の 2 つの場合があります。

最初のマクロ画面

マクロの再生が始まるときには、有効な次画面のリストは空です (一時画面を除く。一時画面を参照)。

最初に処理されるマクロ画面の候補を見付けるために、マクロ・ランタイムは、マクロ全体を検索し、入り口画面のマークが付いている各マクロ画面を見付け、これらのマクロ画面の名前をリストに追加します。

入り口画面の設定 (<screen> エレメントの属性) は、この目的のために存在し、最初に処理される画面として表示できるマクロ画面にマークを付けます。

マクロが記録されるときに、マクロ・オブジェクトは、デフォルトで、最初に記録されるマクロ画面だけに入り口画面のマークを付けます。 記録が完了した後、マクロ開発者は、任意のマクロ画面に入り口画面のマークを付けたり、マークを解除したりすることができます。複数の入り口画面が存在できます。

入り口画面については、入り口画面で詳しく説明しています。

入り口画面のマークが付いているマクロ画面がない場合、マクロ・ランタイムは、マクロ内のすべてのマクロ画面を、最初に処理されるマクロ画面の候補として使用します。

後続のマクロ画面

後続のマクロ画面 (最初のマクロ画面の直後の画面を含む) の場合、マクロ・ランタイムは、現行マクロ画面の <nextscreens> エレメントにリストされる候補マクロ画面の名前を見付けます。

このシナリオの例では、Screen1 が現行のマクロ画面であり、その <nextscreens> エレメントには、1 つのマクロ画面の名前 (Screen2) が含まれています (表 9 を参照)。 したがって、マクロ・ランタイムは、リストに Screen2 を追加します。

どんなに多くのマクロ画面名が <nextscreens> エレメントにリストされていても、マクロ・ランタイムは、すべての画面名を有効な次画面のリストに追加します。

マクロの記録時に、マクロ・オブジェクトが新しいマクロ画面の記録を開始すると、その新しいマクロ画面の名前 (例えば、Screen2) を、記録が終了したばかりのマクロ画面 (Screen1) の <nextscreens> エレメントに保管します。 したがって、記録されたマクロの各マクロ画面 (最後の画面を除く) は、<nextscreens> エレメントに保管されている 1 つのマクロ画面の名前を持ちます。

それ以降、マクロ開発者は、マクロ内の任意のマクロ画面の名前を、任意のマクロ画面の <nextscreens> エレメントに追加したり、そのエレメントから削除したりすることができます。

<nextscreens> エレメントの詳細については、有効な次画面で説明しています。

一時画面

一時画面は、マクロの任意のポイントで生じる画面であり、予期せず発生し、常にクリアする必要がある画面です。 一時画面の例は、無効な入力に応答して表示されるエラー画面です。

マクロ・オブジェクトは、マクロの記録時にマクロ画面に一時画面のマークを付けることはありません。 しかし、それ以降、マクロ開発者は、任意のマクロ画面に一時画面のマークを付けることができます。

マクロの再生が開始すると、マクロ・ランタイムはマクロを検索し、一時画面のマークが付いている各マクロ画面を見付け、各一時マクロ画面の名前を有効な次画面のリストに追加します。 これらの名前は、マクロ再生中、リストに存在します。

一時画面の詳細については、一時画面を参照してください。

画面認識 (ステップ 1(b))

このステップでは、マクロ・ランタイムが、有効な次画面のリストに名前が指定されているマクロ画面の 1 つを、現行のアプリケーション画面と一致させます。

このプロセスは、画面認識と呼ばれます。これは、マクロ・ランタイムが、リスト上のマクロ画面の 1 つを、セッション・ウィンドウに現在表示されているアプリケーション画面に対応するものとして認識するからです。

評価の概要

マクロ・ランタイムは、候補マクロ画面を、有効な次画面のリスト内にそれらの名前が表示されている順に評価します。

マクロ・ランタイムが、候補の 1 つがアプリケーション画面と一致することを検出すると、ただちに評価を停止し、リストから候補名を除去する次のステップ (ステップ 1(c)) に進みます。 一致する画面は、次に処理されるマクロ画面になります (ステージ 2)。

しかし、マクロ・ランタイムがリストに名前が指定された各マクロ画面を評価して、一致を検出しない場合、マクロ・ランタイムは、評価を一時的に停止し、セッション・ウィンドウが更新されるまでは何も実行しません。

評価のやり直し

マクロ・ランタイムが画面認識を続ける間、ホスト・アプリケーションは、新しいアプリケーション画面でセッション・ウィンドウの更新を続けます。 このシナリオの例では、ホスト・アプリケーションは、セッション・ウィンドウを更新して、「ユーティリティー選択パネル」を表示します (表 9 および 表 10 を参照)。 このプロセスには数百ミリ秒かかり、ホストから数パケット分のデータが必要になる場合があります。

この状況は、画面が更新されるまでマクロ・ランタイムが画面認識を一時的に停止する理由の説明になります。 画面認識が失敗した場合、新しいアプリケーション画面が不完全であることが理由である可能性があります。したがって、マクロ・ランタイムは待機します。

OIA 行が更新されるか、セッション・ウィンドウの表示スペースが更新されるたびに、マクロ・ランタイムは有効な次画面のリストを調べ、現行のアプリケーション画面との一致を見付けようとします。 一致が見付からない場合、マクロ・ランタイムは再び待機します。

マクロ・ランタイムは、画面認識が成功するまで、待機と再評価のサイクルを複数回実行する場合があります。

最終的に、必要な新しいアプリケーション画面に到達し、マクロ・ランタイムは、リストに名前が指定されたマクロ画面の 1 つを、新しいアプリケーション画面と一致させることができます。

マクロ画面がアプリケーション画面と一致するかどうかの判別

マクロ・ランタイムは、マクロ画面内の個々のディスクリプターを現行のセッション・ウィンドウと比較することによって、マクロ画面が現行のアプリケーション画面と一致するかどうかを判別します。

このシナリオの例では、マクロ・ランタイムは、有効な次画面のリストで名前 Screen2 を見付け、Screen2 を取り出し、そのディスクリプターを調べ、セッション・ウィンドウと比較します。

各マクロ画面には、1 つの <description> エレメントが含まれ、そのエレメント自体に 1 つ以上のディスクリプターが含まれています。 ディスクリプターは、true か false にすることができる、セッション・ウィンドウ (現在の状態のアプリケーション画面) についての事実のステートメントです。 このシナリオの例では、Screen2 には次の 3 つのディスクリプターが含まれています。

<description> エレメントに複数のディスクリプターがある場合、マクロ・ランタイムがディスクリプターを評価し (ブール true または false として)、それらの結果を 1 つの結果 (true または false) に結合するために使用するメソッドは、本書では記述されていない追加の構成情報によって決まります。

しかし、このシナリオの例では、Screen2 はデフォルトで構成されるので、マクロ・ランタイムは 3 つのディスクリプターをそれぞれ順に評価します。 3 つのすべてが true である場合、マクロ・ランタイムは、全体的な結果が true であり、Screen2 が現行のアプリケーション画面と一致するという結論を出します。

ディスクリプターの評価の詳細については、ディスクリプターの評価を参照してください。

2 つの認識機能

画面認識のタイムアウト設定

タイマーが切れる前に画面認識が行われないとマクロ・ランタイムがマクロを終了させる、タイムアウト値を設定できます (画面認識のタイムアウト設定を参照)。

認識限界

マクロ・ランタイムが認識カウントに相当する回数、マクロ画面 (例えば、ScreenA) を認識すると、マクロ・ランタイムにマクロを終了させるか、指定されたマクロ画面にジャンプさせる認識カウントを設定できます (認識限度 (「画面 (Screens)」タブの「一般 (General)」タブ)を参照)。

有効な次画面のリストからの候補マクロ画面の名前の除去 (ステップ 1(c))

画面認識が成功した後、マクロ・ランタイムは、ただちに次のタスクを開始します。このタスクは、有効な次画面のリストのクリーンアップです (ステップ 1(c))。

これは単純なステップです。 マクロ・ランタイムは、認識しているかどうかにかかわらず、すべての候補マクロ画面の名前を有効な次画面のリストから除去します。

リストに一時画面の名前が含まれている場合、それらの名前はリストに残ります (一時画面を参照)。

ステージ 2: 選択された候補を新しい現行マクロ画面にする

ステージ 2 は単純です。 ステージ 2 では、マクロ・ランタイムは、選択された候補を新しい現行マクロ画面にします。

このシナリオの例では、マクロ・ランタイムが、Screen2 を新しい現行マクロ画面にします。 セッション・ウィンドウは、新しいアプリケーション画面 (「ユーティリティー選択パネル」) を表示します (表 9 および 表 10 を参照)。

マクロ・ランタイムは、ただちにステージ 3 を開始します。

ステージ 3: 新しい現行マクロ画面のアクションを実行する

ステージ 3 では、マクロ・ランタイムは、新しい現行マクロ画面の <actions> エレメント内のアクションを実行します。 新しい現行マクロ画面に <actions> エレメントが含まれていない場合、または <actions> エレメントが空である場合、マクロ・ランタイムはこのステージをスキップします。

各マクロ画面には、通常、実行される 1 つ以上のアクションを含む <actions> エレメントが含まれています。 アクションは、なんらかのアクティビティー (セッション・ウィンドウへの一連のキーの送信、ポップアップ・ウィンドウでのユーザーへのプロンプトの表示、画面からのテキスト・ブロックの取り込みなど) を起こす命令です。

このシナリオの例では、Screen2 には次の 1 つのアクションしか含まれていません。

Screen2 には、正しい入力フィールドにテキスト・カーソルを置くアクションは必要ありません。これは、「ユーティリティー選択パネル」が自動的にテキスト・カーソルをその位置に置くからです。

<actions> エレメントに複数のアクションが含まれている場合、マクロ・ランタイムは、<actions> エレメントに指定される順に、各マクロ・アクションを実行します。

アクションの詳細については、マクロ・アクションを参照してください。

アクション後の遅延の挿入

マクロ・ランタイムは人間のユーザーよりはるかに迅速にアクションを 実行するので、マクロの再生中に予測しない問題が発生し、 アクションが予想通りに実行されない可能性があります。 この原因は、前のアクションへの依存関係が生じることです。

このタイプの問題を避けるために、マクロ・ランタイムは、各マクロ画面のすべての入力アクション やプロンプト・アクションの後に 150 ミリ秒の遅延を、すべてのマクロ画面の最後のアクションの 後に 300 ミリ秒の遅延をデフォルトで挿入します (アクション間の休止 (「マクロ (Macro)」タブ)を参照)。

この機能を使用可能なままにしてください。ただし、必要な場合は使用不可にすることができます。 遅延を 150 ミリ秒および 300 ミリ秒から他の値に変更できます。

必要に応じて、特定のマクロ画面の遅延期間を変更することもできます (休止時間の設定 (「画面 (Screens)」タブの「一般」タブ)を参照)。

また、特定のアクションに対して、アクション後に休止アクションを追加することによって、遅延を増やすこともできます (休止アクション (<pause> エレメント)を参照)。

処理サイクルの繰り返し

マクロ・ランタイムが現行マクロ画面の <actions> エレメント内のすべてのアクションを実行した後、マクロ・ランタイムは、新しい現行マクロ画面の <nextscreens> エレメントにリストされている候補マクロ画面を使用して、ステップ 1(a) からただちに処理サイクルを再開します。

マクロの終了

マクロ・ランタイムは、出口画面のマークが付いているマクロ画面の処理を終了すると、マクロを終了します。

このシナリオの例では、Screen2 に出口画面のマークが付けられています (表 10 を参照)。

出口画面の設定 (<screen> エレメントの属性) は、この目的のために存在し、マクロを終了するマクロ画面にマークを付けます。

マクロが記録されるときに、マクロ・オブジェクトは、デフォルトで、最後に記録されるマクロ画面に出口画面のマークを付けます。 記録が完了した後、マクロ開発者は、任意のマクロ画面に出口画面のマークを付けたり、マークを解除したりすることができます。複数の出口画面が存在できます。

出口画面については、出口画面で詳しく説明しています。