プロパティー

プロパティーは、EGL がパーツ、変数、または文に関する具体的な情報をエンコードするために使用する「名前/値」のペアです。EGL はこうしたプロパティーをさまざまな方法で内部的に定義しますが、EGL プログラマーが知っておく必要がある重要な特徴は多くはありません。
  • シンプル・プロパティー は生成時に EGL に情報を通知するもので、動的に (つまり実行時に) 変更することはできません。シンプル・プロパティーには、value という単一のフィールドのみが含まれています。 以下のように、省略表現を使用して単にプロパティー名と値の設定ブロック内の該当する値を同等と見なすことによって、 このフィールドを設定することができます (値の設定ブロックを参照)。 以下の例では、displayName はシンプル・プロパティーです。
    DataItem socSecNum INT {
       displayName = "Social Security Number"} 
    end
  • 複合プロパティー も、生成時に EGL に情報を通知するものであり、実行時に変更することはできません。 複合プロパティーとシンプル・プロパティーが異なっているのは、複合プロパティーにはフィールドが 1 つだけではなく、複数あるという点だけです。これらの名前と値の各ペアを、プロパティー・フィールド と呼びます。 複合プロパティーの前には、オペランドがフィールドではなく、プロパティーであることを示す単項 @ 演算子がよく付けられています (@ 演算子を参照)。このトピック内の『複合プロパティー』も参照してください。
  • 暗黙フィールド は、プロパティーに良く似た名前値のペアですが、ビルド時はコンパイラーには不可視です。通常、こうした暗黙フィールドは、実行時に変更可能です。EGL はこれらの暗黙フィールドを、例外レコードなどの特定のステレオタイプのパーツに自動的に追加します (例外ステレオタイプを参照)。
  • コンソール UI には「疑似プロパティー」もあります。シンプル・プロパティーのように、疑似プロパティーは変数の特定の型を宣言するときに指定できる名前値のペア (ConsoleField など) です。シンプル・プロパティーとは異なり、生成時の効果はありません。 こうした疑似プロパティーは通常は実行時に変更可能ですが、読み取り専用のものも一部存在します。 詳しくは、個々の UI テクノロジーについてのトピックを参照してください。

この文書では「プロパティー」という用語を、上記すべてを指す広い意味で使用します。

これらのプロパティーは値の設定ブロックで設定することができます。値の設定ブロックについては、値の設定ブロックで詳しく説明します。 特定のパーツまたは文で使用可能なプロパティーおよび値について詳しくは、それらのパーツおよび文に関する個々のプロパティーのトピックを参照してください。

有効なプロパティー・セットは、コンテキストによって変化します。
  • 各タイプのパーツは、一連のプロパティーを定義します。 これらのプロパティーを変更して、パーツの特性を変更できます。 例えば、個々のプログラム・パーツには、コンパイル可能単位の名前を示す alias というプロパティーがあります。

    パーツがステレオタイプ化されている場合、そのパーツだけでなく、パーツ内のフィールドに対しても、 追加プロパティーが使用可能です (ステレオタイプを参照してください)。詳しくは、ステレオタイプがそのパーツを特殊化する固有のデータ・アクセスまたは UI テクノロジーを参照してください。

  • 一部の変数宣言では、関連するパーツ定義の中で指定されていたプロパティーをオーバーライドできますが、 それは、コンテキストの中でそのプロパティーが重要である場合に限られます。
    • プロパティーのオーバーライドは、DataItem パーツに基づいた変数を宣言するときに可能です (DataItem パーツを参照)。 次の定義を例に挙げます。
        DataItem IDNumber CHAR(9) 
        {
          minimumInput = 9,         // 9 文字の入力が必要
          isDecimalDigit = yes, // 数字でなければならない
          column = "SSN"    // 列へ関連付けられている
        }
        end
      次の文は、IDNumber 型の UI フィールドを宣言しますが、 この文はユーザーによる数字入力を必要としません。
        myID IDNumber { isDecimalDigit = no }; 

      この例では、オーバーライドは minimumInputcolumn プロパティーには影響しません。

    • レコード・パーツなどのコンポジット・パーツのプロパティーをオーバーライドできます。次の例は、単一フィールドのレコードを定義したものです。
      Record TestRecord
        y int {color = red};
      end
      この定義に基づいて変数を宣言する場合、以下のように、color プロパティーの値を指定変更することができます。
      myRec TestRecord {y{color = black}};
  • プリミティブ型の変数を宣言するときに、変数宣言のコンテキスト内で使用できる任意のフィールド・レベル・プロパティーを設定できます。
  • レコード変数を宣言する場合は、パーツの定義時には設定できない redefines プロパティーを割り当てることができます。 このプロパティーの詳細については、『他のレコード変数を再定義するレコード変数の宣言』を参照してください。

