内部数据练习
内部数据处理练习 (12题)
#practice #arithmetic #string-processing #internal-tables #data-reference
相关概念
📌核心模式(点击查看)
| 关键词 | 答案 |
|---|---|
| 算术优先级 | decfloat > 二进制浮点 > 压缩数 > 整数 |
** 运算符 |
即使全是 i 也强制浮点算术 |
正则 * vs + |
* = 0 或多次;+ = 1 或多次 |
| 标准表键访问 | O(n) 线性 |
| 排序表键访问 | O(log n) 二分 |
| 哈希表键访问 | O(1) 常数 |
| LOOP 中 ASSIGNING | 无数据复制,直接修改 |
第1题 - 整数除法 [记忆]
DATA int TYPE i. int = 5 / 2.的结果是什么?
📌点击查看答案
5 / 2 = 2(向下舍入到整数)。第2题 - 混合算术优先级 [记忆]
一个表达式包含类型
i、f和p的变量。结果字段为i类型。使用哪种算术?
📌点击查看答案
f 类型操作数(且没有 decfloat),所以使用二进制浮点算术进行计算。结果然后转换为 i 类型。第3题 - 大字面量类型 [应用]
DATA int TYPE i. int = 10000000000 / 3000000000 * 3.结果是什么?为什么?
📌点击查看答案
10000000000 超出了 i 类型的值范围,因此被视为 p 类型。这使得整个表达式使用压缩算术而非整数算术。使用压缩算术:10000000000 / 3000000000 = 3.333...,舍入为 3,然后 3 * 3 = 9.999...,转换为 i 时舍入为 10。第4题 - 字符串函数 [记忆]
说出字符串函数的三个类别,每类给出一个示例。
📌点击查看答案
| 类别 | 用途 | 示例 |
|---|---|---|
| 描述性 | 返回数值结果 | strlen()、count()、find() |
| 处理性 | 返回字符串 | substring()、to_upper()、reverse() |
| 谓词性 | 返回真假值 | contains()、matches() |
第5题 - 正则表达式 [应用]
编写一个正则表达式,匹配以 “ABAP” 开头后跟恰好 3 个数字的字符串。
📌点击查看答案
ABAP\d{3} 或 ABAP[0-9]{3}ABAP匹配字面文本\d或[0-9]匹配单个数字{3}表示恰好 3 次
匹配示例:”ABAP123”、”ABAP456”
第6题 - 字符串模板 [记忆]
字符串模板的语法是什么?如何嵌入表达式?
📌点击查看答案
|...| 定界符。表达式用花括号嵌入:{expression}。示例:|Hello {lv_name}, the value is {lv_amount decimals = 2}|
格式化选项跟随在 {} 中的表达式后面,例如 {lv_date date = user}、{lv_num width = 10 align = right}。
第7题 - 表类型选择 [应用]
需要一个内表,满足:(a) 始终通过唯一键访问,(b) 永远不使用索引访问,(c) 单条记录查找需要最高性能。应选择哪种表类型?
📌点击查看答案
UNIQUE 键。1 | DATA: itab TYPE HASHED TABLE OF ty_line WITH UNIQUE KEY key_field. |
哈希表提供 O(1) 常数时间键访问,要求唯一键,不支持索引访问 – 满足全部三个要求。
第8题 - 二分搜索 [应用]
使用
READ TABLE lt_standard WITH KEY field = 'X' BINARY SEARCH时,搜索要正确工作必须满足什么条件?
📌点击查看答案
field)。BINARY SEARCH 执行假设数据已排序的二分搜索算法。如果表未按该字段排序,结果不可预测 – 不报错但可能找到错误的行或找不到行。第9题 - COLLECT 行为 [记忆]
COLLECT 语句如何与内表配合工作?
📌点击查看答案
COLLECT wa INTO itab 比较工作区的字符型字段来查找匹配行。如果找到匹配行,数值字段被累加。如果没有匹配,插入新行。要求:行类型必须是平坦的(不含深层组件)。COLLECT 在使用与非数值字段匹配的排序或哈希键的表上效果最佳。
第10题 - 次键 [应用]
有一个排序表,主键为
carrid, connid。经常需要单独按cityfrom访问。如何优化?
📌点击查看答案
1 | DATA: itab TYPE SORTED TABLE OF ty_line |
然后使用:READ TABLE itab USING KEY city_key WITH KEY cityfrom = 'NYC'.
次键提供优化访问路径而不改变主键。USING KEY 附加项告诉系统使用次索引。
第11题 - 字段符号 vs 数据引用 [分析]
比较在循环中使用字段符号(
<fs>)和数据引用(dref)访问内表行。各在什么时候更适合?
📌点击查看答案
| 方面 | ASSIGNING <fs> |
REFERENCE INTO dref |
|---|---|---|
| 访问 | 直接,像别名 | 间接通过 ->* 或 dref->field |
| 生命周期 | 仅在当前作用域有效 | 可以存储供后续使用 |
| 修改 | 直接修改 | 通过 ->* 或另一个 ASSIGN 访问 |
| 传递 | 不能传递字段符号本身 | 可以将引用传递给其他方法 |
| 空状态 | IS ASSIGNED 检查 | IS BOUND / IS INITIAL 检查 |
简单循环内修改时优先使用字段符号(更易读,开销更小)。需要存储行引用供后续使用或传递给其他方法时优先使用数据引用。
第12题 - DELETE ADJACENT DUPLICATES [应用]
有一个按
carrid排序的航班预订内表。运行DELETE ADJACENT DUPLICATES FROM itab COMPARING carrid后,所有重复的航空公司都会被删除吗?如果表未排序呢?
📌点击查看答案
carrid 排序:是的,所有重复项都被删除,因为相同的值是相邻的。如果未排序:不会,仅删除恰好在相邻位置的重复项。不相邻的重复项会保留。DELETE ADJACENT DUPLICATES 仅检查连续的行 – 它不执行全局重复检查。
最佳实践:始终先排序,或使用 COMPARING ALL FIELDS / 指定字段列表。
📌模式总结(点击查看)
| 关键词 | 答案 |
|---|---|
| 整数除法 | 商业舍入,截断为整数 |
| 混合优先级 | decfloat > f > p > i |
** 运算符 |
强制浮点算术 |
正则 {n,m} |
n 到 m 次重复 |
| 哈希表 | O(1) 键访问,无索引,仅唯一键 |
| BINARY SEARCH | 需要先按搜索键排序 |
| COLLECT | 累加数值,按非数值匹配 |
| 次键 | WITH ... KEY name COMPONENTS ... |
| 字段符号 vs 引用 | FS:直接/作用域局部;Ref:可存储/可传递 |