SAP Grid ALV

一、Grid  ALV

DATA GT_ITAB TYPE TABLE OF SFLIGHT.
 
SELECT * FROM SFLIGHT INTO TABLE GT_ITAB up to 20 rows.
 
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
   EXPORTING
     I_STRUCTURE_NAME               = 'SFLIGHT'
    TABLES
      T_OUTTAB                       = GT_ITAB .

二、REUSE_ALV_GRID_DISPLAY_LVC 详解

REUSE_ALV_GRID_DISPLAY_LVC
参数 解释是否常用
I_INTERFACE_CHECK 接口一致性检查
 I_BYPASSING_BUFFER  是否使用缓存
I_BUFFER_ACTIVE 是否激活缓存,如果每次显示ALV都是相同的字段目录,则该字段目录会被放到一特殊的缓存里,加快显示速度。
I_CALLBACK_PROGRAM回调函数、输出内表所在的程序名
I_CALLBACK_PF_STATUS_SET回调本地FORM,设置ALV工具栏
I_CALLBACK_USER_COMMAND 回调本地FORM,设置工具栏按钮或数据行事件触发时的操作
I_CALLBACK_TOP_OF_PAGE 回调函数,设置ALV报表表头信息
I_CALLBACK_HTML_TOP_OF_PAGE回调函数,设置ALV报表表头HTML代码
I_CALLBACK_HTML_END_OF_LIST回调函数,设置ALV报表表尾HTML代码
I_STRUCTURE_NAME 字段目录结构,参考数据字典结构,需要定义结构
I_BACKGROUND_ID 设置ALV背景图片ID
 I_GRID_TITLEALV 标题,位于ALV工具栏和ALV GRID之间
I_GRID_SETTINGS GRID信息设置
IS_LAYOUT_LVC ALV输出布局样式
IT_FIELDCAT_LVC设定显示的项目名称及输出设定
IT_EXCLUDING 隐藏设置的ALV工具栏
IT_SPECIAL_GROUPS_LVC 若内表中一些字段通过SP_GROUP被分组在一起,必须为这些组传递组文本内表
IT_SORT_LVCALV排序设置,可以display前对内表数据排序
 IT_FILTER_LVC     ALV过滤设置,可以在get_data时增加过滤
IT_HYPERLINK    超链接是
IS_SEL_HIDE    替换或修改屏幕中select-option的值
I_DEFAULT 用户是否可以定义默认的布局,’X'-可以定义默认布局,Space-不可以定义默认布局 (默认:X)
I_SAVE保存表格布局:'X'-只能保存为全局标准变式,'U'-只能保存特定用户变式,'A'-都可以保存,SPACE-不能保存变式(默认:space)
IS_VARIANT  表格布局变式
IT_EVENTS设置事件, 类型为slis_t_event的内表(name:事件名称,form:事件的FORM)
IT_EVENT_EXIT 设置预置按钮回调的执行行为,表明用户所写的代码是在执行标准执行之前还是之后
IS_PRINT_LVC    打印信息否 
IS_REPREP_ID_LVC re/re接口初始化信息否 
I_SCREEN_START_COLUMN 以对话框形式显示的开始列
I_SCREEN_START_LINE  以对话框形式显示的开始行
I_SCREEN_END_COLUMN以对话框形式显示的结束列
I_SCREEN_END_LINE 以对话框形式显示的结束行
 I_HTML_HEIGHT_TOP 表头高度
 I_HTML_HEIGHT_END   表尾高度
IT_EXCEPT_QINFO_LVC  Exception的信息
T_OUTTAB   必须参数,要显示的内表

三、案例程序

声明
TYPE-POOLS:SLIS.

CONSTANTS:GC_INACTIVE TYPE ICON       VALUE '@BZ@',   " ICON_LED_INACTIVE
                       GC_RED      TYPE ICON       VALUE '@5C@',   " ICON_LED_RED
                      GC_YELLOW   TYPE ICON       VALUE '@5D@',   " ICON_LED_YELLOW
                      GC_GREEN    TYPE ICON       VALUE '@5B@'.   " ICON_LED_GREEN
定义
ALV展示结构定义
TYPES: BEGIN OF TY_SBOOK,
         MANDT        LIKE SBOOK-MANDT,
         CARRID       LIKE SBOOK-CARRID,
         CONNID       LIKE SBOOK-CONNID,
         FLDATE       LIKE SBOOK-FLDATE,
         BOOKID       LIKE SBOOK-BOOKID,
         LUGGWEIGHT   LIKE SBOOK-LUGGWEIGHT,
         WUNIT        LIKE SBOOK-WUNIT,
         CLASS        LIKE SBOOK-CLASS,
         LOCCURAM     LIKE SBOOK-LOCCURAM,
         LOCCURKEY    LIKE SBOOK-LOCCURKEY,
         ORDER_DATE   LIKE SBOOK-ORDER_DATE,
         COUNTER      LIKE SBOOK-COUNTER,
         CANCELLED    LIKE SBOOK-CANCELLED,         " 复选框(编辑状态下显示复选框,需设置 Fieldcat-Checkbox)
         PASSNAME     LIKE SBOOK-PASSNAME,
         PASSBIRTH    LIKE SBOOK-PASSBIRTH,
         SEX(1),                                   " 展示下拉框
         SEL          TYPE XFLAG,                   " 选择框(设置 Layout-box_fname,无需设置 Fieldcat)
         ICON         TYPE ICON_D,                  " 图标(无需设置,直接显示成图标),也可以定义为:icon(4)
         ICONNAME     TYPE ICONNAME,                " 图标名称演示(文本值,具体可以参考数据字典ICON表)
         ICONINAME    TYPE ICON_INT,                " 图标内部名称(无需设置,直接显示成图标),也可以定义为:iconiname(8)
         EXCP(1),                                  " 交通灯图标(需设置 Layout-excp_fname,才能显示图标)
         ROWCOLOR(4),                              " 行颜色,设置 layout-info_fname 后,不显示该字段值
         RCLRVALUE(4),                             " 行颜色值演示,另外定义一个,用于显示值
         COLORTAB     TYPE LVC_T_SCOL,              " 单元格颜色
         STYLETAB     TYPE LVC_T_STYL,              " 单元格样式,如单元格编辑、按钮等
       END OF TY_SBOOK,

       TT_SBOOK TYPE TABLE OF TY_SBOOK.
       
DATA: GT_SBOOK      TYPE TT_SBOOK WITH HEADER LINE.
ALV结构和表单控制相关定义
DATA: GT_COLORTAB TYPE LVC_T_SCOL WITH HEADER LINE,         " 单元格颜色
      GT_STYLETAB TYPE LVC_T_STYL WITH HEADER LINE.         " 单元格编辑

DATA: GT_FIELDCAT   TYPE LVC_T_FCAT WITH HEADER LINE,         " 字段目录
      GS_LAYOUT     TYPE LVC_S_LAYO,                          " 表格布局
      GT_SORT       TYPE LVC_T_SORT WITH HEADER LINE,         " 排序&分类汇总
      GT_EVENT_EXIT TYPE SLIS_T_EVENT_EXIT WITH HEADER LINE,  " 预置按钮出口
      GT_EXCLUDE    TYPE SLIS_T_EXTAB WITH HEADER LINE,       " 排除标准工具栏按钮
      GT_EVENT      TYPE SLIS_T_EVENT WITH HEADER LINE,       " ALV事件
      GS_SETTING    TYPE LVC_S_GLAY,                          " 表格设置
      GS_PRINT      TYPE LVC_S_PRNT.                          " 打印设置

DATA: GT_DROPDOWN TYPE LVC_T_DROP,                            " 下拉框项,按Handle分组,对应Fieldcat-DRDN_HNDL
      GS_DROPDOWN TYPE LVC_S_DROP.
ALV选择屏幕
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-B01. " 基本设置
  PARAMETERS: P_SEL,                                " 选择模式:A、B、C、D
              P_TITLE AS CHECKBOX,                  " 显示ALV标题
              P_TEXT  TYPE STRING DEFAULT 'ALV标题'. " 自定义ALV标题
  PARAMETERS: P_EDIT AS CHECKBOX,                   " 显示编辑模式
              P_ICON AS CHECKBOX.                   " 显示图标
SELECTION-SCREEN END OF BLOCK B1.

SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-B02. " 样式设置
  PARAMETERS: P_EXCP  AS CHECKBOX.                  " 显示交通灯
  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN POSITION 3.
    PARAMETERS: P_LIGHT RADIOBUTTON GROUP 1.
    SELECTION-SCREEN COMMENT 5(10) TEXT-S01.          " 交通灯样式
    SELECTION-SCREEN POSITION 18.
    PARAMETERS: P_LED RADIOBUTTON GROUP 1.
    SELECTION-SCREEN COMMENT 20(10) TEXT-S02.         " LED样式
  SELECTION-SCREEN END OF LINE.

  PARAMETERS: P_COLOR AS CHECKBOX.                  " 显示颜色
  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN POSITION 3.
    PARAMETERS: P_COL RADIOBUTTON GROUP 2.
    SELECTION-SCREEN COMMENT 5(10) TEXT-S03.          " 列颜色
    SELECTION-SCREEN POSITION 18.
    PARAMETERS: P_ROW RADIOBUTTON GROUP 2.
    SELECTION-SCREEN COMMENT 20(10) TEXT-S04.         " 行颜色
    SELECTION-SCREEN POSITION 33.
    PARAMETERS: P_CELL RADIOBUTTON GROUP 2.
    SELECTION-SCREEN COMMENT 35(10) TEXT-S05.         " 单元格颜色
    SELECTION-SCREEN POSITION 48.
    PARAMETERS: P_ALL RADIOBUTTON GROUP 2.
    SELECTION-SCREEN COMMENT 50(10) TEXT-S06.         " 所有颜色
  SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK B2.

SELECTION-SCREEN BEGIN OF BLOCK B3 WITH FRAME TITLE TEXT-B03. " 其他设置
  PARAMETERS: P_SORT AS CHECKBOX.
  PARAMETERS: P_EX AS CHECKBOX.     " 显示所有工具栏按钮
  PARAMETERS: P_TT AS CHECKBOX.     " 显示表头表尾
  PARAMETERS: P_HEIGHT TYPE I DEFAULT 10.
  PARAMETERS: P_DIALOG AS CHECKBOX. " 以对话框显示
SELECTION-SCREEN END OF BLOCK B3.
事件
INITIALIZATION.

START-OF-SELECTION.
  PERFORM FRM_GET_DATA.
  PERFORM FRM_HANDLE_DATA.

END-OF-SELECTION.
  PERFORM FRM_BUILD_LAYOUT.
  PERFORM FRM_BUILD_FIELDCAT.
  PERFORM FRM_BUILD_OTHERS.
  PERFORM FRM_SHOW_ALV.
数据获取
*&---------------------------------------------------------------------*
*&      Form  frm_get_data
*&---------------------------------------------------------------------*
*       ALV数据获取
*----------------------------------------------------------------------*
FORM FRM_GET_DATA.
  SELECT * FROM SBOOK
  INTO CORRESPONDING FIELDS OF TABLE GT_SBOOK
  UP TO 40 ROWS.
ENDFORM.                    "get_data
数据处理
*&---------------------------------------------------------------------*
*&      Form  frm_handle_data
*&---------------------------------------------------------------------*
*       ALV数据处理
*----------------------------------------------------------------------*
FORM FRM_HANDLE_DATA.
  FIELD-SYMBOLS:<FS_SBOOK> LIKE LINE OF GT_SBOOK.
  DATA: LV_INDEX TYPE I, LV_MOD TYPE I.

  LOOP AT GT_SBOOK ASSIGNING <FS_SBOOK>.
    LV_INDEX = SY-TABIX.
    LV_MOD = ( LV_INDEX - 1 ) MOD 4.

