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

时间:2014-10-31 12:55:16

标签: abap

在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 个答案:

答案 0 :(得分:3)

我正在输入评论,但它已经很久......

最佳实践

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

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

话虽如此,文件提到:

关于例外:

Source

有很多方法。

  

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

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

表表达式的默认值

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

答案 1 :(得分:-1)

我认为你应该把所有的阅读表都放在一个试试看