gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:43:48 29 4
gpt4 key购买 nike

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

关于abap - 表表达式的最佳实践 (NW 7.4),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26675236/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com