在本文章中,您将了解 ABAP 7.40 版中引入的新读取语法。
该语法早在 2013 年就已引入,因此已不再新鲜。但是,如果您仍在使用 READ TABLE 关键字来读取表项,那么这篇文章绝对适合您。请看下面的示例。
请注意,下面的代码是在读取语句之前编写的。
DATA : it_flights TYPE STANDARD TABLE OF sflight,
ls_flight TYPE zjp_order.
SELECT * FROM sflight INTO TABLE it_flights .
这里可以使用内联数据声明来创建内部表格和工作区,但在顶部明确声明,以便我们可以关注 READ TABLE 语法:
Context | Before ABAP 7.40 | From ABAP 7.40 |
---|---|---|
Read with index number | READ TABLE it_flights INTO ls_flight INDEX 1. | ls_flight = it_flights[ 1 ]. |
Read with index variable | READ TABLE it_flights INTO ls_flight INDEX lv_idx. | ls_flight = it_flights[ lv_idx ]. |
Read with free key | READ TABLE WITH KEY carrid = 'SQ' . | ls_flight = it_flights[ carrid = 'SQ' ]. |
Read with more than one free key | READ TABLE it_flights INTO ls_flight WITH KEY carrid = 'SQ' | ls_flight = it_flights[ carrid = 'SQ' connid = '0026' ]. |
如果您正在试用上述代码示例,请在这些语句之前添加以下代码块。
SELECT * FROM sflight INTO TABLE @DATA(it_flights).
DATA(lv_idx) = 2.
这里需要注意的是,新表达式
- 不改变 sy-subrc 值
- 当读取表达式失败时引发异常 CX_SY_ITAB_LINE_NOT_FOUND
"Write read expressions in TRY-CATCH blocks
TRY .
DATA(ls_flight) = it_flights[ 1 ].
MESSAGE "Read successful" TYPE 'S'.
CATCH cx_sy_itab_line_not_found.
MESSAGE 'Read failed' TYPE 'E'.
ENDTRY.
当 READ 失败时,控制将转移到 CATCH 块。您可以在 CATCH 块中处理 SY-SUBRC <> 0 的情况。
由于这是一个表达式而不是语句,因此可以在任何操作数位置使用,这在 READ TABLE 语句中是不可能的。
例如
1. 结果中的字段可以使用 - 字段名称。
data(plane_type) = it_flights[ connid = '0026' ]-planetype.
2. 可用于 IF 块
IF it_flights[ connid = '0026' ]-planetype = 'A319'.
"Do something
ELSE.
"Do something else
ENDIF.
表达式的结果也可以分配给一个字段符号。在这种情况下,不需要处理异常,只需进行 sy-subrc 检查即可。
ASSIGN it_flights[ carrid = 'SQ' ] to FIELD-SYMBOL(<fs_flight>).
IF sy-subrc EQ 0.
"Read is successful
ELSE.
"Read has failed
ENDIF.
如果完全不需要处理 READ 失败的情况,可以使用 OPTIONAL 关键字跳过 try-catch。
ls_flight = VALUE #( it_flights[ carrid = 'AA' ] OPTIONAL ).
在这里,你必须小心,因为万一读取失败,变量/结构将是空白的。因此,不要为了避免使用 try-catch 而使用它,只有在实际需要时才使用它。
新 READ 语法中的二分查找
在我结束这篇文章之前,一个重要的问题是--二分查找怎么办?那么,使用排序表就会隐式地使用二分查找。
DATA : it_flights TYPE SORTED TABLE OF sflight
WITH UNIQUE KEY carrid connid.
"Get flight data
SELECT * FROM sflight INTO TABLE it_flights .
"Read with key
data(ls_flight) = it_flights [ carrid = 'SQ' connid = '0026' ].
标签:flight,内表,READ,Read,flights,ls,TABLE,carrid
From: https://blog.csdn.net/SAP_yu/article/details/143592268