讨论 NetWeaver 7.4 (CD261) 中新的 ABAP 编程功能的 SAP 官方演示文稿对表表达式进行了大量讨论,替换了从内部表读取的旧语法:

READ TABLE lt_aufk INTO ls_aufk WITH KEY aedat = sy-datum. 
lv_order = ls_aufk-aufnr. 

带单行 lv_order = lt_aufk[ aedat = sy-datum ]-aufnr.
但是,它没有提到如果表表达式找不到一行,它会引发异常 CX_SY_ITAB_LINE_NOT_FOUND。 ,所以这个符号实际上应该是:
TRY. 
        lv_order = lt_aufk[ aedat = sy-datum ]-aufnr. 
    CATCH cx_sy_itab_line_not_found. 
ENDTRY. 

这既更长又使任何简单的读取逻辑看起来非常复杂且难以阅读。由于每个单独的读取可能需要单独失败或成功,因此很快就会不成比例地膨胀:
TRY. 
        wa1 = lt_itab[ col1 = ... ]. 
    CATCH cx_sy_itab_line_not_found. 
ENDTRY. 
TRY. 
        wa2 = lt_itab[ col2 = ... ]. 
    CATCH cx_sy_itab_line_not_found. 
ENDTRY. 
TRY. 
        wa3 = lt_itab[ col3 = ... ]. 
    CATCH cx_sy_itab_line_not_found. 
ENDTRY. 
TRY. 
        wa4 = lt_itab[ col4 = ... ]. 
    CATCH cx_sy_itab_line_not_found. 
ENDTRY. 
TRY. 
        wa5 = lt_itab[ col5 = ... ]. 
    CATCH cx_sy_itab_line_not_found. 
ENDTRY. 

有什么办法可以提高这些表格表达式的可读性吗?我是否使用不当?

请您参考如下方法:

我正在输入评论,但它变得越来越长......

最佳实践

我想这是有争议的,但我的 2 美分:有时忽略异常是可以的,例如,如果您只想在您的情况下显示一个空单元格。从技术上讲,在旧场景中,您也应该在进入结构之前捕获 SUBRC。您还有一个问题 - 根据您的表定义,我看不到那些 - aedat可能不是主键,在这种情况下,您可能试图将另一种表类型塞入工作区。最后最重要的是您的程序是否崩溃,以及您是否正在显示有意义的数据。

至于设计原则,总的来说,如果你在你的程序中做了很多这样的事情,我认为我宁愿在 DRY 原则上花点功夫。

话虽如此,文档提到:

关于异常:

Source

有办法解决它。

If the specified row is not found, a handleable expression of the class CX_SY_ITAB_LINE_NOT_FOUND is raised in all operand positions, except when

  1. a default value is specified in the definition of the type of the result,
  2. a table expression is used in the statement ASSIGN, where sy-subrc is set to the value 4,
  3. when used in the predicate function line_exists, where the logical value "false" is returned,
  4. when used in the table function line_index, where the value 0 is returned.


表表达式的默认值

Source .

如果您已经在 SP08 或更高版本上,那就很好:

表表达式 itab[ ...] 不能支持 sy-subrc。到目前为止,如果找不到方括号中指定的表格行,则随时会引发异常。并不是每个人都喜欢这种行为。

作为解决方法,您可以将表表达式放在 VALUE 或 REF 表达式中,其中包含 OPTIONAL 或 DEFAULT 添加项。如果未找到一行,则 OPTIONAL 加法返回初始行,而 DEFAULT 加法返回给定值,该值可以指定为表达式,尤其是另一个表表达式。
TYPES: 
  BEGIN OF line, 
    id    TYPE i, 
    value TYPE string, 
  END OF line, 
  itab TYPE SORTED TABLE OF line WITH UNIQUE KEY id. 
 
DATA(def) = VALUE line( id = 0 value = `not found` ). 
 
 
... 
 
DATA(result) = VALUE #( itab[ id = ... ] DEFAULT def ). 


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!