Data Provider グループの中には、情報を取得するためにデータベースにアクセスし、出力にいくつかのエントリーを生成するものがあります。GeneXus はこれを For Each で行うのと同様の方法で推測します。
一般的なブレークの例を見てみましょう。システム内の顧客 (Customer) を国 (Country) 別にレポートする必要があるとします。たとえば、次の構造を持つ Country と Customer トランザクションがあるとします:
Country Customer
CountryId* CustomerId*
CountryName CustomerName
CountryId
CountryName
CustomerAddress
...
出力に関わらず、構造化されていないと仮定した場合、国別にグループ化された顧客をすべて取り出すために使用するプロシージャーのソースは次のようになります:
for each order CountryName
defined by CustomerName
Id = CountryId
Name = CountryName
for each
CustomerId = CustomerId
CustomerName = CustomerName
endfor
endfor
これがブレークです。
次に出力が構造化されている場合を考えます。このとき、出力として SDT が必要となり、構造は次のようになります:
SDT 内に情報を挿入するには、Countries の SDT の &countries 変数、Countries.Country の SDT の &country 変数、および Countries.Country.Customer の SDT の &customer を宣言して前のプロシージャーのソースを変更する必要があります。
for each order CountryName
defined by CustomerName
&country.Id = CountryId
&country.Name = CountryName
for each
&customer.Id = CustomerId
&customer.CustomerName = CustomerName
&country.Customers.Add( &customer )
&customer = new Countries.Country.Customer()
endfor
&countries.Add( &country )
&country = new Countries.Country()
endfor
次のデータプロバイダーのソースを宣言した場合を見てみましょう。
最も深いグループを省略した場合はどうでしょうか (結果はまったく同じです)。
より簡単になりました。
Country グループは、CUSTOMER ベーステーブルの For Each とよく似ており (Defined by があります)、Customers グループは CUSTOMER ベーステーブルの For Each によく似ている、つまりブレークが実装されていることに注意してください。ナビゲーションレポートは、プロシージャーのコードのものとまったく同じになります。また、CustomerName エレメントが割り当てられていないことにも注意してください。これは、項目属性名が正確に同じだからです。詳しくは次を参照してください: データプロバイダーの言語: エレメント
|