如何使用类型为 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.

通用导出参数运行良好:

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仅指定对于方法调用,将静态允许任何类型 - 您实际上是在禁用编译时类型检查。您仍然必须确保方法的调用方在运行时提供兼容的类型。

我知道,这很旧,但选择: 键入任何表作为导出参数。

相关内容

  • 没有找到相关文章

最新更新