特殊表技术
内表特殊技术 (★★★)
#internal-tables
二分搜索(BINARY SEARCH)
- 要求读取前数据按读取键排序
- 在标准表上:必须先 SORT,再使用 BINARY SEARCH 读取
- 在排序表上:自动(
WITH TABLE KEY内置二分搜索) - 如果表未按读取键排序,结果不可预测(不报错)
1 | " 标准表:必须先排序 |
⚠️在未排序的表上使用 BINARY SEARCH 不会报错。它只会返回不正确或不可预测的结果。务必确保排序顺序与读取键匹配。
1 | 标准表使用 BINARY SEARCH: |
DELETE ADJACENT DUPLICATES(删除相邻重复项)
- 仅删除相邻的重复行
- 表必须先排序(按比较字段)
COMPARING附加项指定比较哪些字段
1 | " 先排序! |
| 附加项 | 行为 |
|---|---|
| (无 COMPARING) | 比较字符型和数值型的所有字段 |
COMPARING f1 f2 ... |
仅比较指定字段 |
COMPARING ALL FIELDS |
显式比较所有字段 |
📌DELETE ADJACENT DUPLICATES 仅删除相邻的重复项。如果表未先排序,不相邻的重复项会保留。
COLLECT(收集)
- 将数值字段添加到匹配键的已有行
- 如果没有匹配行,插入新行
- 键比较基于所有非数值字段
- 仅适用于平坦行类型(不含深层结构)
1 | DATA: BEGIN OF ls_totals, |
1 | COLLECT 处理过程: |
⚠️COLLECT 仅适用于平坦行类型。深层结构(包含内表、字符串、引用)会导致运行时错误。
| 特性 | 行为 |
|---|---|
| 键字段 | 所有非数值字段 |
| 数值字段 | 求和(累加) |
| 行类型 | 仅平坦 |
| 表类型 | 任意(但带唯一键的哈希表最理想) |
次键(NW 7.0 EhP2)
用途
- 在主键之外为表定义额外的键
- 通过不同字段组合实现优化访问
- 避免对不同访问模式反复排序标准表
次键类型
| 类型 | 语法 | 唯一性 | 访问 |
|---|---|---|---|
| NON-UNIQUE SORTED | WITH NON-UNIQUE SORTED KEY |
非唯一 | 二分搜索 O(log n) |
| UNIQUE HASHED | WITH UNIQUE HASHED KEY |
唯一 | 哈希搜索 O(1) |
语法
1 | TYPES: BEGIN OF ty_struc, |
使用
1 | DATA: lt_emp TYPE ty_employees. |
何时使用次键
1 | +------------------------------------------------------+ |
💡次键有代价:填充/修改表时,所有次键索引必须更新。仅在读取优化收益超过填充代价时使用。
INSERT INTO TABLE vs APPEND
| 语句 | 行为 | 表类型兼容性 |
|---|---|---|
APPEND wa TO itab |
在末尾添加行 | 仅标准表 |
INSERT wa INTO TABLE itab |
根据表类型插入 | 所有表类型 |
INSERT wa INTO itab INDEX n |
在位置 n 插入 | 仅标准表 |
1 | " APPEND:总是在末尾(标准表) |
💡使用
INSERT INTO TABLE 进行泛型编程。它能正确适用于所有表类型。表表达式(新语法)
1 | " 使用表表达式读取行 |
| 表达式/函数 | 返回值 | 未找到时异常? |
|---|---|---|
itab[ key = val ] |
行(副本) | 是:CX_SY_ITAB_LINE_NOT_FOUND |
... OPTIONAL |
默认值 | 否(返回初始值) |
line_exists( ... ) |
布尔值 | 否 |
line_index( ... ) |
索引或 0 | 否 |
⚠️表表达式
itab[ ... ] 在没有行匹配时抛出 CX_SY_ITAB_LINE_NOT_FOUND。使用 OPTIONAL 或 line_exists() 进行安全访问。考试/测试模式
| 关键词/模式 | 答案 |
|---|---|
| “BINARY SEARCH 未排序表” | 返回不可预测的结果;不报错 |
| “DELETE ADJACENT DUPLICATES” | 仅删除相邻重复项;需先排序 |
| “COMPARING 附加项” | 指定重复比较的字段 |
| “COLLECT 仅限平坦类型” | 深层结构导致运行时错误 |
| “COLLECT 键字段” | 所有非数值字段组成键 |
| “次键类型” | NON-UNIQUE SORTED 或 UNIQUE HASHED |
| “USING KEY” | 指定用于访问的次键 |
| “INSERT INTO TABLE” | 泛型插入;适用于所有表类型 |
| “APPEND” | 仅标准表;在末尾添加 |
| “表表达式异常” | 未找到行时抛出 CX_SY_ITAB_LINE_NOT_FOUND |
| “line_exists()” | 返回布尔值;无异常 |
| “何时使用次键” | 同一表有多种访问模式 |
相关笔记
- 内表类型
- 数据引用与字段符号
- 算术表达式
- 字符串处理与正则表达式
- [[_posts/SAP_MM/SCM500_采购流程/00-仪表盘/考试陷阱]] - 内表陷阱部分
- [[_posts/SAP_MM/SCM500_采购流程/00-仪表盘/快速参考]] - 内表类型部分