内部数据练习

内部数据处理练习 (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. 的结果是什么?

📌点击查看答案
2。整数算术使用商业舍入。精确结果(2.5)舍入到最接近的偶数(对于半值),或根据操作简单截断。在 ABAP 整数算术中,5 / 2 = 2(向下舍入到整数)。

第2题 - 混合算术优先级 [记忆]

一个表达式包含类型 ifp 的变量。结果字段为 i 类型。使用哪种算术?

📌点击查看答案
二进制浮点算术。 优先级规则是:decfloat > 二进制浮点 > 压缩数 > 整数。因为有 f 类型操作数(且没有 decfloat),所以使用二进制浮点算术进行计算。结果然后转换为 i 类型。

第3题 - 大字面量类型 [应用]

DATA int TYPE i. int = 10000000000 / 3000000000 * 3. 结果是什么?为什么?

📌点击查看答案
10。 字面量 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
2
3
DATA: itab TYPE SORTED TABLE OF ty_line
WITH NON-UNIQUE KEY carrid connid
WITH NON-UNIQUE SORTED KEY city_key COMPONENTS cityfrom.

然后使用: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:可存储/可传递