如果没有找到表行,则会引发异常CX_SY_ITAB_LINE_NOT_FOUND。没有sy-subrc。
先上测试代码,后续再讲解。
*&---------------------------------------------------------------------*
*& Report ZLQT_TEST
*&---------------------------------------------------------------------*
*& 测试数据用开发机也有的域值表DD07T ,用MARA表ATTYP物料種類物料种类对应的域值
*&---------------------------------------------------------------------*
REPORT ZLQT_TEST.
SELECT * FROM DD07T
WHERE DOMNAME = 'ATTYP'
AND DDLANGUAGE = '1'
INTO TABLE @DATA(LT_07T) .
DATA LV_INDEX TYPE SY-TABIX .
TRY .
"1.读内表的第几行
READ TABLE LT_07T INDEX 1 INTO DATA(LS_07T_BEFORE) . "740之前
DATA(LS_07T_AFTER) = LT_07T[ 1 ].
WRITE /: '1.读内表的第几行' , LS_07T_BEFORE , LS_07T_AFTER .
CLEAR :LS_07T_BEFORE,LS_07T_AFTER .
"2.根据某个字段读内表
READ TABLE LT_07T WITH KEY VALPOS = '0001' INTO LS_07T_BEFORE . "READ TABLE LT_07T WITH TABLE KEY VALPOS = '0001' DDLANGUAGE = '1' INTO LS_07T_BEFORE.
LS_07T_AFTER = LT_07T[ VALPOS = '0001' ] . "LS_07T_AFTER = LT_07T[ KEY key VALPOS = '0001' ] .
WRITE /: '2.根据某个字段读内表' , LS_07T_BEFORE , LS_07T_AFTER .
CLEAR :LS_07T_BEFORE,LS_07T_AFTER .
"3.判断read的记录是否存在
READ TABLE LT_07T WITH KEY VALPOS = '0001' TRANSPORTING NO FIELDS .
IF SY-SUBRC = 0.
LV_INDEX = SY-TABIX . "BEFOR:读到的是第几行
WRITE /: 'BEFORE:判断read的记录是否存在'.
ENDIF.
IF LINE_EXISTS( LT_07T[ VALPOS = '0001' ] ).
WRITE /: 'AFTER:判断read的记录是否存在' .
ENDIF.
"4.读到的是第几行
READ TABLE LT_07T WITH KEY VALPOS = '0001' TRANSPORTING NO FIELDS .
IF SY-SUBRC = 0.
LV_INDEX = SY-TABIX . "BEFOR:读到的是第几行
WRITE /: 'BEFOR:读到的是第几行' && LV_INDEX .
ENDIF.
DATA(LV_INDE) = LINE_INDEX( LT_07T[ VALPOS = '0001' ] ) ."AFTER:读到的是第几行
WRITE /: 'AFTER:读到的是第几行' && LV_INDE .
CATCH CX_SY_ITAB_LINE_NOT_FOUND .
"如果没有找到表行,则会引发异常CX_SY_ITAB_LINE_NOT_FOUND。没有sy-subrc。
MESSAGE '未找到数据' TYPE 'E' .
ENDTRY.
1.使用新语法时,TRY ... CATCH必不可少。否则在表行没数据是程序会直接dump.所以需要抓异常CX_SY_ITAB_LINE_NOT_FOUND。
代码中有740前后的差异,但如果不能使用二分法,有时候对效率的影响挺大的
所以我后续测试新语法能否对排序表及哈希表使用。