Используйте CL_ABAP_CORRESPONDING для отображения полей на разных уровнях в структуре - PullRequest
3 голосов
/ 23 января 2020

У меня есть две вложенные структуры, и я хочу отобразить поле во время выполнения в соответствии с некоторыми правилами. Можно добавить, что поле структуры dest и структура источника находятся на разных уровнях вложенных структур.

(Структуры имеют разные типы)

Например, я хочу отобразить:

struct1-a1 = struct2-bsub1-s1_b1.
struct1-asub1-s1_a1 = struct2-b1.
    DATA:
      BEGIN OF struct1,
        a1 TYPE string VALUE 'a1',
        a2 TYPE string VALUE 'a2',
        a3 TYPE string VALUE 'a3',
        a4 TYPE string VALUE 'a4',
        a5 TYPE string VALUE 'a5',
        BEGIN OF asub1,
          s1_a1 TYPE string VALUE 's1_a1',
          s1_a2 TYPE string VALUE 's1_a2',
          s1_a3 TYPE string VALUE 's1_a3',
        END OF asub1,
      END OF struct1,

      BEGIN OF struct2,
        b1 TYPE string VALUE 'b1',
        b2 TYPE string VALUE 'b2',
        b3 TYPE string VALUE 'b3',
        a4 TYPE string VALUE 'b4',
        a5 TYPE string VALUE 'b5',
        BEGIN OF bsub1,
          s1_b1 TYPE string VALUE 's1_b1',
          s1_b2 TYPE string VALUE 's1_b2',
          s1_b3 TYPE string VALUE 's1_b3',
        END OF bsub1,
      END OF struct2.

Я нашел этот классный класс для построения сопоставления для полей, но у него есть только один параметр уровня.

У меня вопрос, могу ли я использовать класс CL_ABAP_CORRESPONDING для отображения полей на разных уровнях и как я могу это сделать.

1 Ответ

4 голосов
/ 23 января 2020

Нет, вы не можете, отображаемые структуры должны быть на одном уровне. Выдержка из документа класса:

Примечания

Компоненты могут быть сопоставлены друг с другом, только если они находятся на одном уровне. Компоненты в подструктуре не могут быть назначены компонентам на более высоких уровнях, а компоненты более высокого уровня не могут быть добавлены к компонентам в подструктуре.

Вы должны быть разделены на несколько исполнений:

cl_abap_corresponding=>create(
      source            = struct2-bsub1
      destination       = struct1
      mapping           = VALUE cl_abap_corresponding=>mapping_table(
                          ( level = 0 kind = 1 srcname = 's1_b1' dstname = 'a1' ) )
      )->execute( EXPORTING source      = struct2-bsub1
                  CHANGING  destination = struct1 ).

cl_abap_corresponding=>create(
      source            = struct2
      destination       = struct1-asub1
      mapping           = VALUE cl_abap_corresponding=>mapping_table(
                          ( level = 0 kind = 1 srcname = 's1_a1' dstname = 'b1' ) )
      )->execute( EXPORTING source      = struct2
                  CHANGING  destination = struct1-asub1 ).

РЕДАКТИРОВАТЬ : хотя документация кажется простой, я обнаружил, что селектор компонента может использоваться внутри компонента SRCNAME, чтобы ссылаться на компонент из вложенной структуры, например, первое выполнение выше эквивалентно этому коду (различия в source = struct2 и srcname = 'bsub1-s1_b1'):

cl_abap_corresponding=>create(
      source            = struct2
      destination       = struct1
      mapping           = VALUE cl_abap_corresponding=>mapping_table(
                          ( level = 0 kind = 1 srcname = 'bsub1-s1_b1' dstname = 'a1' ) )
      )->execute( EXPORTING source      = struct2
                  CHANGING  destination = struct1 ).

То, что по-прежнему кажется невозможным , заключается в использовании селектора компонента в компоненте DSTNAME, например, при втором выполнении невозможно указать destination = struct1 и dstname = 'asub1-b1', возникнет исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...