対応するクエリの出力内で、値の重複を禁止する項目属性を指定できます。
unique <項目属性のリスト>
入力値の説明:
<項目属性のリスト>
まとめて (出力内で一度だけ) 処理される項目属性のリスト (式の項目属性を含む) を示します。そのため、この項目属性のリストで複数のレコードが同じ値を持つ場合、1 つだけが考慮されます。項目属性はクエリに対応する拡張テーブルに属している必要があり、そのレベルで使用できるほかの項目属性に制約を与えます (ほかの for each コマンドの項目属性など)。このようなほかの項目属性も、<項目属性のリスト> の値に基づく一意の値を持つ必要があります。つまり、これらも一意である必要があります (いくつかの例を使用して後述します)。
次の 2 つのシナリオを挙げます:
- 単純なシナリオ: 重複を回避します。請求書が登録されているすべての日付を、重複なしで列挙する必要があるとします:
for each Invoice
unique InvoiceDate
print datePB //printblock: InvoiceDate 項目属性
endfor
- 複雑なシナリオ: 集計を含むデータのグループを表示します。各請求日と、その請求日のすべての請求の合計金額を列挙する必要があるとします:
for each Invoice
unique InvoiceDate
&total = Sum( InvoiceTotal)
print totalbyDate //printblock: InvoiceDate、&total
endfor
ここで、for each のベーステーブルは、Sum で集計されたインライン式ベーステーブルと同じです。したがってこの式は、評価のためにコンテキストから暗示的な条件を追加します。これにより、指定された一意の項目属性である InvoiceDate に対するすべての請求の合計が、ナビゲーションレポートに表示されます:
- エクスプレッション ("unique CustomerBirthDate.Year()" など) は、unique 節の項目属性リスト内では許可されません。
- Aggregate 式の外側では、unique 節に指定する項目属性のうち、一意の値を持つ項目属性のみを、For Each コマンドの本文、またはデータプロバイダーのグループステートメントに含めることができます。本文とは、各反復に関連付けられたコードであり、order、using、where などの節は除外されます。つまり、この制限は、レコードがフィルタリングされた場合や並べ替えされた場合などに適用されます。結果のセットは、本文のコードが実行された結果です。
- レベルをネストすることはできません。現時点では、コントロールブレークを実装するために使用することはできません。
InvoiceId 項目属性が、特定の InvoiceDate の値のレコードに対して一意ではないような例を考えます:
for each Unique InvoiceDate
print PB //printblock: InvoiceDate、InvoiceId
Endfor
この例では、InvoiceDate に対して InvoiceId 項目属性の値が一意ではないため、分析時にエラーがスローされます。
分析処理では For Each が有効かどうかを常に示します。有効でない場合、次のエラーがスローされます:
error: spc0206: Cannot reference attribute(s) InvoiceId unless they are referenced in Unique clause in group starting at line 11.
式の場合、ルールは次のとおりです:
- For Each の本文に含まれる Horizontal 式: unique 節の項目属性からの一意の値を使用して、式の項目属性にアクセスできる必要があります。
- Aggregate 式: unique 節の項目属性からの一意の値を使用して、式の項目属性にアクセスできる必要はありません。
このため、次の例は有効になります。特定の日付以降の請求がある各顧客について、顧客名とそれらの請求の合計金額を出力するとします:
for each Invoice
unique CustomerName
where InvoiceDate >= &fromDate
&total = Sum( InvoiceTotal, InvoiceDate>=&fromDate)
print customerInfo //printblock: CustomerName、&total
endfor
CustomerName からの一意の値を使用して InvoiceDate にアクセスすることはできませんが、InvoiceDate は Aggregate 式の外側の for each の本文内にはありません。InvoiceDate は where 節内のみにあり、本文のコードが実行されるときに、レコードを取得するためのフィルタとして機能します。また、Sum 定義内にも含まれており、式の評価のためにナビゲートされるレコードに対するフィルタを示します。
|