実行時にシンプル・プロパティーまたは複合プロパティーにアクセスすることはできません。(暗黙フィールドにはアクセスできます。) 例えば、リレーショナル・データベース・レコード用にステレオタイプ化された変数を作成する場合、 レコードがアクセスするデータベース表を識別する tableNames プロパティーに 割り当てられた名前の取り出しや変更を行う論理を作成することはできません。 変数宣言の中でプロパティー値をオーバーライドしたとしても、プログラム・ロジックで開発時に指定した値を変更することはできません。

そうしたプロパティー値へのランタイム・アクセスが行われないことは、変数の内容を代入したり、 その変数をパラメーターとして使用したりするときに、プロパティー値が内容と一緒に転送されないことを意味します。 同様に、レコードを EGL 関数に渡す場合、パラメーターはフィールド内容を受け取りますが、 開発時に割り当てられていたプロパティーは保存します。 つまり、関数からはプログラムがレコード・プロパティーに対して行った指定変更を識別することができません。

変数名とプロパティー

EGL 変数の名前をプロパティーに割り当てた場合は、変数名を直接使用します (名前を引用符で囲みません。引用符はリテラル文字列を示します)。以下のプロパティーについて、この規則を忘れずに適用してください。
基本プログラム
inputRecord
JSF ハンドラー・ステレオタイプ
onConstructionFunctioninitialUI 配列要素。
Rich UI ハンドラー・ステレオタイプ
onConstructionFunctionvalidationByPassFunctionsvalidatorFunctionviewRootVar
SQLRecord ステレオタイプ
keyItems
その他のプロパティー
msgFieldnumElementsItemselectedIndexItemselectedRowItemselectedValueItem selectFromListItemvalidatorDataTablevalidatorFunctionredefines

複合プロパティー

場合によっては、(一連のプロパティー・フィールドで構成された) 複合プロパティーを割り当てることによって生成特性を指定することができます。以下の例では、EGL サービスを宣言し、サービスへのアクセス提供に必要な詳細を含んでいる xml 複合プロパティーを定義します。
myService ExampleService {
   @xml {
      name="HelloWorld",
      namespace="http://my.website/services"} }
...
end

実行時に、複合プロパティーやそのプロパティー・フィールドにアクセスすることはできません。

代入とプロパティー

プロパティーは、ある値変数を他の値変数に代入する場合には、移動を行いません。 次のシナリオを例に挙げてみます。
  myVar1 INT {color = red} = 5;
  myVar2 INT {color = blue} = 2;

  myVar1 = myVar2;

代入後、myVar1 の値は 2、色は赤になります。

変数を引数として関数に渡す場合も、同様になります。 関数は変数の値を受け取りますが、そのプロパティーの内容は受け取りません。

参照変数の振る舞いは異なります。プロパティーを参照変数に代入する場合、これらのプロパティーを変数が示すオブジェクトに代入します。代入後、2 番目の参照変数は、同じオブジェクトを指します。 参照変数の割り当てを次の例で示します。
myDictionary1 Dictionary { caseSensitive=NO };
myDictionary2 Dictionary { caseSensitive=YES };

myDictionary1 = myDictionary2;

代入後は、myDictionary1 は、同じ Dictionary パーツである myDictionary2 として示されるので、myDictionary1 が大/小文字を区別するようになります。