構造化データタイプ (SDT) のコレクションを取り扱う方法には、少なくとも次の 2 つがあります。
- SDT オブジェクトをコレクションとして定義する
- SDT オブジェクトを反復アイテムとして定義し、Collection 変数を使用して操作する
ここでは、一般論ではなく、例を使って各方法を詳しく説明します。
理解を深めるために例を見てみましょう。特定のオブジェクトからクライアントのコレクションを操作する必要があるとします。これには、次の 2 とおりの方法があります:
Client はコレクションの各アイテムを表す構造化データですが、独立した定義済みの SDT としては存在しません。定義された SDT は Clients コレクションです。
後でこのコレクションを操作するには、&myClients 変数を定義し、これを使用して &eachClient 変数を繰り返し処理する必要があります。
これにより、次のことが可能です:
For &eachClient in &myClients
...// &eachClient を処理するコード
EndFor
上の例では、 [ Collection ] 変数プロパティが False に設定されています。
ここではコレクション自体ではなくコレクションの 1 アイテムのみを扱っています。では、コレクションを使用して作業する方法を見てみましょう。
ここでも次の 2 つの変数を定義します。
Collection 変数を使用してクライアントのコレクションを操作する方法に注意してください (指定されたデータタイプ、ここでは Client SDT のコレクションとして myClients が設定されています。文字などほかのデータタイプの SDT コレクションとすることもできます)。
以下の、同じコードを使用します:
For &eachClient in &myClients
... // &eachClient を処理するコード
EndFor
アイテム自体を定義しておく必要があるかどうかによって、コレクションを操作する方法は異なります。たとえば、Data Provider オブジェクトに返させる必要がある場合、 [ Output ] プロパティでは Clients.Client を指定できないため、未定義の SDT となります。その場合、前出の 2 つ目のオプションを選択する必要があります。
ここでは、前に説明した状況と同じく、同じナレッジベース内で Clients SDT および Client SDT を定義します。GeneXus は Clients.Client と Client を同じものと認識しない点に注意してください。たとえば、次の SDT を定義するとします:
Client のメンバーである Address は、Address SDT のデータタイプであると思われる場合が多くありますが、実際はそうではありません。これは、Client.Address のデータタイプです。
このように区別したくない場合、両方の Address を同じにするには次のように定義します:
再帰 SDT
構造化データ タイプ エディター
New 演算子 (SDT)
Loading Compound Data Types (SDT) using Data Providers
Two ways of returning a collection using a Data Provider
|