1.效果图:
2.源代码:
*---------------------------------------------------------------------*
* Program ID : ZDEMO_ALV_FM *
* Program Name: ZDEMO_ALV_FM *
* T-CODE : ZDEMO_ALV_FM *
* Program Type: *
* Description : *
*---------------------------------------------------------------------*
* Date Created : 16.11.2021 19:26:50 *
* Created By : ZHANGYH *
*---------------------------------------------------------------------*
* Edit Log : *
* Version Date Author Remark *
* <YYYYMMDDnnn> <YYYY/MM/DD> <修改人> <修改理由/内容> *
*---------------------------------------------------------------------*
REPORT zdemo_alv_fm.
*--------------------------------------------------------------------*
*&---------------------------「TABLES」-----------------------------&*
*--------------------------------------------------------------------*
TABLES:spfli.
INCLUDE <list>.
TYPES:BEGIN OF ty_data.
INCLUDE STRUCTURE spfli.
TYPES:
sel TYPE c,
color(4) TYPE c,
cell_color TYPE slis_t_specialcol_alv,
END OF ty_data.
*--------------------------------------------------------------------*
*&--------------------------「VARIABLE」----------------------------&*
*--------------------------------------------------------------------*
DATA:gt_data TYPE TABLE OF ty_data.
DATA:gs_layout TYPE lvc_s_layo,
gt_fieldcat TYPE lvc_t_fcat,
gt_sort TYPE lvc_t_sort.
*--------------------------------------------------------------------*
*&--------------------------「PROCESS」-----------------------------&*
*--------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM frm_get_data.
PERFORM frm_display_data.
*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
*& 获取数据
*&---------------------------------------------------------------------*
FORM frm_get_data.
DATA:ls_cell TYPE slis_specialcol_alv.
ls_cell-fieldname = 'DISTANCE'.
ls_cell-color-col = '6'.
ls_cell-color-int = '1'.
ls_cell-color-inv = '0'.
SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_data FROM spfli.
LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<fs_opt>).
IF <fs_opt>-distance > '1000' AND <fs_opt>-distance < '5000'.
APPEND ls_cell TO <fs_opt>-cell_color.
ELSE.
<fs_opt>-color = 'C510'.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_DATA
*&---------------------------------------------------------------------*
*& 数据展示输出
*&---------------------------------------------------------------------*
FORM frm_display_data .
PERFORM frm_set_layout. " 设置ALV布局
PERFORM frm_set_fieldcat. " 设置ALV展示字段
PERFORM frm_display_alv. " 设置ALV数据展示
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_LAYOUT
*&---------------------------------------------------------------------*
*& 设置ALV布局
*&---------------------------------------------------------------------*
FORM frm_set_layout .
gs_layout-zebra = 'X'. "使ALV呈现斑马线"
gs_layout-sel_mode = 'D'. "选择模式A D"
gs_layout-cwidth_opt = 'X'. "自动优化列宽"
gs_layout-box_fname = 'SEL'. "使用系统选择行项”
gs_layout-info_fname = 'COLOR'. "控制行单元格颜色选项”
gs_layout-ctab_fname = 'CELL_COLOR'. "控制单元格颜色选项”
gs_layout-totals_bef = 'X'. "设置后,求和数据放在ALV列标题下面"
* spos:排序顺序 fieldname:排序字段 up:升序 down:降序
gt_sort = VALUE #( BASE gt_sort
"按照国家地区代码升序
( spos = '1' fieldname = 'COUNTRYTO' up = 'X' )
"按照到达城市降序
( spos = '2' fieldname = 'CITYTO' down = 'X' )
).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_FIELDCAT
*&---------------------------------------------------------------------*
*& 设置字段目录
*&---------------------------------------------------------------------*
FORM frm_set_fieldcat .
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
* I_BUFFER_ACTIVE =
i_structure_name = 'spfli'
* I_CLIENT_NEVER_DISPLAY = 'X'
* I_BYPASSING_BUFFER =
* I_INTERNAL_TABNAME =
CHANGING
ct_fieldcat = gt_fieldcat
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
DATA:ls_fieldcat TYPE lvc_s_fcat.
ls_fieldcat-hotspot = 'X'. "热点链接"
ls_fieldcat-fix_column = 'X'. "固定列"
MODIFY gt_fieldcat FROM ls_fieldcat TRANSPORTING hotspot fix_column WHERE fieldname = 'CARRID' .
CLEAR ls_fieldcat.
ls_fieldcat-do_sum = 'X'. "单列求和"
* ls_fieldcat-no_sum = 'X'. "取消求和"
"求和距离
MODIFY gt_fieldcat FROM ls_fieldcat TRANSPORTING do_sum WHERE fieldname = 'DISTANCE' .
CLEAR ls_fieldcat.
ls_fieldcat-just = 'C'. "列内容居中对齐:L左对齐,C居中,R右对齐"
MODIFY gt_fieldcat FROM ls_fieldcat TRANSPORTING do_sum WHERE fieldname = 'DISTANCE' .
CLEAR ls_fieldcat.
ls_fieldcat-emphasize = 'C310'. "固定列"
MODIFY gt_fieldcat FROM ls_fieldcat TRANSPORTING emphasize WHERE fieldname = 'COUNTRYTO' .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*& 定义ALV输出函数
*&---------------------------------------------------------------------*
FORM frm_display_alv .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER =
* I_BUFFER_ACTIVE =
i_callback_program = sy-repid
i_callback_pf_status_set = 'PF_STATUS_SET'
i_callback_user_command = 'USER_COMMAND'
i_callback_top_of_page = 'TOP_OF_PAGE'
i_callback_html_top_of_page = 'HTML_TOP_OF_PAGE'
* I_CALLBACK_HTML_END_OF_LIST = 'HTML_END_OF_LIST'
* I_STRUCTURE_NAME =
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE = ''
* I_GRID_SETTINGS =
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fieldcat
* it_excluding = gt_exclude
* IT_SPECIAL_GROUPS_LVC =
it_sort_lvc = gt_sort
* it_filter_lvc = gt_filter
* IT_HYPERLINK =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
* I_SAVE = ' '
* IS_VARIANT =
* it_events = gt_event
* IT_EVENT_EXIT =
* IS_PRINT_LVC =
* IS_REPREP_ID_LVC =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* I_HTML_HEIGHT_TOP =
* I_HTML_HEIGHT_END =
* IT_ALV_GRAPHICS =
* IT_EXCEPT_QINFO_LVC =
* IR_SALV_FULLSCREEN_ADAPTER =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = gt_data
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SET_PF_STATUS
*&---------------------------------------------------------------------*
*& 定义工具栏按钮状态
*&---------------------------------------------------------------------*
FORM set_pf_status USING pt_exclude TYPE slis_t_extab .
* 声明按钮设置内表
DATA:lt_exclude TYPE slis_t_extab.
lt_exclude = VALUE #( BASE lt_exclude ( fcode = '&ADDLINE' ) ).
SET PF-STATUS 'STANDARD' EXCLUDING lt_exclude.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form ALV_USER_COMMAND
*&---------------------------------------------------------------------*
*& 定义ALV按钮事件
*&---------------------------------------------------------------------*
FORM user_command USING r_ucomm TYPE sy-ucomm rs_selfield TYPE slis_selfield .
* 设置ALV内容改变事件回调
DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
DATA: lv_index TYPE i.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lr_grid.
CALL METHOD lr_grid->check_changed_data.
* 设置按钮触发事件
CASE r_ucomm.
WHEN '&IC1'. " ALV双击事件/热点链接事件
"获取当前双击的行目索引"
READ TABLE gt_data INDEX rs_selfield-tabindex ASSIGNING FIELD-SYMBOL(<fs_opt>).
"判断是否是指定的字段?"
IF rs_selfield-fieldname EQ 'CARRID'.
MESSAGE '当前数据主键为:CARRID' TYPE 'S'.
* PERFORM frm_alv_event_ic1.
ENDIF.
* WHEN '&PRINT'.
* PERFORM FRM_ALV_EVENT_PRINT. " 调用SF打印事件子例程
* WHEN '&BDC'.
* PERFORM FRM_ALV_EVENT_BDC. " 调用BDC批导事件子例程
* WHEN '&BAPI'.
* PERFORM FRM_ALV_EVENT_BAPI. " 调用BAPI批导事件子例程
* WHEN '&FC01'.
* PERFORM FRM_ALV_EVENT_FC01. " 调用FC01按钮事件子例程
* WHEN '&FC02'.
* PERFORM FRM_ALV_EVENT_FC02. " 调用FC02按钮事件子例程
* WHEN OTHERS.
ENDCASE.
rs_selfield-refresh = 'X'. " 刷新ALV屏幕
ENDFORM.
*&---------------------------------------------------------------------*
*& Form TOP_OF_PAGE
*&---------------------------------------------------------------------*
*& TOP_OF_PAGE
*&---------------------------------------------------------------------*
FORM top_of_page.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form HTML_TOP_OF_PAGE
*&---------------------------------------------------------------------*
*& HTML_TOP_OF_PAGE
*&---------------------------------------------------------------------*
FORM html_top_of_page USING p_cl_dd TYPE REF TO cl_dd_document.
"定义登录用户的描述
DATA:l_name TYPE string,
name_first LIKE adrp-name_first,
name_last LIKE adrp-name_last.
"定义登录日期
DATA: l_date TYPE string .
"定义缓冲区变量
DATA:m_p TYPE i,
m_buffer TYPE string.
"得到登录用户的描述
SELECT SINGLE adrp~name_first
adrp~name_last
INTO (name_first,name_last)
FROM adrp
INNER JOIN usr21 ON adrp~persnumber = usr21~persnumber
WHERE usr21~bname = sy-uname .
IF sy-subrc = 0 .
CONCATENATE name_last name_first INTO l_name .
ELSE .
l_name = sy-uname .
ENDIF.
CLEAR name_first .
CLEAR name_last .
"拼接制表日期
CONCATENATE sy-datum+0(4) '.'
sy-datum+4(2) '.'
sy-datum+6(2)
INTO l_date .
"开始输出表头标题
m_buffer = '<HTML><CENTER><H1>ALV测试</H1></CENTER></HTML>' .
CALL METHOD p_cl_dd->html_insert
EXPORTING
contents = m_buffer
CHANGING
position = m_p.
"输出制表人和制表日期
CONCATENATE '<P ALIGN = CENTER >出表人:' l_name' 出表日期:' l_date INTO m_buffer .
CALL METHOD p_cl_dd->html_insert
EXPORTING
contents = m_buffer
CHANGING
position = m_p.
ENDFORM.