SAP ABAP READ TABLE读取不到数据的问题

本文介绍了ABAP中内表的几种常见操作方法,包括如何通过主键查找、二分查找及索引查找等,并强调了使用二分查找前需进行排序的重要性。此外,还详细解释了在不同情况下可能出现无法获取数据的原因及其解决办法。

可能性一:

SORT TAB1 BY ID NAME.

正确示例:

READ TABLE TBA1 INTO INTO LS_TAB1 WITH KEY ID = '01'

                        NAME = 'ZS' BINARY SEARCH.

错误示例:

READ TABLE TBA1 INTO INTO LS_TAB1 WITH KEY ID = '01'

                        NAME = 'ZS'

                        AGE = '12' BINARY SEARCH.

注意:使用BINARY SEARCH二分查找的前提是需要通过SORT...BY排序;

  当内表排序时,定义了两个字段,但读取数据时,定义了三个字段,可能会出现找不到相关数据的情况。

可能性二:

DATA:TAB1 STANDARD TYPE TABLE OF ZFIT001.

SORT TAB1 BY ID NAME.

READ TABLE TBA1 INTO INTO LS_TAB1 WITH KEY ID = '01'

                        NAME = 'ZS' BINARY SEARCH.

如果TAB1内表是根据ZFIT001自建表定义的,而ZFIT001-ID字段长度定义为了字符串三位,那么可能由于数据导入的过程中存在‘01’后面多了一个空格,从而导致获取不到数据的情况。

补充READ TABLE的使用方式:

通过主键查找(WITH KEY 的检索条件不能使用'<>'):

READ TABLE TAB1 WITH KEY = VALUE1.
READ TABLE TAB1 WITH TABLE KEY = VALUE1.

注意:WITH TABLE KEY 必须将所有的主键全部在语句中指定,否则会遇到syntax error “key must be completely provided”

二分查找(使用前,先排序):

READ TABLE TAB1 WITH KEY . . . BINARY SEARCH.

根据索引查找:

READ TABLE TAB1 INDEX 1.

只查找设置的字段:

READ TABLE TAB1 COMPARING <f1> <f2> . . . .

查找内表所有字段

READ TABLE TAB1 COMPARING ALL FIELDS.

只输出设置字段

READ TABLE TAB1 TRANSPORTING <f1> <f2> . . . .

不输出任何字段:

READ TABLE TAB1 TRANSPORTING NO FIELDS.

SAP ABAP 里,更新内部表有多种方法。 ### 直接赋值 可直接对内部表的特定行和字段进行赋值更新。例如: ```abap DATA: itab TYPE STANDARD TABLE OF spfli WITH DEFAULT KEY, wa TYPE spfli. SELECT * FROM spfli INTO CORRESPONDING FIELDS OF TABLE itab. READ TABLE itab INTO wa INDEX 1. wa-carrid = 'LH'. MODIFY itab FROM wa INDEX 1. ``` 以上代码先从数据库表 `spfli` 读取数据到内部表 `itab` 中,接着读取内部表的第一行到工作区 `wa`,对 `carrid` 字段进行更新,最后用 `MODIFY` 语句把更新后的工作区写回到内部表的第一行。 ### 使用 `LOOP` 循环更新 若要批量更新内部表,可使用 `LOOP` 循环。示例如下: ```abap DATA: itab TYPE STANDARD TABLE OF spfli WITH DEFAULT KEY. SELECT * FROM spfli INTO CORRESPONDING FIELDS OF TABLE itab. LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs>). <fs>-carrid = 'LH'. ENDLOOP. ``` 此代码通过 `LOOP AT` 语句遍历内部表,使用字段符号 `<fs>` 直接访问和更新每一行的 `carrid` 字段。 ### 结合条件更新 可结合条件语句(如 `IF`)来有选择性地更新内部表。示例: ```abap DATA: itab TYPE STANDARD TABLE OF spfli WITH DEFAULT KEY. SELECT * FROM spfli INTO CORRESPONDING FIELDS OF TABLE itab. LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs>). IF <fs>-carrid = 'AA'. <fs>-carrid = 'LH'. ENDIF. ENDLOOP. ``` 该代码在遍历内部表时,仅对 `carrid` 为 `AA` 的行进行更新。 ### 关于引用中的内部表 对于引用中提到的内部表 `YVBPA` 和 `XVBPA`,它们在程序 `SAPMV45A` 中定义和填充,若要访问其内容,需通过 `ASSIGN` 指令引用。在更新这些内部表时,同样可采用上述方法,不过要先确保正确引用和访问这些内部表。例如: ```abap DATA: gv_ref TYPE REF TO data. ASSIGN ('(SAPMV45A)YVBPA') TO gv_ref. IF gv_ref IS BOUND. DATA: it_yvbpa TYPE STANDARD TABLE OF yvbpa. it_yvbpa = CAST STANDARD TABLE OF yvbpa( gv_ref->* ). LOOP AT it_yvbpa ASSIGNING FIELD-SYMBOL(<fs_yvbpa>). <fs_yvbpa>-fieldname = 'new_value'. ENDLOOP. ENDIF. ``` 此代码先使用 `ASSIGN` 指令引用内部表 `YVBPA`,接着将其赋值给本地内部表 `it_yvbpa`,最后遍历并更新该内部表。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值