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

インライン式で説明したように、評価時に式のコンテキストにテーブルがあると、評価の結果に影響します。式の定義そのものも同様です。
Horizontal 式の場合、ベーステーブルのどのレコードを対象とするのか決定するために、コンテキストが必要です。また、式そのものもこのコンテキストテーブルの決定に影響します。このように、相互に影響しあっています。
他方、Aggregate 式の場合、コンテキストは必須ではありません。ただし、コンテキストが存在すると、式によって明示的に指定されるすべてのレコードではなく、コンテキストに由来する暗示的な条件にも適合するレコードだけが対象となります。この場合、コンテキストテーブル (およびその拡張テーブル) の項目属性を既知の値として (実際はコンテキストから) 式の定義に取り込むことができます。Horizontal 式の場合と異なり、Aggregate 式の場合は、コンテキスト ベース テーブルの決定に影響しません。つまり、式のベーステーブルの決定に関係するのは、項目属性だけです。
コンテキストテーブルが該当するシナリオ
  • For Each コマンド
  • ベーステーブルを持つデータ プロバイダー グループ
  • ベーステーブルを持つグリッドコントロール (およびその関連イベント: ロードなど)
  • ベーステーブルを持つスマートデバイス内のパネルのフォームの固定部分 (およびその関連イベント: 再表示など)
  • 条件 (全般的な条件、グリッドに関係する条件、Where 節の条件) 
  • トランザクションルール
 

使用例:

次のトランザクションがあるとします:
FlightInstance      //トランザクション名 = 第 1 レベル名
{
FlightInstanceId* 
FlightInstanceDate
FlightInstanceNumberOfPassengers
FlightNumber 
FlightDescription 
    Seat                   //レベル名    
          { PassengerId* 
            PassengerName 
            FlightInstancePassengerSeatNumber } 

}
ベーステーブルを持つコンテキスト内でプログラミングされているインライン式の例を以下に示します:

例 1

For each
     FlightInstanceNumberOfPassengers = Count(FlightInstancePassengerSeatNumber)
EndFor
まず、項目属性に式を割り当てます。インライン式 (ローカルの計算) であるため、項目属性は物理的にテーブル内に存在します。そのため、計算結果が項目属性に割り当てられ、対応するレコードに格納されます (コードが Procedure オブジェクトソース内に存在する必要があります)。グローバル式を定義した場合だけ、項目属性が「仮想」の定義になります。
この例では、式がナビゲートするテーブルは FLIGHTINSTANCESEAT です。これは、式の定義にある固有の項目属性が、このテーブルに格納されている FlightInstancePassengerSeatNumber だからです。また、For Each のベーステーブルは FLIGHTINSTANCE です (これは、For Each の内側、FlightInstanceNumberOfPassengers 式の外側にある固有の項目属性によって決まります)。
注: GeneXus X Evolution 3 以降では、For Each 内でベーストランザクションを指定します (例: For each FlightInstance...)。
For Each コマンドはフライトインスタンスすべてをナビゲートし、各フライトインスタンスについて Count 式がその乗客をナビゲートしてカウントします。ナビゲートされた両方のテーブル (FLIGHTINSTANCE および FLIGHTINSTANCESEAT) に共通の項目属性である FlightInstanceId があるため、式は各フライトインスタンスおよびその割り当てられた乗客を自動的にカウントします (つまり、FLIGHTINSTANCESEAT.FlightInstanceId = FLIGHTINSTANCE.FlightInstanceId のフィルタが、式に関連付けられた生成されたコードに自動的に含まれます)。

例 2

For Each コマンドとデータ プロバイダー グループは等価なので、同じことが、ベーステーブルを持つデータ プロバイダー グループ ステートメント内のデータ プロバイダー エレメントに割り当てられた式にも当てはまります。
コレクション SDT を出力 ActualFlights として返すデータプロバイダーを設定します:
ActualFlights 
{
   FlightInstance 
   {
       Date = FlightInstanceDate
       NumberOfPassengers = Count( FlightInstancePassengerSeatNumber)
   }
}
この例では、前の例と同じことをしています: グループ ActualFlights は、すべてのフライトインスタンスをナビゲートします (そのベーステーブルは FLIGHTINSTANCE です。「=」の右側にある FlightInstanceDate 項目属性に基づきます)。各インスタンスに対して、Count 式がその乗客をナビゲートし、カウントします (式によってナビゲートされるテーブルは FLIGHTINSTANCESEAT です)。
FlightInstancePassengerSeatNumber 項目属性は、式の定義に関与しますが、グループの定義には関与しません。

例 3

Web パネルにグリッドがある場合も、同様のコンテキストになります (ベーステーブル: FLIGHTINSTANCE):
イメージ:25361.jpg
イベントのコードは次のようになります:
Event Load
   FlightInstanceNumberOfPassengers = Count( FlightInstancePassengerSeatNumber)
endevent
グリッド ベース テーブルに基づき、グリッドにロードする各 FlightInstance レコードに対して 1 回ずつロードが実行されます。

例 4

パラメーター FlightInstanceId を受け取ってその情報を表示する Panel for Smart Devices を設定します:
イメージ:25362.jpg
変数 &NumberOfPassengers に該当する値を割り当てるために、フォームの固定部分をロードする際に Refresh イベントを実行します:
Event Refresh
   &NumberOfPassengers = Count( FlightInstancePassengerSeatNumber )
endevent

例 5

For each order FlightInstanceDate
     where Count(FlightInstancePassengerSeatNumber) > 50
         ....
Endfor
これは、インライン式が Where 節内で定義されている例です。
また、For Each のベーステーブルは FLIGHTINSTANCE です (これは、For Each コマンドの内側、FlightInstanceDate 式の外側にある固有の項目属性によって決まります)。一方、式の定義にある固有の項目属性は FlightInstancePassengerSeatNumber なので、式によってナビゲートされるテーブルは FLIGHTINSTANCESEAT になります。
ここで、GeneXus によって決定される次のような式の暗示的なフィルタが存在することに注意してください: FLIGHTINSTANCE.FlightInstanceId = FLIGHTINSTANCESEAT.FlightInstanceId (FlightInstanceId は、For Each ベーステーブルと、式によってナビゲートされるテーブルに共通する項目属性です。式は、ナビゲートするフライトインスタンスに割り当てられた乗客を自動的にカウントします)。
まとめると、For Each コマンドは、51 人以上の乗客を持つフライトインスタンスすべてをナビゲートしています。











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