Abap 表格表达式的最佳实践(NW 7.4)
SAP的一次官方演示讨论了NetWeaver 7.4(CD261)中新的ABAP编程功能,重点介绍了表表达式,取代了从内部表读取的旧语法: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_
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在所有操作数位置提升,
除
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之后,我可以确认默认/可选
参数按预期工作。请检查问题:每个单独的读取可能需要单独失败或成功