如何在内部 table 中生成新的自己的列表?阿巴普
How to generate new own list in an internal table? abap
列表在内部table开头:
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
从内部得到这样一个列表的输出table:
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有几个相同的名字(比如两个-Anna)有一个值(列 sum)0 - 然后只打印一个值为 0.
的名称
- 列表无法排序 - 输出必须有一个与输入顺序相同的列表。
我正在考虑 lt_grp1
将包含开始的内部 table 记录。我已经声明 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.
希望对您有所帮助!
对于那些认为我没有测试过的人。
这里是输入table -
输出-
这有 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.
列表在内部table开头:
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
从内部得到这样一个列表的输出table:
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有几个相同的名字(比如两个-Anna)有一个值(列 sum)0 - 然后只打印一个值为 0. 的名称
- 列表无法排序 - 输出必须有一个与输入顺序相同的列表。
我正在考虑 lt_grp1
将包含开始的内部 table 记录。我已经声明 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.
希望对您有所帮助!
对于那些认为我没有测试过的人。
这里是输入table -
输出-
这有 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.