特定のナビゲーションのベーステーブルとして使用する
トランザクション名またはトランザクションレベルの名前を指定します。
つまり、ナビゲーションの意図を宣言します。
使用は任意ですが、関連付けられているコマンド (
For Each コマンド、
データプロバイダーのグループステートメント) の表現能力を向上するために使用することをお勧めします。また、コマンド、ステートメント、またはコントロールの
ベーステーブルの計算が不要になるため、分析にかかる時間が短縮されます。
この節は、トランザクションレベルのリストになることがあります。その場合は、テーブル間の「積」が計算されて、別の方法では表現するのが難しい、または単一の SQL 文では解決できない、異なるテーブル間でのナビゲーションが含まれるクエリを解決します。
<BaseTrn1>|<
BaseTrn.Level1>
,...,<BaseTrnN>|<
BaseTrn.LevelN>
入力値の説明:
BaseTrn1|BaseTrn.Level1,...,BaseTrnN|BaseTrn.LevelN
コンマ区切りのトランザクションまたはトランザクションレベルの名前です。
1 つの
ベーストランザクションが宣言されると、このトランザクションのレベルに関連付けられている
テーブルが、節がリンクされているコンテキスト (
For Each コマンドなど) の
ベーステーブルと見なされます。また、コンテキスト (For Each の本文、条件、順序など) に含まれるすべての項目属性がその
拡張テーブルに含まれる必要があります。そうでないと、ナビゲーションレポートでは、拡張テーブルに含まれないすべての項目属性について、項目属性がインスタンス化されていないという警告がスローされます。
複数の
ベーストランザクションが宣言されており、テーブルが直接関連付けられている場合 (または、2 つの異なる項目属性間の同等性によって明示的なフィルタを定義する場合)、それらのトランザクションレベルに関連付けられているテーブル間で
結合が行われます。そうでない場合は、
デカルト積が行われます。また、関連付けが見つからない場合は、分析エラーが発生します (spc0027)。
この節がリンクされているコンテキストの項目属性は、これらのテーブルのいずれかの拡張テーブルに含まれている必要があります。
そのため、この例では次のようになります:
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 の拡張テーブルに含まれる必要があります。
次のデータ プロバイダー グループ定義は、同等の例の 1 つです:
UserCollection from User
{
UserItem
{
Id = UserId
Name = UserName
}
}
データプロバイダーでベーストランザクションを指定するには、
データプロバイダーのグループステートメントで
From 節を使用する必要があります。
このデータプロバイダーは、User テーブルのスキャンによってロードされたコレクション SDT を出力として返します。
各ロールについて、関連するユーザーを表示する必要があるとします。この場合、次のコードを定義する必要があります:
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)。そのため、各ロールに表示されるユーザーは、ナビゲートされるロールに対応するユーザーになります (結合が作成されます)。
システムの各プログラムの情報を格納し、Users および Roles トランザクションとはまったく関連しない Program トランザクションがあり、User および Program テーブルのデカルト積をリストする必要があるとします。また、管理者ユーザーによってフィルタするとします (管理者はすべてのプログラムにアクセスできるため)。
この場合のコードは次のようになります:
For each User, Program
where UserType = 'Administrator'
print crossInfo //printblock: UserName、ProgramName 項目属性
endfor
User テーブルと Program テーブルの間には、テーブルを通じた関連がありません。そのため、Administrator タイプの各ユーザーについて、すべてのプログラム名がユーザー名の横に表示されます。
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 ] プロパティ