含STRING字段的非标准自定义内表转标准表适配cl_salv_table
解决含STRING字段的非标准内表转标准表适配CL_SALV_TABLE问题
cl_salv_table=>factory仅接受标准表类型的内表,非标准表(如SORTED、HASHED)直接传入会触发类型不兼容错误;而通过SQL SELECT转换的方式因STRING字段无法在SQL层面直接处理,会导致编译报错。最优解决方案是直接在ABAP内存中完成非标准表到标准表的复制,具体步骤如下:
1. 定义与原表同结构的标准表类型
基于非标准内表的行结构,创建对应的标准表类型,键值可设为EMPTY KEY(无需排序/唯一约束时)或自定义键,cl_salv_table对两种类型均支持。
示例代码:
" 原行结构与非标准表定义 TYPES: BEGIN OF ty_data, id TYPE i, text TYPE string, " 含STRING字段 END OF ty_data. TYPES: tt_sorted TYPE SORTED TABLE OF ty_data WITH UNIQUE KEY id. " 对应的标准表类型定义 TYPES: tt_standard TYPE STANDARD TABLE OF ty_data WITH EMPTY KEY.
2. 内存中完成表数据复制
ABAP 7.4及以上版本支持直接赋值,低版本可使用MOVE-CORRESPONDING或循环赋值,全程在内存操作,不会触发STRING字段相关的SQL错误。
方式一:直接赋值(ABAP 7.4+推荐)
" 填充非标准表数据 DATA(lt_sorted) = VALUE tt_sorted( ( id = 1 text = '测试字符串1' ) ( id = 2 text = '带特殊字符的测试字符串:!@#$%' ) ). " 直接转换为标准表 DATA(lt_standard) = lt_sorted.
方式二:MOVE-CORRESPONDING(兼容低版本)
DATA lt_standard TYPE tt_standard. MOVE-CORRESPONDING lt_sorted TO lt_standard.
方式三:VALUE构造器循环赋值
DATA(lt_standard) = VALUE tt_standard( FOR line IN lt_sorted ( line ) ).
3. 传入CL_SALV_TABLE展示
将转换后的标准表传入cl_salv_table=>factory即可正常创建SALV实例并展示:
TRY. DATA(lo_salv) = cl_salv_table=>factory( CHANGING t_table = lt_standard ). lo_salv->display( ). CATCH cx_salv_msg INTO DATA(lo_exc). MESSAGE lo_exc->get_text( ) TYPE 'E'. ENDTRY.
关键说明
- 内存复制方式完全支持STRING、XSTRING等复杂字段类型,无需担心SQL转换的限制;
- 若原非标准表数据量较大,直接赋值的性能与循环赋值相当,ABAP运行时会自动优化内存操作,无需额外性能顾虑。
内容的提问来源于stack exchange,提问作者Radinator
相关产品推荐
相关产品推荐

