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.