Как сформировать новый собственный список во внутренней таблице? ABAP - PullRequest
0 голосов
/ 04 июля 2018

Список во внутренней таблице в начале:

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. Если столбец name с несколькими одинаковыми именами (например, с четырьмя - Jon ) имеет значение (столбец sum ) 34,5 ... и 0, затем отбросить все 0 и вывести только ненулевое значение.
  2. Если столбец имя с несколькими одинаковыми именами (например, два - Анна ) имеет значение (столбец сумма ) 0 - затем вывести только одно имя со значением 0.
  3. Список не может быть отсортирован - выходные данные должны иметь список в том же порядке, что и входные.

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

Имеет время выполнения 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.
0 голосов
/ 04 июля 2018

У меня недостаточно баллов, чтобы комментировать чужие сообщения, но я вижу, что они сортируют таблицы, когда в спецификации говорится, что они не должны сортироваться. К сожалению, вам придется отсортировать эту таблицу (что на самом деле повезло). Вы должны спросить, почему это должно оставаться именно таким образом.

Я попробовал подход без сортировки, но теряю Анну при извлечении данных.

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.
0 голосов
/ 04 июля 2018

Я думаю, 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.

Надеюсь, это поможет!

Для тех, кто думает, что я не проверял это.

Вот таблица ввода -

Input table

Выход -

enter image description here

...