*  1、演示EXCP列:
*         0-熄灯,@EB@ ICON_LIGHT_OUT,1-红灯,@0A@  ICON_RED_LIGHT
*         2-黄灯,@09@ ICON_YELLOW_LIGHT,3-绿灯,@08@	ICON_GREEN_LIGHT
    <FS_SBOOK>-EXCP = LV_MOD.

*  2、演示ICON列:赋值 ICON-ID
    CASE <FS_SBOOK>-EXCP.
      WHEN 1.
        <FS_SBOOK>-ICON = GC_RED.           " '@5C@',   " ICON_LED_RED
      WHEN 2.
        <FS_SBOOK>-ICON = GC_YELLOW.        " '@5D@',   " ICON_LED_YELLOW
      WHEN 3.
        <FS_SBOOK>-ICON = GC_GREEN.         " '@5B@'.   " ICON_LED_GREEN
      WHEN OTHERS.
        <FS_SBOOK>-ICON = GC_INACTIVE.      " '@BZ@',   " ICON_LED_INACTIVE
    ENDCASE.
*  2+、演示ICON列:赋值 ICON-INTERNAL
    PERFORM ZFRM_ICON_GET_NAMES_BY_ID USING <FS_SBOOK>-ICON
    CHANGING <FS_SBOOK>-ICONNAME <FS_SBOOK>-ICONINAME.

*  3、演示行颜色:
    DATA: LV_COLOR TYPE STRING.
    DATA: LV_VALUE TYPE I, C1,C2,C3.
    IF LV_INDEX LT 33.
      LV_VALUE = ( LV_INDEX + 1 ) / 4 - 1.
      C1 = LV_VALUE.                          " 颜色第2位为颜色值,由0~7表示,不同的数字表示不同的颜色属性:
*         0 = background color,1 = Gray-blue,2 = Light gray,3 = yellow,
*         4 = blue-gray,5 = green,6 = red,7 = orange
      LV_VALUE = ( LV_MOD + 1 ) / 2 - 1.
      C2 = LV_VALUE.                          " 颜色第3位为是否高亮显示,由1、0(非1)表示,1表示高亮,非1表示不高亮
      LV_VALUE = LV_MOD MOD 2.
      C3 = LV_VALUE.                          " 颜色第4位为是否反转,即颜色作用在背景色(表格行)还是前景色(文字)
*                                                由1、0(非1)表示(仅当第3位为0时才生效),1-前景色,0(非1)-背景色
      CONCATENATE 'C' C1 C2 C3 INTO LV_COLOR. " 颜色定义为4位字符,首位固定为字母“C”
      CONDENSE LV_COLOR NO-GAPS.
      <FS_SBOOK>-ROWCOLOR = LV_COLOR.
      <FS_SBOOK>-RCLRVALUE = LV_COLOR.
    ENDIF.
    IF LV_INDEX EQ 33.
      <FS_SBOOK>-ROWCOLOR = 'C705'.     " 对比颜色值测试
      <FS_SBOOK>-RCLRVALUE = 'C705'.
    ELSEIF LV_INDEX EQ 34.
      <FS_SBOOK>-ROWCOLOR = 'C791'.     " 对比颜色值测试
      <FS_SBOOK>-RCLRVALUE = 'C791'.
    ENDIF.

*  4、演示单元格颜色:
*    IF lv_index GT 34.
    IF <FS_SBOOK>-LUGGWEIGHT GT 40.
      CLEAR GT_COLORTAB.
      GT_COLORTAB-FNAME = 'LUGGWEIGHT'.
      GT_COLORTAB-COLOR-COL = '6'.      " 红色高亮显示
      GT_COLORTAB-COLOR-INT = '1'.
      GT_COLORTAB-COLOR-INV = '0'.
      APPEND GT_COLORTAB.
    ENDIF.
    IF <FS_SBOOK>-COUNTER GT 0.
      CLEAR GT_COLORTAB.
      GT_COLORTAB-FNAME = 'COUNTER'.
      GT_COLORTAB-COLOR-COL = '6'.    " 红色高亮显示
      GT_COLORTAB-COLOR-INT = '1'.
      GT_COLORTAB-COLOR-INV = '0'.
      APPEND GT_COLORTAB.
    ENDIF.
*    ENDIF.
    <FS_SBOOK>-COLORTAB = GT_COLORTAB[].
    CLEAR: GT_COLORTAB, GT_COLORTAB[].

*   5、演示任意单元格编辑:价格小于800的可以编辑
*     如果是针对某列的,可以先设置该列Fieldcat-edit = 'X',开启列可编辑,然后通过样式控制不可编辑单元格;
*     如果是针对表格的,可以先设置表格Layout-edit = 'X',开启全部可编辑,然后通过样式控制不可编辑单元格;
    CLEAR GT_STYLETAB.
    GT_STYLETAB-FIELDNAME = 'LOCCURAM'.
    IF <FS_SBOOK>-LOCCURAM GE 800.
      GT_STYLETAB-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED. " 设置大于等于800的不可编辑
    ELSE.
      GT_STYLETAB-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED. " 设置小于800的可编辑
    ENDIF.
    APPEND GT_STYLETAB.
    <FS_SBOOK>-STYLETAB = GT_STYLETAB[].
    CLEAR: GT_STYLETAB, GT_STYLETAB[].

  ENDLOOP.
ENDFORM.                    "frm_handle_data
ALV显示输出参数设置
*&---------------------------------------------------------------------*
*&      Form  frm_build_layout
*&---------------------------------------------------------------------*
*       常用Layout设置演示
*----------------------------------------------------------------------*
FORM FRM_BUILD_LAYOUT.

  CLEAR GS_LAYOUT.
  GS_LAYOUT-ZEBRA = 'X'.                " 斑马线,隔行换色
*  gs_layout-edit = 'X'.                " ALV所有列可编辑
*  gs_layout-edit_mode = ' '.           " 编辑模式,用途未知
*  gs_layout-no_keyfix = 'X'.           " 关键列不固定,包括设置 FIELDCAT-KEY、FIELDCAT-FIX_COLUMN 的列

*  gs_layout-language = 'E'.            " 语言,没看到效果

*  gs_layout-smalltitle = 'X'.          " 小标题,没看到效果
*  gs_layout-no_hgridln = 'X'.          " 隐藏垂直线,即竖线
*  gs_layout-no_vgridln = 'X'.          " 隐藏水平线,即横线
*  gs_layout-no_headers = 'X'.          " 隐藏标题栏
*  gs_layout-no_merging = 'X'.          " 禁用单元格合并,即排序时相同列内容仍显示,默认显示为空白
  GS_LAYOUT-CWIDTH_OPT = 'X'.           " 所有列自动宽度(此时 Fieldcat-outputlen 失效)
*  gs_layout-totals_bef = 'X'.          " 总计、小计放在第一行
*  gs_layout-no_totarr = 'X'.           " 没看到效果:在总计一行和小计行中显示箭头,这些箭头还表示总计区域。 设置此参数以抑制这些箭头
*  gs_layout-no_totexp = 'X'.           " 没看到效果:一个图标显示在一个(子)总计的开始线表示是否已展开的行。 设置此参数以抑制此图标。
* 此处省略7个
  IF P_EDIT EQ 'X'.                     " 开启编辑会影响layout-sel_mode,ABC模式 = A模式,D模式不变
    GS_LAYOUT-STYLEFNAME = 'STYLETAB'.  " 显示样式:控制单元格可否编辑
  ENDIF.
*  gs_layout-no_rowmark = 'X'.          " 隐藏左边的选择块(当Layout-SEL_MODE = A或D,或设置了Layout-BOX_FNAME,或设置了编辑状态时,默认会有选择块)
*  gs_layout-no_toolbar = 'X'.          " 没看到效果
  GS_LAYOUT-GRID_TITLE = 'Title在哪里'. " 没看到效果
  GS_LAYOUT-SEL_MODE = P_SEL.           " 选择模式(需要去掉:layout-box_fname 和 编辑模式,才能看到效果)
  IF P_SEL IS INITIAL.
*    GS_LAYOUT-BOX_FNAME = 'SEL'.         " 一旦设置,则相当于设置了 gs_layout-SEL_MODE = 'A',其他模式失效
*                                           不管是否编辑状态,可以通过选择块状态来更新SEL字段的值
  ENDIF.
*  gs_layout-sgl_clk_hd = 'X'.          " 列标题支持单击排序
*  gs_layout-no_totline = 'X'.          " 不显示合计、小计行
  GS_LAYOUT-NUMC_TOTAL = 'X'.           " 默认情况,NUMC字段设置 FIELDCAT-DO_SUM = 'X' 是不会计算合计的,设置支持合计
*  gs_layout-no_utsplit = 'X'.          " 是否根据单位拆分总计?
  IF P_EXCP EQ 'X'.     " 是否演示图标
    GS_LAYOUT-EXCP_FNAME = 'EXCP'.      " 指定列按红绿灯显示,否则显示原始值
  ENDIF.

  IF P_EXCP EQ 'X' AND P_LED EQ 'X'.
    GS_LAYOUT-EXCP_LED = 'X'.           " 更改EXCP列的显示样式为LED
  ENDIF.
*  gs_layout-excp_group = 'X'.          " 未知?
* gs_layout-detailinit = 'X'.           " 显示明细,初始值的项也显示,即显示空值,默认不显示
  GS_LAYOUT-DETAILTITL = '明细标题'.    " 显示明细,窗口的标题
*  gs_layout-keyhot = 'X'.              " 关键列作为热点,处理事件在哪里?

*  gs_layout-s_dragdrop = ''.           " ALV拖拽,另外专题讲解
  IF P_COLOR = 'X'.     " 是否演示颜色
    IF P_ROW EQ 'X' OR P_ALL EQ 'X'.
      GS_LAYOUT-INFO_FNAME = 'ROWCOLOR'.  " 行颜色2:设定行颜色值所在的列( COLOR )
    ENDIF.
    IF P_CELL EQ 'X' OR P_ALL EQ 'X'.
      GS_LAYOUT-CTAB_FNAME = 'COLORTAB'.  " 单元格颜色3:设定单元格颜色值所在的内表(列名 FNAME +颜色值 COLOR)
    ENDIF.
  ENDIF.

ENDFORM.                    "frm_build_layout
ALV显示字段设置
*&---------------------------------------------------------------------*
*&      Form  frm_build_fieldcat
*&---------------------------------------------------------------------*
*       常用Fieldcat设置演示
*----------------------------------------------------------------------*
FORM FRM_BUILD_FIELDCAT.

  DATA: LV_FIELD TYPE STRING.
  DEFINE MAC_FIELD.
    lv_field = '&1'.
    TRANSLATE lv_field TO UPPER CASE.

*  gt_fieldcat-row_pos = ''.
*  gt_fieldcat-col_pos = ''.          " 指定显示列位置
    CLEAR gt_fieldcat.
    gt_fieldcat-fieldname = lv_field. " 内表字段名
    gt_fieldcat-reptext = '&2'.       " 字段标题(建议使用该字段,不必设置以下四个字段)
*  gt_fieldcat-scrtext_l = ''.        " 长标题
*  gt_fieldcat-scrtext_m = ''.        " 中标题
*  gt_fieldcat-scrtext_s = ''.        " 短标题
*  gt_fieldcat-tooltip = ''.          " 默认等于 reptext

