最近のアクセス:
ベーストランザクション節

特定のナビゲーションのベーステーブルとして使用するトランザクション名またはトランザクションレベルの名前を指定します。
つまり、ナビゲーションの意図を宣言します。
使用は任意ですが、関連付けられているコマンド (For Each コマンドデータプロバイダーのグループステートメント) の表現能力を向上するために使用することをお勧めします。また、コマンド、ステートメント、またはコントロールのベーステーブルの計算が不要になるため、分析にかかる時間が短縮されます。
この節は、トランザクションレベルのリストになることがあります。その場合は、テーブル間の「積」が計算されて、別の方法では表現するのが難しい、または単一の SQL 文では解決できない、異なるテーブル間でのナビゲーションが含まれるクエリを解決します。

構文

<BaseTrn1>|<BaseTrn.Level1,...,<BaseTrnN>|<BaseTrn.LevelN
入力値の説明:
BaseTrn1|BaseTrn.Level1,...,BaseTrnN|BaseTrn.LevelN
     コンマ区切りのトランザクションまたはトランザクションレベルの名前です。

説明

1 つのベーストランザクションが宣言されると、このトランザクションのレベルに関連付けられているテーブルが、節がリンクされているコンテキスト (For Each コマンドなど) のベーステーブルと見なされます。また、コンテキスト (For Each の本文、条件、順序など) に含まれるすべての項目属性がその拡張テーブルに含まれる必要があります。そうでないと、ナビゲーションレポートでは、拡張テーブルに含まれないすべての項目属性について、項目属性がインスタンス化されていないという警告がスローされます。
複数のベーストランザクションが宣言されており、テーブルが直接関連付けられている場合 (または、2 つの異なる項目属性間の同等性によって明示的なフィルタを定義する場合)、それらのトランザクションレベルに関連付けられているテーブル間で結合が行われます。そうでない場合は、デカルト積が行われます。また、関連付けが見つからない場合は、分析エラーが発生します (spc0027)。
この節がリンクされているコンテキストの項目属性は、これらのテーブルのいずれかの拡張テーブルに含まれている必要があります。
そのため、この例では次のようになります: イメージ:24668.jpg
A と C が (B によって) 関連付けられている場合、For Each コマンドでは次のように判断されます:
各 A レコードについて、対応する B によって関連付けられているすべての C (結合が行われます)
:
  • 対応する外部キーが Null 許容でない場合、内部結合になります。Null 許容の場合は外部結合が選択されます。結合の詳細については、「Join Type と Join Location の仕様」を参照してください。
  • その他の場合 (ベーストランザクションは関連付けられているが、別のテーブルとの N 対 1 の関係を通じて直接関連付けられてはいない場合、またはベーストランザクションがまったく関連付けられておらず、項目属性間の同等性による明示的フィルタを定義していない場合) は、トランザクション 1 の各レコードについて、トランザクション 2 のすべてのレコードが考慮されます (デカルト積)。
他の例も参照できます: For Each コマンドにおける複数のベーストランザクション

次のようなトランザクションについて検討してみましょう:
User            //トランザクション 1 のレベル名
{
   UserId*
   UserName
   UserType
   Role        //トランザクション 2 のレベル名
   {
      RoleId*
   }
}

Role            //トランザクション 1 のレベル名
{
   RoleId*
   RoleName
}


1) For each の例

プロシージャーを使用してすべてのユーザーを表示する必要があり、For Each コマンドベーストランザクションを記述する場合、構文は次のようになります:
For each User
   print userInfo  //printblock: UserId、UserName 項目属性
Endfor
トランザクションレベルに User が指定されているため、For each ベーステーブルが User レベルに関連付けられます。そのため、For each の本文 (および順序、条件など) 内の項目属性は、User の拡張テーブルに含まれる必要があります。

2) データ プロバイダー グループの例

