LOOP AT ITAB GROUP BY 多重维度去重数据

因为最近有个需求要用到多重去重的功能,之前考虑过其他的办法。都过于复杂,经朋友提醒一下,想到了这个简单一些的办法。
话不多说,直接上代码操作,更简洁意懂。


第一种去重方法。


先做个申明

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

完成,达到我需要的结果了
在这里插入图片描述
多重去重,这种方法应该算是比较简单的了。
如果还有更简单的,欢迎大家一起来研讨一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值