我参考了这个问题和答案To get total and subtotal without loop in new abap。但我的要求比这简单得多。我只需要带有相应总数的类别。
我有内部表,如:
Category Amount
AAA 10
AAA 20
BBB 30
CCC 40
CCC 50
CCC 60
Run Code Online (Sandbox Code Playgroud)
我需要像这样构建内部表:
Category Amount
AAA 30
BBB 30
CCC 150
Run Code Online (Sandbox Code Playgroud)
有人能帮忙吗?
从 7.40 版本开始,这可以通过将内部表 ( FOR GROUPS) 中的分组与REDUCE用于计算每个组的总和相结合来完成。
首先是几个声明:
TYPES:
BEGIN OF data_struct,
category TYPE c LENGTH 3,
amount TYPE i,
END OF data_struct,
data_tab TYPE STANDARD TABLE OF data_struct WITH EMPTY KEY.
DATA(input) = VALUE data_tab(
( Category = 'AAA' Amount = 10 )
( Category = 'AAA' Amount = 20 )
( Category = 'BBB' Amount = 30 )
( Category = 'CCC' Amount = 40 )
( Category = 'CCC' Amount = 50 )
( Category = 'CCC' Amount = 60 )
).
Run Code Online (Sandbox Code Playgroud)
这里的解决方案:
DATA(output) = VALUE data_tab(
FOR GROUPS group OF input_line IN input
GROUP BY ( category = input_line-category )
( category = group-category
amount = REDUCE #(
INIT subtotal = 0
FOR group_line IN GROUP group
NEXT subtotal = subtotal + group_line-amount
)
)
).
Run Code Online (Sandbox Code Playgroud)
现在到底发生了什么?
内部表的数据output由FOR GROUPS. 该FOR GROUPS表表达式由三个部分组成:该组的声明中,分组标准和结果。
首先关于声明部分:GROUPS group OF input_line IN input. 这定义了一个名为“group”的组,它的源是内部表“input”,我们将该源表的每一行称为“input_line”。
接下来是分组标准:GROUP BY ( category = input_line-category ). 这意味着每个组都由具有单个字段“类别”的键标识,并且我们希望将字段“类别”相同的所有行分组。
现在是结果部分:
( category = group-category
amount = REDUCE #(
INIT subtotal = 0
FOR group_line IN GROUP group
NEXT subtotal = subtotal + group_line-amount
)
)
Run Code Online (Sandbox Code Playgroud)
这定义了每个组在输出集中应该如何表示。第一个字段“类别”很简单 - 只需输入名为“组”的组的“类别”值。
第二个字段“金额”有点复杂,因为它的值是由 a 计算的REDUCE。REDUCE 构造表达式的目的是取多个值并将它们转换为一个值。它通过执行以下操作来做到这一点:
INIT subtotal = 0FOR GROUPS. 在这种情况下,后者:FOR group_line IN GROUP groupNEXT subtotal = subtotal + group_line-amount调试器的结果: