最近のアクセス:
Unique 節

異なるレコードで重複する値を持つ場合、クエリ出力では一度だけ考慮されるように項目属性を宣言します。

構文

unique <Att1,...,AttN>
入力値の説明:
Att1,...,AttN
          まとめて (出力内で一度だけ) 処理される項目属性のリスト (式項目属性を含む) です。そのため、この項目属性のリストで複数のレコードが同じ値を持つ場合、1 つだけが考慮されます。項目属性はクエリを実行するベーステーブル拡張テーブルに属している必要があり、考慮すべき点がいくつかあるため、以下で例を挙げて説明します。

説明

以下では 2 つの使用シナリオを説明します。 
提示されるすべての例で、以下の Transaction オブジェクトを考えます:
Customer
{
  CustomerId*
  CustomerName
}

Product
{
  ProductId*
  ProductName
  ProductPrice
}

Invoice
{
  InvoiceId*
  InvoiceDate
  CustomerId
  CustomerName
  InvoiceTotal - Formula Attribute: SUM(InvoiceLineAmount)
  Line
  {   
     ProductId*
     ProductName
     ProductPrice
     InvoiceLineQuantity
     InvoiceLineAmount - Formula Attribute: ProductPrice * InvoiceLineQuantity
   }
} 


1. 単純なシナリオ: 重複を避けます。

請求書が存在するすべての日付を、重複なしで列挙する必要があるとします: 
For each Invoice
unique InvoiceDate
   print PBDate //printblock: InvoiceDate 項目属性
endfor

2. より複雑なシナリオ: 集計を含むデータのグループを表示します。

各請求日と、その請求日のすべての請求の合計金額を列挙する必要があるとします:
For each Invoice
unique InvoiceDate
   &total = Sum(InvoiceTotal)
   print PBTotalAmountDate //printblock: InvoiceDate、&total
endfor
ここで、For each のベーステーブルは、Sum で集計されたインライン式ベーステーブル (Invoice) と同じです。したがって、この式は、評価のための暗黙の条件をコンテキストから追加します: ナビゲーションレポートが示すように、Unique 節で指定された項目属性 (InvoiceDate) の請求の合計が計算されます:
イメージ:25508.jpg
考慮事項:
For each コマンドの内部で定義された式のベーステーブルは、その定義に関係する項目属性と、Unique 節を含む For each のコンテキストに関係する項目属性を考慮して決定されます。
たとえば、各商品について、一度も購入されたことのない商品を考慮せずに、その商品が何件の請求で購入されたかをカウントして表示したい場合、以下のコードを定義します:
For each InvoiceLine unique ProductId            
    &ProductInvoicesQuantity = count(ProductId)  //式のベーステーブルは Product ではないInvoiceLine
    print PBProductWithInvoiceQty                //printblock: ProductId、ProductName、&ProductInvoicesQuantity
endfor
式のベーステーブルは Product にはなりません。ProductId 項目属性だけでなく、Unique 節を含む For each のコンテキストも考慮されるため、InvoiceLine になります。したがって、For each のベーステーブルと式のベーステーブルは同じであり、式は評価のための暗黙の条件を追加します: これは、各 ProductId (Unique 節で指定された項目属性) について、それが何回注文されたかをカウントします。

制限

  • Unique 節は、ネストされた For each コマンドの中では宣言できません。
     
  • エクスプレッションは、Unique 節の項目属性リスト内では許可されません。そのため、以下のコードは許可されません:
For each Invoice
unique InvoiceDate.Year()  //許可されない
    //何らかの処理を実行する
endfor
代わりに、次のように計算される式項目属性 (Invoice トランザクションの第 1 レベルにある InvoiceDateYear) を定義できます: InvoiceDate.Year() を実行し、Unique 節でその項目属性を参照します。 
  • For Each コマンドの本文とデータ プロバイダー グループの両方の中で、ただしインライン式の外側で、Unique 節で宣言された項目属性に関して一意の値を持つ項目属性のみを使用できます。

    : 本文を参照する場合、order、using、where 節などは含まれません。つまり、レコードのフィルタ、順序付けなどが行われた時点で制限が適用されます。

    そのため、以下のコードは正しくありません:
    for each Unique InvoiceDate
        print PBInvoiceData //printblock: InvoiceDate、InvoiceId
    Endfor
    同じ InvoiceDate 値を持つレコードの InvoiceId 値は一意ではありません。そのため、以下のエラーが表示されます:
error: spc0206: Cannot reference attribute(s) InvoiceId unless they are referenced in Unique clause in group starting at line xx.

  • For Each の本文/データプロバイダーでの式
     
    • For Each の本文/データプロバイダーに含まれる Horizontal 式
      Unique 節の項目属性からの一意の値を使用して、式に関係する項目属性にアクセスできる必要があります。
       
    • For Each の本文/データプロバイダーに含まれる Aggregate 式
      Unique 節の項目属性からの一意の値を使用して、式に関係する項目属性にアクセスできる必要はありません。このため、次の例は有効になります。

      特定の日付以降の請求がある各顧客について、顧客名とそれらの請求の合計金額を出力する必要があるとします:
For each Invoice
unique CustomerName
where InvoiceDate >= &fromDate
   &total = Sum(InvoiceTotal, InvoiceDate>=&fromDate)
   print PBCustomerInfo //printblock: CustomerName、&total
endfor
CustomerName からの一意の値を使用して InvoiceDate にアクセスすることはできませんが、InvoiceDate は Aggregate 式の外側の For each コマンドの本文内にはありません。InvoiceDate は where 節内のみで記述され、本文のコードが実行されるときに、レコードを取得するためのフィルタとして機能します。また、Sum 定義内にも含まれており、式の評価のためにナビゲートされるレコードに対するフィルタを示します。

適用範囲

参考情報

データプロバイダーにおける Unique 節
Option Distinct 節 (Unique 節に変更されましたが、互換性のために残されています)


サブページ
Created: 15/01/07 22:49 by Admin Last update: 24/11/05 18:57 by Admin
カテゴリ
Powered by GXwiki 3.0