Horizontal 式でエクスプレッション (演算またはその他の種類) を定義できます。
式が Horizontal (Aggregate ではない) であるとは、関係する項目属性が 1 つの拡張テーブルに属するということです。
例:「FlightInstancePrice = FlightPrice * 0.9」では、FlightInstancePrice が FLIGHTINSTANCE テーブル (図のテーブル A) 内の項目属性であり、FlightPrice は FLIGHT テーブル (図のテーブル B) 内にあり、フライトインスタンスごとに 1 つのフライトのみが関連付けられています (つまり、FLIGHT は FLIGHTINSTANCE 拡張テーブルに属する )。
Horizontal 式はグローバル (トランザクション構造レベルで項目属性に割り当て、その項目属性が常に計算結果をとるように指定します) でも、ローカル (またはインライン。項目属性、変数、データプロバイダーのエレメント、SDT などに割り当てるか、または実行時に評価される条件の一部にします) でもかまいません。つまり、次のようになります:
Horizontal グローバル式: <attribute> = <horizontalConditionalFormula>
Horizontal インライン式: {{<variable>|<attribute>} = <horizontalUnconditionalFormula>} | <horizontalUnconditionalFormula>
グローバルとインラインの主な違いは、インラインの Horizontal 式が単にエクスプレッションであるのに対して、グローバルな Horizontal 式の場合は複数の条件式で構成されることがある点です。さらに、ほかのインライン式と同様に、エクスプレッションに変数が含まれている可能性があります (この式は、変数が既知であるローカルなコードにしか存在しないからです。一方、グローバル式がトリガーされる場所は、すべて把握することはできません。これが「グローバル」の意味です。対応するベーステーブルの項目属性が許容される場所であれば、どこでも使用できます)。
「Horizontal インライン式」はエクスプレッションと同じ意味です。エクスプレッションを記述できる場所では、Horizontal 式を記述することになります。そのため、「インラインの Horizontal 式」という概念はあまり生産的ではありません。項目属性が常にその方法で計算される「グローバルな Horizontal 式」の場合とは異なります。
Aggregate 式では評価するコンテキストは必要ありませんが、Horizontal 式では必要です。これを理解できるように、次に 2 つの例を示します。
<horizontalConditionalFormula>::= <exp>1 [ if <cond>1 ] [ ;<exp>2 [ if <cond>2 ] ] [ ;<exp>n [ otherwise | if <cond>n ] ]
<horizontalUnconditionalFormula>::= <exp>
入力値の説明:
<exp>n には任意の有効なエクスプレッションを使用できます。次のものを含めることができます:
- 項目属性 (式でナビゲートされるテーブルとその拡張テーブルから取得。式の項目属性自体の場合もあります)
- 変数 (グローバル式の場合はシステム変数のみ。インライン式の場合は、システム変数とユーザー定義変数の両方です (オブジェクトで定義済みの場合))
- 定数
- 関数、メソッド、およびプロパティ
- 算術演算子 (+、-、*、/、^)
- 文字列演算子 (+)
- 日付演算子 (+、-)
- 比較演算子 (<、<=、=、>、>=、>、like) (エクスプレッションが Boolean データタイプの場合)
- 論理演算子 (and、or、not) (エクスプレッションが Boolean データタイプの場合)
<cond>n には任意の有効なトリガー条件を使用できます。次のものを含めることができます:
- 項目属性 (式でナビゲートされるテーブルとその拡張テーブルから取得)
- 定数
- 関数、メソッド、およびプロパティ
- 論理演算子 (and、or、not)
- 比較演算子 (>、<、=、>=、<=、like)
Horizontal 式で返される結果は、True を返す最初の条件に関連するエクスプレッションになります。ほかのものは評価されません。
<otherwise>: 評価されたトリガー条件のいずれも True を返さない場合、式の定義に Otherwise 節が含まれていれば、返される結果はこの節と関連付けられているエクスプレッションになります。
スマートデバイスのクライアント側イベント文法では、サーバー側で実行されるイベントに関する制約があります。そのため、許可されるインライン式は、Horizontal (Aggregate は許可されません) だけでなく、上記で説明したような縮小されたセットも含まれます。
Flight
{
FlightId*
FlightDescription
FlightPrice
}
FlightInstance
{
FlightInstanceNumber*
FlightId
FlightDescription
FlightPrice
FlightInstanceNumberOfPassengers
FlightInstancePrice = FlightPrice if FlightInstanceNumberOfPassengers <= 100;
FlightPrice * 0.9 if FlightInstanceNumberOfPassengers > 100 and FlightInstanceNumberOfPassengers < 200;
FlightPrice * 0.8 otherwise;
FlightInstanceTotal = FlightInstanceNumberOfPassengers * FlightInstancePrice;
}
FlightInstancePrice 項目属性と FlightInstanceTotal 項目属性は両方とも Horizontal 式です (この例では、関連付けられた計算が示されています)。これらはすべてグローバル式です。
FlightInstancePrice の定義を確認してください。これに関連付けられたテーブルは FLIGHTINSTANCE (物理的に格納されている場合に項目属性が属するテーブル) です。式項目属性は FLIGHTINSTANCE 拡張テーブル (つまり、FLIGHTINSTANCE テーブルと FLIGHT テーブル) に属します。3 つの条件式として定義されていることに注意してください。次に示す例では、インラインの場合の同じ定義を説明しています。
FlightInstanceTotal のベーステーブルも FLIGHTINSTANCE ですが (FLIGHTINSTANCE 拡張テーブルに属する項目属性を使用)、その定義には条件が付きません。
どちらの場合も、式には FlightInstance の第 1 レベルトランザクションというコンテキストがあります。別々に定義されてはいません。
次の画像は、GeneXus トランザクションエディターで編集中の FlightInstance トランザクションと、GeneXus 式エディターで編集中の FlightInstancePrice Horizontal 式の項目属性を示しています。
フライトインスタンスの価格が式項目属性として計算されておらず、プロシージャーコード内で必要な場合は、次のように記述します。
Do case
case FlightInstanceNumberOfPassengers <= 100
&price = FlightPrice
case FlightInstanceNumberOfPassengers > 100 and FlightInstanceNumberOfPassengers < 200
&price = FlightPrice*0.9
otherwise
&price = FlightPrice*0.8
endcase
厳密に言えば、ここには 3 つのエクスプレッション、つまり 3 つのインライン式があります。このコードは、FlightInstance テーブルに置かれているコンテキストでのみ意味をなします。そのため、このコードブロックはその適切なコンテキスト内にある必要があります。
インライン式を、項目属性の定義レベルの外部で項目属性に割り当てることがあります。次のようなプロシージャーソース内にある場合:
For each order FlightInstanceNumber
Do case
case FlightInstanceNumberOfPassengers <= 100
FlightInstancePrice = FlightPrice
case FlightInstanceNumberOfPassengers > 100 and FlightInstanceNumberOfPassengers < 200
FlightInstancePrice = FlightPrice*0.9
otherwise
FlightInstancePrice = FlightPrice*0.8
endcase
endfor
ここでは式の評価結果を項目属性 FlightInstancePrice にローカルに割り当てています。これ自体は式ではなく、(ほかのものと同様に) 通常の項目属性です。このコード内でのみ、このように計算されます。
これまで説明したように、式を意味のあるものにするには、拡張テーブルを使用してすべての式項目属性に到達するテーブルに配置されたコンテキスト内にあることが必要です。そのため、同じ式が存在すると、このコンテキストテーブルの特定にも影響します。
たとえば、コンテキストとして for each があるとします:
for each order FlighPrice
&total = &total + FlightInstanceNumberOfPassengers * FlightInstancePrice
endfor
エクスプレッション (式) の項目属性のため、この for each ベーステーブルは FLIGHT ではなく FLIGHTINSTANCE です。
|