删除邻接重复不起作用

时间:2012-11-06 16:24:02

标签: duplicates sap abap

我有一个内部表,其中包含108个条目。从9到9个条目重复条目,我想删除重复项。由于它们完全相同,我使用了delete adjacent duplicates from itab comparing all fields。也试过没有comparing all fields。没有成功。 如果它有帮助,我的桌子有9个字段:bukrs,hkont,gjahr,belnr,budat,waers,shkzg,wrbtr,dmbtr和dmbe2。他们来自BSIS,他们也在这个顺序。 这是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 个答案:

答案 0 :(得分:8)

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

中说明
  

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

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

 A B
 C D
 A B
 C D

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

另一方面,SELECT语句在返回所选数据集时不保证特定顺序,除非您将其告知ORDER BY一列或多列。行只是以任何顺序返回,如果DELETE ADJACENT 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.

答案 1 :(得分:1)

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

  1. 排序内部表格。

    SORT ITAB WITH KEY ITAB-FIELDS.
    
  2. 然后比较字段。

     DELETE ADJACENT DUPLICATES FROM ITAB
    

    它会正常工作。

答案 2 :(得分:0)

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

根据&#34; bug&#34; - 之前有一个很好的评论。

此致 安德鲁。

相关问题