繁体   English   中英

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

[英]How to generate new own list in an internal table? 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. 如果有几个相同的名称(例如四-乔恩)列有一个值(列总和)34.5 ...和0,然后扔掉所有0并打印非零。
  2. 如果具有几个相同的名称(例如两个-安娜)列具有值(列总和)0 -然后用值0仅打印一个名称。
  3. 列表无法排序 - 输出必须有一个与输入顺序相同的列表。

我正在考虑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.

希望这可以帮助!

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

这是输入表-

输入表

输出 -

在此处输入图片说明

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

lt_copy = lt_original.
SORT lt_copy BY code name ASCENDING sum DESCENDING. "if there is a non-zero line, it is at the top "
DELETE ADJACENT DUPLICATES FROM lt_copy.

LOOP AT lt_original INTO DATA(ls_original).
  IF ls_original-sum = 0. "only 0 lines need to be checked"
    READ TABLE lt_copy ASSIGNING <fs_max_sum> BINARY SEARCH
        WITH KEY code = <fs_original>-code
                 name = <fs_original>-name.
    IF <fs_max_sum>-sum = 0.
      "there are only zeros for this code and name, we need it"
    ELSE.
      DELETE lt_original.
    ENDIF.
  ENDIF.
ENDLOOP.

我没有足够的要点来评论其他人的帖子,但是我看到当规范说它不能排序时,他们正在对表格进行排序。 不幸的是,您将不得不对该表进行排序(这实际上是幸运的事情)。 您需要问为什么它必须以这种特定方式保留。

我尝试了一种不进行排序的方法,但是在提取数据时丢失了Anna。

LOOP At itab.
    READ TABLE itab WITH KEY code = itab-code TRANSPORTING NO FIELDS.
    IF SY-SUBRC EQ 0.
      IF itab-sum NE 0.
        wa-code = itab-code.
        wa-name = itab-name.
        wa-sum = itab-sum.
        APPEND wa.
      ENDIF.
    ENDIF
  ENDLOOP.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM