簡體   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