原创 无峰 [ ABAP 技巧与实战 ](javascript:void\(0\);)
**点击蓝字** 关注我们
一
前言
前一篇文章介绍行表转列表的实现方式.
> 详见链接 无峰,公众号:ABAP 技巧与实战 [ ABAP基础知识 行表与列表的转换
> ](http://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247486243&idx=1&sn=ff39c4e06d9776ff3f7cd9dc0755d164&chksm=cf5dd615f82a5f03d8e37ee2f6cae503102f393e957ded84083f48707cfc34585868e0594a82#rd)
文末提到会可以把转换过程封装到一个通用方法中, 这样不必每次都写转换逻辑去执行转换.
**本文介绍一个行表转列表的封装类**
**
**
二
关键要素
行表转列表时需要确定如下因素
• 列表保留的关键字:一个或多个.
• 要转入列的字段: 一个或多个
• 要转入的指标: 一个或多个
三
处理逻辑
• 循环行表,获取转列的字段内容,并补充序号
• 通过转列的字段内容及序号动态创建列表
• 循环行表
• 按关键字读取列表(哈希表):如果未读取到,新增一条记录
• 根据关键,转列字段内容及指标识别出对应的列表字段.
• 累计列表中的值
**在上述处理逻辑中通过动态语法根据传入的关键要素生成目标内表并填充内容**
四
测试
封装类使用程序ZTS_COL_TO_LINE_N执行测试.执行结果调用
CL_DEMO_OUTPUT和ALV输出
_**01** _
**测试数据结构**
创建一个结构(为了便于后续与ALV的整合,封装类方法中使用了ALV的字段属性内表LVC_T_FCAT,创建结构的目的在于快速通过函数LVC_FIELDCATALOG_MERGE获取该内表
_**02** _
**测试数据说明**
为了验证效果. 数量,金额都有一定的规律. 方便快速核对结果
_**03** _
**关键要素赋值**
准备行表转列表的要素
• K 关键字(允许多个字段)
• C 转成列表的字段(允许多个字段)
• M 指标字段(允许多个字段)
_**04** _
**方法调用**
定义方法返回的内表,调用方法获取动态内表 及该动态内表的字段集lt_fcat_x
• 参数 **IV_TEXT_S** 用于控制动态字段集LT_FCAT_X中的动态字段的描述获取方式
• 'A' 字段值 指标字段描述+转列的字段值,多个转列字段则使用联合值
• 'B' 字段序号 指标字段描述+字段序号
• 'C' 字段值描述 指标字段描述+转列的字段值的码表描述. (需要码表框架支持,详见链接)
• 参数 **I** **T_FCAT** 传入原内表的字段集
• 参数 **I** **T_LINE_N** 传入原内表
• 参数 **I** **T_FD** 传入转换关键要素
• 返回参数 **E** **T_FCAT_X** 获取转换后的内表字段集
• 返回参数 **ER**_DATA_X** ** 获取转换后的内表数据对象
> 码表框架 无峰,公众号:ABAP 技巧与实战 [ SAP开发框架系列之 码表框架
> ](http://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247485048&idx=1&sn=76518aafb6203e7e88a21fa7775c6375&chksm=cf5ddb4ef82a5258b668deae7cb3eac48564369f66f851da68d6247f1db7767126065cf7e480#rd)
_**05** _
**结果ALV输出**
使用方法返回的内表和内表字段集直接调用函数
REUSE_ALV_GRID_DISPLAY_LVC
输出ALV清单
_**06** _
**结果验证**
内表直接输出及ALV输出
五
关于类源代码
行表转列表的通用方法实现比较简单. 建议通过本文提供的逻辑自行开发实现.
如果你对这个工具感兴趣或者想通过源代码了解实现方式.可以打赏文章后, 联系微信号392077索取源代码.
六
测试程序源代码
*&---------------------------------------------------------------------**& Report ZTS_COL_TO_LINE_N*&---------------------------------------------------------------------**&*&---------------------------------------------------------------------*REPORT zts_col_to_line_n.*调用类方法行表专列表DATA: lt_fcat TYPE lvc_t_fcat, lt_fd TYPE zsline_to_col_fields_tab.DATA: lt_line_n LIKE TABLE OF zsline_to_col_demo.lt_line_n = VALUE #(( name = '张三' cat = '电视' nf = '2020' sl = 10 je = 50 )( name = '张三' cat = '手机' nf = '2020' sl = 20 je = 100 )( name = '张三' cat = '冰箱' nf = '2020' sl = 30 je = 150 )( name = '李四' cat = '电视' nf = '2020' sl = 40 je = 200 )( name = '李四' cat = '电视' nf = '2020' sl = 5 je = 25 )( name = '李四' cat = '手机' nf = '2020' sl = 50 je = 250 )( name = '王五' cat = '冰箱' nf = '2020' sl = 60 je = 300 )
( name = '张三' cat = '电视' nf = '2021' sl = 110 je = 550 )( name = '张三' cat = '手机' nf = '2021' sl = 120 je = 600 )( name = '张三' cat = '冰箱' nf = '2021' sl = 130 je = 650 )( name = '李四' cat = '电视' nf = '2021' sl = 140 je = 700 )( name = '李四' cat = '电视' nf = '2021' sl = 15 je = 75 )( name = '李四' cat = '手机' nf = '2021' sl = 150 je = 750 )( name = '王五' cat = '冰箱' nf = '2021' sl = 160 je = 800 )).FIELD-SYMBOLS <fs_data_x> TYPE ANY TABLE.*赋值行转列所需的字段lt_fd = VALUE #( ( lc_func = 'K' lc_field = 'NAME' ) ( lc_func = 'C' lc_field = 'CAT' ) ( lc_func = 'C' lc_field = 'NF' ) ( lc_func = 'M' lc_field = 'SL' ) ( lc_func = 'M' lc_field = 'JE' ) ).*获取字段信息CALL FUNCTION 'LVC_FIELDCATALOG_MERGE' EXPORTING i_structure_name = 'ZSLINE_TO_COL_DEMO' CHANGING ct_fieldcat = lt_fcat EXCEPTIONS inconsistent_interface = 1 program_error = 2 OTHERS = 3.*调用通用方法转换成列表DATA: lt_fcat_x TYPE lvc_t_fcat.DATA: lrt_data_x TYPE REF TO data.FIELD-SYMBOLS <lt_data_x> TYPE STANDARD TABLE.CALL METHOD zcl_rep_comm_line_col=>convert_line_to_col EXPORTING it_fcat = lt_fcat it_data = lt_line_n it_fd = lt_fd iv_text_s = 'A' "'A' 字段值 'B' 字段序号 'C' 字段值描述 IMPORTING et_fcat_x = lt_fcat_x er_data_x = lrt_data_x.ASSIGN lrt_data_x->* TO <lt_data_x>.*显示转换后的列表CALL METHOD cl_demo_output=>write( <lt_data_x> ).CALL METHOD cl_demo_output=>display( ).
PERFORM frm_alv_data.*&---------------------------------------------------------------------**& Form FRM_ALV_DATA*&---------------------------------------------------------------------**& text*&---------------------------------------------------------------------**& --> p1 text*& <-- p2 text*&---------------------------------------------------------------------*FORM frm_alv_data . DATA: lv_repid LIKE sy-repid, lv_title TYPE lvc_title. DATA: g_layout TYPE lvc_s_layo. g_layout-cwidth_opt = 'X'.
lv_repid = sy-repid. lv_title = '显示转换后的列表'. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = lv_repid i_grid_title = lv_title is_layout_lvc = g_layout* i_structure_name = 'ZTBAPI_ERROR' it_fieldcat_lvc = lt_fcat_x TABLES t_outtab = <lt_data_x>.
ENDFORM.七
总结
应用这个类方法可以方便的获取转换后的内表及转换后的内表的字段集.用于后续处理或ALV输出.
后续考虑继续封装功能,在原数据ALV显示界面添加功能,根据选中的行与列,转换成列表后显示.
** THE **
** END **
**约定**
如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.
( **如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程.
越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.** )
**公众号 : syjf1976_abap**
**ABAP开发技巧**
**微信号 : 392077**
**公众号主群加入受限, 请扫码加入副群后,向管理员申请加入主群**