ABAP 内表

ABAP 内表

📊 内部表概述

定义

内部表实际上是一个临时表,它包含正在执行的ABAP程序的记录。内部表仅在SAP程序的运行期间存在。

内部表的特点



graph TD
    A[内部表] --> B[临时存储]
    A --> C[运行时存在]
    A --> D[行结构]
    A --> E[灵活访问]
    
    B --> B1[程序终止时丢弃]
    C --> C1[不占用永久内存]
    D --> D1[相同结构和键]
    E --> E1[索引或键访问]

数据存储结构

内部表中的数据存储在行和列中:

  • 每一行称为行(Row)
  • 每一列称为字段(Field)

所有记录具有相同的结构和键,使用索引或键访问内部表的各个记录。

💾 内部表的用途

主要用途

  1. 计算结果存储

    • 保存以后可在程序中使用的计算结果
    • 临时存储中间计算数据
  2. 数据缓冲

    • 保存记录和数据,以便快速访问
    • 避免重复访问数据库表
  3. 临时缓冲区

    • 可以根据需要修改数据
    • 只在运行时占用内存,不在声明时占用
  4. 数据结构定义

    • 可以使用任何数量的其他定义的结构来定义
    • 非常多才多艺

使用建议

保持内部表尽可能小,以避免系统运行缓慢。

🔧 内部表的种类

1. 标准表 (STANDARD TABLE)

特性 说明 访问方式 性能
表类型 STANDARD TABLE 索引或关键字 中等
索引 系统为每一行生成逻辑索引 - -
数据存储 可以附加在现有行后或插入指定位置 - -
操作特点 插入、删除时,数据行位置不变,系统重新排列索引值 - -

2. 排序表 (SORTED TABLE)

特性 说明 访问方式 性能
表类型 SORTED TABLE 索引或关键字 高(查找时)
索引 具有逻辑索引 - -
数据存储 总是按关键字升序排列 - -
特点 维护表时会自动保持排序 - 插入较慢

3. 哈希表 (HASHED TABLE)

特性 说明 访问方式 性能
表类型 HASHED TABLE 仅关键字 极高(查找时)
索引 无索引 - -
数据管理 使用哈希算法管理数据 - -
性能特点 寻址时间与表大小无关 - 插入/删除较慢

🔑 表关键字

关键字定义规则

  1. 结构体作为行

    • 可以指定结构体中的某几个字段作为内表关键字
    • 该字段不能是内表或引用类型,但可以是嵌套体
  2. 基本类型作为行

    • 如果内表的整行都是由基本类型字段组成,可以把整行指定为关键字
  3. 默认关键字

    • 如果不指定任何关键字,使用默认的标准关键字
    • 扁平结构内表的默认关键字是非数字和非内表的组件字段

默认关键字示例

字段类型 示例 默认关键字
姓名(C类型) C 类型 姓名
年龄(N类型) N 类型 年龄
工资(F类型) F 类型 姓名、年龄
单个基本类型 I 类型 整行

💡 内部表的定义和使用

基本定义

1
2
3
4
5
6
7
8
9
10
11
* 使用STANDARD TABLE(默认)
DATA: lt_customers TYPE TABLE OF scustom,
wa_customer LIKE LINE OF lt_customers.

* 使用SORTED TABLE
DATA: lt_sorted TYPE SORTED TABLE OF spfli
WITH UNIQUE KEY carrid connid.

* 使用HASHED TABLE
DATA: lt_hashed TYPE HASHED TABLE OF scustom
WITH UNIQUE KEY id.

操作示例

1. 数据插入

1
2
3
4
5
* APPEND - 追加到末尾
APPEND wa_customer TO lt_customers.

* INSERT - 插入到指定位置
INSERT wa_customer INTO TABLE lt_customers INDEX 1.

2. 数据读取

1
2
3
4
5
6
7
8
9
10
11
12
13
* 使用索引读取
READ TABLE lt_customers INTO wa_customer INDEX 3.

* 使用关键字读取
READ TABLE lt_customers INTO wa_customer
WITH TABLE KEY id = '100001'.

* 检查是否成功
IF sy-subrc = 0.
WRITE: / '读取成功'.
ELSE.
WRITE: / '读取失败'.
ENDIF.

3. 数据修改

1
2
3
4
5
6
7
* 修改指定行
MODIFY lt_customers FROM wa_customer
TRANSPORTING name title
WHERE id = '100001'.

* 使用索引修改
MODIFY lt_customers FROM wa_customer INDEX 3.

4. 数据删除

1
2
3
4
5
6
7
8
9
* 删除指定行
DELETE lt_customers WHERE id = '100001'.

* 使用索引删除
DELETE lt_customers INDEX 3.

* 删除所有行
CLEAR lt_customers. " 清空表
REFRESH lt_customers. " 删除所有行

📊 内部表类型对比

类型 访问方式 插入性能 查找性能 删除性能 适用场景
标准表 索引或键 慢(线性) 中等 通用,需要索引访问
排序表 索引或键 慢(需要保持排序) 快(二分查找) 中等 需要有序数据,频繁查找
哈希表 仅键 极快(O(1)) 仅按键查找,性能要求高

⚠️ 注意事项

1. 内存管理

  • 保持内部表尽可能小
  • 避免不必要的数据存储
  • 及时清理不再需要的数据

2. 性能考虑

1
2
3
* 高效的批量操作
* 使用批量语句而不是循环
SELECT * FROM scustom INTO TABLE lt_customers.

3. 数据完整性

  • 注意关键字唯一性
  • 正确处理系统返回代码
  • 避免数据不一致