我的递归方法中有一个传入的深层结构,其中包含结构和表,所以我正在使用 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.
通用导出参数运行良好:
CLASS lcl DEFINITION.
PUBLIC SECTION.
METHODS: process_input IMPORTING im_input TYPE ANY
EXPORTING ex_input TYPE ANY.
ENDCLASS.
所以你的问题出在别处。
我可以通过使用更改而不是导入和导出来解决我的问题。但我想了解这一点。你可以帮我吗?
我认为您需要在调用process_input
时检查是否提供了importing
参数。 如果不提供与importing
参数相同的exporting
类型,则会发生OBJECTS_MOVE_NOT_SUPPORTED
。
宣:
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
,则应将其声明为 value。
process_input
importing
value(im_input) type any
exporting
!ex_input type any.
问题似乎超出了您在问题中引用的代码。TYPE any
仅指定对于方法调用,将静态允许任何类型 - 您实际上是在禁用编译时类型检查。您仍然必须确保方法的调用方在运行时提供兼容的类型。
我知道,这很旧,但选择: 键入任何表作为导出参数。