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
|
代码解析
内表创建:
mytable是哈希表类型的内部表
- 唯一键是
ColP
Line1作为工作区
数据填充:
- 循环8次,填充数据
ColP包含值1,2,3,4,5,6,7,8
ColQ包含值5,6,7,8,9,10,11,12
删除操作:
- 删除
ColP值为1的行
- 删除
ColP值为3的行
- 使用
WITH TABLE KEY显式指定键
结果验证:
- 剩余
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行
|