ABAP 筑基宝典(5) -- 关于使用READ TABLE语句的几点注意事项

本文介绍了ABAP中内表操作的重要技巧,包括使用READTABLE语句前的准备工作、二分法搜索的应用及其优势,以及如何通过变通方法实现特定的数据检索需求。

转载自:http://www.dlsap.com/thread-34-1-1.html

向原作者 莫怀远 致谢

 

1.  如果使用READ TABLE语句来读取内部表数据,而不是简单看返回值判断是否存在,那么在使用READ TABLE语句之前,一定要记得使用CLEAR语句清空内部表的工作区。


2.  READ TABLE itab WITH KEY = v BINARY SEARCH.

  使用READ TABLE语句的二分法搜索以 代替标准顺 序搜索时, 必须首先按关键字中指定的次序对内表进行排序。如果系统找到匹配指定关键字的多行,则读取索引最低的行。二分法搜索 比线性搜索要快。因此,应尽可能将内表排序并且使用二分法搜索。如果找到有匹配关键字的条目,则将系统字段 SY-SUBRC 设置为0并且 SY-TABIX 包含该行的索引。否则,将 SY-SUBRC 设置为非零。

3.  WITH KEY 中的检索条件比较符不能使用‘<>’(不等于)。

  如果只想取得内部表中不等于某条件的一条记录,那么请使用下面变通方法。
       LOOP AT itab WHERE KEY <> ‘XX’.
          此处取得第一条记录。
          EXIT.
       ENDLOOP.

   如果在运行时 <KEY> 值为空,则 统忽略该关键字段。另外可对关键字段指定偏移量和长度。

BTW:
感谢binary search,有一次到日本做项目,有这么个课题,
内部表中的数据如下
A    B    C
01  001 20060301
01  001  20060201
01  001 20060101

要求取出距现在时间最近的记录。
我的做法是先排序
SORT IT_TAB BY A
                         B ASCENDING
                         C DESCENDING.
然后用二分法读取
READ IT_TAB INTO WA_TAB WITH KEY A = '01'
                                                         B = '001'
                                                         BINARY SEARCH.
应该取到01  001 20060301这条记录。(也确实取得是这条记录)
这时来之日本SAP公司的检证人员就挑毛病了,说你用二分法从中间切入,怎么能保证取到20060301这条,而不是20060201?
SE接到质问让我抓图证明用二分法没错,否则改用普通READ。
我听了马上告诉SE,ABAP语法就是这样的,这是“常识”!
系统如果找到匹配指定关键字的多行,则读取索引最低的行。
经过我的特殊排序后,20060301所在行索引最低。
过后他调查了一下,一点脾气都没有,乖乖地说OK,呵呵。

ABAP中,`READ TABLE` 语句用于从内表中读取单条记录。其语法灵活,可以根据索引、键值或条件读取数据。以下是对 `READ TABLE sflight_tab INDEX sy-index INTO sflight_wa` 的详细解释: ### 语法解析 ```abap READ TABLE sflight_tab INDEX sy-index INTO sflight_wa ``` - **sflight_tab**:这是源内表,存储了多条航班数据(例如 `SFLIGHT` 表的记录)。 - **INDEX sy-index**:表示通过索引访问内表中的某一行。`sy-index` 是一个系统变量,通常在循环中使用,表示当前循环的索引值。 - **INTO sflight_wa**:将读取到的内表行数据赋值给结构变量 `sflight_wa`,它通常与内表的行结构一致。 ### 使用场景 此语句常用于循环处理内表时,按索引逐行读取数据。例如,在 `DO` 或 `WHILE` 循环中使用 `sy-index` 作为计数器,从 `sflight_tab` 中读取每一行数据到 `sflight_wa` 中进行处理。 ### 示例代码 ```abap DATA: sflight_tab TYPE TABLE OF sflight, sflight_wa TYPE sflight. SELECT * FROM sflight INTO TABLE sflight_tab. DO. READ TABLE sflight_tab INDEX sy-index INTO sflight_wa. IF sy-subrc <> 0. EXIT. ENDIF. " 处理 sflight_wa 中的数据 WRITE: / sflight_wa-carrid, sflight_wa-connid, sflight_wa-fldate. ENDDO. ``` 在这个例子中: - 使用 `SELECT` 从数据库表 `sflight` 中读取数据填充内表 `sflight_tab`。 - 通过 `DO` 循环和 `sy-index` 按索引逐行读取数据。 - 每次读取成功时 `sy-subrc` 为 0,否则退出循环。 ### 注意事项 - 内表必须是标准表(standard table)或索引表(index table),否则不能使用 `INDEX` 选项。 - 如果索引超出内表范围,`sy-subrc` 将不为 0,需在读取后检查该值以避免错误[^1]。 ### 性能建议 - 如果需要频繁按关键字访问数据,建议使用排序表(sorted table)或哈希表(hash table),以提高查找效率。 - 在大量数据处理场景中,应尽量避免在循环中频繁使用 `READ TABLE`,以减少性能开销。 ---
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值