首页 文章

删除邻接重复不起作用

提问于
浏览
3

我有一个内部表,其中包含108个条目 . 从9到9个条目's repeating the entries and I wanted to delete does duplicates. Since they'与我使用的 delete adjacent duplicates from itab comparing all fields 完全相同 . 也试过没有 comparing all fields . 没有成功 . 如果它有帮助,我的 table 有9个字段:bukrs,hkont,gjahr,belnr,budat,waers,shkzg,wrbtr,dmbtr和dmbe2 . 他们也按此顺序排列 . 这是 DO 循环,其中是SELECT enter code here . 我把 DELETE 推到了 DO 循环之外 . 两个第一个 SELECT 工作正常,属于以前存在的代码 .

DO 12 TIMES.
         lv_aux = lv_aux + 1.
         lv_tamanho = STRLEN( lv_aux ).
         IF lv_tamanho = 1.
           CONCATENATE '0' lv_aux INTO lv_aux.
         ENDIF.
         CONCATENATE p_gjahr lv_aux '01' INTO z_v_first_day.

         PERFORM get_last_day_of_month USING z_v_first_day
                                       CHANGING lv_last_day.

         " some other code irrelevant to the issue

         SELECT bukrs hkont gjahr belnr budat waers shkzg dmbtr wrbtr dmbe2 FROM bsis
           APPENDING CORRESPONDING FIELDS OF TABLE gt_bancbsis
           WHERE hkont = '0051100001'
           AND bukrs EQ p_bukrs
           AND budat <= lv_last_day.

         " some other code irrelevant to the issue
ENDDO.

DELETE ADJACENT DUPLICATES FROM gt_bancbsis COMPARING ALL FIELDS.

这是dubugger中内部表gt_bancbsis的图片 .
itab in the debugger

3 回答

  • 7

    声明 DELETE ADJACENT DUPLICATES 中的单词 ADJACENT 有一个很好的理由:它说明只删除了彼此相邻的重复行 . 这也在_1099549中说明:

    如果相邻行的内容在所检查的组件中相同,则认为行重复 . 如果多个重复行彼此跟随,则删除所有行(第一行除外) .

    这意味着:如果您的表包含值

    A B
     C D
     A B
     C D
    

    它包含重复值,但由于它们不相邻,因此 DELETE ADJACENT DUPLICATES 不会删除它们,无论您指定什么 .

    另一方面, SELECT 语句在返回所选数据集时不保证特定顺序,除非您将其告知 ORDER BY 一列或多列 . 行只是以任何顺序返回,如果 DELETE ADJACENT DUPLICATES 语句有效,那就完全是巧合 . 它甚至可能在一个系统上工作,停止在另一个系统上工作,并且只删除第三个系统上的一半重复项 . 所以,基本规则:

    Make sure that your internal table is sorted by the fields you want to be checked for duplicates BEFORE deleting the duplicates.

    为了获得更好的可伸缩性,您应该使用 SORT 语句,而不是让数据库使用 ORDER BY 对行进行排序 . 所以你可以使用其中之一

    SORT gt_bancbsis.
    DELETE ADJACENT DUPLICATES FROM gt_bancbsis.
    

    或者,如果您只想检查某些字段,

    SORT gt_bancbsis BY foo bar baz.
    DELETE ADJACENT DUPLICATES FROM gt_bancbsis COMPARING foo bar baz.
    
  • 0

    BSIS 表中,您正在使用4个jey字段( bukrs, hkont, gjahr, belnr ) . 仅将这些字段用于排序 .

    • Sort 首先是内部表 .
    SORT ITAB WITH KEY ITAB-FIELDS.
    
    • 然后 COMPARING 字段 .
    DELETE ADJACENT DUPLICATES FROM ITAB
    

    它会工作正常 .

  • 1

    如果这是确切的代码片段,则无需通过ABAP处理重复的行 . 您可以通过SQL语句 <where_clause> 消除它们:获取 lv_last_day 的最大值并在条件中使用它(如果您的选择列表不包含所有关键字段,则使用 distinct 关键字) . 要处理多个 p_bukrsp_bukrs 的每个值和相应的最大值 lv_last_day 放入内部表中,然后使用 FOR ALL ENTRIES IN itab addtion,将_d99573_中的itds组件与fileds进行比较 . 这将返回没有冗余信息的数据,并且与应用程序服务器对大型结果集进行排序相比,开销更少 .

    根据“bug” - 之前有一个很好的评论 .

    问候,安德鲁 .

相关问题