GeneXusの5日間の基礎研修を受講した方は「コントロールブレイク」という単語に聞き覚えがあると思います。
コントロールブレイクとは、キー項目を並び替え、キーの値が変わるまで処理を継続することで、キー項目ごとの集計などを実現する手法です。
SQLが発展する以前の時代の用語らしく最近ではあまり聞かないと思いますが、SQLのGroup byをプログラミングで実現するものとイメージしてください。
GeneXusにおけるコントロールブレイクは、For Eachコマンドを同一のベーステーブルで入れ子にすることで実現します。
1 2 3 4 5 6 7 8 9 |
For Each Ordered Order ProductId &SDTOrderItem = New() &SDTOrderItem.ProductId = ProductId &SDTOrderItem.ProductName = ProductName For Each Ordered &SDTOrderItem.TotalSum += OrderedNum EndFor &SDTOrder.Add(&SDTOrderItem) EndFor |
上記ではProductIdの値が変わったらコントロールブレイクし、ProductId毎にOrderedNumを加算しています。
ビルド時のナビゲーションにコントロールブレイクの実施を表す”Break”が表示されます。
なお、Unique節を使用しても、コントロールブレイクと同じ結果が得られます。
1 2 3 4 5 6 7 |
For Each Ordered Order ProductId Unique ProductId, ProductName &SDTOrderItem = New() &SDTOrderItem.ProductId = ProductId &SDTOrderItem.ProductName = ProductName &SDTOrderItem.TotalSum = Sum(OrderedNum) &SDTOrder.Add(&SDTOrderItem) EndFor |
パフォーマンス的にはUnique節を使用した方が良いはずですが、Unique節が使用できない場面では、コントロールブレイクを使用して集計します。