首页 > 解决方案 > 如何在内部表中生成新的自己的列表?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  | Jon  | 34.2
 12  | Bob  | 999.4
 45  | Anna | 0
 11  | Mike | 234.3

形成新(出)名单的条件:

  1. 如果具有多个相同名称的列(例如四个 - Jon)的值(列sum)为 34.5 ... 和 0,则丢弃所有 0 并仅打印非零值。
  2. 如果具有多个相同名称的列(例如两个 - Anna)的值(列sum)为 0 - 则仅打印一个值为 0 的名称。
  3. 列表无法排序 - 输出必须有一个与输入顺序相同的列表。

标签: abap

解决方案


我正在考虑lt_grp1将包含开始的内部表记录。我已经声明lt_grp2了与lt_grp1.

  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.

希望这可以帮助!

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

这是输入表-

输入表

输出 -

在此处输入图像描述


推荐阅读