表格表达式的最佳实践(NW 7.4)

Lil*_*hal 6 abap

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

READ TABLE lt_aufk INTO ls_aufk WITH KEY aedat = sy-datum.
lv_order = ls_aufk-aufnr.
Run Code Online (Sandbox Code Playgroud)

单线 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.
Run Code Online (Sandbox Code Playgroud)

哪个更长,并且使任何简单的读取逻辑看起来非常复杂且难以阅读.由于每个单独阅读可能需要单独失败或成功,因此这种快速气球不成比例:

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.
Run Code Online (Sandbox Code Playgroud)

有没有办法提高这些表表达式的可读性?我不正确地使用它们吗?

Jor*_*org 4

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

最佳实践

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

至于设计原则,总的来说,如果你在程序中做了很多这样的事情,我认为我宁愿在 DRY 原则上投入一些精力。

话虽如此,文档中提到:

关于异常:

来源

有办法解决这个问题。

如果未找到指定行,则会在所有操作数位置引发 CX_SY_ITAB_LINE_NOT_FOUND 类的可处理表达式, 除非

  1. 在结果类型的定义中指定了默认值,
  2. ASSIGN 语句中使用了表表达式,其中 sy-subrc 设置为值 4,
  3. 当在谓词函数 line_exists 中使用时,返回逻辑值“false”,
  4. 当在表函数line_index中使用时,返回值0。

表表达式的默认值

来源。

如果您已经使用 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 ).
Run Code Online (Sandbox Code Playgroud)