openUI

openUI 文を使用すると、コンソール UI に基づくインターフェースを備えたプログラムと対話できます。 この文では、ユーザー・イベントおよびプログラム・イベントを定義し、互いに応答する方法を指定します。

exit openUI 文を発行することによって、openUI 文を終了することができます。

構文

openUI 文の構文
OpenAttributes
それぞれがコンマで区切られた、一連のプロパティーと値のペア。 各プロパティーは、ユーザーとの対話に影響し、場合によっては、OpenableElements の変数のプロパティーを上書きします。 これらのプロパティーについて詳しくは、openUI のプロパティーを参照してください。
OpenableElements
openUI 文が機能することができる ConsoleUI 変数は、次のとおりです。
  • ConsoleForm
  • consoleField、または以下のいずれか:
    • それぞれがコンマで区切られた ConsoleField のリスト
    • consoleForm で宣言され、かつその consoleForm 内の consoleField のセットを参照する dictionary
    • consoleForm で宣言され、かつその consoleForm 内の consoleField 配列のセットを参照する arrayDictionary
  • Menu
  • Prompt
  • ウィンドウ
BindClause
ConsoleUI 変数とバインドされているプリミティブ変数、レコード、または配列のリスト。 バインディング変数の特性は、openUI 文の動作対象となる consoleUI 変数の特性によって異なります。
  • consoleField に対して、プリミティブ変数を指定できます。
  • 画面内の arrayDictionary に対して、arrayDictionary 内で 1 行ごとに 1 要素がある、レコードの配列を指定できます。 また、arrayDictionary 内の各行が単一の値を表す場合は、プリミティブ変数の配列を指定することができます。
  • 辞書、または consoleField のリストに対して、プリミティブ変数のリストを指定できます。 あるいは、consoleField にバインドされている一連のフィールドが各要素に格納されている、レコードの配列を指定することができます。 この代替方法は、動的配列を、1 行だけしか持たない画面内の arrayDictionary とバインディングすることと同等です。 動的配列を変更するためにレコードの追加、挿入、または削除を行うことができ、いずれの場合も、一度に 1 つのレコードだけ表示されます。
  • プロンプトに対して、ユーザーの応答を受け取るプリミティブ・フィールドを指定できます。

バインディングについて詳しくは、トピック『コンソール UI パーツおよび関連する変数』のほか、 『OnEventBlock パラメーター』の説明を参照してください。

OnEventBlock
イベント・ブロック は、多くのそれぞれが特定のイベントに対する応答を含んでいるイベント・ハンドラー に対して 0 を含むプログラミング構造です。 イベント・ハンドラーは、以下のように、onEvent ヘッダーで開始します。
  onEvent(eventKind: eventQualifiers)
eventKind
いくつかのイベントの 1 つ。有効な値については、イベント・タイプで説明されています。
eventQualifier
イベントをさらに定義するデータ。このようなデータは、入力される ConsoleField か、または押されたキー・ストロークになることがあります。

特定のイベントに応答する EGL 文は、後述の例に示すとおり、OnEvent ヘッダーとその次の OnEvent ヘッダーの間にあります (存在する場合)。 ただし、参照変数をプログラムのグローバル変数として宣言しておいた場合以外は、onEvent ブロックにその変数を組み込むことはできません。

ユーザーは引き続きプログラムと対話し、そのイベント・ハンドラーに関連付けられている イベントが発生すると、プログラムはイベント・ハンドラーを実行します。 ただし、プロンプトを表示することが openUI 文の目的である場合、このユーザーとプログラムの対話は、以下のように完全なループとはいえなくなります。
  1. イベント・ハンドラー (いくつかのうちの 1 つの場合もある) が、ユーザーのキー・ストロークをトラップし、応答する
  2. openUI 文が終了する

ウィンドウに使用可能なイベント・ブロックはありません。

イベント・タイプ

