使用DELETE ADJACENT DUPLICATE FORM特别注意以下事項
前一段时间调试一个程序的,半天没发现问题在哪里,经过测试才发现
delete adjacent duplicates from itab 和 delete adjacent duplicates from itab comparing all fields还是有区别的:
前者相邻两行数据,如果除金额字段以外的其他字段都相同,则去重复删除其中一行;
后者相邻两行数据,如果所有对应的字段都相同(包含金额字段),则去重复删除其中一行。
DELETE ADJACENT DUPLICATES FROM <table>的功能是删除邻近、相同的行,如果是为了把内表itab里部相同的行去掉,则应该对内表先按某个字段排序。但是有时候对某一个字段排序并不能把相同的两行排序到一起。
SORT itab BY comp1, comp2,..., compi [ASCENDING|DESCENDING]
通常我们会按一个字段进行排序,但是这有有可能相同的行排序不到一块去,比如今天我下行对itab_sf01表按BUKRS进行排序,结果如图
图1 排序及删除语句
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
图2 itab_sf01表内容
由图2可以发现,由于排序时只按BUKRS字段,所以第1行和第3行、第2行和第4行内容相同,但没有相邻,所以执行DLETE ADJACENT DUPLICATES FROM itab_sf01 也没有达到预期目的。
解决方案:把SORT语句改成 SORT itab_sf01 BY bukrs belnr gjahr augdt.即可。
DELETE ADJACENT DUPLICATES FROM 语句,我们知道他的基本功能是:删除相邻行的重复数据。
但是他最终保留哪一行数据呢?
下面看看一个Demo:
DATA : BEGIN OF itab OCCURS 0,
vbeln TYPE lips-vbeln,
version TYPE c LENGTH 2,
END OF itab.
itab-vbeln = '0084000010'.
itab-version = '1'.
APPEND itab.
itab-vbeln = '0084000010'.
itab-version = '2'.
APPEND itab.
itab-vbeln = '0084000010'.
itab-version = '3'.
APPEND itab.
itab-vbeln = '0084000011'.
itab-version = '2'.
APPEND itab.
itab-vbeln = '0084000011'.
itab-version = '3'.
APPEND itab.
itab-vbeln = '0084000009'.
itab-version = '2'.
APPEND itab.
itab-vbeln = '0084000009'.
itab-version = '1'.
APPEND itab.
WRITE:/ '原始数据:'.
LOOP AT itab.
WRITE: / itab-vbeln,itab-version.
ENDLOOP.
SORT itab BY vbeln ASCENDING version DESCENDING.
WRITE:/ '排序数据:'.
LOOP AT itab.
WRITE: / itab-vbeln,itab-version.
ENDLOOP.
DELETE ADJACENT DUPLICATES FROM itab COMPARING vbeln.
WRITE:/ '排序数据:'.
LOOP AT itab.
WRITE: / itab-vbeln,itab-version.
ENDLOOP.
可见DELETE ADJACENT DUPLICATES FROM只保留相邻重复行的第一行数据,大家也可以测试测试其他场景验证。
实战中用法举例:
主数据下发:一种主数据下发,可能有多个版本号,我们只保留版本号最大的一条数据,作为最新数据。用这种方法最简单啦