类方法(METHOD)参数 - 实现动态传入内表、工作区、对象
自定义的CLASS中METHOD需要动态确定内表和工作区,通过如下方法实现:
CLASS: ZCL_TEST
METHOD: MT_TYPE_DATA
内 表:TYPE STANDARD TABLE
工作区:TYPE DATA
对 象:TYPE REF TO OBJECT
METHOD实施程序
METHOD mt_type_data.
ASSIGN cs_data TO FIELD-SYMBOL(<fs_data>).
IF <fs_data> IS ASSIGNED.
ASSIGN COMPONENT 'FD1' OF STRUCTURE <fs_data> TO FIELD-SYMBOL(<fd1>).
ENDIF.
"读取传入内表数据
DATA(zkey) = |FD2|.
READ TABLE it_tab ASSIGNING FIELD-SYMBOL(<fs_tab>) WITH KEY (zkey) = |22|.
IF sy-subrc = 0.
ASSIGN COMPONENT 'FD1' OF STRUCTURE <fs_tab> TO FIELD-SYMBOL(<fs_fd>).
CHECK <fs_fd> IS ASSIGNED.
IF <fd1> IS ASSIGNED.
<fs_fd> = <fd1>.
UNASSIGN <fd1>.
ENDIF.
WRITE: / <fs_fd>.
UNASSIGN <fs_fd>.
ENDIF.
ENDMETHOD.
测试DEMO
REPORT ycl_test.
TYPES:BEGIN OF ty_out,
fd1 TYPE char20,
fd2 TYPE char20,
END OF ty_out.
DATA: lt_out TYPE STANDARD TABLE OF ty_out,
ls_out TYPE ty_out.
lt_out[] = VALUE #( ( fd1 = |11| fd2 = |12| )
( fd1 = |21| fd2 = |22| )
( fd1 = |31| fd2 = |32| ) ).
ls_out = VALUE #( fd1 = |WA_FD1| fd2 = |WA_FD2| ).
CALL METHOD lcl_test->mt_type_data
CHANGING
it_tab = lt_out
cs_data = ls_out.
DEBUG
如果需要对内表或工作区具体字段进行操作,通过
https://blog.****.net/wangjolly/article/details/79127090
获取字段信息,改造代码如下:
METHOD mt_type_data.
ASSIGN cs_data TO FIELD-SYMBOL(<fs_data>).
IF <fs_data> IS ASSIGNED.
ASSIGN COMPONENT 'FD1' OF STRUCTURE <fs_data> TO FIELD-SYMBOL(<fd1>).
ENDIF.
"读取传入内表数据
DATA(zkey) = |FD2|.
READ TABLE it_tab ASSIGNING FIELD-SYMBOL(<fs_tab>) WITH KEY (zkey) = |22|.
IF sy-subrc = 0.
ASSIGN COMPONENT 'FD1' OF STRUCTURE <fs_tab> TO FIELD-SYMBOL(<fs_fd>).
CHECK <fs_fd> IS ASSIGNED.
IF <fd1> IS ASSIGNED.
<fs_fd> = <fd1>.
UNASSIGN <fd1>.
ENDIF.
WRITE: / <fs_fd>.
UNASSIGN <fs_fd>.
ENDIF.
**********************************************************************
* 获取 传入内表和工作区字段信息
DATA: lcl_struc TYPE REF TO cl_abap_structdescr,
lcl_tab TYPE REF TO cl_abap_tabledescr,
lcl_tab_struc TYPE REF TO cl_abap_structdescr,
lt_comps_wa TYPE abap_compdescr_tab,
lt_comps_tab TYPE abap_compdescr_tab.
"1 工作区 字段信息
lcl_struc ?= cl_abap_typedescr=>describe_by_data( cs_data ).
lt_comps_wa = lcl_struc->components.
"3 内表 字段信息
"->3.1 Get the description of data object type
lcl_tab ?= cl_abap_tabledescr=>describe_by_data( it_tab ).
"->3.2 Get the line type
lcl_tab_struc ?= lcl_tab->get_table_line_type( ).
lt_comps_tab = lcl_struc->components.
ENDMETHOD.