ABAP delete duplicate的用法指南

来源:互联网 发布:协作办公平台 知乎 编辑:程序博客网 时间:2024/06/10 21:05

DELETE TABLE <itab> FROM <wa>.
or
DELETE TABLE <itab> WITH TABLE KEY <k1> = <f 1> ... <k n> = <f n>.
根据条件删除内表中的一行数据

DELETE <itab> WHERE <cond>.
根据条件删除内表中的多行数据

DELETE ADJACENT DUPLICATE ENTRIES FROM <itab> 
                                  [COMPARING <f1> <f 2> ... 
                                             |ALL FIELDS].
删除相邻行的重复项,保留第一条记录
1、如果没有定义non-nuique键,并且在删除的时候没有指定条件,则将比较所有的字段;等同于比较
DELETE ADJACENT DUPLICATES FROM ITAB COMPARING ALL FIELDS
定义non-unique字段方式如下:
DATA ITAB LIKE STANDARD TABLE OF LINE
          WITH NON-UNIQUE KEY COL2.
2、如果有non-unique键,则在没有删除的比较条件时比较该key,删除相邻的重复项。
3、可以使用指定条件进行比较处理 COMPARING <f1> <f 2> ... ,此时,需要所有指定字段在相邻处相同,否则不会删除。
当然在此也可以使用动态的方式指定比较的内容,下面的例子二我做了一个简单的测试,仅供参考。

其他补充说明:
如果对比较的字段进行了事先的排序,则可以将所有该字段重复的行全部删除。
如果至少删除成功一条,则sy-subrc返回0,否则返回4.

下面将是两个例子:
例子一:
DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF LINE.

DATA ITAB LIKE HASHED TABLE OF LINE WITH UNIQUE KEY COL1.

DO 4 TIMES.
LINE-COL1 = SY-INDEX.
LINE-COL2 = SY-INDEX ** 2.
INSERT LINE INTO TABLE ITAB.
ENDDO.

LINE-COL1 = 1.

DELETE TABLE ITAB: FROM LINE,
                   WITH TABLE KEY COL1 = 3.

LOOP AT ITAB INTO LINE.
WRITE: / LINE-COL1, LINE-COL2.
ENDLOOP.

例子二:
DATA OFF TYPE I.

DATA: BEGIN OF LINE,
      COL1 TYPE I,
      COL2 TYPE C,
      col3 type c,
END OF LINE.

DATA ITAB LIKE STANDARD TABLE OF LINE
          WITH NON-UNIQUE KEY COL2.
LINE-COL1 = 1. LINE-COL2 = 'A'. line-col3 = '9'. APPEND LINE TO ITAB.
LINE-COL1 = 1. LINE-COL2 = 'A'. line-col3 = '9'. APPEND LINE TO ITAB.
LINE-COL1 = 1. LINE-COL2 = 'B'. line-col3 = '9'. APPEND LINE TO ITAB.
LINE-COL1 = 2. LINE-COL2 = 'B'. line-col3 = '9'. APPEND LINE TO ITAB.
LINE-COL1 = 3. LINE-COL2 = 'B'. line-col3 = '8'. APPEND LINE TO ITAB.
LINE-COL1 = 4. LINE-COL2 = 'B'. line-col3 = '9'. APPEND LINE TO ITAB.
LINE-COL1 = 5. LINE-COL2 = 'A'. line-col3 = '9'. APPEND LINE TO ITAB.

OFF = 0.
PERFORM LIST.

DELETE ADJACENT DUPLICATES FROM ITAB COMPARING ALL FIELDS.
OFF = 30.
PERFORM LIST.

DELETE ADJACENT DUPLICATES FROM ITAB COMPARING col1 col3.
OFF = 60.
PERFORM LIST.
DELETE ADJACENT DUPLICATES FROM ITAB.

*data:col(4) type c.
*FIELD-SYMBOLS: <fs-lydn> type ANY.
*col = 'col1'.
*ASSIGN col to <fs-lydn>.
*DELETE ADJACENT DUPLICATES FROM ITAB COMPARING (<fs-lydn>) col3.
*OFF = 60.
*PERFORM LIST.
*DELETE ADJACENT DUPLICATES FROM ITAB.

OFF = 90.
PERFORM LIST.
FORM LIST.
SKIP TO LINE 3.
LOOP AT ITAB INTO LINE.
     WRITE:   AT /OFF LINE-COL1, LINE-COL2,line-col3.
ENDLOOP.
ENDFORM.

原创粉丝点击