For Each コマンドの Unique 節はオプションです。項目属性のセットに対し、重複する値がないレコードを処理する必要がある場合に役立ちます。
ここでは、提示された問題を、Unique 節を使用して解決する例を説明します。次のトランザクション構造があるとします:
Customer
{
CustomerId*
CustomerName
}
Product
{
ProductId*
ProductName
ProductPrice
}
Invoice
{
InvoiceId*
InvoiceDate
CustomerId
CustomerName
Line
{
InvoiceLineId*
ProductId
ProductName
ProductPrice
InvoiceLineQty
InvoiceLineTotal = ProductPrice * InvoiceLineQty
}
InvoiceTotal = Sum( InvoiceLineTotal)
}
これまでに販売されたすべての製品を取得します:
For each Invoice.Line Unique ProductName
print PB //printblock: ProductName
endfor
for each のベーステーブルは、ベーストランザクション Invoice.Line の次のテーブルであることに注意してください: INVOICELINE。unique 節がないと、これまでに販売されたすべての製品が繰り返し返されます。unique 節があると、重複した値は出力に含まれなくなります。
一意の項目属性 ProductName は、for each ベーステーブルの拡張テーブル内にあることに注意してください。
今度は、特定の日付 (&fromDate) 以降の請求書がある顧客について、顧客が支払った合計金額を出力します:
for each Invoice unique CustomerId
where InvoiceDate >= &fromDate
&total = Sum( InvoiceTotal )
print totalbycustomer //printblock: CustomerName、&total
endfor
この Sum 集計式には、CustomerId がコンテキストによって決まるという暗示的な条件があることに注意してください。つまり、同じ CustomerId の値を持つ請求書のレコードが、for each の反復処理ごとにグループとして考慮されます。
CustomerName 項目属性も、CustomerId (指定された一意の項目属性) から一意に決まることに注意してください (CustomerId は外部キーのため、Customer 拡張テーブルのすべての項目属性は、CustomerId の値から一意に値が決まります)。
Sum フィルタはグループ化 (unique 節に基づく) のフィルタであることに注意してください。where 節フィルタは for each に対してのみ有効であるため適用されません。つまり、&fromDate 以降の請求書がある各顧客に対して、顧客と請求書の合計金額 (&fromDate 前後の請求書、つまりすべての請求書が対象) が出力されます。指定した日付以降の請求書の金額のみを合計するには、そのように明示する必要があります:
for each Invoice unique CustomerId
where InvoiceDate >= &fromDate
&total = Sum( InvoiceTotal, InvoiceDate >= &fromDate )
print totalbycustomer //printblock: CustomerName、&total
endfor
次は、項目属性でなく、その一部の Horizontal インライン式別にグループ分けする必要があります。
For each Invoice Unique InvoiceDate.Year()
&total = Sum( InvoiceTotal )
print totalbyyear //printblock: InvoiceDate.Year()、&total
endfor
一時的な制限として、現在これは許可されていません。unique 節内では項目属性のみ (場合によっては式の項目属性) を使用できます。つまり、この解決方法は、Invoice トランザクション構造レベル内の InvoiceDateYear 項目属性を、次のように計算される式として定義することです: "InvoiceDate.Year()"。
|