如何使用类型为ANY的导出参数
问题描述:
我的递归方法中包含结构和表的传入深层结构,因此我正在使用RTTI检查类型,循环并执行操作,以防万一找到一个特定的组件。如何使用类型为ANY的导出参数
如果当前组件是一个结构或表,那么方法调用它自己。
问题: 我导入类型为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.
所以你的问题不在于此。
答
我可以通过使用CHANGING而不是IMPORTING和EXPORTING来解决我的问题。但我想了解这一点。你可以帮我吗 ?
我认为您需要检查当您致电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
MODIFY,因为它是用其他方法保护会有转储。
如果您需要直接修改它,则应声明im_input
为值。
process_input
importing
value(im_input) type any
exporting
!ex_input type any.
答
问题似乎超出了您在问题中引用的代码。 TYPE any
仅指定对于方法调用,任何类型都将被静态地允许 - 您基本上禁用了编译时类型检查。您仍然必须确保兼容类型在运行时由方法调用者提供。
如果我尝试将导入变量的末尾分配给导出变量,我得到转储OBJECTS_MOVE_NOT_SUPPORTED。 – bish
然后您的导入/导出参数[不能相互转换](https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abenconversion_rules.htm)。这与通用参数无关。 – Suncatcher
如果你可以创建通用参数,这并不意味着你可以将任何东西转换成任何人。 – Suncatcher