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

所以你的问题不在于此。

+0

如果我尝试将导入变量的末尾分配给导出变量,我得到转储OBJECTS_MOVE_NOT_SUPPORTED。 – bish

+1

然后您的导入/导出参数[不能相互转换](https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abenconversion_rules.htm)。这与通用参数无关。 – Suncatcher

+1

如果你可以创建通用参数,这并不意味着你可以将任何东西转换成任何人。 – Suncatcher

我可以通过使用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. 
+0

我在一个空的程序中试过,它可以和字符串一起工作。我取消了整个代码的注释并只分配了导入来导出。看来,这是深层结构的问题。你能证实这一点吗? – bish

+0

我必须看你的代码。你能否更新这个问题? – Allen

问题似乎超出了您在问题中引用的代码。 TYPE any仅指定对于方法调用,任何类型都将被静态地允许 - 您基本上禁用了编译时类型检查。您仍然必须确保兼容类型在运行时由方法调用者提供。