点击此处---> 群内免费提供SAP练习系统(在群公告中)
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
在这篇文章中,您将了解 ABAP 7.40 版中引入的新读取语法。
这是在 2013 年引入的,所以这不再是新的了。但是,如果您仍然使用 READ TABLE 关键字来读取表条目,那么这篇文章绝对适合您。看看下面的例子。
考虑到下面的代码是在 read 语句之前编写的。
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 | READ TABLE it_flights INTO ls_flight | ls_flight = it_flights[ 1 ]. |
number | INDEX 1. | |
Read with index | READ TABLE it_flights INTO ls_flight | ls_flight = it_flights[ lv_idx ]. |
variable | INDEX lv_idx. | |
Read with free key | READ TABLE it_flights INTO ls_flight | ls_flight = it_flights[ carrid = 'SQ' ]. |
WITH KEY carrid = 'SQ'. | ||
Read with more than | READ TABLE it_flights INTO ls_flight | ls_flight = it_flights[ carrid = 'SQ' connid = '0026' ]. |
one free key | WITH KEY carrid = 'SQ' | |
connid = '0026'. |
这里要注意的重要一点是新表达式
不改变 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 块中使用
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 失败的情况下,您可以使用OPLTIONAL关键字跳过 try-catch 。
ls_flight = VALUE #( it_flights[ carrid = 'AA' ] OPTIONAL ).
在这里,您必须小心,因为万一读取失败,变量/结构将是空白的。所以不要仅仅为了避免使用 try-catch 而使用它,而是仅在实际需要时使用。
在我结束这篇文章之前,有一个重要的问题——二分查找怎么样?好吧,使用排序表和二分查找将被隐式使用。
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' ].