我有一个内部表,其中包含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的图片 .
3 回答
声明
DELETE ADJACENT DUPLICATES
中的单词ADJACENT
有一个很好的理由:它说明只删除了彼此相邻的重复行 . 这也在_1099549中说明:这意味着:如果您的表包含值
它包含重复值,但由于它们不相邻,因此
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
对行进行排序 . 所以你可以使用其中之一或者,如果您只想检查某些字段,
在 BSIS 表中,您正在使用4个jey字段( bukrs, hkont, gjahr, belnr ) . 仅将这些字段用于排序 .
它会工作正常 .
如果这是确切的代码片段,则无需通过ABAP处理重复的行 . 您可以通过SQL语句
<where_clause>
消除它们:获取lv_last_day
的最大值并在条件中使用它(如果您的选择列表不包含所有关键字段,则使用distinct
关键字) . 要处理多个p_bukrs
将p_bukrs
的每个值和相应的最大值lv_last_day
放入内部表中,然后使用FOR ALL ENTRIES IN itab
addtion,将_d99573_中的itds组件与fileds进行比较 . 这将返回没有冗余信息的数据,并且与应用程序服务器对大型结果集进行排序相比,开销更少 .根据“bug” - 之前有一个很好的评论 .
问候,安德鲁 .