ConsoleUI は、すべてのモードについて、以下のイベントをサポートします。
BEFORE_OPENUI
EGL ランタイムは、openUI 文を実行し始めます。このイベントは、 ウィンドウに基づいた変数以外のすべての ConsoleUI 変数に使用可能です。
AFTER_OPENUI
EGL ランタイムは、openUI 文の実行を停止しようとしています。このイベントは、 ウィンドウに基づいた変数以外のすべての ConsoleUI 変数に使用可能です。
ON_KEY:(ListOfStrings)
ユーザーは、「ESC」、「F2」、または「CTRL_W」などのストリングで示される特定のキーを押しています。 ストリングをそれぞれ、次の例で示すように区切ることによって、複数のキーを識別することができます。
  ON_KEY:("a", "ESC") 

このイベントは、ArrayDictionary、 ConsoleField、メニュー、またはプロンプトで使用可能です。

BEFORE_FIELD:(ListOfStrings)
ユーザーは、ConsoleField の name フィールドの値に一致するストリングによる指示のとおりに、カーソルを特定の ConsoleField に移動させます。 ストリングをそれぞれ、次の例で示すように区切ることによって、同じ consoleForm の複数の ConsoleField を識別することができます。
  BEFORE_FIELD:("field01", "field02") 
AFTER_FIELD:(ListOfStrings)
ユーザーは、ConsoleField の name フィールドの値に一致するストリングによる指示のとおりに、 カーソルを特定の ConsoleField から移動させます。 ストリングをそれぞれ、次の例で示すように区切ることによって、同じ consoleForm の複数の ConsoleField を識別することができます。
  AFTER_FIELD:("field01", "field02") 
BEFORE_DELETE
画面内の arrayDictionary との関連で、ユーザーが consoleLib.key_deleteLine に指定されているキーを押しましたが、 EGL ランタイムはまだその行を削除していません。 プログラムは、行の削除を回避するため、consoleLib.cancelDelete を呼び出すことができます。
BEFORE_INSERT
画面内の arrayDictionary との関連で、ユーザーが consoleLib.key_insertLine に指定されているキーを押しましたが、 EGL ランタイムはまだ行を挿入していません。 プログラムは、行の挿入を回避するため、consoleLib.cancelInsert を呼び出すことができます。
BEFORE_ROW
画面内の arrayDictionary に関して、ユーザーはカーソルを行に移動しました。
AFTER_DELETE
画面内の arrayDictionary との関連で、ユーザーが consoleLib.key_deleteLine に指定されているキーを押し、EGL ランタイムは行を削除しました。
AFTER_INSERT
画面内の arrayDictionary との関連で、ユーザーが consoleLib.key_insertLine に指定されているキーを押し、EGL ランタイムは行を挿入しました。 カーソルは、挿入された行に置かれています。

ユーザーは、AFTER_INSERT ハンドラーで一般に行われるように、データベースへの変更をコミットする前に行を編集することができます。

AFTER_ROW
ユーザーは、カーソルを画面内の arrayDictionary にある行から移動させました。
MENU_ACTION:(ListOfStrings)
ユーザーが、「menuItem 名 (menuItem name)」フィールドの値に一致するストリングが示すように、menuItem を選択しました。 ストリングをそれぞれ、次の例で示すように区切ることによって、複数の menuItem を識別することができます。
  MENU_ACTION:("item01", "item02") 
ConsoleUI は、RCP モードについてのみ、以下のイベントをサポートします。詳しくは、コンソール UI ウィジェットを参照してください。
PUSHED: buttonName
ユーザーが buttonName をクリックしたとき。
SELECTION_CHANGED: comboBoxName | radioGroupName
ユーザーが comboBoxName、または radioGroupName のメンバーをクリックしたとき。
STATE_CHANGED: checkBoxName
ユーザーが checkBoxName をクリックしたとき。

isConstruct

isConstruct プロパティーを YES に設定すると、個々のフィールドが変数にバインドされるのではなく、openUI ステートメント全体が変数にバインドされます。 EGL は、ステートメントをバインドしたストリングを使用して、SQL の WHERE 文節の内容を保持します。以下に例を示します。
  1. openUI ステートメントが、3 つの ConsoleField (従業員、年齢、および市区町村) を持つ ConsoleForm を対象として機能し、各フィールドは、同じ名前の SQL テーブル列と関連付けられています。

    SQLColumnName consoleField プロパティーを設定することで、consoleField を SQL テーブル列に関連付けます。また、dataTypeに記されているように dataType consoleField プロパティーを設定する必要があります。

  2. ユーザーが以下のアクションを実行します。
    • 従業員フィールドはブランクのままにします。
    • 年齢フィールドに以下のように入力します。
        > 25
    • 市区町村フィールドに以下のように入力します。
        = 'Sarasota'
  3. openUI 文が機能する画面内の変数をそのままにする場合、バインドされている変数は次のようなコンテンツを受信します。
      AGE > 28 AND CITY = 'Sarasota'

