ABAP ALV行、列、单元格颜色

本文介绍了如何在ABAP开发中使用ALV(AdvancedListViewer)为特定数据分配颜色,包括列颜色、行颜色和单元格颜色的设置方法,通过示例代码演示了如何在ALV表格中实现颜色区分功能。


前言

有些需求会对其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!

<think>我们正在处理一个关于ABAP ALV设置单元格颜色的问题。根据用户提供的引用和问题,我们需要总结出设置单元格颜色的方法。 根据引用[2]和[3],设置单元格颜色通常需要以下步骤: 1. 在显示ALV的内表结构中添加一个类型为`LVC_T_SCOL`的字段(通常命名为`CELLCOLOR`或`COLOR`)用于存储单元格颜色信息。 2. 在循环内表时,为需要设置颜色单元格创建颜色结构(类型为`LVC_S_SCOL`),并填充颜色代码(颜色代码由三位组成:COL(颜色代码,1-7),INT(增强颜色,0或1),INV(反转颜色,0或1))。 同时指定要设置颜色的字段名(`FNAME`)。 3. 将颜色结构添加到内表颜色字段(即`CELLCOLOR`或`COLOR`)中(这是一个内表,因为一可能有多个单元格设置颜色)。 4. 在ALV布局中,通过`I_LAYOUT-CELLTAB_FIELDNAME`(或`ctab_fieldname`)指定内表中颜色字段的名称。 另外,引用[4]提到,设置颜色是通过在数据内表中添加一个4位CHAR类型的字段(例如`COLOR`),然后在布局中指定`INFO_FIELDNAME`(或`info_fname`)为该字段名。但是注意,颜色单元格颜色是不同的,颜色是整一个颜色,而单元格颜色可以分别设置。 用户问题明确要求设置单元格颜色,所以我们重点在单元格颜色。 步骤详细说明: 1. 定义内表结构,添加颜色字段: 例如: TYPES: BEGIN OF ty_data, matnr TYPE matnr, " 物料 werks TYPE werks_d, " 工厂 labst TYPE labst, " 库存 " ... 其他字段 cellcolor TYPE lvc_t_scol, " 单元格颜色表 END OF ty_data. 2 在循环内表时,为特定单元格添加颜色: LOOP AT gt_data ASSIGNING <fs_data>. IF <fs_data>-labst = 0. " 例如库存为0时,设置物料字段为红色 DATA(ls_color) = VALUE lvc_s_scol( fname = 'MATNR' " 要设置颜色的字段名 color-col = '6' " 红色,颜色代码:1-7,具体查色卡 color-int = 1 " 增强显示 color-inv = 0 " 不反转 nokeycol = 'X' " 忽略关键颜色(可选) ). APPEND ls_color TO <fs_data>-cellcolor. ENDIF. ENDLOOP. 3 在ALV布局设置中指定单元格颜色字段: DATA: gs_layout TYPE lvc_s_layo. gs_layout-ctab_fname = 'CELLCOLOR'. " 这里填写内表中颜色字段的名称 4 调用ALV显示函数时传入布局。 注意:颜色代码通常使用1到7,具体颜色可能因主题而异,常见的如: 1:灰色,2:蓝色,3:黄色,4:粉红色,5:绿色,6:红色,7:橙色。 另外,引用[3]中有一个例子,设置周转天数字段为红色,当满足条件时。 根据以上步骤,我们可以编写一个示例代码。 下面提供一个完整的示例程序框架:</think>### ABAP ALV 设置单元格颜色的方法 在 ABAP ALV 中设置单元格颜色需要以下步骤: #### 1. **数据结构准备** 在显示 ALV 的内表中添加颜色字段,类型为 `LVC_T_SCOL`(存储单元格颜色表): ```abap TYPES: BEGIN OF ty_data, matnr TYPE matnr, " 物料号 werks TYPE werks_d, " 工厂 labst TYPE labst, " 库存数量 color TYPE lvc_t_scol, " 单元格颜色表(关键字段) END OF ty_data. DATA: gt_data TYPE TABLE OF ty_data. ``` #### 2. **设置颜色逻辑** 在数据处理循环中,通过条件判断为单元格添加颜色: ```abap LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<fs_data>). IF <fs_data>-labst = 0. " 库存为0时设置颜色 DATA(ls_color) = VALUE lvc_s_scol( fname = 'LABST' " 目标字段名 color-col = '6' " 颜色代码(6=红色) color-int = '1' " 增强显示(1=开启) color-inv = '0' " 不反转颜色 ). APPEND ls_color TO <fs_data>-color. " 添加到颜色表 ENDIF. ENDLOOP. ``` #### 3. **ALV 布局配置** 在布局参数中指定颜色字段名: ```abap DATA(gs_layout) = VALUE lvc_s_layo( ctab_fname = 'COLOR' " 指向内表的颜色字段 zebra = 'X' " 启用斑马纹 col_opt = 'X' " 自动优化宽 ). ``` #### 4. **ALV 输出** 调用 ALV 函数时传入布局和字段目录: ```abap CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = sy-repid is_layout_lvc = gs_layout it_fieldcat_lvc = gt_fieldcat " 需提前构建字段目录 TABLES t_outtab = gt_data. ``` #### 📌 关键说明 1. **颜色代码**: - `COL`:基础色值(1=灰, 2=蓝, 3=黄, 4=粉, 5=绿, **6=红**, 7=橙) - `INT=1`:启用高亮增强 - `INV=0`:禁用颜色反转 2. **多单元格控制**: 同一可向 `COLOR` 字段追加多条记录,实现多单元格染色: ```abap APPEND VALUE #( fname='MATNR' color-col=5 ) TO <fs_data>-color. " 物料号绿色 APPEND VALUE #( fname='WERKS' color-col=3 ) TO <fs_data>-color. " 工厂黄色 ``` 3. **字段名一致性**: `FNAME` 必须匹配字段目录中的字段名(区分大小写)[^2][^3]。 #### 效果示例 | 物料号 | 工厂 | 库存 | |--------|------|------| | M001 | 1001 | <span style="color:red">**0**</span> | <!-- 库存为0时红色 --> | M002 | 1002 | 150 | --- ### 相关问题 1. 如何设置整背景色(非单元格)? 2. ALV 颜色代码与标准色卡的对应关系是什么? 3. 能否根据动态条件(如用户输入)改变单元格颜色? 4. 如何清除已设置的 ALV 单元格颜色? [^1]: SAP ALV 颜色控制包含单元格三个层级,需使用不同字段存储颜色信息。 [^2]: 单元格颜色必须通过类型 `LVC_T_SCOL` 的内表字段存储,布局中需用 `CTAB_FNAME` 绑定该字段。 [^3]: 颜色结构 `LVC_S_SCOL` 中的 `FNAME` 需严格匹配目标字段名,否则染色无效。 [^4]: 颜色控制使用 `INFO_FNAME` + 4 位 CHAR 字段,与单元格染色机制不同。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值