内表 (★★★★)

内表 (★★★★)

#abap #abap-data

概览表

方面 要点
定义 存储多行相同结构数据的动态数据对象
内存 由 ABAP 运行时动态管理
关键要素 行类型、表类型、主键

表类型

类型 键唯一性 访问方式 适用场景
STANDARD 非唯一 索引 顺序访问、APPEND
SORTED 唯一或非唯一 索引 部分范围访问、排序顺序
HASHED 仅唯一 键(无索引) 单条记录按键查找
1
2
3
4
5
性能决策树:
你将如何访问数据?
├── 索引顺序访问 → STANDARD
├── 部分范围访问 → SORTED
└── 单键查找 → HASHED

定义内表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
" 使用字典表类型
DATA gt_connections TYPE bc400_t_connections.

" 内联定义
DATA gt_flights TYPE TABLE OF bc400_s_flight.

" 显式指定表类型和键
DATA gt_sorted TYPE SORTED TABLE OF bc400_s_flight
WITH NON-UNIQUE KEY carrid connid.

" 工作区
DATA gs_flight TYPE bc400_s_flight.
" 或者
DATA gs_flight LIKE LINE OF gt_flights.

定义默认值(简写形式)

  • 表类型:STANDARD(默认)
  • 键唯一性:非唯一(标准表的唯一选项)
  • 主键:默认键(所有非数字字段)
⚠️默认键
默认键使用所有非数字字段,通常没有实际意义。务必定义显式键。

行操作

语句 用途 示例
APPEND wa TO itab 添加到末尾(仅标准表) APPEND ls TO gt_tab.
INSERT wa INTO TABLE itab 插入(排序位置) INSERT ls INTO TABLE gt_tab.
READ TABLE itab INTO wa 读取单行 READ TABLE gt_tab INTO ls INDEX 1.
MODIFY itab FROM wa 覆盖行 MODIFY gt_tab FROM ls.
DELETE itab 删除行 DELETE gt_tab WHERE carrid = 'LH'.
COLLECT wa INTO itab 按键汇总 COLLECT ls INTO gt_tab.

集合操作

语句 用途
LOOP AT itab INTO wa 逐行处理
DELETE itab WHERE cond 删除匹配的行
INSERT LINES OF itab1 INTO itab2 在表之间复制行
APPEND LINES OF itab1 TO itab2 在表之间追加行

按索引 vs 按键访问

1
2
3
4
5
6
7
" 按索引(仅标准表和排序表)
READ TABLE gt_tab INTO ls INDEX 1.
LOOP AT gt_tab INTO ls FROM 1 TO 5.

" 按键
READ TABLE gt_tab INTO ls WITH TABLE KEY carrid = 'LH' connid = '0400'.
LOOP AT gt_tab INTO ls WHERE carrid = 'LH'.
💡性能提示
  • 排序表以键字段作为首字段 → 最适合 WHERE 访问
  • 哈希表 → 最适合大数据集中单条记录按键访问
  • 标准表 → 最适合主要以 APPEND 方式顺序处理的场景

排序和清除

1
2
3
4
5
6
7
SORT gt_tab BY field ASCENDING.     " 或 DESCENDING
SORT gt_tab AS TEXT. " 按语言相关的排序规则
SORT gt_tab STABLE. " 保持相等键的原始顺序

REFRESH gt_tab. " 清除内容,保留内存
CLEAR gt_tab. " 与 REFRESH 相同(无表头行时)
FREE gt_tab. " 清除内容并释放内存

表头行(已过时)

⚠️不要使用表头行
表头行已经过时。在 ABAP Objects 或嵌套数据对象中不允许使用。务必使用显式工作区。

考试/测试模式

场景/关键词 答案
“三种表类型?” STANDARD、SORTED、HASHED
“APPEND 适用于所有表?” 否 — 仅标准表
“默认键?” 所有非数字字段
“推荐使用表头行?” 否 — 已过时
“循环中的索引字段?” sy-tabix
“从表定义工作区?” LIKE LINE OF itab

相关笔记