次のデータ プロバイダー グループ定義は、同等の例の 1 つです:
UserCollection from User
{
   UserItem
   {
        Id = UserId
        Name = UserName
   }
}
データプロバイダーでベーストランザクションを指定するには、データプロバイダーのグループステートメントFrom 節を使用する必要があります。
このデータプロバイダーは、User テーブルのスキャンによってロードされたコレクション SDT を出力として返します。

3) m 対 n の関係での For Each の例

各ロールについて、関連するユーザーを表示する必要があるとします。この場合、次のコードを定義する必要があります:
for each Role
   print roleInfo            //printblock: RoleId、RoleName
   for each User.Role
      print userInfo         //printblock: UserId、UserName
   endfor
endfor
ネストされた For Each ベーステーブルは、User トランザクションの第 2 レベルに関連付けられます (User.Role)。そのため、各ロールに表示されるユーザーは、ナビゲートされるロールに対応するユーザーになります (結合が作成されます)。

4) 複数のベーストランザクションでのデカルト積の例

システムの各プログラムの情報を格納し、Users および Roles トランザクションとはまったく関連しない Program トランザクションがあり、User および Program テーブルのデカルト積をリストする必要があるとします。また、管理者ユーザーによってフィルタするとします (管理者はすべてのプログラムにアクセスできるため)。
この場合のコードは次のようになります:
For each User, Program
    where UserType = 'Administrator'
        print crossInfo     //printblock: UserName、ProgramName 項目属性
endfor
User テーブルと Program テーブルの間には、テーブルを通じた関連がありません。そのため、Administrator タイプの各ユーザーについて、すべてのプログラム名がユーザー名の横に表示されます。

5) 複数のベーストランザクションでの結合の例


5.1) 複数の企業で構成されるシステムで、各企業 (Company) が製品を販売し、各プロバイダー (Provider) がそれらの製品を提供しているとします。トランザクション構造は次のようになります:
Product
{
   ProductId*
   ProductName
}

Company
{
   CompanyId*
   CompanyName
   Product
   {
      ProductId*
      ProductName
   }
}

Provider
{
   ProviderId*
   ProviderName
   Product
   {
      ProductId
      ProductName
   }
}
この場合に、特定の同じ製品を販売する Company と Provider の組み合わせをリストする必要があるとします:
Parm(&ProductId);

For each Company.Product, Provider.Product
   where ProductId = &ProductId
         print crossInfo    //printblock: CompanyName、ProviderName 項目属性
endfor
Company.Product テーブルと Provider.Product テーブルは、Product テーブルによって直接関連付けられています。そのため、ProductId = &ProductId である Company.Product 内の各レコードについて、Provider.Product のすべての関連レコードが考慮されます (Provider.Product の ProductId = Company.Product の ProductId であるすべてのレコード)。

5.2) 次のトランザクション構造があるとします:
Transaction1
{
  A*
  B  
  C  
}

Transaction2
{
  D*
  E
}
B と D の間に関係がない場合に (それぞれ名前が異なり、サブタイプではない)、For each を次のように定義するとします:
For each Transaction1 ,Transaction2
  where B = D
        print printblock1 //printblock: C および E 項目属性
endfor
Transaction1 と Transaction2 はベーストランザクションとして宣言され、B および D 項目属性間の同等性によって明示的フィルタが定義されると、Transaction1 と Transaction2 に関連付けられているテーブル間で結合が行われます。
この例での SQL 文 (SQL Server 用) は次のように生成されます。
SELECT T2. [ D ] , T1. [ B ] , T1. [ C ] , T2. [ E ] , T1. [ A ]  FROM  [ Transaction1 ]  T1,   [ Transaction2 ]  T2 WHERE T1. [ B ]  = T2. [ D ]  ORDER BY T1. [ A ] .

適用範囲

参考情報

グリッドの [ Base Trn ] プロパティ



サブページ
Created: 15/01/07 22:50 by Admin Last update: 23/04/24 18:06 by Admin
カテゴリ
Powered by GXwiki 3.0