データベースからデータセットを取得します。Procedure オブジェクトで使用される場合には、データベースを読み込むだけでなく、更新することもできます。
For each [ <BaseTrn1>|<BaseTrn.Level1>,...,<BaseTrnN>|<BaseTrn.LevelN> ]
[ SKIP <NumericExpression> COUNT <NumericExpression> ]
[ order <Att1>,...,<AttN> [ when <Condition> ] ] ...
[ order none [ when <Condition> ] ] ...
[ using <DataSelectorName>( [ <parm1>,...,<parmN> ] ) ] ...
[ unique <Att1>,...,<AttN> ] ...
[ where <Condition> [ when <Constraint> ] ] ...
[ where [ not ] <Att> in <DataSelectorName>( [ <parm1>,...,<parmN> ] ) ] ...
[ blocking <NumericExpression> ]
<MainCode>
[ When duplicate
[ <CodeWhenDuplicate> ] ]
[ When none
[ <CodeWhenNone> ] ]
Endfor
構文の表記規則の表示
入力値の説明:
BaseTrn1|BaseTrn.Level1, ..., BaseTrnN|BaseTrn.LevelN
For Each ナビゲーションのベーステーブルとして使用するトランザクションまたはトランザクションレベルの名前です。複数をコンマで区切ることもできます。詳細については、「
ベーストランザクション節」を参照してください。
SKIP
出力から省くレコードの数を指定します。Skip には正の値を指定できます。
NumericExpression
各ブロック内のレコード数を指定します。
COUNT
出力するレコード数を指定します。Count の値が 0 以下の場合は制限がないことを示します。
order
クエリの結果が返される順番を指定することができます。構文に示すように、複数の条件付き Order 節を記述できます。
Att1,...,AttN
コンマ区切りによる項目属性のリストです。言及する各項目属性は、丸かっこ付きまたは丸かっこなしのナレッジベース項目属性である必要があります。順序項目属性が丸かっこでくくられている場合、この項目属性は降順であることを示します。
when
データの取り出しまたは表示順序に関する条件を使用するタイミングを指定します。
Condition
データの取り出しに条件を付ける有効な論理エクスプレッションを指定します。「and」、「or」、「not」の論理演算子を使用した複合条件にすることもできます。
Order None 節
これは、特定の順序で返す必要がなく、未定義のままにしておきたい場合に使用します。
using
DataSelectorName を指定して、データセレクターで決められている条件のセットに従って並べ替えとフィルタリングを行います。
DataSelectorName
データセレクターの名前です。
parm1, …, parmN
変数 (呼び先オブジェクトで定義) または項目属性です。
Unique
参照される項目属性の値セットが一意であるレコードのみを返します。
where
(
MainCode 内の) For Each で処理するデータが満たす必要のある条件のリストを指定できます。この条件にはブール式、簡単な式または非常に複雑なネストされた式を指定できます。
Constraint
Where 節をいつ適用するかを指定する条件です。
Att
データセレクターのベーステーブルの拡張テーブルに属している必要がある項目属性です。
blocking
プロシージャーで使用できます (更新または削除の場合)。更新または削除を行う場合、DBMS への通信回数を削減するために、データベースブロックを構成するレコード数を示します。
MainCode
コマンドのリストです。
CodeWhenDuplicate
MainCode 内で、特定の項目属性が更新 (上書き) され、その項目属性に対する一意のインデックスが存在する場合、プロシージャーで使用できます。既存の値でレコードを上書きする場合は、
MainCode の代わりにこのコードがレコードに対して実行されます。詳細については、「
When duplicate 節」を参照してください。
CodeWhenNone
フィルタ条件に合致するデータがない場合、
MainCode コマンドは実行されません。代わりに
CodeWhenNone コマンドが実行されます。詳細については、「
When None 節」を参照してください。
場合によっては、アプリケーションで
プロシージャーを使用してデータベースから情報を取得する必要があります。
このような場合、GeneXus では、
For Each コマンドを使用してデータベースからデータセットを取得できます。プロシージャーで使用される場合には、データベースを読み込むだけでなく、更新することもできます。
For Each コマンドは、次の場所で定義できます:
For Each コマンド内では、読み取る情報を定義できます (
Procedure オブジェクト内では書き込むこともできます)。
次の
Transaction オブジェクトがあるとします:
Customer
{
CustomerId*
CustomerName
CustomerAddress
CustomerPhone
CustomerEmail
CountryId
CountryName
}
Country
{
CountryId*
CountryName
}
顧客に関する情報を表示するとします。そのために、
プロシージャーの [ Source ] を次のように定義します:
For each Customer //Customer はトランザクション名。Customer が For each のベーストランザクションとなる。
Print Customers
Endfor
「Customers」は、
プロシージャーの [ Layout ] で定義される次の printblock の名前です:
この For each コマンド (顧客データを表示する
Print コマンドが含まれる) では、
ベーステーブルとなる Customer テーブルとその
拡張テーブルに対してクエリを実行し、データベース内の各顧客のコード、名前、国名を表示するよう指定していることになります。
For each コマンドでは常に、データベースから何らかの情報を取得し、取得するレコードごとに関連付けられた情報に対して何らかの操作 (出力など) を行うことを指定します。
このため、すべての For each コマンドでは、既定でテーブルが 1 つナビゲートされます。このテーブルは For each の
ベーステーブルと呼ばれます。このテーブルはベーストランザクションに関連付けられます。
複数のベーストランザクションを使用する場合は特に注意が必要です。
上記の例では、ナビゲートする For each のベーステーブルは Customer です。ナビゲートする各顧客の国は、Country テーブルから取得されます。
For each コマンドでは、GeneXus が
ベーステーブルをナビゲートする一方で、そのベーステーブルの
拡張テーブルに属するすべてのテーブルにアクセスして、必要な情報を取得することもできます。上記の例で、ベーステーブルが Customer なのに、各顧客に関連する国を取得できるのは、このため (Country テーブルが Customer の拡張テーブルに含まれているため) です。
検索の開始ポイントとなるベーストランザクションを指定することができます。必須ではありませんが、指定することをお勧めします:
- ベーストランザクションを指定すると、ベーステーブルが直接決定されます。For each コマンドコード内に記述されているすべての項目属性 (呼び出される printblock 内に記述されている項目属性を含む) は、対応する拡張テーブルに属している必要があります。項目属性が拡張テーブルに属していない場合は、ベーステーブルから拡張テーブル経由でアクセスできない項目属性ごとにインスタンスが生成されなかったことを示す警告が表示されます。
- ベーストランザクションを指定しない場合、For each 内で定義されている項目属性 (呼び出される printblock 内に記述されている項目属性を含む) を考慮して、自動的に取得方法が決定されます。これは、すべての項目属性を含む最も拡張されていないテーブルを検出し、その拡張テーブルのベーステーブルが For each ベーステーブルに選択されるためです。取得先のテーブルやアクセスに使用するインデックスを定義する必要はありません。必要な項目属性を定義すると、自動的に取得方法が決定されます。
ベーストランザクションを指定すると、ユーザーが必要とする情報を GeneXus で簡単に把握し、迅速に処理を実行できます。ユーザーも処理の内容を把握し、管理を簡単に行うことができます。
Where 節のブール式は、取得されるデータセットを制限します。ただし、フル スキャン テーブル アクセスとインデックスで最適化されたランダムアクセスには大きな違いがあります。
GeneXus は一定の論理ルールを適用し、Order 節 (あるいは主キーの順序) に、
Where 節のブール式との互換性があるかどうかを判断し、フル テーブル スキャンを行わずインデックスを使うことでテーブルへのアクセスを最適化します。
これは、どのような場合にも望ましい動作です。
詳細については、「
条件付きフィルタと順序」を参照してください。
このコマンドは、
ネイティブ モバイル ジェネレーターまたは Angular 向けにアプリケーションを開発するときに使用できますが、いくつか考慮事項があります。
Work With パターンと Work With オブジェクトおよび
Panel オブジェクト、
ネイティブ モバイル アプリケーションのイベント (
Start、
Refresh、
Load の各イベント) でしか使用できません。
ネストされた For Each コマンド
Lists and For Each command to query the database