最近のアクセス:
Where 節

For Each コマンドデータプロバイダーのグループステートメントのレベル内で処理するために、データと一致する必要がある条件のリストを指定します。この条件にはブール式、簡単な式、または非常に複雑なネストされた式を指定できます。
複数の Where 節を指定できます。この場合、条件は And 演算子で区切られている場合と同様に評価します。

構文

{where    {<condition>  [ when <constraint> ] }  |  
  { [ not ] <attribute> in <DataSelectorName>( [ <parameterList> ] ) }}...
 
入力値の説明:
<condition>
データ取得に条件を付けるための有効な論理エクスプレッションを指定します。「and」「or」「not」論理演算子を使用して複合条件にすることもできます。
この条件で指定する項目属性は、For Each のベーステーブルとその拡張テーブルのどちらにあるものでもかまいません。場合によっては、拡張テーブルに属さない項目属性が含まれることがあります。詳細は、「ヒントとしてのフィルタ」を参照してください。
n 回目の where 節の出現は、連続するブール条件を持つ where 節が 1 つしか出現しない場合と同じです。
<condition> ::= 
[ not ]  <condition>  [ {or | and<condition> ]
  [ ( ]  <condition>  [ ) ]
  <relationalExpr>
  <stringExpr> like <stringExpr>
  <booleanFunctionExpr>
<relationalExpr> ::= 
<expr>  [ {> | >= | = | < | <=<expr> ]
  <expr> はエクスプレッションです。比較に使用する場合は、比較可能なデータタイプ (Numeric や Character など) でなければなりません。集計式 (インライン) にすることもできます (count、sum、min、max、average など)。
<booleanFunctionExpr> ::= 
True | False | <bool_attribute> | <bool_variable> | <bool_function>( <expr> <bool_proc>(  [ <parametersList> ]  )
  <bool_attribute><bool_variable> は、それぞれ Boolean データタイプの項目属性と変数です。
<bool_fuction> は、ブール値の結果 (True または False) を返す関数です。<expr> は、<bool_function> で必要とされるデータタイプのエクスプレッションです。
<bool_proc> は、ブール値を返すユーザー定義のプロシージャーです。

<constraint>
Where 節をいつ適用するかを指定する <condition> です。クライアント/サーバープラットフォームでは、まず、各 Where 節の When 節が評価され、条件が満たされた場合は、Where 節で指定したフィルタが適用されます。詳細については、「When 節」を参照してください。
[ not ] <attribute> in <DataSelectorName>( [ <parameterList> ] )
クエリを決定するのは、Data Selector オブジェクト自体です。したがって、データセレクターの定義で生成される SELECT 文は、レベル 1 (For Each コマンドまたはデータプロバイダーのグループステートメント) の SELECT 文とは異なる独立したものになります。このため、<attribute> と同じ定義に対応する値のコレクションを返します。<attribute> は、データセレクターのベーステーブルの拡張テーブルに属している必要があります。詳細については、次の記事を参照してください: For Each コマンドにおける Data Selector

プロパティとしての条件

構文が少し異なるものの (where キーワードがないなど)、同じコンセプトが Data Selector オブジェクト、および Web Panel オブジェクトPanel オブジェクトWork With for Smart Devices オブジェクトの [ 条件 ] エレメント、さらにグリッドの [ Conditions ] プロパティに適用されます。

最適化

Where 節の <Condition> は、取得するデータセットを制限します。ただし、それだけではありません。フル スキャン テーブル アクセスとインデックスで最適化されたランダムアクセスには大きな違いがあります。一定の論理ルールを適用する場合、GeneXus は order 節 (あるいは主キーの順序) が、where 条件と互換性があると判断します。フル テーブル スキャンを行わず、インデックスを使い、テーブルへのアクセスを最適化します。これは、どのような場合にも望ましい動作です。
次の演算子を使用する条件を最適化できます: >、>=、=、<、および <=。
Where 条件を最適化すると、ナビゲーションレポートで [ Navigation Filter ] として表示されます。最適化しない場合は [ Constraint ] として表示されます。
Where 節で使用する条件がタイプの定義に必ず準拠するようにしてください。準拠しない場合は、タイプのミスマッチを示すエラーメッセージが表示されます。
詳細については、「条件付きフィルタと順序」を参照してください。

1. 特定の日付以降に特定の国で生まれた顧客の名前を印刷する必要があるとします。
For Each Customer
Where CountryId = &CountryId
Where CustomerBirthDate.year() >= &youngDate
    print youngCustomer //printblock: CustomerName
EndFor
なお、このコードは、ベーステーブルを指定するためのベーストランザクション節が取り込まれた GeneXus X Evolution 3 以降でのみ有効です。ただし、この節は必須ではなく、使用しなくてもかまいません。この場合、以前のバージョンの GeneXus でもこのコードは有効になります。
CountryId、CustomerBirthDate、および CustomerName は CUSTOMER 拡張テーブルに属します。order は指定されていません。これにより、「条件付きフィルタと順序」で説明したように、パフォーマンスに影響が生じます。
2. 次に、&CountryId は、たとえば Web パネルなどにより、エンドユーザーが設定するものとします。ユーザーが変数を空のままにしておくことがあるので、その場合はフィルタを適用しないようにする必要があります:
for each Customer
where CountryId = &CountryId when not &CountryId.lsEmpty()
where CustomerBirthDate.year() >= &youngDate
    print youngCustomer // printblock: CustomerName
endfor
3. 複数のオブジェクトで特定の国の若い顧客をフィルタする必要がある場合、そのクエリを定義するために、データセレクターを作成している可能性があります:
イメージ:25525.jpg
そのため、以前の for each は次のようになります:
for each Customer
where CustomerId in YoungCustomer( &CountryId, &youngDate )
   print youngCustomer // printblock: CustomerName
endfor
4. 最後に、顧客が 100 人以上いる国を印刷します:
for each Country
where Count( CustomerName ) > 100
   print countryInfo //printblock: CountryName
endfor
この場合、for each のベーステーブルは COUNTRY になります。

適用範囲

コマンド: For Each コマンドXfor Each コマンドXfor First コマンドデータプロバイダーのグループステートメント

参考情報

条件付きフィルタと順序









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