因为最近有个需求要用到多重去重的功能,之前考虑过其他的办法。都过于复杂,经朋友提醒一下,想到了这个简单一些的办法。
话不多说,直接上代码操作,更简洁意懂。
第一种去重方法。
先做个申明
TYPES: BEGIN OF ty_data,
matnr TYPE mara-matnr,
mtart TYPE mara-mtart,
matkl TYPE mara-matkl,
text1 TYPE char50,
END OF ty_data.
DATA lt_data TYPE TABLE OF ty_data.
DATA lt_table TYPE TABLE OF ty_data.
再造点数据进去
lt_data = VALUE #( ( matnr = 'Material-001'
mtart = 'FOOD'
matkl = '1020'
text1 = 'FIRST' )
( matnr = 'Material-002'
mtart = 'WATR'
matkl = '1030'
text1 = 'SECOND' )
( matnr = 'Material-003'
mtart = 'WATR'
matkl = '1020'
text1 = 'THIRD' )
( matnr = 'Material-004'
mtart = 'WATR'
matkl = '1020'
text1 = 'FOURTH' )
( matnr = 'Material-005'
mtart = 'WATR'
matkl = '1020'
text1 = 'FIFTH' )
( matnr = 'Material-006'
mtart = 'WATR'
matkl = '1020'
text1 = 'SIXTH' )
( matnr = 'Material-007'
mtart = 'WATR'
matkl = '1020'
text1 = 'SEVENTH' )
( matnr = 'Material-008'
mtart = 'WATR'
matkl = '1030'
text1 = 'EIGHTH' )
( matnr = 'Material-009'
mtart = 'WATR'
matkl = '1030'
text1 = 'NINTH' )
( matnr = 'Material-010'
mtart = 'WATR'
matkl = ''
text1 = 'TENTH' )
( matnr = 'Material-011'
mtart = 'WATR'
matkl = ''
text1 = 'ELEVENTH' )
( matnr = 'Material-012'
mtart = 'WATR'
matkl = ''
text1 = 'TWELFTH' ) ).
SORT lt_data BY matkl.
DELETE ADJACENT DUPLICATES FROM lt_data COMPARING matkl.
CALL METHOD cl_demo_output=>display( lt_data ).
直接删除掉重复项,得到的结果
这种结果,不是我想要的。
所以要用其他的方法去重。
第二种
还是一样的操作
先做个申明
TYPES: BEGIN OF ty_data,
matnr TYPE mara-matnr,
mtart TYPE mara-mtart,
matkl TYPE mara-matkl,
text1 TYPE char50,
END OF ty_data.
DATA lt_data TYPE TABLE OF ty_data.
DATA lt_table TYPE TABLE OF ty_data.
DATA lt_table1 TYPE TABLE OF ty_data.
加了一个操作的内表,再造点数据进去
lt_data = VALUE #( ( matnr = 'Material-001'
mtart = 'FOOD'
matkl = '1020'
text1 = 'FIRST' )
( matnr = 'Material-002'
mtart = 'WATR'
matkl = '1030'
text1 = 'SECOND' )
( matnr = 'Material-003'
mtart = 'WATR'
matkl = '1020'
text1 = 'SECOND' )
( matnr = 'Material-004'
mtart = 'WATR'
matkl = '1020'
text1 = 'SECOND' )
( matnr = 'Material-005'
mtart = 'WATR'
matkl = '1020'
text1 = 'THIRD' )
( matnr = 'Material-006'
mtart = 'WATR'
matkl = '1020'
text1 = 'THIRD' )
( matnr = 'Material-007'
mtart = 'WATR'
matkl = '1020'
text1 = 'THIRD' )
( matnr = 'Material-008'
mtart = 'WATR'
matkl = '1030'
text1 = 'THIRD' )
( matnr = 'Material-009'
mtart = 'WATR'
matkl = '1030'
text1 = 'FOURTH' )
( matnr = 'Material-010'
mtart = 'WATR'
matkl = ''
text1 = 'FOURTH' )
( matnr = 'Material-011'
mtart = 'WATR'
matkl = ''
text1 = 'FOURTH' )
( matnr = 'Material-012'
mtart = 'WATR'
matkl = ''
text1 = 'FOURTH' ) ).
再来去重的代码。
LOOP AT lt_data INTO DATA(lwa_data) GROUP BY lwa_data-matkl INTO DATA(g1).
IF g1 IS NOT INITIAL.
lt_table1 = VALUE #( FOR lwa_table1 IN GROUP g1 ( lwa_table1 ) ).
DELETE ADJACENT DUPLICATES FROM lt_table1 COMPARING matkl. "第一个维度 物料组相同的去重
ELSE.
lt_table1 = VALUE #( FOR lwa_table1 IN GROUP g1 ( lwa_table1 ) ).
ENDIF.
LOOP AT lt_table1 INTO DATA(lwa_table).
APPEND lwa_table TO lt_table.
ENDLOOP.
ENDLOOP.
CALL METHOD cl_demo_output=>display( lt_table ).
注意,数据有了不小的变化了。
因为要考虑到多个维度的去重,第一个维度的重复项已经去重了。
OK。
再来去重第二个维度的重复项。
还是一样的操作
先做个申明
TYPES: BEGIN OF ty_data,
matnr TYPE mara-matnr,
mtart TYPE mara-mtart,
matkl TYPE mara-matkl,
text1 TYPE char50,
END OF ty_data.
DATA lt_data TYPE TABLE OF ty_data.
DATA lt_table TYPE TABLE OF ty_data.
DATA lt_table1 TYPE TABLE OF ty_data.
加了一个操作的内表,再造点数据进去
lt_data = VALUE #( ( matnr = 'Material-001'
mtart = 'FOOD'
matkl = '1020'
text1 = 'FIRST' )
( matnr = 'Material-002'
mtart = 'WATR'
matkl = '1030'
text1 = 'SECOND' )
( matnr = 'Material-003'
mtart = 'WATR'
matkl = '1020'
text1 = 'SECOND' )
( matnr = 'Material-004'
mtart = 'WATR'
matkl = '1020'
text1 = 'SECOND' )
( matnr = 'Material-005'
mtart = 'WATR'
matkl = '1020'
text1 = 'THIRD' )
( matnr = 'Material-006'
mtart = 'WATR'
matkl = '1020'
text1 = 'THIRD' )
( matnr = 'Material-007'
mtart = 'WATR'
matkl = '1020'
text1 = 'THIRD' )
( matnr = 'Material-008'
mtart = 'WATR'
matkl = '1030'
text1 = 'THIRD' )
( matnr = 'Material-009'
mtart = 'WATR'
matkl = '1030'
text1 = 'FOURTH' )
( matnr = 'Material-010'
mtart = 'WATR'
matkl = ''
text1 = 'FOURTH' )
( matnr = 'Material-011'
mtart = 'WATR'
matkl = ''
text1 = 'FOURTH' )
( matnr = 'Material-012'
mtart = 'WATR'
matkl = ''
text1 = 'FOURTH' ) ).
再来去重的代码。
LOOP AT lt_data INTO DATA(lwa_data) GROUP BY lwa_data-matkl INTO DATA(g1).
IF g1 IS NOT INITIAL.
lt_table1 = VALUE #( FOR lwa_table1 IN GROUP g1 ( lwa_table1 ) ).
DELETE ADJACENT DUPLICATES FROM lt_table1 COMPARING matkl. "第一个维度 物料组相同的去重
ELSE.
lt_table1 = VALUE #( FOR lwa_table1 IN GROUP g1 ( lwa_table1 ) ).
DELETE ADJACENT DUPLICATES FROM lt_table1 COMPARING text1. "第二个维度 文本相同的去重
ENDIF.
LOOP AT lt_table1 INTO DATA(lwa_table).
APPEND lwa_table TO lt_table.
ENDLOOP.
ENDLOOP.
CALL METHOD cl_demo_output=>display( lt_table ).
完成,达到我需要的结果了
多重去重,这种方法应该算是比较简单的了。
如果还有更简单的,欢迎大家一起来研讨一下。