如何在内部表中生成新的自己的列表?abap

如何在内部表中生成新的自己的列表?abap,abap,Abap,开始时内部表格中的列表: code | name | sum 22 | Jon | 234.3 22 | Jon | 34.2 22 | Jon | 0 22 | Jon | 0 12 | Bob | 999.4 12 | Bob | 0 45 | Anna | 0 45 | Anna | 0 11 | Mike | 0 11 | Mike | 234.3 code | name | sum 22 | Jon | 234.3 22

开始时内部表格中的列表:

code | name | sum
 22  | Jon  | 234.3
 22  | Jon  | 34.2
 22  | Jon  | 0
 22  | Jon  | 0
 12  | Bob  | 999.4
 12  | Bob  | 0
 45  | Anna | 0
 45  | Anna | 0
 11  | Mike | 0
 11  | Mike | 234.3
code | name | sum
 22  | Jon  | 234.3
 22  | Jon  | 34.2
 12  | Bob  | 999.4
 45  | Anna | 0
 11  | Mike | 234.3
要从内部表获取此类列表的输出:

code | name | sum
 22  | Jon  | 234.3
 22  | Jon  | 34.2
 22  | Jon  | 0
 22  | Jon  | 0
 12  | Bob  | 999.4
 12  | Bob  | 0
 45  | Anna | 0
 45  | Anna | 0
 11  | Mike | 0
 11  | Mike | 234.3
code | name | sum
 22  | Jon  | 234.3
 22  | Jon  | 34.2
 12  | Bob  | 999.4
 45  | Anna | 0
 11  | Mike | 234.3
形成新(传出)列表的条件:

code | name | sum
 22  | Jon  | 234.3
 22  | Jon  | 34.2
 22  | Jon  | 0
 22  | Jon  | 0
 12  | Bob  | 999.4
 12  | Bob  | 0
 45  | Anna | 0
 45  | Anna | 0
 11  | Mike | 0
 11  | Mike | 234.3
code | name | sum
 22  | Jon  | 234.3
 22  | Jon  | 34.2
 12  | Bob  | 999.4
 45  | Anna | 0
 11  | Mike | 234.3
  • 如果具有多个相同名称的列name(例如具有四个-Jon)有一个值(列sum)34.5。。。和0,然后丢弃所有0,只打印非零
  • 如果具有多个相同名称(例如两个)的列name的值为0(列sum),则仅打印一个值为0的名称
  • 列表无法排序-输出必须具有与输入相同顺序的列表

  • 我正在考虑
    lt_grp1
    将包含开始的内部表记录。我已经声明了与
    lt\u grp1
    结构相同的
    lt\u grp2

      DATA: lv_index TYPE i VALUE 0.
    
      APPEND LINES OF lt_grp1 TO lt_grp2.
      DELETE ADJACENT DUPLICATES FROM lt_grp2 COMPARING code name.
    
      LOOP AT lt_grp2 INTO ls_grp1.
    
        LOOP AT lt_grp1 INTO ls_grp2
              WHERE code = ls_grp1-code
                AND name = ls_grp1-name.
          lv_index = lv_index + 1.
          IF ls_grp2-sum = 0.
            IF lv_index > 1.
              DELETE lt_grp1 INDEX sy-tabix.
            ENDIF.
          ELSE.
            IF lv_index > 1.
              DELETE lt_grp1 WHERE sum = 0
                              AND code = ls_grp1-code.
            ENDIF.
          ENDIF.
          CLEAR: ls_grp2.
        ENDLOOP.
        CLEAR : lv_index.
      ENDLOOP.
    
    
      CLEAR :ls_grp1.
      LOOP AT lt_grp1 INTO ls_grp1.
        WRITE: / ls_grp1-code, ls_grp1-name, ls_grp1-sum.
      ENDLOOP.
    
    希望这有帮助

    对于那些认为我没有测试它的人

    这里是输入表-

    输出-

    这有O(n log(n))运行时

    lt_copy=lt_original。
    按代号升序和降序对lt\U副本排序。如果有非零行,则它位于顶部
    从lt\U副本中删除相邻副本。
    在lt_原件处循环到数据(ls_原件)。
    如果ls_原始和=0。“只需检查0行”
    读取表lt\U副本分配二进制搜索
    使用KEY code=-code
    name=-name。
    如果-sum=0。
    “此代码和名称只有零,我们需要它”
    其他的
    删除lt_原件。
    恩迪夫。
    恩迪夫。
    结束循环。
    
    兄弟,让我们看看代码!:)@andreas我只是ABAP的初学者,所以请帮助我了解算法,如果你知道可以使用什么标准方法来解决这个问题,那么没有标准方法,因为你有定制的要求。只是循环和删除,只有硬核!不要试图让别人替你做你的工作。@András无法排序,新列表必须按照它的顺序排列before@Suncatcher我不想让别人来做我的工作,我刚才描述了一个我不理解的问题,并问如何解决它
    lt_grp2=lt_grp1
    附加
    @András行要快得多,因为我只需要一个jon,这就是为什么我要复制另一个内部表。首先理解代码。它在做什么。@András我知道什么是规范。我认为你很难理解代码。我在编辑中给出了测试结果。@András我只从一个内部表中删除,而不是从两个表中删除。@divScorp如果lv_index>1,为什么要检查两次->
    。。。ENDIF.
    在您的代码中?