ABAP 7.4 及更高版本 [2]:使用新语法读取内表

2021-11-07 10:18发布


          点击此处--->   EasySAP.com 群内免费提供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' ].

赞赏支持