Ordaと集計

例えば、伝票があるとしてORDAをつかって商品毎の個数と売上金額を集計しようとする場合
どの様に記述するのがスマートなのでしょうか?

SQLだとGROUP BYで書けるとおもうのですが、ORDAにはGROUP BYがない?ので
どう書くのか疑問になりました。 :pray:

表示のみで良いのでエンティティセレクション型のリストボックスへ表示するのにべんりかなと思ったのですが
集計方法でつまづきました。 :mrgreen:

一応想定していた書き方はこんな感じです。

Code :
$item_c:=New collection(“product_id”;“product_name”;“sum(qty)”;“sum(amount)”)
$result_c:=ds.den_detail.query("…").groupBy(“product_id,unit_price”;$item_c)

「商品毎の個数と売上金額を集計」

アイデア

集計: Sum() は使用しない
商品毎: オブジェクト型を使用する(プロパティ名をキーとした連想配列)
リストボックス: オブジェクトからコレクションを起こす

ステップ1

対象データからコレクションを作ります。

$col:=ds.den_detail.all().toCollection(“product_id,unit_price,qty,amount,product_name”)

ステップ2

集計します。

$newObj:=$col.reduce(“reduce_test”;New object)

reduce_test {
C_OBJECT($1;$value;$accumulator)

$value:=$1.value
$accumulator:=$1.accumulator

C_TEXT($product_id;$product_name)
$product_id:=$value.product_id
$product_name:=$value.product_name

C_OBJECT($o)
$o:=$accumulator[$product_id]
If ($o=Null)
$o:=New object(“product_id”;$product_id;“product_name”;$product_name;“qty”;0;“amount”;0)
$accumulator[$product_id]:=$o
End if

$o.qty:=$o.qty+$value.qty
$o.amount:=$o.amount+$value.amount
}

ステップ3

表示用のコレクションに変換します。

$col:=New collection
C_TEXT($product_id)
For each ($product_id;$newObj)
$col.push($newObj[$product_id])
End for each

https://forums.4d.com/4DBB_Main/x_User/298210/files/31605689.zip