*  gt_fieldcat-tabname = ''.
*  gt_fieldcat-cfieldname = 'LOCCURKEY'.
*  gt_fieldcat-quantity = ''.
*  gt_fieldcat-qfieldname = ''.
*  gt_fieldcat-ifieldname = ''.
*  gt_fieldcat-round = ''.
*  gt_fieldcat-exponent = ''.

    IF gt_fieldcat-fieldname EQ 'CARRID' OR gt_fieldcat-fieldname EQ 'CONNID'.
      gt_fieldcat-KEY = 'X'.
      gt_fieldcat-just = 'C'.           " 单元格中内容显示时对齐方式:(R)ight (L)eft (C)ent.
      gt_fieldcat-no_zero = 'X'.        " 为X时,不输出前导零,和无意义的空值
    ENDIF.
    IF gt_fieldcat-fieldname EQ 'FLDATE'.
      gt_fieldcat-fix_column = 'X'.     " 单元格固定
    ENDIF.

    IF p_edit EQ 'X'.
      IF gt_fieldcat-fieldname EQ 'LOCCURAM'.   " 金额
        gt_fieldcat-EDIT = 'X'.           " 设置该列可编辑
        gt_fieldcat-datatype = 'CURR'.    " 指定数据类型:金额,用于控制输入时的小数位为2位
      ENDIF.
      IF gt_fieldcat-fieldname EQ 'LUGGWEIGHT'. " 行李重量
        gt_fieldcat-EDIT = 'X'.           " 设置该列可编辑
        gt_fieldcat-DECIMALS = 4.         " 指定小数位,用于控制输入时的小数位为4位
      ENDIF.
      IF gt_fieldcat-fieldname EQ 'ORDER_DATE'.
        gt_fieldcat-EDIT = 'X'.
        gt_fieldcat-edit_mask = '____/__/__'.
      ENDIF.
      IF gt_fieldcat-fieldname EQ 'CANCELLED'.
        gt_fieldcat-EDIT = 'X'.
        gt_fieldcat-CHECKBOX = 'X'.       " 复选框
      ENDIF.
      IF gt_fieldcat-fieldname EQ 'SEX'.  " 下拉框
        gt_fieldcat-EDIT = 'X'.
        gt_fieldcat-outputlen = 10.
        gt_fieldcat-drdn_hndl = '1'.      " 对应 gt_dropdown-Handle = 1 的项
*      gt_fieldcat-drdn_field = ''.       " 指定存handle值的字段
*      gt_fieldcat-drdn_alias = ''.       " 未知?
      ENDIF.
      " 设置可编辑字段F4搜索帮助
      IF gt_fieldcat-fieldname EQ 'WUNIT'.  " 单位-F4帮助(?)
        gt_fieldcat-EDIT = 'X'.
        gt_fieldcat-f4availabl = 'X'.
        gt_fieldcat-ref_field = 'MSEHI'.  " 如需单元格显示F4输入帮助,则需要指定字段所参照的表中的字段名
        gt_fieldcat-ref_table = 'T006'.   " 如需单元格显示F4输入帮助,则需要指定字段所参照的表名
      ENDIF.
    ENDIF.

*    if gt_fieldcat-fieldname eq 'ICON'.
*     gt_fieldcat-icon = 'X'.             " 显示图标,对于赋值ICON-ID的列,不设置也能自动显示图标
*     gt_fieldcat-symbol = 'X'.
*    endif.

*     gt_fieldcat-lzero = 'X'.          " 为X时,输出前导零
*  gt_fieldcat-no_sign = 'X'.            " 为X时,不显示数字符号
*  gt_fieldcat-no_convext = ''.

    IF p_color EQ 'X' AND ( p_col EQ 'X' OR p_all EQ 'X' )
    AND gt_fieldcat-fieldname EQ 'CLASS'.
      gt_fieldcat-emphasize = 'C510'.   " 列颜色1:绿色高亮显示
    ENDIF.

    IF gt_fieldcat-fieldname EQ 'LUGGWEIGHT'
    OR gt_fieldcat-fieldname EQ 'COUNTER'.  " NUMC类型,需要设置 layout-numc_total = 'X' 才能合计
      gt_fieldcat-do_sum = 'X'.   " 合计
*     gt_fieldcat-no_sum = ''.
    ENDIF.

    IF gt_fieldcat-fieldname EQ 'PASSNAME'.
      gt_fieldcat-no_out = 'X'.     " 不显示在ALV列表中,但可以更改布局显示出来
    ENDIF.
    IF gt_fieldcat-fieldname EQ 'PASSBIRTH'.
      gt_fieldcat-tech = 'X'.       " 彻底隐藏,在更改布局中不可见
    ENDIF.

*  gt_fieldcat-outputlen = ''.      " 设置列宽,当设置自动列宽是,此参数失效
*  gt_fieldcat-convexit = ''.
*  gt_fieldcat-seltext = ''.

*  gt_fieldcat-rollname = ''.
*  gt_fieldcat-inttype = ''.
*  gt_fieldcat-intlen = ''.
*  gt_fieldcat-lowercase = ''.
*
*  gt_fieldcat-hier_level = ''.
*  gt_fieldcat-reprep = ''.
*  gt_fieldcat-domname = ''.
*  gt_fieldcat-sp_group = ''.
*  gt_fieldcat-hotspot = ''.        " 设置字段内容下面是否有热点(有下划线,可点击,单击即可触发相应事件)
*  gt_fieldcat-dfieldname = ''.
*  gt_fieldcat-col_id = ''.

*  gt_fieldcat-auto_value = ''.
*  gt_fieldcat-checktable = ''.
*  gt_fieldcat-valexi = ''.
*  gt_fieldcat-web_field = ''.
*  gt_fieldcat-href_hndl = ''.
*  gt_fieldcat-style = ''.
*  gt_fieldcat-style2 = ''.
*  gt_fieldcat-style3 = ''.
*  gt_fieldcat-style4 = ''.

*  gt_fieldcat-no_merging = ''.
*  gt_fieldcat-h_ftype = ''.
*  gt_fieldcat-col_opt = ''.          " 单列优化宽度
*  gt_fieldcat-no_init_ch = ''.

*  gt_fieldcat-txt_field = ''.
*  gt_fieldcat-roundfield = ''.
*  gt_fieldcat-decimals_o = ''.
*  gt_fieldcat-decmlfield = ''.
*  gt_fieldcat-dd_outlen = ''.
*  gt_fieldcat-coltext = ''.

*  gt_fieldcat-colddictxt = ''.
*  gt_fieldcat-selddictxt = ''.
*  gt_fieldcat-tipddictxt = ''.
*
*  gt_fieldcat-tech_col = ''.
*  gt_fieldcat-tech_form = ''.
*  gt_fieldcat-tech_comp = ''.
*  gt_fieldcat-hier_cpos = ''.
*  gt_fieldcat-h_col_key = ''.
*  gt_fieldcat-h_select = ''.
*  gt_fieldcat-dd_roll = ''.
*  gt_fieldcat-dragdropid = ''.
*  gt_fieldcat-mac = ''.
*  gt_fieldcat-indx_field = ''.
*  gt_fieldcat-indx_cfiel = ''.
*  gt_fieldcat-indx_qfiel = ''.
*  gt_fieldcat-indx_ifiel = ''.
*  gt_fieldcat-indx_round = ''.
*  gt_fieldcat-indx_decml = ''.
*  gt_fieldcat-get_style = ''.
*  gt_fieldcat-mark = ''.

    APPEND gt_fieldcat.

  END-OF-DEFINITION.

  MAC_FIELD:  "mandt       集团,
  CARRID      航运公司,           " 关键字(需设置 fieldcat-key )
  CONNID      航线ID,             " 固定列(需设置 fieldcat-fix_column )
  FLDATE      航班日期,           " 日期,编辑样式(需设置 fieldcat-edit、fieldcat-edit_mask )
  LUGGWEIGHT  行李重量,           " 合计(需设置 fieldcat-do_sum)
  WUNIT       重量单位,
  CLASS       航班舱位,
  LOCCURAM    价格,
  LOCCURKEY   币别,
  ORDER_DATE  订单日期,
  COUNTER     柜台号,             " NUMC合计(需设置 layout-numc_total、fieldcat-do_sum)
  CANCELLED   取消,               " 复选框(编辑状态下显示复选框,需设置 Fieldcat-Checkbox)
  PASSNAME    乘客姓名,           " 默认隐藏(需设置 fieldcat-no_out )
  PASSBIRTH   乘客生日,           " 技术隐藏(需设置 fieldcat-tech )
  SEX         性别_下拉演示不保存,
  ICON        图标,               " 图标(无需设置,直接显示成图标)
  ICONNAME    图标名称,           " 图标名称(文本值,具体可以参考数据字典ICON表)
  ICONINAME   图标内码,           " 图标内部名称(无需设置,直接显示成图标)
  RCLRVALUE   行颜色值演示.

  IF P_ICON IS INITIAL.   " 是否显示图标
    LOOP AT GT_FIELDCAT WHERE FIELDNAME CS 'ICON'.
      DELETE GT_FIELDCAT.
    ENDLOOP.
  ELSE.
    LOOP AT GT_FIELDCAT WHERE FIELDNAME CS 'ICON'.
      GT_FIELDCAT-JUST = 'C'.
      MODIFY GT_FIELDCAT.
    ENDLOOP.
  ENDIF.

  IF P_COLOR IS INITIAL.  " 是否显示颜色
    LOOP AT GT_FIELDCAT WHERE FIELDNAME EQ 'RCLRVALUE'.
      DELETE GT_FIELDCAT.
    ENDLOOP.
  ENDIF.

  IF P_EDIT IS INITIAL.   " 是否编辑状态
    LOOP AT GT_FIELDCAT WHERE FIELDNAME EQ 'SEX'.
      DELETE GT_FIELDCAT.
    ENDLOOP.
  ENDIF.

ENDFORM.                    "frm_build_fieldcat
ALV其他功能设置
*&---------------------------------------------------------------------*
*&      Form  frm_build_others
*&---------------------------------------------------------------------*
*       ALV 其他设置
*----------------------------------------------------------------------*
FORM FRM_BUILD_OTHERS.

  " 1、此部分用于排序和分类汇总
  IF P_SORT EQ 'X'.
    CLEAR GT_SORT.
    GT_SORT-SPOS = 1.
    GT_SORT-FIELDNAME = 'LOCCURAM'.   "要排序或分类汇总的字段
    GT_SORT-UP        = 'X'.          "表示按照上面栏位升序排列
    GT_SORT-SUBTOT    = 'X'.          "表示按照该栏位名来分组汇总
    APPEND GT_SORT.
  ENDIF.

  " 2、此部分用于设置预置按钮事件
  CLEAR GT_EVENT_EXIT.
  GT_EVENT_EXIT-UCOMM = '&ETA'.   " 查看明细
  GT_EVENT_EXIT-AFTER = 'X'.
  APPEND GT_EVENT_EXIT.

  " 3、此部分用于排除特定工具栏按钮
  IF P_EX IS INITIAL.
    CLEAR GT_EXCLUDE.
    GT_EXCLUDE-FCODE = '&VEXCEL'.       " 导出EXCEL
    APPEND GT_EXCLUDE.
    CLEAR GT_EXCLUDE.
    GT_EXCLUDE-FCODE = '%SL'.           " 邮件
    APPEND GT_EXCLUDE.
  ENDIF.

  " 4、此部分用于绑定事件处理Form
  CLEAR GT_EVENT.
  GT_EVENT-NAME = 'CALLER_EXIT'.      " 调用出口,可以和OO ALV结合使用
  GT_EVENT-FORM = 'FRM_CALLER_EXIT'.
  APPEND GT_EVENT.

