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

在ABAP中计算内部表中的重复项,abap,internal-tables,Abap,Internal Tables,我只想问一下如何计算内部表中的重复项。我想这样做是为了让我计算每个客户的数量,并将其放入“客户数量”列中 Sales Employee Customer Customer Count a 1 2 a 2 2 b 3 3 b

我只想问一下如何计算内部表中的重复项。我想这样做是为了让我计算每个客户的数量,并将其放入“客户数量”列中

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

正如suncatcher在他的评论中提到的,使用sql聚合比在内部表中循环更有效。但如果在你的情况下这是不可能的,一种方法是使用该声明
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\u sales
,一个工作区
wa\u sales
,这两个表都有一个字段
employee
。表
it\u count
然后包含您的员工列表(按他们在销售表中出现的顺序)以及他们在销售表中出现的次数。

正如suncatcher在评论中提到的,使用sql聚合比在内部表中循环更有效。但如果在你的情况下这是不可能的,一种方法是使用该声明
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.
FIELD-SYMBOLS : <lfs_sales> TYPE ty_sales.
该示例假设您有一个表
it\u sales
,一个工作区
wa\u sales
,这两个表都有一个字段
employee
。表
it\u count
然后包含您的员工列表(按他们在销售表中出现的顺序)以及他们在销售表中出现的次数

FIELD-SYMBOLS : <lfs_sales> TYPE ty_sales.
我们需要计算重复的sales\u employee count并更新customer\u count字段。我们可以使用Dirik建议的collect语句,也可以使用如下所示的controlbreak语句

Sales_employee Customer customer_count
a                 1             1
a                 2             1
b                 3             1
b                 2             1
b                 4             1
c                 1             1
使用SUM关键字的先决条件是将每行的customer_count初始化为1,以便它可以根据相似的sales_employee汇总customer_count

LOOP AT li_sales ASSIGNING <lfs_sales>.
     <lfs_sales>-customer_count = 1.
ENDLOOP.
以下代码会更新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.
我们需要计算重复的sales\u employee count并更新customer\u count字段。我们可以使用Dirik建议的collect语句,也可以使用如下所示的controlbreak语句

Sales_employee Customer customer_count
a                 1             1
a                 2             1
b                 3             1
b                 2             1
b                 4             1
c                 1             1
使用SUM关键字的先决条件是将每行的customer_count初始化为1,以便它可以根据相似的sales_employee汇总customer_count

LOOP AT li_sales ASSIGNING <lfs_sales>.
     <lfs_sales>-customer_count = 1.
ENDLOOP.
以下代码会更新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.

使用SQL子句并已使用聚合结果构建itab。这比计算itab中的DUP更有效。使用SQL子句并使用聚合结果构建itab。它比在itab中计算DUP更有效。您应该将其更改为排序表。关于COLLECT的文档提到,您应该推迟在标准表(性能)上使用它。是的,我尝试过它,但我尝试对他的逻辑进行一些更改,以满足我的要求。无论如何,谢谢!您应该将其更改为排序表。关于COLLECT的文档提到,您应该推迟在标准表(性能)上使用它。是的,我尝试过它,但我尝试对他的逻辑进行一些更改,以满足我的要求。无论如何,谢谢!