我的递归方法中有一个传入的深层结构,其中包含结构和表格,所以我正在使用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.
答案 0 :(得分:0)
通用导出参数运行良好:
CLASS lcl DEFINITION.
PUBLIC SECTION.
METHODS: process_input IMPORTING im_input TYPE ANY
EXPORTING ex_input TYPE ANY.
ENDCLASS.
所以你的问题出在其他地方。
答案 1 :(得分:0)
我可以通过使用CHANGING而不是IMPORTING和EXPORTING来解决我的问题。但我想明白这一点。你能救我吗?
我认为您在致电label2Elements = document.getElementsByClassName('class2');
for (var i=0; i<label2Elements.length; i++) {
var elm = label2Elements[i];
var a = document.createElement('a');
a.href="#";
elm.parentNode.insertBefore(a, elm);
a.appendChild(elm);
}
时需要检查是否提供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
答案 2 :(得分:0)
问题似乎超出了您在问题中引用的代码。 TYPE any
仅指定对于方法调用,将静态允许任何类型 - 您实际上是禁用编译时类型检查。您仍然必须确保在运行时方法的调用者提供兼容类型。