最近のアクセス:
インライン式

インラインとは、オブジェクトのコード内 (例: プロシージャーのソースの途中、オブジェクトのサブルーチン内、データプロバイダーのステートメント内など) で定義するローカルの式のことです。
つまり、式は項目属性または変数に対して、コードの途中や Where 節などで文 (ステートメント) としてローカルで割り当てることができます。
{{<variable>|<attribute>= <UnconditionalFormula>} | <UnconditionalFormula>
インライン式 <UnconditionalFormula>Horizontal でも Aggregate でもかまいません。グローバル式との主な違いは、インライン式は複数の条件式から構成されることはなく、単一の条件式から構成されることさえありません。さらに、ほかのインライン式と同様に、エクスプレッションに変数が含まれている可能性があります (この式は、変数が既知であるローカルなコードにしか存在しないからです。一方、グローバル式がトリガーされる場所は、すべて把握することはできません。これが「グローバル」の意味です。対応するベーステーブルの項目属性が許容される場所であれば、どこでも使用できます)。
グローバル式にはコンテキストに必ずテーブル (仮想でない場合に式項目属性が格納されるテーブル) があるのに対し、インライン式では必ずしも必要ありません。対象となるのはどのような種類の式でしょうか。コンテキストを評価する必要がないものには、Aggregate 式があります。

コンテキストはなぜ意味があるのか

計算結果に影響を与え、考慮されるデータにフィルタリング条件を追加できるためです。

ある国/都市から別の国/都市への実際のフライトを格納する FlightInstance トランザクションと、フライトの乗客を格納する FlighInstanceSeat という第 2 階層があるとします。あるプロシージャーでは該当するテーブル内の乗客に既に 100 席より多く割り当て済みかを最初に知る必要があるとしましょう。
   &success = Count( FlightInstancePassengerSeatNumber ) > 100
この場合は、式のコンテキストテーブルはありません。単独にトリガーされ、ベーステーブル (FlightInstanceSeat) のすべてのレコードをカウントします。格納されているすべてのフライトインスタンスについて、すべての乗客をカウントします。
これに対して、次のように、上記のコードが for each コマンドの内部にあるとします:
   for each FlightInstance
   where Count( FlightInstancePassengerSeatNumber) > 100
      print flightInstanceInfo //FlightInstanceNumber, FlightInstanceDate
   endfor
この式にはコンテキストがあります: FlightInstance テーブル (For each のベーステーブル)。このため、すべての乗客の座席をカウントするのではなく、各 for each の反復処理で考慮される各 FlightInstance レコードに対応するものだけがカウントされます。したがって、乗客が 100 人以上のフライトだけが出力されます。
グローバル式の項目属性 FlightInstanceNumberOfPassengers を FlightInstance トランザクションレベルで定義した場合、次のように定義したことと同じになります:
   for each FlightInstance
   where FlightInstanceNumberOfPassengers > 100
      print flightInstanceInfo //FlightInstanceNumber, FlightInstanceDate
   endfor
さらに、コンテキストテーブルがある場合、その拡張テーブルのすべての項目属性を、既知として式の中で使用できます。たとえば、&fromDate 変数が事前にロードされているとします:
   for each FlightInstance
   where Count( FlightInstancePassengerSeatNumber, FlightDate >= &fromDate) > 100
      ...
   endfor

horizontal であるインライン式にはコンテキストテーブルが必ずあります: 少なくとも固有のベーステーブルがあります。Horizontal グローバル式とまったく同じです。このため、項目属性が値をとることができるコンテキストなしでは指定できません。
例:
   &age = &today.Year() - PassengerBirthDate.Year()
この割り当てだけでは不適切です。この場合の乗客の誕生日とは何でしょうか。次の割り当ての場合は状況が異なります:
for each FlightInstanceSeat
    &age = &today.Year() - PassengerBirthDate.Year()
   ...
endfor
この場合、GeneXus は、乗客が各「for each」で反復されるもの、つまり都度配置される for each のベース テーブル レコードに関連付けられているものと推論します。for each は、座席に割り当てられている乗客を格納しているテーブルをナビゲートします: FlightInstanceSeat。この場合、コンテキストテーブル FlightInstanceSeat は、式のベーステーブルである Passenger と同一ではありませんが、前者の拡張テーブルに後者が含まれます。
このように、インライン式は、そのコンテキストに応じて定義できます:

動画

イメージ:20668.png Inline formulas



サブページ
Created: 14/09/18 03:19 by Admin Last update: 22/04/05 18:20 by Admin
カテゴリ
Powered by GXwiki 3.0