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

Abap 表格表达式的最佳实践(NW 7.4),abap,Abap,SAP的一次官方演示讨论了NetWeaver 7.4(CD261)中新的ABAP编程功能,重点介绍了表表达式,取代了从内部表读取的旧语法: READ TABLE lt_aufk INTO ls_aufk WITH KEY aedat = sy-datum. lv_order = ls_aufk-aufnr. 使用单行lv\u order=lt\u aufk[aedat=sy datum]-aufnr. 但是,它没有提到,如果表表达式找不到行,它将引发异常CX_SY_ITAB_line_NOT_

SAP的一次官方演示讨论了NetWeaver 7.4(CD261)中新的ABAP编程功能,重点介绍了表表达式,取代了从内部表读取的旧语法:

READ TABLE lt_aufk INTO ls_aufk WITH KEY aedat = sy-datum.
lv_order = ls_aufk-aufnr.
使用单行
lv\u order=lt\u 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美分:有时忽略一个异常是可以的,例如,如果你只是想,在你的情况下,显示一个空单元格。从技术上讲,在旧场景中,您也应该在进入结构之前捕获子RCS。您还有一个额外的问题-取决于您的表定义,我看不到这些-即
aedat
可能不是主键,在这种情况下,您可能试图将另一个表类型填充到工作区域中。最后最重要的是程序是否崩溃,以及是否显示了有意义的数据

至于设计原则,总的来说,如果你在你的程序中做了很多这方面的工作,我想我宁愿把一些精力放在干式原则上

尽管如此,文件提到:

关于例外情况:

这是有办法的

如果未找到指定的行,则 类CX_SY_ITAB_LINE_NOT_FOUND在所有操作数位置提升,

  • 默认值在结果类型的定义中指定
  • 在ASSIGN语句中使用表表达式,其中sy subrc设置为值4
  • 当在谓词函数行_中使用时,返回逻辑值“false”
  • 在表函数行_索引中使用时,返回值0
  • 表表达式的默认值

    如果您已经使用SP08或更高版本,请选择:

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

    作为一种解决方法,您可以将表表达式放置在包含可选或默认添加项的值或引用表达式中。如果找不到行,可选加法将返回初始行,而默认加法将返回给定值,该值可以指定为表达式,尤其是另一个表表达式

    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 ).
    

    我认为您应该将所有的读取表包含在一个try-catch中

    首先将它们合并到一个try/catch块中。@Jorg
    在这些情况下,每个单独的读取可能都需要失败或成功
    。啊,很抱歉,我错过了这个选项。您是否总是读取相同的日期字段?在这种情况下,您可以将其移动到一个方法并保持读取动态,这可能是简化它的一个选项,但这只是从itabs读取WAs的一般情况的一个示例。我希望有一些模糊的技巧可以忽略块中的异常,但我想我还是坚持使用这种语法。尽管即使它存在,忽略异常也可能不是一个最佳的甚至是公认的做法。SP8似乎确实提供了一个替代方案。对于上面的示例,代码将是
    wa1=VALUE#(lt_itab[col1=…]可选)。
    。不幸的是,我们刚刚升级到SP7,所以我想我现在必须处理难看的代码。现在我们已经升级到SP08之后,我可以确认
    默认/可选
    参数按预期工作。请检查问题:
    每个单独的读取可能需要单独失败或成功