Есть ли в ABAP что-то вроде ИНОСТРАННЫХ ПЕРВОНАЧАЛЬНЫХ ИГНОРИРУЮЩИХ ИСКУССТВ? - PullRequest
5 голосов
/ 03 февраля 2012

Я ищу языковую конструкцию или функциональный модуль, который был бы похож на MOVE-CORRESPONDING IGNORING INITIALS.Проще говоря, я хочу что-то, что работает точно так же, как MOVE-CORRESPONDING source TO dest, но игнорируя все поля, которые являются начальными в source.

.

Ответы [ 2 ]

3 голосов
/ 03 февраля 2012

Я подготовил свой собственный фрагмент кода, которым хочу поделиться.Он не идеален, он не будет работать со сложными структурами.Однако сейчас мне не нужно ничего больше, чем работать с плоскими структурами.

CLASS lcl_utilities DEFINITION FINAL CREATE PRIVATE.
  PUBLIC SECTION.
    CLASS-METHODS:
      move_corresponding_ignore_init
        IMPORTING
          i_str_source TYPE any
        CHANGING
          c_str_dest   TYPE any.
ENDCLASS.

CLASS lcl_utilities IMPLEMENTATION.
  METHOD move_corresponding_ignore_init.
    DATA:
      l_rcl_abap_structdescr TYPE REF TO cl_abap_structdescr.

    l_rcl_abap_structdescr ?= cl_abap_typedescr=>describe_by_data( i_str_source ).
    LOOP AT l_rcl_abap_structdescr->components ASSIGNING FIELD-SYMBOL(<fs_str_component>).
      ASSIGN COMPONENT <fs_str_component>-name OF STRUCTURE c_str_dest TO FIELD-SYMBOL(<fs_dest_field>).
      IF sy-subrc = 0.
        ASSIGN COMPONENT <fs_str_component>-name OF STRUCTURE i_str_source TO FIELD-SYMBOL(<fs_source_field>).
        ASSERT sy-subrc = 0.
        IF <fs_source_field> IS NOT INITIAL.
          <fs_dest_field> = <fs_source_field>.
        ENDIF.
      ENDIF.
    ENDLOOP.
  ENDMETHOD.                    "move_corresponding_ignore_init
ENDCLASS.

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

DEFINE move_corresponding_ignore_init.
  lcl_utilities=>move_corresponding_ignore_init(
    exporting
      i_str_source = &1
    changing
      c_str_dest   = &2
  ).
END-OF-DEFINITION.
1 голос
/ 03 февраля 2012

Не существует языковой конструкции для произвольных структур.Для символьных полей вы можете использовать OVERLAY ... WITH, но если вы попытаетесь сделать это со структурами, это приведет к действительно грязному коду и множеству непредвиденных проблем с содержимым переменной длины.Для этого лучше всего использовать RTTI ( Идентификация типа времени выполнения ), но будьте осторожны при проверке начальных значений.

...