ABAP 删除内表

ABAP 删除内表

🗑️ DELETE语句概述

基本功能

DELETE语句用于从内部表中删除一个或多个记录。可以通过指定表键、条件或查找重复条目来删除内部表的记录。

删除特点

  • 如果内部表具有非唯一键并且包含重复条目,则将删除表中的第一个条目
  • 删除操作会影响内表的结构和大小
  • 删除后的内表会重新索引

📝 DELETE语法详解

1. 基本删除语法

1
DELETE TABLE <internal_table> FROM <work_area_itab>.

参数说明

参数 描述 示例
internal_table 目标内表 mytable
work_area_itab 与内表类型兼容的工作区 wa_line

工作原理

  • 基于可以从工作区组件获取的默认键来执行删除操作
  • 工作区必须与内表的行类型兼容

2. 显式指定表键

1
2
DELETE TABLE <internal_table> 
WITH TABLE KEY <K1> = <F1> ... <Kn> = <Fn>.

参数说明

参数 描述 示例
K1, K2, … Kn 内部表的关键字段 ColP
F1, F2, … Fn 字段的值 1

类型转换

如果字段的数据类型与关键字段不兼容,SAP系统会自动将它们转换为兼容格式。

💡 实例解析

完整示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
REPORT zdelete_demo.

DATA:
BEGIN OF Line1,
ColP TYPE i,
ColQ TYPE i,
END OF Line1.
DATA mytable LIKE HASHED TABLE OF Line1 WITH UNIQUE KEY ColP.

DO 8 TIMES.
Line1-ColP = sy-index.
Line1-ColQ = sy-index + 4.
INSERT Line1 INTO TABLE mytable.
ENDDO.

Line1-ColP = 1.
DELETE TABLE mytable:
FROM Line1,
WITH TABLE KEY ColP = 3.

LOOP AT mytable INTO Line1.
WRITE: / Line1-ColP, Line1-ColQ.
ENDLOOP.

输出示例

1
2
3
4
5
6
2         6
4 8
5 9
6 10
7 11
8 12

代码解析

  1. 内表创建

    • mytable是哈希表类型的内部表
    • 唯一键是ColP
    • Line1作为工作区
  2. 数据填充

    • 循环8次,填充数据
    • ColP包含值1,2,3,4,5,6,7,8
    • ColQ包含值5,6,7,8,9,10,11,12
  3. 删除操作

    • 删除ColP值为1的行
    • 删除ColP值为3的行
    • 使用WITH TABLE KEY显式指定键
  4. 结果验证

    • 剩余ColP值:2,4,5,6,7,8
    • 剩余ColQ值:6,8,9,10,11,12

🔧 DELETE TABLE的多种用法

1. 使用工作区删除

1
2
3
4
5
6
* 准备工作区
DATA: wa_line TYPE ty_line.
wa_line-key = '1001'.

* 删除
DELETE TABLE lt_table FROM wa_line.

2. 使用键值删除

1
2
3
4
* 直接使用键值
DELETE TABLE lt_table
WITH TABLE KEY id = '1001'
name = 'Test'.

3. 使用条件删除

1
2
3
4
5
* 使用条件删除
LOOP AT lt_table INTO wa_line
WHERE status = 'inactive'.
DELETE TABLE lt_table FROM wa_line.
ENDLOOP.

4. 删除特定索引的行

1
2
* 删除指定索引的行
DELETE TABLE lt_table INDEX 5.

5. 批量删除

1
2
3
4
5
6
7
8
* 使用内表批量删除
DATA: lt_keys TYPE TABLE OF ty_key.

APPEND '1001' TO lt_keys.
APPEND '1002' TO lt_keys.
APPEND '1003' TO lt_keys.

DELETE lt_table FROM TABLE lt_keys.

⚠️ 注意事项

1. 键值匹配

1
2
3
4
5
6
7
* 正确的键值匹配
DELETE TABLE lt_table
WITH TABLE KEY id = '1001'.

* 错误:字段名不匹配
DELETE TABLE lt_table
WITH TABLE KEY key = '1001'. " 如果键字段不是key

2. 数据类型兼容性

1
2
3
4
5
* 自动类型转换
DATA: lv_char(10) TYPE c VALUE '1001'.

DELETE TABLE lt_table
WITH TABLE KEY id = lv_char. " 自动转换为适当类型

3. 性能考虑



graph TD
    A[删除方式] --> B[哈希表]
    A --> C[标准表]
    A --> D[排序表]
    
    B --> E[O(1) - 快速]
    C --> F[O(n) - 较慢]
    D --> G[O(log n) - 中等]

💡 最佳实践

1. 错误处理

1
2
3
4
5
6
7
8
9
* 标准错误处理
DELETE TABLE lt_table
WITH TABLE KEY id = '1001'.

IF sy-subrc = 0.
WRITE: / '记录删除成功'.
ELSE.
WRITE: / '记录不存在'.
ENDIF.

2. 先查找后删除

1
2
3
4
5
6
7
8
9
10
* 先检查是否存在再删除
READ TABLE lt_table INTO wa_line
WITH TABLE KEY id = '1001'.

IF sy-subrc = 0.
DELETE TABLE lt_table FROM wa_line.
WRITE: / '记录已删除'.
ELSE.
WRITE: / '记录不存在'.
ENDIF.

3. 使用TRANSPORTING选项

1
2
3
4
* 只删除特定字段(如果适用)
DELETE TABLE lt_table
WITH TABLE KEY id = '1001'
TRANSPORTING field1 field2.

4. 批量删除优化

1
2
3
4
5
6
7
8
9
10
11
* 批量删除而非循环单条删除
DATA: lt_to_delete TYPE TABLE OF ty_key.

" 收集要删除的键
SELECT id FROM ztable WHERE status = 'inactive'
INTO TABLE lt_to_delete.

" 一次性删除
IF lt_to_delete IS NOT INITIAL.
DELETE ztable FROM TABLE lt_to_delete.
ENDIF.

🎯 删除操作的变种

1. DELETE(不带TABLE关键字)

1
2
3
4
5
6
* 删除当前行
LOOP AT lt_table INTO wa_line.
IF wa_line-status = 'delete'.
DELETE lt_table.
ENDIF.
ENDLOOP.

2. 删除重复项

1
2
3
* 删除重复项(保留第一个)
SORT lt_table BY key.
DELETE ADJACENT DUPLICATES FROM lt_table.

3. 删除范围

1
2
* 删除索引范围
DELETE lt_table FROM 3 TO 5. " 删除第3到第5行