我有一个内部表,其中填充了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
循环,其中是SELECTenter 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的图片。
发布于 2012-11-07 19:27:26
语句DELETE ADJACENT DUPLICATES
中的单词ADJACENT
有一个非常好的理由:它规定只有相邻的重复行才会被删除。online keyword documentation中也说明了这一点
如果所检查的组件中相邻行的内容相同,则认为
行是重复的。在多个重复行相继出现的情况下,所有行(第一行除外)都将被删除。
这意味着:如果您的表包含以下值
A B
C D
A B
C D
它包含重复的值,但由于这些值不相邻,所以无论您指定什么,DELETE ADJACENT DUPLICATES
都不会删除它们。
另一方面,除非告诉SELECT
语句ORDER BY
一个或多个列,否则在返回选定的datasets时,它不能保证特定的顺序。这些行以任何顺序返回,如果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.
发布于 2012-11-07 12:29:27
在BSIS表中,您使用了4个jey字段( bukrs,hkont,gjahr,belnr )。这些字段仅用于排序。
首先对内部表执行
使用KEY ITAB-FIELDS.
从ITAB中删除相邻重复项
它会工作得很好。
https://stackoverflow.com/questions/13255213
复制相似问题