*  CLEAR gt_event.
*  gt_event-name = 'PF_STATUS_SET'.    " 作用同设置i_callback_pf_status_set
*  gt_event-form = 'FRM_CB_STATUS_SET'.
*  APPEND gt_event.

*  CLEAR gt_event.
*  gt_event-name = 'DATA_CHANGED'.
*  gt_event-form = 'FRM_DATA_CHANGED'.
*  APPEND gt_event.

  " 5、GRID显示、打印设置
  IF P_TT IS INITIAL.   " 显示表头表尾
    GS_SETTING-COLL_TOP_P = 'X'. "  最小化 TOP_OF_PAGE
    GS_SETTING-COLL_END_L = 'X'. "  最小化 END_OF_LIST
  ENDIF.
*  gs_setting-top_p_only = 'X'. "  Top_Of_Page 仅在打印
*  gs_setting-eol_p_only = 'X'. "  END_OF_LIST 仅在打印
*  gs_setting-no_colwopt = 'X'. "  ALV 控制: 不优化打印的列宽
  GS_SETTING-EDT_CLL_CB = 'X'. "  值修改后立即触发Data_changed

  " 6、后台打印设置(未设置)
*  gs_print

  " 7、编辑状态的下拉框
  " 一个 ALV 报表可以存在多个单元格不同数值下拉框,所以 handle 可以理解为分组,后期调用根据该值来判断是哪个下拉框。
  " 设置Fieldcat-DRDN_HNDL = 分组ID
  GS_DROPDOWN-HANDLE = '1'.   " 第1组下拉框:男、女
  GS_DROPDOWN-VALUE = '男'.
  APPEND GS_DROPDOWN TO GT_DROPDOWN.
  GS_DROPDOWN-HANDLE = '1'.
  GS_DROPDOWN-VALUE = '女'.
  APPEND GS_DROPDOWN TO GT_DROPDOWN.

ENDFORM.                    "frm_build_others
完整代码
*&---------------------------------------------------------------------*
*& Report ZALV_FDOME
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZALV_FDOME.

TYPE-POOLS:SLIS.

CONSTANTS:GC_INACTIVE TYPE ICON       VALUE '@BZ@',   " ICON_LED_INACTIVE
                       GC_RED      TYPE ICON       VALUE '@5C@',   " ICON_LED_RED
                      GC_YELLOW   TYPE ICON       VALUE '@5D@',   " ICON_LED_YELLOW
                      GC_GREEN    TYPE ICON       VALUE '@5B@'.   " ICON_LED_GREEN

TYPES: BEGIN OF TY_SBOOK,
         MANDT        LIKE SBOOK-MANDT,
         CARRID       LIKE SBOOK-CARRID,
         CONNID       LIKE SBOOK-CONNID,
         FLDATE       LIKE SBOOK-FLDATE,
         BOOKID       LIKE SBOOK-BOOKID,
         LUGGWEIGHT   LIKE SBOOK-LUGGWEIGHT,
         WUNIT        LIKE SBOOK-WUNIT,
         CLASS        LIKE SBOOK-CLASS,
         LOCCURAM     LIKE SBOOK-LOCCURAM,
         LOCCURKEY    LIKE SBOOK-LOCCURKEY,
         ORDER_DATE   LIKE SBOOK-ORDER_DATE,
         COUNTER      LIKE SBOOK-COUNTER,
         CANCELLED    LIKE SBOOK-CANCELLED,         " 复选框(编辑状态下显示复选框,需设置 Fieldcat-Checkbox)
         PASSNAME     LIKE SBOOK-PASSNAME,
         PASSBIRTH    LIKE SBOOK-PASSBIRTH,
         SEX(1),                                   " 展示下拉框
         SEL          TYPE XFLAG,                   " 选择框(设置 Layout-box_fname,无需设置 Fieldcat)
         ICON         TYPE ICON_D,                  " 图标(无需设置,直接显示成图标),也可以定义为:icon(4)
         ICONNAME     TYPE ICONNAME,                " 图标名称演示(文本值,具体可以参考数据字典ICON表)
         ICONINAME    TYPE ICON_INT,                " 图标内部名称(无需设置,直接显示成图标),也可以定义为:iconiname(8)
         EXCP(1),                                  " 交通灯图标(需设置 Layout-excp_fname,才能显示图标)
         ROWCOLOR(4),                              " 行颜色,设置 layout-info_fname 后,不显示该字段值
         RCLRVALUE(4),                             " 行颜色值演示,另外定义一个,用于显示值
         COLORTAB     TYPE LVC_T_SCOL,              " 单元格颜色
         STYLETAB     TYPE LVC_T_STYL,              " 单元格样式,如单元格编辑、按钮等
       END OF TY_SBOOK,
       TT_SBOOK TYPE TABLE OF TY_SBOOK.

DATA: GT_SBOOK      TYPE TT_SBOOK WITH HEADER LINE.

DATA: GT_COLORTAB TYPE LVC_T_SCOL WITH HEADER LINE,         " 单元格颜色
      GT_STYLETAB TYPE LVC_T_STYL WITH HEADER LINE.         " 单元格编辑

DATA: GT_FIELDCAT   TYPE LVC_T_FCAT WITH HEADER LINE,         " 字段目录
      GS_LAYOUT     TYPE LVC_S_LAYO,                          " 表格布局
      GT_SORT       TYPE LVC_T_SORT WITH HEADER LINE,         " 排序&分类汇总
      GT_EVENT_EXIT TYPE SLIS_T_EVENT_EXIT WITH HEADER LINE,  " 预置按钮出口
      GT_EXCLUDE    TYPE SLIS_T_EXTAB WITH HEADER LINE,       " 排除标准工具栏按钮
      GT_EVENT      TYPE SLIS_T_EVENT WITH HEADER LINE,       " ALV事件
      GS_SETTING    TYPE LVC_S_GLAY,                          " 表格设置
      GS_PRINT      TYPE LVC_S_PRNT.                          " 打印设置

DATA: GT_DROPDOWN TYPE LVC_T_DROP,                            " 下拉框项,按Handle分组,对应Fieldcat-DRDN_HNDL
      GS_DROPDOWN TYPE LVC_S_DROP.

*用DEFINITION DEFERRED让程序提前知道类 LCL_EVENT_RECEIVER 避免编译错误。
CLASS LCL_EVENT_RECEIVER DEFINITION DEFERRED.

* 结合OO ALV的应用
*----------------------------------------------------------------------*
*       CLASS lcl_event_receiver DEFINITION
*----------------------------------------------------------------------*
*       OO ALV 事件处理方法定义
*----------------------------------------------------------------------*
CLASS LCL_EVENT_RECEIVER DEFINITION .
  PUBLIC SECTION.
    METHODS: HANDLE_DATA_CHANGED    " 值变更事件
      FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
      IMPORTING ER_DATA_CHANGED.
ENDCLASS.                    "LCL_ALV_RECEIVER DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_event_receiver IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS LCL_EVENT_RECEIVER IMPLEMENTATION.
  METHOD HANDLE_DATA_CHANGED.
    PERFORM FRM_DATA_CHANGED USING ER_DATA_CHANGED.
  ENDMETHOD.                    "handle_data_changed
ENDCLASS.                    "LCL_GRID_EVENT_RECEIVER IMPLEMENTATION


SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-B01. " 基本设置
  PARAMETERS: P_SEL,                                " 选择模式:A、B、C、D
              P_TITLE AS CHECKBOX,                  " 显示ALV标题
              P_TEXT  TYPE STRING DEFAULT 'ALV标题'. " 自定义ALV标题
  PARAMETERS: P_EDIT AS CHECKBOX,                   " 显示编辑模式
              P_ICON AS CHECKBOX.                   " 显示图标
SELECTION-SCREEN END OF BLOCK B1.

SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-B02. " 样式设置
  PARAMETERS: P_EXCP  AS CHECKBOX.                  " 显示交通灯
  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN POSITION 3.
    PARAMETERS: P_LIGHT RADIOBUTTON GROUP 1.
    SELECTION-SCREEN COMMENT 5(10) TEXT-S01.          " 交通灯样式
    SELECTION-SCREEN POSITION 18.
    PARAMETERS: P_LED RADIOBUTTON GROUP 1.
    SELECTION-SCREEN COMMENT 20(10) TEXT-S02.         " LED样式
  SELECTION-SCREEN END OF LINE.

  PARAMETERS: P_COLOR AS CHECKBOX.                  " 显示颜色
  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN POSITION 3.
    PARAMETERS: P_COL RADIOBUTTON GROUP 2.
    SELECTION-SCREEN COMMENT 5(10) TEXT-S03.          " 列颜色
    SELECTION-SCREEN POSITION 18.
    PARAMETERS: P_ROW RADIOBUTTON GROUP 2.
    SELECTION-SCREEN COMMENT 20(10) TEXT-S04.         " 行颜色
    SELECTION-SCREEN POSITION 33.
    PARAMETERS: P_CELL RADIOBUTTON GROUP 2.
    SELECTION-SCREEN COMMENT 35(10) TEXT-S05.         " 单元格颜色
    SELECTION-SCREEN POSITION 48.
    PARAMETERS: P_ALL RADIOBUTTON GROUP 2.
    SELECTION-SCREEN COMMENT 50(10) TEXT-S06.         " 所有颜色
  SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK B2.

SELECTION-SCREEN BEGIN OF BLOCK B3 WITH FRAME TITLE TEXT-B03. " 其他设置
  PARAMETERS: P_SORT AS CHECKBOX.
  PARAMETERS: P_EX AS CHECKBOX.     " 显示所有工具栏按钮
  PARAMETERS: P_TT AS CHECKBOX.     " 显示表头表尾
  PARAMETERS: P_HEIGHT TYPE I DEFAULT 10.
  PARAMETERS: P_DIALOG AS CHECKBOX. " 以对话框显示
SELECTION-SCREEN END OF BLOCK B3.

INITIALIZATION.

START-OF-SELECTION.
  PERFORM FRM_GET_DATA.
  PERFORM FRM_HANDLE_DATA.

END-OF-SELECTION.
  PERFORM FRM_BUILD_LAYOUT.
  PERFORM FRM_BUILD_FIELDCAT.
  PERFORM FRM_BUILD_OTHERS.
  PERFORM FRM_SHOW_ALV.


*&---------------------------------------------------------------------*
*&      Form  frm_get_data
*&---------------------------------------------------------------------*
*       ALV数据获取
*----------------------------------------------------------------------*
FORM FRM_GET_DATA.
  SELECT * FROM SBOOK
  INTO CORRESPONDING FIELDS OF TABLE GT_SBOOK
  UP TO 40 ROWS.
ENDFORM.                    "get_data

*&---------------------------------------------------------------------*
*&      Form  frm_handle_data
*&---------------------------------------------------------------------*
*       ALV数据处理
*----------------------------------------------------------------------*
FORM FRM_HANDLE_DATA.
  FIELD-SYMBOLS:<FS_SBOOK> LIKE LINE OF GT_SBOOK.
  DATA: LV_INDEX TYPE I, LV_MOD TYPE I.

  LOOP AT GT_SBOOK ASSIGNING <FS_SBOOK>.
    LV_INDEX = SY-TABIX.
    LV_MOD = ( LV_INDEX - 1 ) MOD 4.

*  1、演示EXCP列:
*         0-熄灯,@EB@ ICON_LIGHT_OUT,1-红灯,@0A@  ICON_RED_LIGHT
*         2-黄灯,@09@ ICON_YELLOW_LIGHT,3-绿灯,@08@	ICON_GREEN_LIGHT
    <FS_SBOOK>-EXCP = LV_MOD.

