在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的文档提到,您应该推迟在标准表(性能)上使用它。是的,我尝试过它,但我尝试对他的逻辑进行一些更改,以满足我的要求。无论如何,谢谢!