无需 LOOP 即可获得总数

Hen*_*nry 3 abap

我参考了这个问题和答案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)

有人能帮忙吗?

Phi*_*ipp 5

从 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)

现在到底发生了什么?

内部表的数据outputFOR 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 构造表达式的目的是取多个值并将它们转换为一个值。它通过执行以下操作来做到这一点:

  1. 声明并初始化一个变量: INIT subtotal = 0
  2. 对内部表或外部FOR GROUPS. 在这种情况下,后者:FOR group_line IN GROUP group
  3. 对该输入的每一行执行相同的代码片段,更改变量。在这种情况下,通过将其金额添加到小计中:NEXT subtotal = subtotal + group_line-amount
  4. 返回在步骤 1 中声明的变量的最终值。

调试器的结果:

结果