表示されているように、EGL はユーザーが提供する各文節の間に演算子 AND を置きます。

次の表は、有効なユーザーの入力およびそれによる文節を示しています。「単純な SQL 型」という句は、構造化もされず、LOB のような型でもない SQL の型を指しています。

シンボル 定義 サポートされるデータ型 結果としてできた文節 (C という名のストリング用) 結果としてできた文節 (C という名の数列用)
= 等しい 単純な SQL 型 =x、==x C = 'x' C = x
> より大きい 単純な SQL 型 >x C > 'x' C > x
< 未満 単純な SQL 型 <x C < 'x' C < x
>= 以上 単純な SQL 型 >=x C >= 'x' C >= x
<= 以下 単純な SQL 型 <=x C <= 'x' C <= x
<> または != 等しくない 単純な SQL 型 <>x または !=x C != 'x' C != x
.. 範囲 単純な SQL 型 x.y または x..y C BETWEEN 'x' AND 'y' C BETWEEN x AND y
* ストリングのワイルドカード (次の表に説明のとおり) CHAR *x または x* または *x* C MATCHES '*x' 適用不可
? 単一文字のワイルドカード (次の表に記載のとおり) CHAR ?x、x?、?x?、 x?? C MATCHES '?x' 適用不可
| 論理 OR 単純な SQL 型 x|y C IN ('x', 'y') C IN (x, y)

等号 (=) は「null 値を持つ」ことを意味する場合があり、不等号 (!= または <>) は「null 値を持たない」ことを意味する場合があります。

MATCHES 文節は、次の表に記載のワイルドカード文字の 1 つをユーザーが指定することによって作られます。

シンボル 結果
* ゼロ個以上の文字に一致します。
? 任意の単一文字に一致します。
[ ] 囲まれた文字の内、いずれか一字に一致します。
- (ハイフン) 大括弧内の文字間で使用される場合、ハイフンは、2 つの文字の間の範囲で (2 つの文字を含む) いずれかの文字に一致します。 例えば、[a-z] は、いずれかの小文字または小文字の範囲の特殊文字に一致します。
^ 大括弧で使用されると、最初のキャレットは、大括弧内に含まれない、いずれかの文字と一致します。 例えば、[^abc] は a、b、または c を除くいずれかの文字と一致します。
\ デフォルトのエスケープ文字です。次の文字はリテラルです。 ストリングに含まれるすべてのワイルドカード文字からワイルドカードの効果を除くことができます。
大括弧の外のその他すべての文字 正確に一致する必要があります。

ユーザーとコンソール書式との間での対話の手引きとして、以下の例を検討します。
		openUI {bindingByName=yes}
			 activeForm
			 bind firstName, lastName, ID
			 OnEvent(AFTER_FIELD:"ID")
				  if (employeeID == 700)
        firstName = "Angela";
        lastName = "Smith";
				  end
  end
このコードは以下のアクションを実行します。
  • アクティブ ConsoleForm (アクティブ・ウィンドウに最近表示された consoleForm) を開く
  • プリミティブ変数のセットを各 ConsoleField にバインドする
  • ユーザーが employeeID フィールドに値を入力し、次のフィールドに移動した後、EGL が他の 2 つの変数にストリングを置くことを指定する
上記の例については、以下の詳細に注意してください。
  • カーソルは、リストされている consoleField の先頭から始まりますが、他のフィールドのユーザー入力がイベント・ハンドラーによって消されないように、ID フィールドからカーソルを開始する必要があります。
  • イベント・ハンドラーは、firstName および lastName の consoleField にバインドされている変数を更新しますが、 カーソルがそれらのフィールドに入るまで、それらの変数値を表示させません。 これらの値をその前に表示させたい場合があります。

フィードバック