最近のアクセス:
Aggregate 式

Aggregate (集計) により、テーブルの多くのレコード (および拡張テーブルを使用して関連付けられたレコード) を含める、いくつかのタイプの計算や検索を定義できます。
イメージ:25295.jpg
これには次のものがあります:
たとえば、次のトランザクションがあるとします:
FlightInstance {    //トランザクション名
   FlightInstanceId*
   FlightInstanceDate
   FlightInstanceNumberOfPassengers
   FlightNumber
   FlightDescription
      Seat {       //フライトの乗客を格納しておくためのトランザクションレベルの名前
         PassengerId*
         PassengerName
         FlightInstancePassengerSeatNumber}
プロシージャー内で次のように記述できます:
&NumberOfPassengers = Count( FlightInstancePassengerSeatNumber, FlightInstanceDate = &importantDate and PassengerType = 'Premium')
FLIGHTINSTANCE テーブル (図のテーブル B) の関連する FlighInstanceDate&importantDate ローカル変数の値と同じで、PASSENGER テーブル (図のテーブル D) の関連する Passenger が 'Premium' タイプである FLIGHTINSTANCESEAT テーブル (図のテーブル A) のすべてのレコードをカウントします。このようにして、プレミアムな乗客用として &importantDate に確保されている座席の合計数を取得します。 
Aggregate はグローバル (トランザクション構造レベルで項目属性に割り当て、その項目属性が常に計算結果をとるように指定します) でも、ローカル (またはインライン。項目属性や変数、データプロバイダーのエレメント、SDT などに割り当てるか、または実行時に評価される条件の一部にします) でもかまいません。つまり、次のようになります:
Aggregate グローバル式<attribute> = <aggregateConditionalFormula>
Aggregate インライン式: {{<variable>|<attribute>= <aggregateUnconditionalFormula>} | <aggregateUnconditionalFormula>
グローバル式とインライン式の主な違いはトリガー条件 (インライン式では、式の定義には含まれません) と、グローバル式でユーザー変数を使用できないことです。 
Horizontal 式では評価するコンテキストが必要なのに対し、前の例に示すように、Aggregate 式では必ずしも必要でありません。その例では、式を評価するために必要とされるデータは、&importantDate ユーザー変数だけです。ただし、必ずしも必要というわけではないものの、コンテキストテーブルが存在する場合、特定の推論が行われます。これについては、下記でいくつかの例を使って説明します。 

一般的な構文スキーム

<agregateConditionalFormula>::= <aggregateFormulaName>( <aggregateExpression>, <aggregateCondition>, <defaultValue> [ , <returnedAttributeValue> ]  )   [  if <triggeringCondition>  ]
<agregateUnconditionalFormula>::= <aggregateFormulaName>( <aggregateExpression>, <aggregateCondition>, <defaultValue> [ , <returnedAttributeValue> ]  )
入力値の説明:
<aggregateFormulaName>::= {Find | Max | Min | Sum | Count | Average}
<aggregateExpression>
<aggregateCondition> を満たすレコードの中で、検索を行ったり、最大値、最小値、合計、平均を求めたりするエクスプレッションです。項目属性 (計算式の項目属性でもかまいません)、定数、変数を含めることができます (ユーザー変数はインライン式だけで使用できます)。Count のみの場合は、値はエクスプレッションでなく、項目属性になります。Sum および Average では、<aggregateExpression> の結果は数値である必要があります。
<aggregateCondition>
検索条件と Data Selector の呼び出しを組み合わせたものです。検索条件および Data Selector はオプションです:
[ <SearchCondition> ] [ USING <DataSelector> '(<Parameter>1, <Parameter>2, <Parameter>n ')' ] ]
<SearchCondition>
レコードを総計に含める場合、このレコードが満たす必要のある条件です。項目属性、定数、変数を含めることができます (ユーザー変数はインライン式のみ、GeneXus の標準変数は グローバル式とインライン式のみで使用できます)。 
<defaultValue>
<aggregateCondition> に一致するレコードがない場合に返される値です。これは定数であり、オプションです。
<returnedAttributeValue>
Max 式と Min 式の場合のみ。<Aggregate 条件> を満たすレコードが見つかった場合、<Aggregate エクスプレッション> の最大値/最小値を求めた後に式から値が返される項目属性です。 
<triggeringCondition>
式をトリガーする必要があるかどうかを判別する条件です。これはオプションです。使用できるのは、コンテキストテーブルに属する項目属性 (格納された場合に式項目属性が属するもの) とその拡張項目属性だけです。

Count( FlightInstancePassengerSeatNumber, FlightInstanceDate >= &dateFrom and PassengerType = "Premium")
InvoiceDate >= &dateFrom であり、関連する乗客レコードが "Premium" タイプのレコードだけをカウントします。 

コンテキストテーブル

式が使用されるコンテキストに応じて、GeneXus は、式でナビゲートされるテーブル (およびその拡張テーブル) に属し、コンテキストで既にインスタンス化されている項目属性と一致しているかの判定を行うフィルタを自動的に追加します。
たとえば、対応するテーブルでプレミアムな乗客に既に 100 席より多い座席が割り当てられているかどうかを最初に把握することが必要なプロシージャーを記述できます:
   &success = Count( FlightInstancePassengerSeatNumber, FlightInstanceDate >= &dateFrom and PassengerType = "Premium") > 100
この場合は、式のコンテキストテーブルはありません。単独でトリガーされ、ベーステーブル (FlightInstanceSeat) の条件に一致するすべてのレコードをカウントします。&dateFrom 以降のすべてのフライトインスタンスについて、すべてのプレミアムな乗客をカウントします。
これに対して、次のように、上記のコードが for each コマンドの内部にあるとします:
   for each FlightInstance
   where Count( FlightInstancePassengerSeatNumber, FlightInstanceDate >= &dateFrom and PassengerType = 'Premium') > 100
      print flightInstanceInfo //FlightInstanceId, FlightInstanceDate
   endfor
この式にはコンテキストがあります: FlightInstance テーブル (For each のベーステーブル)。このため、プレミアムなすべての乗客の座席をカウントするのではなく、各 "for each" の反復処理で考慮される各 FlightInstance レコードに対応するものだけがカウントされます。したがって、&dateFrom 以降にプレミアムな乗客が 100 人以上いるフライトだけが出力されます。 
式が評価されるたびに、式にはインスタンス化されたフライトインスタンス (FlightInstanceId) が既にあるということになります。これは、FLIGHTINSTANCESEAT テーブルで考慮されるレコードに対して、GeneXus は次のフィルタも適用することを意味します:
FLIGHTINSTANCESEAT.FlightInstanceId = FLIGHTINSTANCE.FlightInstanceId

式のベーステーブルがコンテキストと同じ場合はどうなるか

次の例では、請求日ごとに、その請求日すべての請求の合計金額を印刷するとします:
for each Unique InvoiceDate
   &total = Sum(InvoiceTotal)
   print totalbydate //InvoiceDate, &total
endfor
この場合、Sum のベーステーブルは Invoice であり、for each のベーステーブルと同じであるとともに、Unique 節があるので、GeneXus は for each または Sum の計算で InvoiceDate 別に情報をグループ化します。言い換えると、Sum 式には InvoiceDate 項目属性による暗示的な同等条件があり、これが適用されたものとみなされます。 
: Unique 節がない場合は、for each 本体の内部にある項目属性は InvoiceDate だけであるので (InvoiceTotal は Sum 式の中です)、動作は同じになります。

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

計算結果に影響を与え、考慮されるデータや別の項目属性 (コンテキストで既知のもの) にフィルタリング条件を追加できるためです。 
したがって、コンテキストテーブルが存在する場合、式が明示的に指定するすべてのレコードではなく、コンテキストから生じる暗示的な条件にも一致するレコードのみが考慮されます。この場合、開発者はコンテキストテーブル (およびその拡張テーブル) の項目属性を式の定義に取り込むことができます。Horizontal 式の場合と異なり、コンテキストのベーステーブルの決定に Aggregate 式は何の影響も与えません。つまり、式のベーステーブルの決定に関係するのは、項目属性だけです。








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