*  2、演示ICON列:赋值 ICON-ID
    CASE <FS_SBOOK>-EXCP.
      WHEN 1.
        <FS_SBOOK>-ICON = GC_RED.           " '@5C@',   " ICON_LED_RED
      WHEN 2.
        <FS_SBOOK>-ICON = GC_YELLOW.        " '@5D@',   " ICON_LED_YELLOW
      WHEN 3.
        <FS_SBOOK>-ICON = GC_GREEN.         " '@5B@'.   " ICON_LED_GREEN
      WHEN OTHERS.
        <FS_SBOOK>-ICON = GC_INACTIVE.      " '@BZ@',   " ICON_LED_INACTIVE
    ENDCASE.
*  2+、演示ICON列:赋值 ICON-INTERNAL
    PERFORM ZFRM_ICON_GET_NAMES_BY_ID USING <FS_SBOOK>-ICON
    CHANGING <FS_SBOOK>-ICONNAME <FS_SBOOK>-ICONINAME.

*  3、演示行颜色:
    DATA: LV_COLOR TYPE STRING.
    DATA: LV_VALUE TYPE I, C1,C2,C3.
    IF LV_INDEX LT 33.
      LV_VALUE = ( LV_INDEX + 1 ) / 4 - 1.
      C1 = LV_VALUE.                          " 颜色第2位为颜色值,由0~7表示,不同的数字表示不同的颜色属性:
*         0 = background color,1 = Gray-blue,2 = Light gray,3 = yellow,
*         4 = blue-gray,5 = green,6 = red,7 = orange
      LV_VALUE = ( LV_MOD + 1 ) / 2 - 1.
      C2 = LV_VALUE.                          " 颜色第3位为是否高亮显示,由1、0(非1)表示,1表示高亮,非1表示不高亮
      LV_VALUE = LV_MOD MOD 2.
      C3 = LV_VALUE.                          " 颜色第4位为是否反转,即颜色作用在背景色(表格行)还是前景色(文字)
*                                                由1、0(非1)表示(仅当第3位为0时才生效),1-前景色,0(非1)-背景色
      CONCATENATE 'C' C1 C2 C3 INTO LV_COLOR. " 颜色定义为4位字符,首位固定为字母“C”
      CONDENSE LV_COLOR NO-GAPS.
      <FS_SBOOK>-ROWCOLOR = LV_COLOR.
      <FS_SBOOK>-RCLRVALUE = LV_COLOR.
    ENDIF.
    IF LV_INDEX EQ 33.
      <FS_SBOOK>-ROWCOLOR = 'C705'.     " 对比颜色值测试
      <FS_SBOOK>-RCLRVALUE = 'C705'.
    ELSEIF LV_INDEX EQ 34.
      <FS_SBOOK>-ROWCOLOR = 'C791'.     " 对比颜色值测试
      <FS_SBOOK>-RCLRVALUE = 'C791'.
    ENDIF.

*  4、演示单元格颜色:
*    IF lv_index GT 34.
    IF <FS_SBOOK>-LUGGWEIGHT GT 40.
      CLEAR GT_COLORTAB.
      GT_COLORTAB-FNAME = 'LUGGWEIGHT'.
      GT_COLORTAB-COLOR-COL = '6'.      " 红色高亮显示
      GT_COLORTAB-COLOR-INT = '1'.
      GT_COLORTAB-COLOR-INV = '0'.
      APPEND GT_COLORTAB.
    ENDIF.
    IF <FS_SBOOK>-COUNTER GT 0.
      CLEAR GT_COLORTAB.
      GT_COLORTAB-FNAME = 'COUNTER'.
      GT_COLORTAB-COLOR-COL = '6'.    " 红色高亮显示
      GT_COLORTAB-COLOR-INT = '1'.
      GT_COLORTAB-COLOR-INV = '0'.
      APPEND GT_COLORTAB.
    ENDIF.
*    ENDIF.
    <FS_SBOOK>-COLORTAB = GT_COLORTAB[].
    CLEAR: GT_COLORTAB, GT_COLORTAB[].

*   5、演示任意单元格编辑:价格小于800的可以编辑
*     如果是针对某列的,可以先设置该列Fieldcat-edit = 'X',开启列可编辑,然后通过样式控制不可编辑单元格;
*     如果是针对表格的,可以先设置表格Layout-edit = 'X',开启全部可编辑,然后通过样式控制不可编辑单元格;
    CLEAR GT_STYLETAB.
    GT_STYLETAB-FIELDNAME = 'LOCCURAM'.
    IF <FS_SBOOK>-LOCCURAM GE 800.
      GT_STYLETAB-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED. " 设置大于等于800的不可编辑
    ELSE.
      GT_STYLETAB-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED. " 设置小于800的可编辑
    ENDIF.
    APPEND GT_STYLETAB.
    <FS_SBOOK>-STYLETAB = GT_STYLETAB[].
    CLEAR: GT_STYLETAB, GT_STYLETAB[].

  ENDLOOP.
ENDFORM.                    "frm_handle_data

*&---------------------------------------------------------------------*
*&      Form  frm_build_layout
*&---------------------------------------------------------------------*
*       常用Layout设置演示
*----------------------------------------------------------------------*
FORM FRM_BUILD_LAYOUT.

  CLEAR GS_LAYOUT.
  GS_LAYOUT-ZEBRA = 'X'.                " 斑马线,隔行换色
*  gs_layout-edit = 'X'.                " ALV所有列可编辑
*  gs_layout-edit_mode = ' '.           " 编辑模式,用途未知
*  gs_layout-no_keyfix = 'X'.           " 关键列不固定,包括设置 FIELDCAT-KEY、FIELDCAT-FIX_COLUMN 的列

*  gs_layout-language = 'E'.            " 语言,没看到效果

*  gs_layout-smalltitle = 'X'.          " 小标题,没看到效果
*  gs_layout-no_hgridln = 'X'.          " 隐藏垂直线,即竖线
*  gs_layout-no_vgridln = 'X'.          " 隐藏水平线,即横线
*  gs_layout-no_headers = 'X'.          " 隐藏标题栏
*  gs_layout-no_merging = 'X'.          " 禁用单元格合并,即排序时相同列内容仍显示,默认显示为空白
  GS_LAYOUT-CWIDTH_OPT = 'X'.           " 所有列自动宽度(此时 Fieldcat-outputlen 失效)
*  gs_layout-totals_bef = 'X'.          " 总计、小计放在第一行
*  gs_layout-no_totarr = 'X'.           " 没看到效果:在总计一行和小计行中显示箭头,这些箭头还表示总计区域。 设置此参数以抑制这些箭头
*  gs_layout-no_totexp = 'X'.           " 没看到效果:一个图标显示在一个(子)总计的开始线表示是否已展开的行。 设置此参数以抑制此图标。
* 此处省略7个
  IF P_EDIT EQ 'X'.                     " 开启编辑会影响layout-sel_mode,ABC模式 = A模式,D模式不变
    GS_LAYOUT-STYLEFNAME = 'STYLETAB'.  " 显示样式:控制单元格可否编辑
  ENDIF.
*  gs_layout-no_rowmark = 'X'.          " 隐藏左边的选择块(当Layout-SEL_MODE = A或D,或设置了Layout-BOX_FNAME,或设置了编辑状态时,默认会有选择块)
*  gs_layout-no_toolbar = 'X'.          " 没看到效果
  GS_LAYOUT-GRID_TITLE = 'Title在哪里'. " 没看到效果
  GS_LAYOUT-SEL_MODE = P_SEL.           " 选择模式(需要去掉:layout-box_fname 和 编辑模式,才能看到效果)
  IF P_SEL IS INITIAL.
*    GS_LAYOUT-BOX_FNAME = 'SEL'.         " 一旦设置,则相当于设置了 gs_layout-SEL_MODE = 'A',其他模式失效
*                                           不管是否编辑状态,可以通过选择块状态来更新SEL字段的值
  ENDIF.
*  gs_layout-sgl_clk_hd = 'X'.          " 列标题支持单击排序
*  gs_layout-no_totline = 'X'.          " 不显示合计、小计行
  GS_LAYOUT-NUMC_TOTAL = 'X'.           " 默认情况,NUMC字段设置 FIELDCAT-DO_SUM = 'X' 是不会计算合计的,设置支持合计
*  gs_layout-no_utsplit = 'X'.          " 是否根据单位拆分总计?
  IF P_EXCP EQ 'X'.     " 是否演示图标
    GS_LAYOUT-EXCP_FNAME = 'EXCP'.      " 指定列按红绿灯显示,否则显示原始值
  ENDIF.

  IF P_EXCP EQ 'X' AND P_LED EQ 'X'.
    GS_LAYOUT-EXCP_LED = 'X'.           " 更改EXCP列的显示样式为LED
  ENDIF.
*  gs_layout-excp_group = 'X'.          " 未知?
* gs_layout-detailinit = 'X'.           " 显示明细,初始值的项也显示,即显示空值,默认不显示
  GS_LAYOUT-DETAILTITL = '明细标题'.    " 显示明细,窗口的标题
*  gs_layout-keyhot = 'X'.              " 关键列作为热点,处理事件在哪里?

*  gs_layout-s_dragdrop = ''.           " ALV拖拽,另外专题讲解
  IF P_COLOR = 'X'.     " 是否演示颜色
    IF P_ROW EQ 'X' OR P_ALL EQ 'X'.
      GS_LAYOUT-INFO_FNAME = 'ROWCOLOR'.  " 行颜色2:设定行颜色值所在的列( COLOR )
    ENDIF.
    IF P_CELL EQ 'X' OR P_ALL EQ 'X'.
      GS_LAYOUT-CTAB_FNAME = 'COLORTAB'.  " 单元格颜色3:设定单元格颜色值所在的内表(列名 FNAME +颜色值 COLOR)
    ENDIF.
  ENDIF.

ENDFORM.                    "frm_build_layout

*&---------------------------------------------------------------------*
*&      Form  frm_build_fieldcat
*&---------------------------------------------------------------------*
*       常用Fieldcat设置演示
*----------------------------------------------------------------------*
FORM FRM_BUILD_FIELDCAT.

  DATA: LV_FIELD TYPE STRING.
  DEFINE MAC_FIELD.
    lv_field = '&1'.
    TRANSLATE lv_field TO UPPER CASE.

*  gt_fieldcat-row_pos = ''.
*  gt_fieldcat-col_pos = ''.          " 指定显示列位置
    CLEAR gt_fieldcat.
    gt_fieldcat-fieldname = lv_field. " 内表字段名
    gt_fieldcat-reptext = '&2'.       " 字段标题(建议使用该字段,不必设置以下四个字段)
*  gt_fieldcat-scrtext_l = ''.        " 长标题
*  gt_fieldcat-scrtext_m = ''.        " 中标题
*  gt_fieldcat-scrtext_s = ''.        " 短标题
*  gt_fieldcat-tooltip = ''.          " 默认等于 reptext

