在ABAP中计算内部表中的重复项

时间:2018-04-25 06:42:28

标签: sap abap hana

我只想询问如何计算内部表中的重复项。我想这样做是为了让我按客户计算并将其放入客户计数栏。

Sales Employee          Customer    Customer Count
a                          1             2
a                          2             2
b                          3             3
b                          2             3
b                          4             3
c                          1             1

2 个答案:

答案 0 :(得分:3)

正如suncatcher在评论中提到的那样,使用sql聚合比循环遍历内部表更有效。但如果在您的情况下不可能,那么一种方法是使用collect语句。 collect将条目添加到内部表,并在具有相同键字段的行已存在时添加数字字段。创建一个内部表,其中包含销售员工的字段,另一个计数字段和循环销售表,使用collect更新每个销售的计数表。

types: begin of t_count,
       employee type text10,
       count type i,
       end of t_count.

data: it_count type standard table of t_count,
      wa_count type t_count.

loop at it_sales into wa_sales.
    move: wa_sales-employee to wa_count-employee,
          1 to wa_count-count.

    collect wa_count into it_count.
endloop.

该示例假设您有一个表it_sales,一个工作区wa_sales,两者都有一个字段employee。然后,表it_count包含您的员工列表(按照它们在销售表中的显示顺序)以及它们在销售表中出现的次数。

答案 1 :(得分:1)

FIELD-SYMBOLS : <lfs_sales> TYPE ty_sales.

假设li_sales是一个包含Sales_employee,Customer和customer_count列的内部表。最初表条目如下所示。

Sales_employee Customer customer_count
a                 1             0
a                 2             0
b                 3             0
b                 2             0
b                 4             0
c                 1             0

我们需要计算重复的sales_employee计数并更新customer_count字段。我们可以使用Dirik建议的收集声明或使用控制中断语句,如下所示。

使用SUM关键字的先决条件是将customer_count初始化为每行1,以便它可以根据类似的sales_employee总结客户数。

LOOP AT li_sales ASSIGNING <lfs_sales>.
     <lfs_sales>-customer_count = 1.
ENDLOOP.

现在条目如下所示。

Sales_employee Customer customer_count
a                 1             1
a                 2             1
b                 3             1
b                 2             1
b                 4             1
c                 1             1

以下代码确实更新了customer_count字段值。

LOOP AT li_sales INTO rec_sales.
AT END OF employee.
  SUM.
  MOVE-CORRESPONDING rec_sales TO rec_count.
  APPEND rec_count TO li_count.
  CLEAR rec_count.
ENDAT.
ENDLOOP.

SORT li_count BY employee.
LOOP AT li_sales ASSIGNING <lfs_sales>.
  CLEAR rec_count.
  READ TABLE li_count INTO rec_count
  WITH KEY employee = <lfs_sales>-employee
  BINARY SEARCH.
  IF sy-subrc IS INITIAL.
    <lfs_sales>-count = rec_count-count.
  ENDIF.
ENDLOOP.

现在内部表被分配了customer_count,如下所示。

Sales_employee Customer customer_count
a                 1             2
a                 2             2
b                 3             3
b                 2             3
b                 4             3
c                 1             1