ABAP 7.31 SP10环境下EXPANDING NESTED TABLES的替代方案求推荐
问题描述
众所周知,MOVE-CORRESPONDING语句有一个实用子句EXPANDING NESTED TABLES,语法为:
MOVE-CORRESPONDING: <m_source> TO <m_target> EXPANDING NESTED TABLES.
它的核心作用是当层级结构的表与类型不一一匹配但存在共同字段和行类型时,自动解析各层级结构。当前项目需复制7-10层级的代理结构,恰好需要该功能,但系统为ABAP 7.31 SP10,不支持该子句。
尝试过用RTTS构建替代逻辑,示例如下:
LOOP AT <m_source>-components ASSIGNING <fs_components_l0> LOOP AT <fs_components_l0>-components ASSIGNING <fs_components_l1> .... DO N TIMES. ASSIGN COMPONENT n OF STRUCTURE <fs_components_l1> to <fs_components_l1_comp> MOVE-CORRESPONDING ... ENDDO ENDLOOP ENDLOOP
但该方式在层级较多时代码冗长,维护性差,求更简洁高效的替代方案。
替代方案
1. 递归RTTS通用函数
通过递归遍历数据类型的结构和内表,实现任意层级的对应字段赋值,无需手动嵌套多层循环,代码简洁且易维护。
示例通用函数:
FUNCTION z_move_corresponding_nested. *"---------------------------------------------------------------------- *"*"Local Interface: *" IMPORTING *" VALUE(IV_SOURCE) TYPE REF TO DATA *" EXPORTING *" VALUE(EV_TARGET) TYPE REF TO DATA *"---------------------------------------------------------------------- DATA: lo_source_descr TYPE REF TO cl_abap_typedescr, lo_struct_descr TYPE REF TO cl_abap_structdescr, lo_table_descr TYPE REF TO cl_abap_tabledescr, ls_component TYPE abap_componentdescr, lv_source_field TYPE REF TO DATA, lv_target_field TYPE REF TO DATA. lo_source_descr = cl_abap_typedescr=>describe_by_data_ref( iv_source ). " 创建与源同类型的目标数据对象 CREATE DATA ev_target TYPE HANDLE lo_source_descr. CASE lo_source_descr->type_kind. WHEN 'S'. " 处理结构类型 lo_struct_descr ?= lo_source_descr. LOOP AT lo_struct_descr->components INTO ls_component. ASSIGN COMPONENT ls_component-name OF STRUCTURE iv_source->* TO FIELD-SYMBOL(<fs_source>). IF sy-subrc = 0. ASSIGN COMPONENT ls_component-name OF STRUCTURE ev_target->* TO FIELD-SYMBOL(<fs_target>). IF sy-subrc = 0. " 递归处理嵌套的子组件 z_move_corresponding_nested( EXPORTING iv_source = REF #( <fs_source> ) IMPORTING ev_target = REF #( <fs_target> ) ). ENDIF. ENDIF. ENDLOOP. WHEN 'T'. " 处理内表类型 lo_table_descr ?= lo_source_descr. ASSIGN iv_source->* TO FIELD-SYMBOL(<fs_source_tab>). ASSIGN ev_target->* TO FIELD-SYMBOL(<fs_target_tab>). LOOP AT <fs_source_tab> ASSIGNING FIELD-SYMBOL(<fs_source_row>). APPEND INITIAL LINE TO <fs_target_tab> ASSIGNING FIELD-SYMBOL(<fs_target_row>). " 递归处理内表行的结构 z_move_corresponding_nested( EXPORTING iv_source = REF #( <fs_source_row> ) IMPORTING ev_target = REF #( <fs_target_row> ) ). ENDLOOP. WHEN OTHERS. " 基本数据类型直接赋值 ASSIGN iv_source->* TO FIELD-SYMBOL(<fs_source>). ASSIGN ev_target->* TO FIELD-SYMBOL(<fs_target>). <fs_target> = <fs_source>. ENDCASE. ENDFUNCTION.
使用方式:
DATA(lo_target) = z_move_corresponding_nested( iv_source = REF #( lv_source ) ). ASSIGN lo_target->* TO FIELD-SYMBOL(<fs_target>).
2. 性能优化建议
- 若频繁调用该函数,可添加类型描述器缓存逻辑,避免重复执行
cl_abap_typedescr=>describe_by_data_ref,提升执行效率。 - 若目标类型与源类型不完全一致(仅字段对应),可在结构处理分支中,先检查目标结构是否存在同名字段,再执行赋值,模拟
MOVE-CORRESPONDING的匹配逻辑。
3. 固定结构场景:预定义转换方法
如果代理结构是固定不变的,可创建专用转换类,为每个层级的结构编写转换方法。这种方式性能优于通用RTTS,但仅适用于结构固定的场景,灵活性较差。
内容的提问来源于stack exchange,提问作者Suncatcher
相关产品推荐
相关产品推荐