*  gt_fieldcat-tabname = ''.
*  gt_fieldcat-cfieldname = 'LOCCURKEY'.
*  gt_fieldcat-quantity = ''.
*  gt_fieldcat-qfieldname = ''.
*  gt_fieldcat-ifieldname = ''.
*  gt_fieldcat-round = ''.
*  gt_fieldcat-exponent = ''.

    IF gt_fieldcat-fieldname EQ 'CARRID' OR gt_fieldcat-fieldname EQ 'CONNID'.
      gt_fieldcat-KEY = 'X'.
      gt_fieldcat-just = 'C'.           " 单元格中内容显示时对齐方式:(R)ight (L)eft (C)ent.
      gt_fieldcat-no_zero = 'X'.        " 为X时,不输出前导零,和无意义的空值
    ENDIF.
    IF gt_fieldcat-fieldname EQ 'FLDATE'.
      gt_fieldcat-fix_column = 'X'.     " 单元格固定
    ENDIF.

    IF p_edit EQ 'X'.
      IF gt_fieldcat-fieldname EQ 'LOCCURAM'.   " 金额
        gt_fieldcat-EDIT = 'X'.           " 设置该列可编辑
        gt_fieldcat-datatype = 'CURR'.    " 指定数据类型:金额,用于控制输入时的小数位为2位
      ENDIF.
      IF gt_fieldcat-fieldname EQ 'LUGGWEIGHT'. " 行李重量
        gt_fieldcat-EDIT = 'X'.           " 设置该列可编辑
        gt_fieldcat-DECIMALS = 4.         " 指定小数位,用于控制输入时的小数位为4位
      ENDIF.
      IF gt_fieldcat-fieldname EQ 'ORDER_DATE'.
        gt_fieldcat-EDIT = 'X'.
        gt_fieldcat-edit_mask = '____/__/__'.
      ENDIF.
      IF gt_fieldcat-fieldname EQ 'CANCELLED'.
        gt_fieldcat-EDIT = 'X'.
        gt_fieldcat-CHECKBOX = 'X'.       " 复选框
      ENDIF.
      IF gt_fieldcat-fieldname EQ 'SEX'.  " 下拉框
        gt_fieldcat-EDIT = 'X'.
        gt_fieldcat-outputlen = 10.
        gt_fieldcat-drdn_hndl = '1'.      " 对应 gt_dropdown-Handle = 1 的项
*      gt_fieldcat-drdn_field = ''.       " 指定存handle值的字段
*      gt_fieldcat-drdn_alias = ''.       " 未知?
      ENDIF.
      " 设置可编辑字段F4搜索帮助
      IF gt_fieldcat-fieldname EQ 'WUNIT'.  " 单位-F4帮助(?)
        gt_fieldcat-EDIT = 'X'.
        gt_fieldcat-f4availabl = 'X'.
        gt_fieldcat-ref_field = 'MSEHI'.  " 如需单元格显示F4输入帮助,则需要指定字段所参照的表中的字段名
        gt_fieldcat-ref_table = 'T006'.   " 如需单元格显示F4输入帮助,则需要指定字段所参照的表名
      ENDIF.
    ENDIF.

*    if gt_fieldcat-fieldname eq 'ICON'.
*     gt_fieldcat-icon = 'X'.             " 显示图标,对于赋值ICON-ID的列,不设置也能自动显示图标
*     gt_fieldcat-symbol = 'X'.
*    endif.

*     gt_fieldcat-lzero = 'X'.          " 为X时,输出前导零
*  gt_fieldcat-no_sign = 'X'.            " 为X时,不显示数字符号
*  gt_fieldcat-no_convext = ''.

    IF p_color EQ 'X' AND ( p_col EQ 'X' OR p_all EQ 'X' )
    AND gt_fieldcat-fieldname EQ 'CLASS'.
      gt_fieldcat-emphasize = 'C510'.   " 列颜色1:绿色高亮显示
    ENDIF.

    IF gt_fieldcat-fieldname EQ 'LUGGWEIGHT'
    OR gt_fieldcat-fieldname EQ 'COUNTER'.  " NUMC类型,需要设置 layout-numc_total = 'X' 才能合计
      gt_fieldcat-do_sum = 'X'.   " 合计
*     gt_fieldcat-no_sum = ''.
    ENDIF.

    IF gt_fieldcat-fieldname EQ 'PASSNAME'.
      gt_fieldcat-no_out = 'X'.     " 不显示在ALV列表中,但可以更改布局显示出来
    ENDIF.
    IF gt_fieldcat-fieldname EQ 'PASSBIRTH'.
      gt_fieldcat-tech = 'X'.       " 彻底隐藏,在更改布局中不可见
    ENDIF.

*  gt_fieldcat-outputlen = ''.      " 设置列宽,当设置自动列宽是,此参数失效
*  gt_fieldcat-convexit = ''.
*  gt_fieldcat-seltext = ''.

*  gt_fieldcat-rollname = ''.
*  gt_fieldcat-inttype = ''.
*  gt_fieldcat-intlen = ''.
*  gt_fieldcat-lowercase = ''.
*
*  gt_fieldcat-hier_level = ''.
*  gt_fieldcat-reprep = ''.
*  gt_fieldcat-domname = ''.
*  gt_fieldcat-sp_group = ''.
*  gt_fieldcat-hotspot = ''.        " 设置字段内容下面是否有热点(有下划线,可点击,单击即可触发相应事件)
*  gt_fieldcat-dfieldname = ''.
*  gt_fieldcat-col_id = ''.

*  gt_fieldcat-auto_value = ''.
*  gt_fieldcat-checktable = ''.
*  gt_fieldcat-valexi = ''.
*  gt_fieldcat-web_field = ''.
*  gt_fieldcat-href_hndl = ''.
*  gt_fieldcat-style = ''.
*  gt_fieldcat-style2 = ''.
*  gt_fieldcat-style3 = ''.
*  gt_fieldcat-style4 = ''.

*  gt_fieldcat-no_merging = ''.
*  gt_fieldcat-h_ftype = ''.
*  gt_fieldcat-col_opt = ''.          " 单列优化宽度
*  gt_fieldcat-no_init_ch = ''.

*  gt_fieldcat-txt_field = ''.
*  gt_fieldcat-roundfield = ''.
*  gt_fieldcat-decimals_o = ''.
*  gt_fieldcat-decmlfield = ''.
*  gt_fieldcat-dd_outlen = ''.
*  gt_fieldcat-coltext = ''.

*  gt_fieldcat-colddictxt = ''.
*  gt_fieldcat-selddictxt = ''.
*  gt_fieldcat-tipddictxt = ''.
*
*  gt_fieldcat-tech_col = ''.
*  gt_fieldcat-tech_form = ''.
*  gt_fieldcat-tech_comp = ''.
*  gt_fieldcat-hier_cpos = ''.
*  gt_fieldcat-h_col_key = ''.
*  gt_fieldcat-h_select = ''.
*  gt_fieldcat-dd_roll = ''.
*  gt_fieldcat-dragdropid = ''.
*  gt_fieldcat-mac = ''.
*  gt_fieldcat-indx_field = ''.
*  gt_fieldcat-indx_cfiel = ''.
*  gt_fieldcat-indx_qfiel = ''.
*  gt_fieldcat-indx_ifiel = ''.
*  gt_fieldcat-indx_round = ''.
*  gt_fieldcat-indx_decml = ''.
*  gt_fieldcat-get_style = ''.
*  gt_fieldcat-mark = ''.

    APPEND gt_fieldcat.

  END-OF-DEFINITION.

  MAC_FIELD:  "mandt       集团,
  CARRID      航运公司,           " 关键字(需设置 fieldcat-key )
  CONNID      航线ID,             " 固定列(需设置 fieldcat-fix_column )
  FLDATE      航班日期,           " 日期,编辑样式(需设置 fieldcat-edit、fieldcat-edit_mask )
  LUGGWEIGHT  行李重量,           " 合计(需设置 fieldcat-do_sum)
  WUNIT       重量单位,
  CLASS       航班舱位,
  LOCCURAM    价格,
  LOCCURKEY   币别,
  ORDER_DATE  订单日期,
  COUNTER     柜台号,             " NUMC合计(需设置 layout-numc_total、fieldcat-do_sum)
  CANCELLED   取消,               " 复选框(编辑状态下显示复选框,需设置 Fieldcat-Checkbox)
  PASSNAME    乘客姓名,           " 默认隐藏(需设置 fieldcat-no_out )
  PASSBIRTH   乘客生日,           " 技术隐藏(需设置 fieldcat-tech )
  SEX         性别_下拉演示不保存,
  ICON        图标,               " 图标(无需设置,直接显示成图标)
  ICONNAME    图标名称,           " 图标名称(文本值,具体可以参考数据字典ICON表)
  ICONINAME   图标内码,           " 图标内部名称(无需设置,直接显示成图标)
  RCLRVALUE   行颜色值演示.

  IF P_ICON IS INITIAL.   " 是否显示图标
    LOOP AT GT_FIELDCAT WHERE FIELDNAME CS 'ICON'.
      DELETE GT_FIELDCAT.
    ENDLOOP.
  ELSE.
    LOOP AT GT_FIELDCAT WHERE FIELDNAME CS 'ICON'.
      GT_FIELDCAT-JUST = 'C'.
      MODIFY GT_FIELDCAT.
    ENDLOOP.
  ENDIF.

  IF P_COLOR IS INITIAL.  " 是否显示颜色
    LOOP AT GT_FIELDCAT WHERE FIELDNAME EQ 'RCLRVALUE'.
      DELETE GT_FIELDCAT.
    ENDLOOP.
  ENDIF.

  IF P_EDIT IS INITIAL.   " 是否编辑状态
    LOOP AT GT_FIELDCAT WHERE FIELDNAME EQ 'SEX'.
      DELETE GT_FIELDCAT.
    ENDLOOP.
  ENDIF.

ENDFORM.                    "frm_build_fieldcat

*&---------------------------------------------------------------------*
*&      Form  frm_build_others
*&---------------------------------------------------------------------*
*       ALV 其他设置
*----------------------------------------------------------------------*
FORM FRM_BUILD_OTHERS.

  " 1、此部分用于排序和分类汇总
  IF P_SORT EQ 'X'.
    CLEAR GT_SORT.
    GT_SORT-SPOS = 1.
    GT_SORT-FIELDNAME = 'LOCCURAM'.   "要排序或分类汇总的字段
    GT_SORT-UP        = 'X'.          "表示按照上面栏位升序排列
    GT_SORT-SUBTOT    = 'X'.          "表示按照该栏位名来分组汇总
    APPEND GT_SORT.
  ENDIF.

  " 2、此部分用于设置预置按钮事件
  CLEAR GT_EVENT_EXIT.
  GT_EVENT_EXIT-UCOMM = '&ETA'.   " 查看明细
  GT_EVENT_EXIT-AFTER = 'X'.
  APPEND GT_EVENT_EXIT.

  " 3、此部分用于排除特定工具栏按钮
  IF P_EX IS INITIAL.
    CLEAR GT_EXCLUDE.
    GT_EXCLUDE-FCODE = '&VEXCEL'.       " 导出EXCEL
    APPEND GT_EXCLUDE.
    CLEAR GT_EXCLUDE.
    GT_EXCLUDE-FCODE = '%SL'.           " 邮件
    APPEND GT_EXCLUDE.
  ENDIF.

  " 4、此部分用于绑定事件处理Form
  CLEAR GT_EVENT.
  GT_EVENT-NAME = 'CALLER_EXIT'.      " 调用出口,可以和OO ALV结合使用
  GT_EVENT-FORM = 'FRM_CALLER_EXIT'.
  APPEND GT_EVENT.

*  CLEAR gt_event.
*  gt_event-name = 'PF_STATUS_SET'.    " 作用同设置i_callback_pf_status_set
*  gt_event-form = 'FRM_CB_STATUS_SET'.
*  APPEND gt_event.

*  CLEAR gt_event.
*  gt_event-name = 'DATA_CHANGED'.
*  gt_event-form = 'FRM_DATA_CHANGED'.
*  APPEND gt_event.

  " 5、GRID显示、打印设置
  IF P_TT IS INITIAL.   " 显示表头表尾
    GS_SETTING-COLL_TOP_P = 'X'. "  最小化 TOP_OF_PAGE
    GS_SETTING-COLL_END_L = 'X'. "  最小化 END_OF_LIST
  ENDIF.
