代码之家  ›  专栏  ›  技术社区  ›  Suncatcher

通过分组在ABAP内部表中查找重复项

  •  1
  • Suncatcher  · 技术社区  · 6 年前

    我们都知道 these excellent ABAP statements 允许在一个线性中查找唯一值:

    it_unique = VALUE #( FOR GROUPS value OF <line> IN it_itab 
                         GROUP BY <line>-field WITHOUT MEMBERS ( value ) ).
    

    但是提取重复项呢?一个人能利用 GROUP BY 这项任务的语法,或者表理解在这里更有用?

    我发现的唯一方法(虽然不是很优雅)是:

    LOOP AT lt_marc ASSIGNING FIELD-SYMBOL(<fs_marc>) GROUP BY ( matnr = <fs_marc>-matnr 
                                                                 werks = <fs_marc>-werks )
                                                      ASSIGNING FIELD-SYMBOL(<group>).
      members = VALUE #( FOR m IN GROUP <group> ( m ) ).
    
      IF lines( members ) > 1.
        "throw error
      ENDIF.
    
    ENDLOOP.
    

    有没有更漂亮的方法通过任意键查找副本?

    3 回复  |  直到 4 年前
        1
  •  3
  •   Suncatcher    6 年前

    所以,我只是把它作为答案,因为我们和弗洛里安没能想出更好的办法。
    如果有人能改进它,就去做吧。

    TYPES tt_materials TYPE STANDARD TABLE OF marc WITH DEFAULT KEY. 
    
    DATA duplicates TYPE tt_materials. 
    LOOP AT materials INTO DATA(material) 
    GROUP BY ( id = material-matnr 
               status = material-pstat 
               size = GROUP SIZE ) 
    ASCENDING REFERENCE INTO DATA(group_ref). 
    
    CHECK group_ref->*-size > 1. 
    duplicates = VALUE tt_materials( BASE duplicates FOR <status> IN GROUP group_ref ( <status> ) ). 
    
    ENDLOOP.
    
        2
  •  1
  •   Florian    6 年前

    鉴于

    TYPES: BEGIN OF key_row_type,
             matnr TYPE matnr,
             werks TYPE werks_d,
           END OF key_row_type.
    TYPES key_table_type TYPE
      STANDARD TABLE OF key_row_type
      WITH DEFAULT KEY.
    
    TYPES: BEGIN OF group_row_type,
             matnr TYPE matnr,
             werks TYPE werks_d,
             size  TYPE i,
           END OF group_row_type.
    TYPES group_table_type TYPE
      STANDARD TABLE OF group_row_type
      WITH DEFAULT KEY.
    
    TYPES tt_materials TYPE STANDARD TABLE OF marc WITH DEFAULT KEY.
    DATA(materials) = VALUE tt_materials(
      ( matnr = '23' werks = 'US' maabc = 'B' )
      ( matnr = '42' werks = 'DE' maabc = 'A' )
      ( matnr = '42' werks = 'DE' maabc = 'B' ) ).
    

    什么时候

    DATA(duplicates) =
      VALUE key_table_type(
        FOR key IN VALUE group_table_type(
          FOR GROUPS group OF material IN materials
          GROUP BY ( matnr = material-matnr
                     werks = material-werks
                     size  = GROUP SIZE )
          WITHOUT MEMBERS ( group ) )
        WHERE ( size > 1 )
        ( matnr = key-matnr
          werks = key-werks ) ).
    

    然后

    cl_abap_unit_assert=>assert_equals(
        act = duplicates
        exp = VALUE tt_materials( ( matnr = '42' werks = 'DE') ) ).
    

    这个解决方案的可读性太差了,您应该只在一个名称明确的方法中使用它,如 collect_duplicate_keys .

    还要注意,语句的长度随着键字段数量的增加而增加,因为 GROUP SIZE 添加需要将键字段作为简单类型列表逐一列出。

        3
  •  0
  •   VXLozano    6 年前

    古典音乐怎么样?我不确定它们是否已被弃用,但我的第一个想法是创建一个表克隆,删除其中相邻的重复项,然后比较两行()。。。 我渴望阅读新选项。