多变量声明和初始化

时间:2019-02-08 17:18:18

标签: abap

假设我有一个带有一些导入参数的方法:

*"----------------------------------------------------------------------
*"  IMPORTING
*"     VALUE(iv_xx)  TYPE  xx
*"     VALUE(iv_xxx) TYPE  xxx
*"----------------------------------------------------------------------

我不想直接使用它们,因为在方法内部进行调试时可能无法更改它们的值,并且可能还有更多原因。因此,我声明了要为其分配导入值的新变量。有很多方法可以做到这一点...

我是这样开始的:

DATA lv_xx  TYPE xx.
DATA lv_xxx TYPE xxx.

lv_xx  = iv_xx.
lv_xxx = iv_xxx.

继续:

DATA:
  lv_xx  TYPE xx,
  lv_xxx TYPE xxx.

lv_xx  = iv_xx.
lv_xxx = iv_xxx.

演变为:

DATA:
  lv_xx  LIKE iv_xx,
  lv_xxx LIKE iv_xxx.

lv_xx  = iv_xx.
lv_xxx = iv_xxx.

最近发现了一种更加懒惰的方式:

DATA(lv_xx)  = iv_xx.
DATA(lv_xxx) = iv_xxx.

现在我想知道:
我可以再进一步一步,以某种方式消除“ DATA(...)”重复吗?
我在寻找

DATA( 
 lv_xx  = iv_xx
 lv_xxx = iv_xxx
).

3 个答案:

答案 0 :(得分:5)

我看到您的参数已通过值传递,因此内核隐式完成了复制,无需使用辅助变量。您还可以在调试时更改这些按值传递的参数(也许前一段时间在调试器中存在错误,但现在不再存在)。

因此,您可能只对参数通过引用传递有问题,因为它们被分配了“只读”标志。

无论如何,要回答您的问题,一种可能性是使用宏:

CLASS ltc_main DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS
      INHERITING FROM cl_aunit_assert.
  PRIVATE SECTION.
    METHODS test FOR TESTING.
    METHODS test2
      IMPORTING
        VALUE(iv_xx)  TYPE  i
        VALUE(iv_xxx) TYPE  i.
ENDCLASS.
CLASS ltc_main IMPLEMENTATION.
  METHOD test2.

    DEFINE mac_data.
      DATA(&1) &2 &3.
    END-OF-DEFINITION.

    mac_data :
      lv_xx  = iv_xx,
      lv_xxx = iv_xxx.

    assert_equals( act = lv_xx exp = 5 ).
    assert_equals( act = lv_xxx exp = 9 ).
  ENDMETHOD.

  METHOD test.
    test2( iv_xx = 5 iv_xxx = 9 ).
  ENDMETHOD.
ENDCLASS.

但就我个人而言,我不会使用宏,我会声明每个辅助变量,例如DATA(lv_xx) = iv_xx

答案 1 :(得分:2)

TYPES:
  BEGIN OF input_type,
    xx  TYPE xx,
    xxx TYPE xxx,
  END OF input_type.

DATA(input) = VALUE input_type( xx  = iv_xx
                                xxx = iv_xxx ).

答案 2 :(得分:1)

和最终的废话。 ;-)

DEFINE mac_data.
  DATA(lv_&1) = iv_&2.
END-OF-DEFINITION.

mac_data : xx, xxx.