有时候需要不同结构 相同字段 赋值,如果仅仅简单赋值 move-corresponding 即可、但是有时候需要将非空字段赋值,甚至不要把原来的值覆盖掉。
Demo如下
FUNCTION zfm_move_corresponding1.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(IS_INPUT)
*" REFERENCE(IV_STRUCTURE)
*" REFERENCE(CV_STRUCTURE)
*" CHANGING
*" REFERENCE(CS_INPUT)
*"----------------------------------------------------------------------
FIELD-SYMBOLS:
<l_field> TYPE any, "从工作区结构
<l_field_c> TYPE any. "到工作区结构
*
DATA : lt_idetails TYPE abap_compdescr_tab WITH HEADER LINE.
DATA : lr_ref_table_des TYPE REF TO cl_abap_structdescr.
DATA : ct_idetails TYPE abap_compdescr_tab WITH HEADER LINE.
DATA : cr_ref_table_des TYPE REF TO cl_abap_structdescr.
lr_ref_table_des ?=
cl_abap_typedescr=>describe_by_name( iv_structure ).
CLEAR lt_idetails[].
lt_idetails[] = lr_ref_table_des->components[].
cr_ref_table_des ?=
cl_abap_typedescr=>describe_by_name( cv_structure ).
CLEAR ct_idetails[].
ct_idetails[] = cr_ref_table_des->components[].
"循环判断结构每个字段
LOOP AT lt_idetails.
ASSIGN COMPONENT lt_idetails-name OF STRUCTURE is_input TO <l_field> .
IF sy-subrc = 0 AND <l_field> IS NOT INITIAL.
READ TABLE ct_idetails WITH KEY name = lt_idetails-name.
CHECK sy-subrc = 0.
ASSIGN COMPONENT ct_idetails-name OF STRUCTURE cs_input TO <l_field_c>.
IF sy-subrc = 0.
* IF sy-subrc = 0 AND <l_field_c> IS INITIAL. "如果不想覆盖掉原来值
<l_field_c> = <l_field>.
ENDIF.
ENDIF.
ENDLOOP.
ENDFUNCTION.