前言
有些需求会对其ALV特殊的数据进行标注(颜色展示),这样更有利于区分特殊的数据,视觉效果比较好,下面小例子来介绍ALV展示行、列、单元格颜色的实现方法。
一、介绍
1.ALV列颜色:
1.1.列颜色主要由FIELDCAT来进行颜色分配。
如:fieldname = 'CARRID' emphasize = 'C510'
" 字段名称为'CARRID'
" C->color 5->颜色7个标准颜色 1->反转颜色开启 0->增强颜色关闭
2.ALV行颜色:
2.1.在ALV展示数据的内表中,添加一个char型4位的字段(CLR),用来记录颜色代码;
2.2.GS_LAYOUT-INFO_FNAME = 'CLR'. "行颜色设置
2.3.最后循环ALV数据内表给对应的行CLR赋值颜色代码
3.ALV单元格颜色:
3.1单元格颜色跟单元格可编辑很像;
3.2在ALV展示数据的内表中,添加cell_color 类型为lvc_t_scol ,用来记录颜色代码,需要设置,颜色的字段名(单元格颜色结构赋值、FNAME、COLOR-COL、COLOR-INT、COLOR-INV)放入对应的cell_color 中;
3.3.GS_LAYOUT-CTAB_FNAME = 'CELL_COLOR'。
二、使用步骤
1.代码
代码如下(示例):
*&---------------------------------------------------------------------*
*& 程 序 名:YTEST_001
*& 程序描述:ABAP ALV行、列、单元格颜色
*& 创 建 者:小涵
*& 创建日期:2023/08/04
*&---------------------------------------------------------------------*
*& 版本 修改者(公司) 日期 修改描述
*& 1.0.0 XXXX YYYYMMDD 创建程序
*&---------------------------------------------------------------------*
REPORT ytest_001.
*&---------------------------------------------------------------------*
* TYPES
*&---------------------------------------------------------------------*
TABLES:sflight.
TYPES:
BEGIN OF ty_alv,
carrid TYPE sflight-carrid, " 航线代码
fldate TYPE sflight-fldate, " 航班日期
price TYPE sflight-price, " 航空运费
planetype TYPE sflight-planetype, " 飞机类型
paymentsum TYPE sflight-paymentsum, " 当前预定总数
cell_color TYPE lvc_t_scol, " 单元格颜色
clr TYPE char4, " 列颜色:颜色代码分配用
END OF ty_alv,
tt_alv TYPE STANDARD TABLE OF ty_alv.
*&---------------------------------------------------------------------*
* CONSTANTS
*&---------------------------------------------------------------------*
CONSTANTS:
BEGIN OF c_ucomm,
action01 TYPE sy-ucomm VALUE '&ZALL',text01 TYPE text VALUE '全选 ',
action02 TYPE sy-ucomm VALUE '&ZSAL',text02 TYPE text VALUE '取消全选',
END OF c_ucomm,
BEGIN OF c_fcat,
name01 TYPE fieldname VALUE 'CARRID ',text01 TYPE fieldtext VALUE '航线代码',
name02 TYPE fieldname VALUE 'FLDATE ',text02 TYPE fieldtext VALUE '航班日期',
name03 TYPE fieldname VALUE 'PRICE ',text03 TYPE fieldtext VALUE '航空运费',
name04 TYPE fieldname VALUE 'PLANETYPE ',text04 TYPE fieldtext VALUE '飞机类型',
name05 TYPE fieldname VALUE 'PAYMENTSUM ',text05 TYPE fieldtext VALUE '当前预定总数',
END OF c_fcat.
*&---------------------------------------------------------------------*
* DEFIEN ALV
*&---------------------------------------------------------------------*
DATA:go_container TYPE REF TO cl_gui_docking_container,
go_grid TYPE REF TO cl_gui_alv_grid,
gt_exclude TYPE ui_functions,
gt_fieldcat TYPE lvc_t_fcat,
gs_layout TYPE lvc_s_layo,
gs_variant TYPE disvariant,
gv_save,
ok_code TYPE sy-ucomm,
save_code TYPE sy-ucomm.
*&---------------------------------------------------------------------*
* GLOBAL INTERNAL TABLES
*&---------------------------------------------------------------------*
DATA:
gt_out TYPE tt_alv.
*&---------------------------------------------------------------------*
* GLOBAL MACROS
*&---------------------------------------------------------------------*
DEFINE macro_fcat.
ls_fieldcat-fieldname = &1.
ls_fieldcat-reptext = &2.
APPEND ls_fieldcat TO ct_fieldcat.
CLEAR ls_fieldcat.
END-OF-DEFINITION.
*&---------------------------------------------------------------------*
* SELECTION-SCREEN
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS:
s_carrid FOR sflight-carrid.
SELECTION-SCREEN END OF BLOCK b01.
*&----------------------------------------------------------------------
*& INITIALIZATION.
*&----------------------------------------------------------------------
INITIALIZATION.
* 初始化
PERFORM frm_initial_data.
*&----------------------------------------------------------------------
*& AT SELECTION-SCREEN OUTPUT
*&----------------------------------------------------------------------
AT SELECTION-SCREEN OUTPUT.
*&----------------------------------------------------------------------
*& AT SELECTION-SCREEN
*&----------------------------------------------------------------------
AT SELECTION-SCREEN.
*&----------------------------------------------------------------------
*& START-OF-SELECTION
*&----------------------------------------------------------------------
START-OF-SELECTION.
* 数据处理
PERFORM frm_get_data.
PERFORM frm_show_alv.
*&---------------------------------------------------------------------*
*& Form FRM_INITIAL_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_initial_data .
CLEAR gt_out.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_data .
SELECT *
FROM sflight
WHERE carrid IN @s_carrid
INTO CORRESPONDING FIELDS OF TABLE @gt_out
UP TO 20 ROWS.
LOOP AT gt_out ASSIGNING FIELD-SYMBOL(<fs_alv>).
* 行颜色 红色
IF <fs_alv>-fldate = '20230925'.
<fs_alv>-clr = 'C610'.
ENDIF.
* 单元格颜色
IF <fs_alv>-fldate = '20230725'.
"航班日期为20230725的单元格变成黄色。
APPEND INITIAL LINE TO <fs_alv>-cell_color ASSIGNING FIELD-SYMBOL(<fs_color>).
<fs_color>-fname = 'FLDATE'.
<fs_color>-color-col = 3.
<fs_color>-color-int = 1.
<fs_color>-color-inv = 0.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SHOW_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_show_alv .
CALL SCREEN 9000.
ENDFORM.
*&---------------------------------------------------------------------*
*& Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9000 OUTPUT.
DATA:lv_title TYPE string.
CLEAR lv_title.
lv_title = 'ABAP ALV行、列、单元格颜色'.
SET PF-STATUS '9000'. " 定义gui状态
SET TITLEBAR '9000' WITH lv_title. " 定义gui标题
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module ALV_DES OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE alv_des OUTPUT.
DATA:lt_sort TYPE lvc_t_sort.
IF go_grid IS INITIAL .
CREATE OBJECT go_container
EXPORTING
repid = sy-repid
dynnr = '9000'
extension = 2050
side = cl_gui_docking_container=>property_floating.
CREATE OBJECT go_grid
EXPORTING
i_parent = go_container.
* 获取字段目录
PERFORM prepare_field_catalog CHANGING gt_fieldcat .
* 获取样式
PERFORM prepare_layout CHANGING gs_layout .
* 锚定ALV变式标记
CLEAR gs_variant.
gs_variant = sy-repid.
gv_save = 'A'.
gs_variant-report = |{ sy-repid }{ sy-dynnr }|.
*-----显示ALV-------------------------------------------
PERFORM frm_alv_display USING gt_out.
ELSE .
*----------------------------刷新ALV----------------------
" 刷新ALV
PERFORM frm_refresh_alv.
ENDIF .
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form PREPARE_LAYOUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->PS_LAYOUT text
*----------------------------------------------------------------------*
FORM prepare_layout
CHANGING ps_layout TYPE lvc_s_layo.
ps_layout-cwidth_opt = 'X'. " 优化行宽度
ps_layout-zebra = 'X'. " 斑马纹
ps_layout-sel_mode = 'D'. " 选择方式
ps_layout-box_fname = 'SEL'. " 指定行选择字段
gs_layout-info_fname = 'CLR'. " 行颜色设置
gs_layout-ctab_fname = 'CELL_COLOR'. " 单元格颜色设置
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV_DISPLAY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> GT_OUT
*&---------------------------------------------------------------------*
FORM frm_alv_display
USING pt_table.
CALL METHOD go_grid->set_table_for_first_display
EXPORTING
is_layout = gs_layout
it_toolbar_excluding = gt_exclude
is_variant = gs_variant
i_save = gv_save
CHANGING
it_outtab = pt_table
it_fieldcatalog = gt_fieldcat.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_REFRESH_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_refresh_alv .
DATA:ls_stable TYPE lvc_s_stbl.
"刷新ALV
ls_stable-row = 'X'.
ls_stable-col = 'X'.
CALL METHOD go_grid->refresh_table_display
EXPORTING
is_stable = ls_stable.
ENDFORM.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
save_code = ok_code.
CLEAR ok_code.
CASE save_code.
* 定义返回按钮
WHEN 'BACK'.
LEAVE TO SCREEN 0.
WHEN 'EXIT' OR 'EXIT2'.
LEAVE PROGRAM.
WHEN 'SAVE'.
WHEN OTHERS.
CALL METHOD go_grid->set_function_code
CHANGING
c_ucomm = save_code.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form PREPARE_FIELD_CATALOG
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- GT_FIELDCAT
*&---------------------------------------------------------------------*
FORM prepare_field_catalog
CHANGING ct_fieldcat TYPE lvc_t_fcat.
DATA:
ls_fieldcat TYPE lvc_s_fcat.
macro_fcat:
c_fcat-name01 c_fcat-text01,
c_fcat-name02 c_fcat-text02,
c_fcat-name03 c_fcat-text03,
c_fcat-name04 c_fcat-text04.
* 列颜色->航线代码列 绿色
LOOP AT ct_fieldcat ASSIGNING FIELD-SYMBOL(<fs_fieldcat>).
IF <fs_fieldcat>-fieldname = 'CARRID'.
<fs_fieldcat>-emphasize = 'C510'.
ENDIF.
ENDLOOP.
ENDFORM.
2.效果如下
总结
这个技巧其实很简单,理解具体的实现方法就很Nice!