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

インライン式で説明したように、評価時に式のコンテキストにテーブルがあると、評価の結果に影響します。式の定義そのものも同様です。
インライン式をコンテキストテーブルなしに定義すると、式がトリガーされた時点では、アクセスするテーブルが決まっていないことになります。したがって、これは、Aggregate 式にのみ当てはまります。式の定義には、ナビゲートするテーブルとその拡張テーブルの項目属性、ならびに変数のみを含めることができます。
コンテキストテーブルが該当しないシナリオ
 
次のようなトランザクションがあるとします:
Customer             //トランザクション名
  {CustomerId*
  CustomerName}

Invoice             //トランザクション名
  {InvoiceId*
  InvoiceDate
  CustomerId
  CustomerName
  InvoiceTotal}
同じ式が、For Each コマンド内で定義された場合にはコンテキストテーブルと暗示的フィルタを持ち、For Each コマンド外で定義された場合にはコンテキストテーブルも暗示的フィルタも持たなくなる例を次に示します:
イメージ:6735.jpg
最初の例では、For Each のベーステーブルは CUSTOMER です。Sum 式は For Each 内で定義されているので、そのコンテキストテーブルも CUSTOMER となります。この Sum 式には INVOICE テーブル (式によってナビゲートされるテーブル) に属する項目属性だけが含まれていますが、場合によっては、CUSTOMER テーブルやその拡張テーブルに属する項目属性、ならびに変数が含まれる場合もあります。
最初の例で考慮すべきもう 1 つの点は、式の暗示的なフィルタが使用されることです: INVOICE.CustomerId =  CUSTOMER.CustomerId (CustomerId が、For Each のベーステーブルと式でナビゲートされるテーブルに共通する項目属性であるため)。そのため、For Each によりナビゲートされる各顧客について請求書がまとめられます。
注: GeneXus X Evolution 3 以降では、For Each 内でベーストランザクションを指定します (例: For each Customer...)。
2 つ目の例では、同じ Sum 式が For Each コマンドの外で定義されています。そのため、式はコンテキストテーブルを持っておらず、ナビゲートされるテーブルとその拡張テーブルに属する項目属性、ならびに変数のみを含めることができます。また、式は GeneXus が推論した暗示的なフィルタを持ちません。そのため、この例ではすべての請求書がまとめられます。

重要な検討事項

式を含むグループが開始されると、その式がトリガーされます。
つまり、コードの特定の行でパラメーターを定義された式がある場合、これらのパラメーターの値は、グループがデータベース内で実行された時点で読み込まれたものとなります。グループがデータベース内で実行され、その後、式の定義で使用するパラメーターに異なる値を割り当てた場合、考慮されるパラメーター値は割り当てたものではなく、式を含むグループがデータベース内で実行された時点で読み込まれたものとなります。
では、グループが実行されるのはいつでしょうか。
  1. プログラムの起動時
  2. For Each の開始時
  3. Endfor の後
  4. サブルーチンまたはイベントの開始時
変数でも同様です。式がトリガーされるときに変数が取る値は、式を含むグループが実行された時点で割り当てられた値です。そのため、次のコードを記述する場合:
 &CustomerId = 1
&total = Sum(InvoiceTotal, CustomerId = &CustomerId)
&CustomerId 変数は、式がトリガーされる時点では値を持ちません。
これは、次の式により解決できます:
&CustomerId = 1
Do 'CalcTotal'
...

Sub 'CalcTotal'
    &total = Sum(InvoiceTotal, CustomerId = &CustomerId)
EndSub
この方法では (サブルーチンの開始時に) 新しいグループが開始されており、サブルーチン内に式が含まれているため、式が実行される時点では &CustomerId 変数は既に希望する値を持っています。

分離して評価を行う場合は常に、プロシージャーを使用して計算を実行できます。










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