*  gs_setting-top_p_only = 'X'. "  Top_Of_Page 仅在打印
*  gs_setting-eol_p_only = 'X'. "  END_OF_LIST 仅在打印
*  gs_setting-no_colwopt = 'X'. "  ALV 控制: 不优化打印的列宽
  GS_SETTING-EDT_CLL_CB = 'X'. "  值修改后立即触发Data_changed

  " 6、后台打印设置(未设置)
*  gs_print

  " 7、编辑状态的下拉框
  " 一个 ALV 报表可以存在多个单元格不同数值下拉框,所以 handle 可以理解为分组,后期调用根据该值来判断是哪个下拉框。
  " 设置Fieldcat-DRDN_HNDL = 分组ID
  GS_DROPDOWN-HANDLE = '1'.   " 第1组下拉框:男、女
  GS_DROPDOWN-VALUE = '男'.
  APPEND GS_DROPDOWN TO GT_DROPDOWN.
  GS_DROPDOWN-HANDLE = '1'.
  GS_DROPDOWN-VALUE = '女'.
  APPEND GS_DROPDOWN TO GT_DROPDOWN.

ENDFORM.                    "frm_build_others

*&---------------------------------------------------------------------*
*&      Form  frm_caller_exit
*&---------------------------------------------------------------------*
*       调用出口,可结合OO ALV使用
*----------------------------------------------------------------------*
FORM FRM_CALLER_EXIT USING LS_DATA TYPE SLIS_DATA_CALLER_EXIT.
  DATA:LR_GRID TYPE REF TO CL_GUI_ALV_GRID.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = LR_GRID.

  CALL METHOD LR_GRID->SET_DROP_DOWN_TABLE
    EXPORTING
      IT_DROP_DOWN = GT_DROPDOWN.

** 设置enter事件
*  CALL METHOD lr_grid->register_edit_event
*    EXPORTING
*      i_event_id = cl_gui_alv_grid=>mc_evt_enter
*    EXCEPTIONS
*      error      = 1
*      OTHERS     = 2.
** 设置 单光标焦点移开被修改单元格后既触发事件
*  CALL METHOD lr_grid->register_edit_event
*    EXPORTING
*      i_event_id = cl_gui_alv_grid=>mc_evt_modified
*    EXCEPTIONS
*      error      = 1
*      OTHERS     = 2.
* 以上两句作用等同于:gs_setting-edt_cll_cb = 'X'. "  值修改后立即触发Data_changed

  DATA: LR_EVENT_RECEIVER TYPE REF TO LCL_EVENT_RECEIVER.
  CREATE OBJECT LR_EVENT_RECEIVER.
  SET HANDLER LR_EVENT_RECEIVER->HANDLE_DATA_CHANGED FOR LR_GRID.
* 以上两句作用等同于:
*  CLEAR gt_event.
*  gt_event-name = 'DATA_CHANGED'.
*  gt_event-form = 'FRM_DATA_CHANGED'.
*  APPEND gt_event.


*  SET HANDLER lr_event_receiver->handle_f4 FOR lr_grid.

*  ls_f4-fieldname  = 'EMPLOYEE'.   "窗口时间参数(需要定义F4帮助按钮的字段)
*  ls_f4-register   = 'X'.
*  ls_f4-getbefore  = 'X'.
*  ls_f4-chngeafter = 'X'.
*  INSERT ls_f4 INTO TABLE lt_f4.
*
* CALL METHOD lr_grid->register_f4_for_fields
*   EXPORTING
*     it_f4 = lt_f4[].

*  还需要设置相应的fieldcat
*  ls_fieldcat-edit = 'X'.    "把这一列变为可修改
*  ls_fieldcat-f4availabl = 'X'. "这个一定要打上X,字段尾部,添加搜索帮助的的小按钮
ENDFORM.                    "frm_caller_exit

*&---------------------------------------------------------------------*
*&      Form  frm_DATA_CHANGED
*&---------------------------------------------------------------------*
*       可编辑GRID值更新
*----------------------------------------------------------------------*
FORM FRM_DATA_CHANGED USING PCL_DATA TYPE REF TO CL_ALV_CHANGED_DATA_PROTOCOL.
  DATA: L_NAME(20),
        LS_CELLS TYPE LVC_S_MODI.
  FIELD-SYMBOLS: <FS_VALUE>.

  LOOP AT PCL_DATA->MT_MOD_CELLS INTO LS_CELLS.
    CLEAR GT_SBOOK.
    READ TABLE GT_SBOOK INDEX LS_CELLS-ROW_ID.  " 读取更新的行
    CONCATENATE 'GT_SBOOK-' LS_CELLS-FIELDNAME INTO L_NAME.
    ASSIGN (L_NAME) TO <FS_VALUE>.
    <FS_VALUE> = LS_CELLS-VALUE.                " 给对应字段赋新值,更新grid
    MODIFY GT_SBOOK INDEX LS_CELLS-ROW_ID TRANSPORTING (LS_CELLS-FIELDNAME).

    " 值联动:可以从数据库获取其他字段值,
    "赋数据库其他值(适用于仓库变更,显示新的库存量的场景)
*     SELECT SINGLE labst
*     INTO gt_sbook-labst
*     FROM mard
*     WHERE matnr = ls_sbook-matnr
*       AND werks = ls_sbook-reswk
*       AND lgort = ls_sbook-lgort.
    "更新GRID
    " MODIFY gt_sbook INDEX ls_cells-row_id.
  ENDLOOP.

  " 做了更新,则刷新GRID
  DATA: LR_GRID TYPE  REF TO CL_GUI_ALV_GRID,
        LS_STBL TYPE  LVC_S_STBL.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = LR_GRID.
  LS_STBL-ROW = 'X'." 基于行稳定刷新
  LS_STBL-COL = 'X'." 基于列稳定刷新
  CALL METHOD LR_GRID->REFRESH_TABLE_DISPLAY
    EXPORTING
      IS_STABLE = LS_STBL.
ENDFORM.                    "frm_DATA_CHANGED

*&---------------------------------------------------------------------*
*&      Form  frm_show_alv
*&---------------------------------------------------------------------*
*       ALV显示
*----------------------------------------------------------------------*
FORM FRM_SHOW_ALV.
  DATA: LV_TITLE TYPE LVC_TITLE.
  IF P_TITLE EQ 'X'.
    LV_TITLE = P_TEXT.
    IF LV_TITLE IS INITIAL.
      LV_TITLE = '您未定义ALV标题'.
    ENDIF.
  ENDIF.

  DATA: LV_LOC1 TYPE I, LV_LOC2 TYPE I, LV_LOC3 TYPE I, LV_LOC4 TYPE I.
  IF P_DIALOG EQ 'X'.
    LV_LOC1 = 1.
    LV_LOC2 = 1.
    LV_LOC3 = 100.
    LV_LOC4 = 10.
  ENDIF.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
*     I_INTERFACE_CHECK           = ' '                        " 接口一致性检查
*     I_BYPASSING_BUFFER          =                            " 是否使用缓存
*     I_BUFFER_ACTIVE             =                            " 是否激活缓存,如果每次显示ALV都是相同的字段目录,则该字段目录会被放到一特殊的缓存里,加快显示速度。
      I_CALLBACK_PROGRAM          = 'ZALV_FDOME'                " 回调函数、输出内表所在的程序名
      I_CALLBACK_PF_STATUS_SET    = 'FRM_CB_STATUS_SET'          " 回调本地FORM,设置ALV工具栏
      I_CALLBACK_USER_COMMAND     = 'FRM_CB_USER_COMMAND'        " 回调本地FORM,设置工具栏按钮或数据行事件触发时的操作
      I_CALLBACK_TOP_OF_PAGE      = 'FRM_CB_TOP_OF_PAGE'         " 回调函数,设置ALV报表表头信息
      I_CALLBACK_HTML_TOP_OF_PAGE = 'FRM_CB_HTML_TOP_OF_PAGE'    " 回调函数,设置ALV报表表头HTML代码
      I_CALLBACK_HTML_END_OF_LIST = 'FRM_CB_HTML_END_OF_LIST'    " 回调函数,设置ALV报表表尾HTML代码
*     I_STRUCTURE_NAME            = 'GT_SBOOK'                 " 字段目录结构,参考数据字典结构,需要为gt_sbook定义结构
*     I_BACKGROUND_ID             = ' '                        " 设置ALV背景图片ID
      I_GRID_TITLE                = LV_TITLE                     " ALV 标题,位于ALV工具栏和ALV GRID之间
      I_GRID_SETTINGS             = GS_SETTING                   " GRID信息设置
      IS_LAYOUT_LVC               = GS_LAYOUT                    " ALV输出布局样式
      IT_FIELDCAT_LVC             = GT_FIELDCAT[]                " 设定显示的项目名称及输出设定
      IT_EXCLUDING                = GT_EXCLUDE[]                 " 隐藏设置的ALV工具栏
*     IT_SPECIAL_GROUPS_LVC       =
      IT_SORT_LVC                 = GT_SORT[]                    " ALV排序设置,可以display前对内表数据排序
*     IT_FILTER_LVC               =                            " ALV过滤设置,可以在get_data时增加过滤
*     IT_HYPERLINK                =
*     IS_SEL_HIDE                 =
      I_DEFAULT                   = 'X'                          " 用户是否可以定义默认的布局,’X'-可以定义默认布局,Space-不可以定义默认布局 (默认:X)
      I_SAVE                      = 'A'                          " 保存表格布局:'X'-只能保存为全局标准变式,'U'-只能保存特定用户变式,'A'-都可以保存,SPACE-不能保存变式(默认:space)
*     IS_VARIANT                  =                            " 表格布局变式
      IT_EVENTS                   = GT_EVENT[]                  " 设置事件, 类型为slis_t_event的内表(name:事件名称,form:事件的FORM)
      IT_EVENT_EXIT               = GT_EVENT_EXIT[]             " 设置预置按钮回调的执行行为,表明用户所写的代码是在执行标准执行之前还是之后
*     IS_PRINT_LVC                =
*     IS_REPREP_ID_LVC            =
      I_SCREEN_START_COLUMN       = LV_LOC1                     " 以对话框形式显示的开始列
      I_SCREEN_START_LINE         = LV_LOC2                     " 以对话框形式显示的开始行
      I_SCREEN_END_COLUMN         = LV_LOC3                     " 以对话框形式显示的结束列
      I_SCREEN_END_LINE           = LV_LOC4                     " 以对话框形式显示的结束行
      I_HTML_HEIGHT_TOP           = P_HEIGHT                    " 表头高度
      I_HTML_HEIGHT_END           = P_HEIGHT                    " 表尾高度
*     IT_EXCEPT_QINFO_LVC         =
*     IR_SALV_FULLSCREEN_ADAPTER  =
*  IMPORTING
*     E_EXIT_CAUSED_BY_CALLER     =
*     ES_EXIT_CAUSED_BY_USER      =
    TABLES
      T_OUTTAB                    = GT_SBOOK                    " 必须参数,要显示的内表
*  EXCEPTIONS
*     PROGRAM_ERROR               = 1
*     OTHERS                      = 2
    .
  IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
ENDFORM.                    "show_alv

*&---------------------------------------------------------------------*
*&      Form  FRM_CB_STATUS_SET
*&---------------------------------------------------------------------*
*       ALV 自定义工具栏
*----------------------------------------------------------------------*
FORM FRM_CB_STATUS_SET USING RT_EXTAB TYPE SLIS_T_EXTAB.
* 参数说明:rt_extab是要排除掉的按钮,根据Funcode来排除。
*  另外,也可以通过REUSE_ALV_GRID_DISPLAY函数IT_EXCLUDING内表参数来直接排除哪些预置按钮不可用,
*  IT_EXCLUDING内表结构只有一个fcode字段,即根据保留的FunCode即可disabled掉。

