如何使用ANY

时间:2017-08-18 09:38:46

标签: generics parameters sap abap

我的递归方法中有一个传入的深层结构,其中包含结构和表格,所以我正在使用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.

3 个答案:

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