Как использовать параметр экспорта с типом ANY

У меня есть входящая глубокая структура в моем рекурсивном методе, который содержит структуры и таблицы, поэтому я работаю с RTTI, чтобы проверить тип, перебрать его и выполнить свою операцию, если я нашел конкретный компонент.

Если текущий компонент является структурой или таблицей, метод вызывает сам себя.

Проблема: импортирую структуру с типом any. Все идет нормально. И я хочу также экспортировать это как тип.

И вот я борюсь.

Как я могу назначить отредактированную глубинную структуру моему параметру экспорта?


METHOD process_input.

DATA: lo_type_descr   TYPE REF TO cl_abap_typedescr,
      lo_struct_descr TYPE REF TO cl_abap_structdescr,
      lv_comp_found   TYPE abap_bool.

FIELD-SYMBOLS: <fs_table>     TYPE ANY TABLE,
               <fs_value>     TYPE any.

lo_type_descr ?= cl_abap_typedescr=>describe_by_data( p_data =  im_input  ).

IF lo_type_descr->type_kind EQ cl_abap_typedescr=>typekind_struct2 OR
   lo_type_descr->type_kind EQ cl_abap_typedescr=>typekind_struct1.
  lo_struct_descr ?= cl_abap_structdescr=>describe_by_data( p_data =  im_input  ).
  LOOP AT lo_struct_descr->components ASSIGNING FIELD-SYMBOL(<fs_comp>).
    ASSIGN COMPONENT sy-tabix OF STRUCTURE  im_input  TO <fs_value>.
    lo_type_descr ?= cl_abap_typedescr=>describe_by_data( p_data = <fs_value> ).
    lv_comp_found = abap_false.

    IF  lo_type_descr->type_kind EQ cl_abap_typedescr=>typekind_struct2 OR
        lo_type_descr->type_kind EQ cl_abap_typedescr=>typekind_struct1  OR
        lo_type_descr->type_kind EQ cl_abap_typedescr=>typekind_table.
      process_input(
        EXPORTING
          im_input    = <fs_value>
          im_list = im_list
      ).
    ELSE.
      READ TABLE im_list INTO DATA(element) WITH KEY service_part = <fs_comp>-name BINARY SEARCH.
      IF sy-subrc EQ 0.
        <fs_value> = 'TEST :)'.
      ENDIF.
    ENDIF.
  ENDLOOP.
ELSEIF lo_type_descr->type_kind EQ cl_abap_typedescr=>typekind_table.
  ASSIGN  im_input TO <fs_table>.
  LOOP AT <fs_table> ASSIGNING FIELD-SYMBOL(<fs_tab_index>).
    lo_struct_descr ?= cl_abap_structdescr=>describe_by_data( p_data = <fs_tab_index> ).
    LOOP AT lo_struct_descr->components ASSIGNING <fs_comp>.
      ASSIGN COMPONENT sy-tabix OF STRUCTURE <fs_tab_index> TO <fs_value>.
      lo_type_descr ?= cl_abap_typedescr=>describe_by_data( p_data = <fs_value> ).
      lv_comp_found = abap_false.

      IF  lo_type_descr->type_kind EQ cl_abap_typedescr=>typekind_struct2 OR
          lo_type_descr->type_kind EQ cl_abap_typedescr=>typekind_struct1  OR
          lo_type_descr->type_kind EQ cl_abap_typedescr=>typekind_table.

        process_input(
          EXPORTING
            im_input = <fs_value>
            im_list  = im_list
        ).
      ELSE.
        READ TABLE im_list INTO element WITH KEY service_part = <fs_comp>-name BINARY SEARCH.
        IF sy-subrc EQ 0.
          <fs_value> = 'TEST :)'.
        ENDIF.
      ENDIF.
    ENDLOOP.
  ENDLOOP.
ENDIF.
get REFERENCE OF im_input INTO lv_cont.
ex_input = im_input.
ENDMETHOD.

person bish    schedule 18.08.2017    source источник


Ответы (3)


Общие параметры экспорта прекрасно работают:

CLASS lcl DEFINITION.
 PUBLIC SECTION.
  METHODS: process_input IMPORTING im_input TYPE ANY
                         EXPORTING ex_input TYPE ANY.
ENDCLASS.

Итак, ваша проблема в другом.

person Suncatcher    schedule 18.08.2017
comment
Если я попытаюсь назначить переменную импорта в конце переменной экспорта, я получу дамп OBJECTS_MOVE_NOT_SUPPORTED. - person bish; 18.08.2017
comment
Тогда ваши параметры импорта / экспорта не могут быть взаимно преобразованы . Это не имеет ничего общего с общими параметрами. - person Suncatcher; 18.08.2017
comment
Если вы можете создавать общие параметры, это не значит, что вы можете конвертировать что угодно в кого угодно. - person Suncatcher; 18.08.2017
comment
Да, вы правы. Я не могу понять, что передача таблицы для импорта любого типа параметра работает, но передача таблицы в параметр экспорта не работает. Это сообщение об ошибке из дампа: «Преобразование типа TABLE OF PRXCTRL в тип C LENGTH 4 не поддерживается». Почему тип параметра экспорта определен как «C LENGTH 4»? - person bish; 18.08.2017
comment
Я мог бы решить свою проблему, используя ИЗМЕНЕНИЕ вместо ИМПОРТА и ЭКСПОРТА. Но я хочу это понять. Вы можете мне помочь ? - person bish; 18.08.2017

Я мог бы решить свою проблему, используя ИЗМЕНЕНИЕ вместо ИМПОРТА и ЭКСПОРТА. Но я хочу это понять. Вы можете мне помочь ?

Я думаю, вам нужно проверить, указываете ли вы параметр importing при вызове своего process_input. OBJECTS_MOVE_NOT_SUPPORTED произойдет, если вы не укажете тот же тип exporting, что и ваш параметр importing.

Объявляем:

process_input
  importing
    !im_input type any
  exporting
    !ex_input type any.

Как вы звоните:

process_input(
    exporting
        im_input = ls_test
    importing
        ex_input = ls_test
).

Еще одна вещь, которую я хотел бы упомянуть, вы не должны НЕПОСРЕДСТВЕННО МОДИФИЦИРОВАТЬ im_input, поскольку она защищена, иначе будут дампы.

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

process_input
  importing
    value(im_input) type any
  exporting
    !ex_input type any.
person Haojie    schedule 18.08.2017
comment
Я пробовал это в пустой программе, и она работает со строками. Я раскомментировал весь код и назначил только импорт для экспорта. Похоже, здесь проблема с глубокими структурами. Вы можете это подтвердить? - person bish; 22.08.2017
comment
Мне нужно увидеть твой код. Не могли бы вы обновить вопрос? - person Haojie; 22.08.2017

Проблема, похоже, выходит за рамки кода, который вы указали в вопросе. TYPE any только указывает, что для вызова метода любой тип будет разрешен статически - вы, по сути, отключаете проверки типов во время компиляции. Вы все равно должны убедиться, что совместимые типы предоставляются вызывающим методом во время выполнения.

person vwegert    schedule 31.08.2017