* 1、使用ALV自带的,注释调入参:i_callback_pf_status_set 即可

* 2、调用系统预定义好的标准ALV工具栏,在程序SAPLKKBL中,使用以下语句调用
* SET PF-STATUS 'STANDARD_FULLSCREEN' OF PROGRAM 'SAPLKKBL' EXCLUDING rt_extab.

* 3、自定义ALV工具栏,自已创建一个GUI Status,
*  通常作法是从SLVC_FULLSCREEN函数组中拷贝STANDARD_FULLSCREEN,再在此基础之上新增按钮即可

  "取消激活Function code为 %PC 的本地文件、&AQW 的文字处理
  APPEND '%PC' TO  RT_EXTAB.    " 注意:rt_extab 中已经存在一些fcode了
  APPEND '&AQW' TO  RT_EXTAB.
  IF P_EX IS INITIAL.
    SET PF-STATUS 'STANDARD_FULLSCREEN' EXCLUDING RT_EXTAB.
  ELSE.
    SET PF-STATUS 'STANDARD_FULLSCREEN'.
  ENDIF.
ENDFORM.                    "FRM_CB_STATUS_SET

*&---------------------------------------------------------------------*
*&      Form  FRM_CB_USER_COMMAND
*&---------------------------------------------------------------------*
*       ALV 自定义按钮事件
*----------------------------------------------------------------------*
FORM FRM_CB_USER_COMMAND USING R_UCOMM LIKE SY-UCOMM RS_SELFIELD TYPE SLIS_SELFIELD.
* 过程说明:ALV触发的事件(如双击某行数据、单击热点、点ALV工具栏上的自定义的按钮时),
*           会回调I_CALLBACK_USER_COMMAND参数指定的Form;
*           只有自已新增的按钮(或双击数据行时、热点点击)再会调用,
*           ALV 标准默认的Function Code是不会调用的(除非使用使用IT_EVENT_EXIT)
* 参数说明:R_UCOMM 为触发的function code;
*           结构 RS_SELFIELD 为触发字段相关信息
  CASE R_UCOMM.
    WHEN '&IC1'.  " 表示双击
      CHECK RS_SELFIELD-TABINDEX > 0.
      DATA: LV_STR TYPE STRING.
      LV_STR = RS_SELFIELD-TABINDEX.
      CONCATENATE '您双击了:第' LV_STR '行的' RS_SELFIELD-FIELDNAME ',值为:' RS_SELFIELD-VALUE
      INTO LV_STR.
      MESSAGE LV_STR TYPE 'I'.

    WHEN '&ETA'.  " 显示明细
      MESSAGE '此弹窗仅在设置了IT_EVENT_EXIT才出现' TYPE 'I'.

    WHEN 'ZSAVE'. " 保存:更改系统的保存按钮FCODE:&DATA_SAVE 为 ZSAVE,预留的FCODE无法直接捕获
      DATA: LT_SBOOK TYPE TABLE OF SBOOK,
            LS_SBOOK TYPE SBOOK.
      LOOP AT GT_SBOOK.
        MOVE-CORRESPONDING GT_SBOOK TO LS_SBOOK.
        APPEND LS_SBOOK TO LT_SBOOK.
      ENDLOOP.
      MODIFY SBOOK FROM TABLE LT_SBOOK.     " 必须包含所有关键字才能更新DB
      IF SY-SUBRC EQ 0.
        COMMIT WORK.
      ELSE.
        ROLLBACK WORK.
      ENDIF.

    WHEN 'ZSEL'.  " 选择:设置BOX_FNANE,通过选择块来控制SEL字段的值
      DATA: LV_COUNT TYPE I.
      LOOP AT GT_SBOOK WHERE SEL = 'X'.
        LV_COUNT = LV_COUNT + 1.
      ENDLOOP.
      DATA: LV_MSG TYPE STRING.
      IF LV_COUNT IS INITIAL.
        LV_MSG = '0'.
      ELSE.
        LV_MSG = LV_COUNT.
      ENDIF.
      CONCATENATE '您选择了' LV_MSG '条记录!' INTO LV_MSG.
      MESSAGE LV_MSG TYPE 'I'.

  ENDCASE.

  "自动刷新
*  rs_selfield-refresh    = 'X'.
*  rs_selfield-col_stable = 'X'.
*  rs_selfield-row_stable = 'X'.
ENDFORM.                    "FRM_CB_USER_COMMAND

*&---------------------------------------------------------------------*
*&      Form  FRM_CB_TOP_OF_PAGE
*&---------------------------------------------------------------------*
*       ALV 表头设置
*----------------------------------------------------------------------*
FORM FRM_CB_TOP_OF_PAGE.
  DATA: LT_GRID_TOP_OF_PAGE TYPE SLIS_T_LISTHEADER.
  DATA: LS_LINE TYPE SLIS_LISTHEADER.
  CLEAR LT_GRID_TOP_OF_PAGE[].
  CLEAR LS_LINE.
  LS_LINE-TYP  = 'H'.         " 只显示 INFO
*  ls_line-key  = '大标题'.     " 不显示
  LS_LINE-INFO  = '航空公司订单记录表'.
  APPEND LS_LINE TO LT_GRID_TOP_OF_PAGE.

* STATUS LINE: TYPE S
  CLEAR LS_LINE.
  LS_LINE-TYP  = 'S'.         " 显示 KEY INFO
  LS_LINE-KEY  = '系统日期'.
  CONCATENATE SY-DATUM+0(4) '年' SY-DATUM+4(2) '月' SY-DATUM+6(2)  '日'
  INTO LS_LINE-INFO  .
  APPEND LS_LINE TO LT_GRID_TOP_OF_PAGE.

  CLEAR LS_LINE.
  LS_LINE-TYP  = 'A'.         " 只显示 INFO
*  ls_line-key  = '小标题'.     " 不显示
  LS_LINE-INFO  = 'TYP-A'.
  APPEND LS_LINE TO LT_GRID_TOP_OF_PAGE.

  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      IT_LIST_COMMENTARY = LT_GRID_TOP_OF_PAGE.

ENDFORM.                    "FRM_CB_TOP_OF_PAGE

*&---------------------------------------------------------------------*
*&      Form  FRM_CB_HTML_TOP_OF_PAGE
*&---------------------------------------------------------------------*
*       ALV HTML表头设置
*----------------------------------------------------------------------*
FORM FRM_CB_HTML_TOP_OF_PAGE USING CL_DD TYPE REF TO CL_DD_DOCUMENT.
*  说明:使用 ABAP 类 CL_DD_DOCUMENT,定义HTML文档,
*  即:使用HTML语言对表头的输出格式进行控制,包括输出文字的大小,字体及颜色等,
*  总之在HTML语言中能实现的在这里都能实现.
*  当I_CALLBACK_TOP_OF_PAGE和I_CALLBACK_HTML_TOP_OF_PAGE同时设置时,
*  只有I_CALLBACK_HTML_TOP_OF_PAGE起作用.

  DATA: M_P TYPE I.
  DATA: M_BUFF TYPE STRING.
*表头其实完全可以是一个html文件,自己使用html语言进行格式控制
  M_BUFF = '<html>'.
  CALL METHOD CL_DD->HTML_INSERT
    EXPORTING
      CONTENTS = M_BUFF
    CHANGING
      POSITION = M_P.

  M_BUFF = '<H4>航空公司订单记录表</H4>'.
  CALL METHOD CL_DD->HTML_INSERT
    EXPORTING
      CONTENTS = M_BUFF
    CHANGING
      POSITION = M_P.

  M_BUFF = SY-DATUM.
  CALL METHOD CL_DD->HTML_INSERT
    EXPORTING
      CONTENTS = M_BUFF
    CHANGING
      POSITION = M_P.

  M_BUFF = '</html>'.
  CALL METHOD CL_DD->HTML_INSERT
    EXPORTING
      CONTENTS = M_BUFF
    CHANGING
      POSITION = M_P.
ENDFORM.                    "FRM_CB_HTML_TOP_OF_PAGE

*&---------------------------------------------------------------------*
*&      Form  FRM_CB_HTML_END_OF_LIST
*&---------------------------------------------------------------------*
*       ALV HTML表尾设置
*----------------------------------------------------------------------*
FORM FRM_CB_HTML_END_OF_LIST USING DOCUMENT TYPE REF TO CL_DD_DOCUMENT.
  DATA: TEXT TYPE SDYDO_TEXT_ELEMENT.
  TEXT = '自定义表尾信息'.
  CALL METHOD DOCUMENT->ADD_TEXT
    EXPORTING
      TEXT      = TEXT
      SAP_STYLE = 'HEADING'.
  "换行写另一标题
  CALL METHOD DOCUMENT->NEW_LINE.
  "缩进
  CALL METHOD DOCUMENT->ADD_GAP
    EXPORTING
      WIDTH = 10.                                           "空格宽10
  TEXT = '追加标题'.
  CALL METHOD DOCUMENT->ADD_TEXT
    EXPORTING
      TEXT      = TEXT
      SAP_STYLE = 'HEADING'.
ENDFORM.                    "FRM_CB_HTML_END_OF_LIST

*&---------------------------------------------------------------------*
*&      Form  zfrm_icon_get_iname_by_name
*&---------------------------------------------------------------------*
*       创建带自定义提示符的图标
*----------------------------------------------------------------------*
FORM ZFRM_ICON_CREATE_BY_NAME
USING VALUE(FV_ICON_NAME) VALUE(FV_INFO)
CHANGING FC_ICON_INAME.
  CALL FUNCTION 'ICON_CREATE'
    EXPORTING
      NAME   = FV_ICON_NAME  "图标名字
      INFO   = FV_INFO       "图标提示
    IMPORTING
      RESULT = FC_ICON_INAME
    EXCEPTIONS
      OTHERS = 0.
ENDFORM.                    "zfrm_icon_get_iname_by_name

*&---------------------------------------------------------------------*
*&      Form  zfrm_icon_get_iname_by_name
*&---------------------------------------------------------------------*
*       通过图标名称获取图标内码
*----------------------------------------------------------------------*
FORM ZFRM_ICON_GET_INAME_BY_NAME
USING VALUE(FV_NAME)
CHANGING FC_ICON_INAME.
  DATA: LS_ICON TYPE ICON.
  SELECT SINGLE * INTO LS_ICON FROM ICON WHERE NAME = FV_NAME.
  IF SY-SUBRC = 0.
    FC_ICON_INAME = LS_ICON-INTERNAL.
  ENDIF.
ENDFORM.                    "zfrm_icon_get_iname_by_name

*&---------------------------------------------------------------------*
*&      Form  zfrm_icon_get_names_by_id
*&---------------------------------------------------------------------*
*       通过图标ID获取图标名称
*----------------------------------------------------------------------*
FORM ZFRM_ICON_GET_NAMES_BY_ID
USING VALUE(FV_ID)
CHANGING FC_ICON_NAME FC_ICON_INAME.
  DATA: LS_ICON TYPE ICON.
  SELECT SINGLE * INTO LS_ICON FROM ICON WHERE ID = FV_ID.
  IF SY-SUBRC = 0.
    FC_ICON_NAME = LS_ICON-NAME.
    FC_ICON_INAME = LS_ICON-INTERNAL.
  ENDIF.
ENDFORM.                    "zfrm_icon_get_names_by_id

ALV展示

注:代码原文连接

【SAP Abap】SAP ALV开发(REUSE_ALV_GRID_DISPLAY_LVC)全网最详细 DEMO_X档案库的博客-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值