最近のアクセス:
For Each コマンド

データベースからデータセットを取得します。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 の Defined By 節 (構文内の ConditionListBlockingGroup の間に記載) を使用することはできますが、ベーストランザクション節に対して意味がなくなります。

説明

場合によっては、アプリケーションでプロシージャーを使用してデータベースから情報を取得する必要があります。
このような場合、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 の名前です:
イメージ:6022.jpg
この For each コマンド (顧客データを表示する Print コマンドが含まれる) では、ベーステーブルとなる Customer テーブルとその拡張テーブルに対してクエリを実行し、データベース内の各顧客のコード、名前、国名を表示するよう指定していることになります。
For each コマンドでは常に、データベースから何らかの情報を取得し、取得するレコードごとに関連付けられた情報に対して何らかの操作 (出力など) を行うことを指定します。

ベーステーブル

このため、すべての For each コマンドでは、既定でテーブルが 1 つナビゲートされます。このテーブルは For each のベーステーブルと呼ばれます。このテーブルはベーストランザクションに関連付けられます。複数のベーストランザクションを使用する場合は特に注意が必要です。
上記の例では、ナビゲートする For each のベーステーブルは Customer です。ナビゲートする各顧客の国は、Country テーブルから取得されます。
イメージ:24768.jpg
For each コマンドでは、GeneXus がベーステーブルをナビゲートする一方で、そのベーステーブルの拡張テーブルに属するすべてのテーブルにアクセスして、必要な情報を取得することもできます。上記の例で、ベーステーブルが Customer なのに、各顧客に関連する国を取得できるのは、このため (Country テーブルが Customer の拡張テーブルに含まれているため) です。

拡張テーブル

検索の開始ポイントとなるベーストランザクションを指定することができます。必須ではありませんが、指定することをお勧めします:
  • ベーストランザクションを指定すると、ベーステーブルが直接決定されます。For each コマンドコード内に記述されているすべての項目属性 (呼び出される printblock 内に記述されている項目属性を含む) は、対応する拡張テーブルに属している必要があります。項目属性が拡張テーブルに属していない場合は、ベーステーブルから拡張テーブル経由でアクセスできない項目属性ごとにインスタンスが生成されなかったことを示す警告が表示されます。
  • ベーストランザクションを指定しない場合、For each 内で定義されている項目属性 (呼び出される printblock 内に記述されている項目属性を含む) を考慮して、自動的に取得方法が決定されます。これは、すべての項目属性を含む最も拡張されていないテーブルを検出し、その拡張テーブルのベーステーブルが For each ベーステーブルに選択されるためです。取得先のテーブルやアクセスに使用するインデックスを定義する必要はありません。必要な項目属性を定義すると、自動的に取得方法が決定されます。
ベーストランザクションを指定すると、ユーザーが必要とする情報を GeneXus で簡単に把握し、迅速に処理を実行できます。ユーザーも処理の内容を把握し、管理を簡単に行うことができます。

最適化

Where 節のブール式は、取得されるデータセットを制限します。ただし、フル スキャン テーブル アクセスとインデックスで最適化されたランダムアクセスには大きな違いがあります。
GeneXus は一定の論理ルールを適用し、Order 節 (あるいは主キーの順序) に、Where 節のブール式との互換性があるかどうかを判断し、フル テーブル スキャンを行わずインデックスを使うことでテーブルへのアクセスを最適化します。
これは、どのような場合にも望ましい動作です。
詳細については、「条件付きフィルタと順序」を参照してください。

ネイティブ モバイル アプリケーションと Angular アプリケーション

このコマンドは、ネイティブ モバイル ジェネレーターまたは Angular 向けにアプリケーションを開発するときに使用できますが、いくつか考慮事項があります。Work With オブジェクトおよび Panel オブジェクトネイティブ モバイル アプリケーションのシステムイベント (StartRefreshLoad の各イベント) でしか使用できません。

参考情報

ネストされた For Each コマンド

動画

イメージ:20668.png Introduction to For Each command to access the database
イメージ:20668.png More on nested For eachs.Cases and navigation
イメージ:20668.png Syntax of the For each command


 


サブページ
Created: 15/01/09 02:10 by Admin Last update: 23/05/08 21:26 by Admin
カテゴリ
Powered by GXwiki 3.0