Объявление и инициализация нескольких переменных - PullRequest
0 голосов
/ 08 февраля 2019

Допустим, у меня есть метод с несколькими параметрами импорта:

*"----------------------------------------------------------------------
*"  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( 
 lv_xx  = iv_xx
 lv_xxx = iv_xxx
).

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019
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 ).
0 голосов
/ 12 февраля 2019

И полная ерунда.; -)

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

mac_data : xx, xxx.
0 голосов
/ 08 февраля 2019

Я вижу, что ваши параметры передаются по значению , поэтому ядро ​​неявно выполняет копирование, нет необходимости использовать вспомогательные переменные.Вы также можете изменить эти переданные по значению параметры во время отладки (возможно, в отладчике была ошибка некоторое время назад, но ее больше нет).

Таким образом, у вас может быть только проблемас параметрами , переданными по ссылке , потому что им присвоен флаг «только для чтения».

В любом случае, чтобы ответить на ваш вопрос, можно использовать макрос:

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.

...