原创 无峰 [ ABAP 技巧与实战 ](javascript:void\(0\);)
**点击蓝字** 关注我们
一
前言
关于行表转列表的介绍,参考如下链接
> 详见链接 无峰,公众号:ABAP 技巧与实战 [ SAP工具箱 行表转列表的通用类
> ](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247486253&idx=1&sn=c722838d31527354a4176980123ed3c2&chksm=cf5dd61bf82a5f0d0844a3833dcdc1b274fc053481f32eaac88654c3f4ad6b3a8f8c16c3ecc1&token=1049564527&lang=zh_CN#rd)
**本文主要介绍行表转列表时,保持单元格的颜色及编辑状态**
二
示例程序
示例程序名: ZTS_COL_TO_LINE_EDIT_COL
源代码附在文末
_**01** _
**内表定义**
_**02** _
**内表内容**
构造内表内容,及单元格的编辑状态/颜色
_**03** _
**行表呈现**
行表ALV呈现(部分单元格可编辑,数量字段有不同的颜色),使用了单元格的颜色设置及编辑状态设置
详情可参考标准示例程序
• BCALV_TEST_COLORS 单元格颜色
• BCALV_EDIT_02 单元格可标记状态
_**04** _
**转换列表**
调用类ZCL_REP_COMM_LINE_COL
方法CONVERT_LINE_TO_COL
转换成列表
_**05** _
**列表呈现**
列表显示的ALV(保留了行表显示时的颜色及编辑状态)
三
处理原理
行表转列表的类ZCL_REP_COMM_LINE_COL 方法 CONVERT_LINE_TO_COL 中补充了参数,
用来传递内表中记录颜色/编辑状态的字段(通过表类型LVC_T_SCOL / LVC_T_STYL 定义)
在类的处理中,根据行专列的规则,在新建的动态内表中同样补充这两个字段,并且按照行转列的规则,调整这两个内表中的内容.
原理说起来挺简单,实际调整时还是很费事的. 因为要用动态语法支持所有传入的内表,很多细节逻辑都需要反复验证.
四
待补充逻辑
因为只改进了方法 CONVERT_LINE_TO_COL . 另外的通用方法尚未调整. 这个会影响整合在ALV 中的通用行专列按钮.
通过该按钮转换的列表没有携带源ALV的颜色及编辑状态信息
• CONVERT_LINE_TO_COL_FULL_ALV全屏ALV清单行表转为列表
• CONVERT_LINE_TO_COL_ALV对象ALV清单行表转为列表
五
总结
通用行转列的类基本解决了行表转列表的所有需求
• 字段命名
• 关键字段
• 附加字段
• 汇总字段
• 行选中标记
• 单元格颜色
• 单元格编辑状态
• 列表修改的内容回写行表
• ......
具体可以参考如下链接了解更多的行专列的信息
> 详见链接 无峰,公众号:ABAP 技巧与实战 [ ABAP基础知识 行表与列表的转换
> ](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247486243&idx=1&sn=ff39c4e06d9776ff3f7cd9dc0755d164&chksm=cf5dd615f82a5f03d8e37ee2f6cae503102f393e957ded84083f48707cfc34585868e0594a82&token=1049564527&lang=zh_CN#rd)
六
示例程序代码
*&---------------------------------------------------------------------**& Report ZTS_COL_TO_LINE_N*&---------------------------------------------------------------------**&调用通用类实现行转列, 调整数量后回写到原内表.如果无需回写,可以去掉和ALV事件相关的代码*&---------------------------------------------------------------------*REPORT zts_col_to_line_edit_col.PARAMETERS: p_line RADIOBUTTON GROUP ra1, "行表显示 p_col RADIOBUTTON GROUP ra1. "列表显示PARAMETERS: p_width TYPE i DEFAULT 20.DATA: gc_grid TYPE REF TO cl_gui_alv_grid.DATA: gt_modi TYPE lvc_t_modi.
DATA: gt_fcat TYPE lvc_t_fcat, gt_fd TYPE zsline_to_col_fields_tab.DATA: gt_line_n TYPE TABLE OF zsline_to_col_demo_edit_col.
DATA: gt_fcat_x TYPE lvc_t_fcat.DATA: grt_data_x TYPE REF TO data.DATA: grt_data_xl TYPE REF TO data, grw_data_key TYPE REF TO data.DATA: gt_rel TYPE zsline_to_col_rel_tab.DATA: gt_fd_rel TYPE zsline_to_col_field_rel_tab.FIELD-SYMBOLS: <gt_data_x> TYPE STANDARD TABLE, <gt_data_xl> TYPE HASHED TABLE, <lw_key> TYPE any.
CLASS lcl_event_receiver DEFINITION. PUBLIC SECTION. METHODS handle_modify FOR EVENT data_changed_finished OF cl_gui_alv_grid IMPORTING e_modified et_good_cells.ENDCLASS. "LCL_EVENT_RECEIVER DEFINITIONDATA gc_event_receiver TYPE REF TO lcl_event_receiver .
CLASS lcl_event_receiver IMPLEMENTATION. METHOD handle_modify. APPEND LINES OF et_good_cells TO gt_modi. "记录发生过修改的单元格.
ENDMETHOD. "HANDLE_MODIFYENDCLASS. "LCL_EVENT_RECEIVER IMPLEMENTATIONSTART-OF-SELECTION. PERFORM frm_get_data.*调用类方法行表专列表 CASE 'X'. WHEN p_line. PERFORM frm_line_disp.. WHEN p_col. PERFORM frm_col_disp. ENDCASE.
*&---------------------------------------------------------------------**& 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: ls_layout TYPE lvc_s_layo. ls_layout-cwidth_opt = 'X'. ls_layout-zebra = 'X'. ls_layout-edit = ''. ls_layout-edit_mode = ''. ls_layout-no_keyfix = 'X'. ls_layout-ctab_fname = 'COLTAB'. "颜色信息 ls_layout-stylefname = 'CELLTAB'. "编辑信息 ls_layout-box_fname = 'SEL'.
lv_repid = sy-repid. lv_title = '显示转换后的列表'. DATA: gt_events TYPE slis_t_event . gt_events = VALUE #( ( name = 'CALLER_EXIT' form = 'FRM_REGISTER' ) ).*如果字段存在KEY 标记, 则颜色设置失效. LOOP AT gt_fcat_x ASSIGNING FIELD-SYMBOL(<fs_x>). <fs_x>-key = ''. ENDLOOP. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = lv_repid i_grid_title = lv_title i_callback_pf_status_set = 'FRM_SET_STATUS' i_callback_user_command = 'FRM_SET_USERCOMMAND' it_events = gt_events is_layout_lvc = ls_layout* i_structure_name = 'ZTBAPI_ERROR' it_fieldcat_lvc = gt_fcat_x TABLES t_outtab = <gt_data_x>.
ENDFORM.
FORM frm_set_status USING i_extab TYPE slis_t_extab.SET PF-STATUS 'LIST'.
ENDFORM. "frm_set_status*&---------------------------------------------------------------------**& Form FRM_SET_USERCOMMAND*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** -->R_UCOMM text* -->RS_SELFIELD text*----------------------------------------------------------------------*FORM frm_set_usercommand USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield.
CASE r_ucomm. WHEN '&DATA_SAVE'. PERFORM frm_save. WHEN 'L2C'. CALL METHOD zcl_rep_comm_line_col=>convert_line_to_col_full_alv CHANGING ct_data = gt_line_n . ENDCASE.
rs_selfield-refresh = 'X'.ENDFORM. "FRM_SET_USERCOMMAND*&---------------------------------------------------------------------**& Form FRM_SAVE*&---------------------------------------------------------------------**& text*&---------------------------------------------------------------------**& --> p1 text*& <-- p2 text*&---------------------------------------------------------------------*FORM frm_save . DATA: lv_save(1). lv_save = 'X'.
* DATA: lc_grid TYPE REF TO cl_gui_alv_grid. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'* EXPORTING** IR_SALV_FULLSCREEN_ADAPTER = IMPORTING* ET_EXCLUDING =* E_REPID =* E_CALLBACK_PROGRAM =* E_CALLBACK_ROUTINE = e_grid = gc_grid* ET_FIELDCAT_LVC =* ER_TRACE =* E_FLls_NO_HTML =* ES_LAYOUT_KKBLO =* ES_SEL_HIDE =* ET_EVENT_EXIT =* ER_FORM_TOL =* ER_FORM_EOL = . "---Get data changed from ALV to internal table----------- CALL METHOD gc_grid->check_changed_data. "补充选择字段的变化 DATA: lt_rows TYPE lvc_t_row. CALL METHOD gc_grid->get_selected_rows IMPORTING et_index_rows = lt_rows* et_row_no = . "设置选择字段修改标记.同时需要清空原内表的所有选择. DATA: ls_line_n L...