一、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 详解
参数 | 解释 | 是否常用 |
---|---|---|
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_TITLE | ALV 标题,位于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_LVC | ALV排序设置,可以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博客