データプロバイダーは、直接または再帰呼び出しを通じて再帰構造にデータを挿入します。
次の構造を持つ Employee トランザクションを見てみましょう。
Employee
{
EmployeeId*
EmployeeName
BossId subtype of EmployeeId
BossName subtype of EmployeeName
}
従業員の情報を構造にロードする必要があるとします (たとえば、ほかのオブジェクトにパラメーターとして送信する必要がある場合など)。まず、SDT を次のように定義します:

これは再帰 SDTです。次に、従業員を受け入れるデータプロバイダーがこの問題を解決します:

入力値の説明:
出力: EmployeeSDT
Collection: False
Parm( &EmployeeId );
これは再帰データプロバイダーです。DPLoadEmployee が自身を呼び出し、EmployeeSDT の再帰メンバーにデータを挿入します。たとえば、XML 出力 (DPLoadEmployee( 123 ).toXML()) は次のようになります:
<EmployeeSDT>
<Id>123</Id>
<Name>John Doe</Name>
<Manager>
<Id>99</Id>
<Name>Mary Shelley</Name>
<Manager>
<Id>69</Id>
<Name>Ernest Jackson</Name>
<Manager></Manager>
</Manager>
</Manager>
<EmployeeSDT>
任意の従業員について、次のように、その部下 (直接および間接の部下) 全員を出力する必要があるとします:
<SubEmployees>
<Employee>
<Id>99</Id>
<Name>Mary Shelley</Name>
<Subordinates>
<Employee>
<Id>123</Id>
<Name>John Doe</Name>
<Subordinates>
...
</Subordinates>
</Employee>
<Employee>
<Id>150</Id>
<Name>Camile Green</Name>
<Subordinates>
...
</Subordinates>
</Employee>
...
</Subordinates>
</Employee>
<Employee>
...
</Employee>
...
</SubEmployees>
これはデータプロバイダーにより簡単に処理できます。
まず、Output 構造を定義する必要があります (SDT を使用して定義します)。

データプロバイダーは次のようになります:
Name: DPLoadSubordinates
Output: SubEmployees
Rules: parm(&BossId)
SubEmployees
{
Employee
{
Id = EmployeeId
Name = EmployeeName
Subordinates = DPLoadSubordintates( EmployeeId )
}
}
これは再帰データプロバイダーである点に注意してください (DPLoadSubordinates が自身を呼び出しています)。
|