1.效果图:

image.png

2.源代码:

  1. *---------------------------------------------------------------------*
  2. * Program ID : ZDEMO_ALV_FM *
  3. * Program Name: ZDEMO_ALV_FM *
  4. * T-CODE : ZDEMO_ALV_FM *
  5. * Program Type: *
  6. * Description : *
  7. *---------------------------------------------------------------------*
  8. * Date Created : 16.11.2021 19:26:50 *
  9. * Created By : ZHANGYH *
  10. *---------------------------------------------------------------------*
  11. * Edit Log : *
  12. * Version Date Author Remark *
  13. * <YYYYMMDDnnn> <YYYY/MM/DD> <修改人> <修改理由/内容> *
  14. *---------------------------------------------------------------------*
  15. REPORT zdemo_alv_fm.
  16. *--------------------------------------------------------------------*
  17. *&---------------------------「TABLES」-----------------------------&*
  18. *--------------------------------------------------------------------*
  19. TABLES:spfli.
  20. INCLUDE <list>.
  21. TYPES:BEGIN OF ty_data.
  22. INCLUDE STRUCTURE spfli.
  23. TYPES:
  24. sel TYPE c,
  25. color(4) TYPE c,
  26. cell_color TYPE slis_t_specialcol_alv,
  27. END OF ty_data.
  28. *--------------------------------------------------------------------*
  29. *&--------------------------「VARIABLE」----------------------------&*
  30. *--------------------------------------------------------------------*
  31. DATA:gt_data TYPE TABLE OF ty_data.
  32. DATA:gs_layout TYPE lvc_s_layo,
  33. gt_fieldcat TYPE lvc_t_fcat,
  34. gt_sort TYPE lvc_t_sort.
  35. *--------------------------------------------------------------------*
  36. *&--------------------------「PROCESS」-----------------------------&*
  37. *--------------------------------------------------------------------*
  38. START-OF-SELECTION.
  39. PERFORM frm_get_data.
  40. PERFORM frm_display_data.
  41. *&---------------------------------------------------------------------*
  42. *& Form frm_get_data
  43. *&---------------------------------------------------------------------*
  44. *& 获取数据
  45. *&---------------------------------------------------------------------*
  46. FORM frm_get_data.
  47. DATA:ls_cell TYPE slis_specialcol_alv.
  48. ls_cell-fieldname = 'DISTANCE'.
  49. ls_cell-color-col = '6'.
  50. ls_cell-color-int = '1'.
  51. ls_cell-color-inv = '0'.
  52. SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_data FROM spfli.
  53. LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<fs_opt>).
  54. IF <fs_opt>-distance > '1000' AND <fs_opt>-distance < '5000'.
  55. APPEND ls_cell TO <fs_opt>-cell_color.
  56. ELSE.
  57. <fs_opt>-color = 'C510'.
  58. ENDIF.
  59. ENDLOOP.
  60. ENDFORM.
  61. *&---------------------------------------------------------------------*
  62. *& Form FRM_DISPLAY_DATA
  63. *&---------------------------------------------------------------------*
  64. *& 数据展示输出
  65. *&---------------------------------------------------------------------*
  66. FORM frm_display_data .
  67. PERFORM frm_set_layout. " 设置ALV布局
  68. PERFORM frm_set_fieldcat. " 设置ALV展示字段
  69. PERFORM frm_display_alv. " 设置ALV数据展示
  70. ENDFORM.
  71. *&---------------------------------------------------------------------*
  72. *& Form FRM_SET_LAYOUT
  73. *&---------------------------------------------------------------------*
  74. *& 设置ALV布局
  75. *&---------------------------------------------------------------------*
  76. FORM frm_set_layout .
  77. gs_layout-zebra = 'X'. "使ALV呈现斑马线"
  78. gs_layout-sel_mode = 'D'. "选择模式A D"
  79. gs_layout-cwidth_opt = 'X'. "自动优化列宽"
  80. gs_layout-box_fname = 'SEL'. "使用系统选择行项”
  81. gs_layout-info_fname = 'COLOR'. "控制行单元格颜色选项”
  82. gs_layout-ctab_fname = 'CELL_COLOR'. "控制单元格颜色选项”
  83. gs_layout-totals_bef = 'X'. "设置后,求和数据放在ALV列标题下面"
  84. * spos:排序顺序 fieldname:排序字段 up:升序 down:降序
  85. gt_sort = VALUE #( BASE gt_sort
  86. "按照国家地区代码升序
  87. ( spos = '1' fieldname = 'COUNTRYTO' up = 'X' )
  88. "按照到达城市降序
  89. ( spos = '2' fieldname = 'CITYTO' down = 'X' )
  90. ).
  91. ENDFORM.
  92. *&---------------------------------------------------------------------*
  93. *& Form FRM_SET_FIELDCAT
  94. *&---------------------------------------------------------------------*
  95. *& 设置字段目录
  96. *&---------------------------------------------------------------------*
  97. FORM frm_set_fieldcat .
  98. CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
  99. EXPORTING
  100. * I_BUFFER_ACTIVE =
  101. i_structure_name = 'spfli'
  102. * I_CLIENT_NEVER_DISPLAY = 'X'
  103. * I_BYPASSING_BUFFER =
  104. * I_INTERNAL_TABNAME =
  105. CHANGING
  106. ct_fieldcat = gt_fieldcat
  107. EXCEPTIONS
  108. inconsistent_interface = 1
  109. program_error = 2
  110. OTHERS = 3.
  111. IF sy-subrc <> 0.
  112. * Implement suitable error handling here
  113. ENDIF.
  114. DATA:ls_fieldcat TYPE lvc_s_fcat.
  115. ls_fieldcat-hotspot = 'X'. "热点链接"
  116. ls_fieldcat-fix_column = 'X'. "固定列"
  117. MODIFY gt_fieldcat FROM ls_fieldcat TRANSPORTING hotspot fix_column WHERE fieldname = 'CARRID' .
  118. CLEAR ls_fieldcat.
  119. ls_fieldcat-do_sum = 'X'. "单列求和"
  120. * ls_fieldcat-no_sum = 'X'. "取消求和"
  121. "求和距离
  122. MODIFY gt_fieldcat FROM ls_fieldcat TRANSPORTING do_sum WHERE fieldname = 'DISTANCE' .
  123. CLEAR ls_fieldcat.
  124. ls_fieldcat-just = 'C'. "列内容居中对齐:L左对齐,C居中,R右对齐"
  125. MODIFY gt_fieldcat FROM ls_fieldcat TRANSPORTING do_sum WHERE fieldname = 'DISTANCE' .
  126. CLEAR ls_fieldcat.
  127. ls_fieldcat-emphasize = 'C310'. "固定列"
  128. MODIFY gt_fieldcat FROM ls_fieldcat TRANSPORTING emphasize WHERE fieldname = 'COUNTRYTO' .
  129. ENDFORM.
  130. *&---------------------------------------------------------------------*
  131. *& Form FRM_DISPLAY_ALV
  132. *&---------------------------------------------------------------------*
  133. *& 定义ALV输出函数
  134. *&---------------------------------------------------------------------*
  135. FORM frm_display_alv .
  136. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
  137. EXPORTING
  138. * I_INTERFACE_CHECK = ' '
  139. * I_BYPASSING_BUFFER =
  140. * I_BUFFER_ACTIVE =
  141. i_callback_program = sy-repid
  142. i_callback_pf_status_set = 'PF_STATUS_SET'
  143. i_callback_user_command = 'USER_COMMAND'
  144. i_callback_top_of_page = 'TOP_OF_PAGE'
  145. i_callback_html_top_of_page = 'HTML_TOP_OF_PAGE'
  146. * I_CALLBACK_HTML_END_OF_LIST = 'HTML_END_OF_LIST'
  147. * I_STRUCTURE_NAME =
  148. * I_BACKGROUND_ID = ' '
  149. * I_GRID_TITLE = ''
  150. * I_GRID_SETTINGS =
  151. is_layout_lvc = gs_layout
  152. it_fieldcat_lvc = gt_fieldcat
  153. * it_excluding = gt_exclude
  154. * IT_SPECIAL_GROUPS_LVC =
  155. it_sort_lvc = gt_sort
  156. * it_filter_lvc = gt_filter
  157. * IT_HYPERLINK =
  158. * IS_SEL_HIDE =
  159. * I_DEFAULT = 'X'
  160. * I_SAVE = ' '
  161. * IS_VARIANT =
  162. * it_events = gt_event
  163. * IT_EVENT_EXIT =
  164. * IS_PRINT_LVC =
  165. * IS_REPREP_ID_LVC =
  166. * I_SCREEN_START_COLUMN = 0
  167. * I_SCREEN_START_LINE = 0
  168. * I_SCREEN_END_COLUMN = 0
  169. * I_SCREEN_END_LINE = 0
  170. * I_HTML_HEIGHT_TOP =
  171. * I_HTML_HEIGHT_END =
  172. * IT_ALV_GRAPHICS =
  173. * IT_EXCEPT_QINFO_LVC =
  174. * IR_SALV_FULLSCREEN_ADAPTER =
  175. * IMPORTING
  176. * E_EXIT_CAUSED_BY_CALLER =
  177. * ES_EXIT_CAUSED_BY_USER =
  178. TABLES
  179. t_outtab = gt_data
  180. EXCEPTIONS
  181. program_error = 1
  182. OTHERS = 2.
  183. IF sy-subrc <> 0.
  184. * Implement suitable error handling here
  185. ENDIF.
  186. ENDFORM.
  187. *&---------------------------------------------------------------------*
  188. *& Form SET_PF_STATUS
  189. *&---------------------------------------------------------------------*
  190. *& 定义工具栏按钮状态
  191. *&---------------------------------------------------------------------*
  192. FORM set_pf_status USING pt_exclude TYPE slis_t_extab .
  193. * 声明按钮设置内表
  194. DATA:lt_exclude TYPE slis_t_extab.
  195. lt_exclude = VALUE #( BASE lt_exclude ( fcode = '&ADDLINE' ) ).
  196. SET PF-STATUS 'STANDARD' EXCLUDING lt_exclude.
  197. ENDFORM.
  198. *&---------------------------------------------------------------------*
  199. *& Form ALV_USER_COMMAND
  200. *&---------------------------------------------------------------------*
  201. *& 定义ALV按钮事件
  202. *&---------------------------------------------------------------------*
  203. FORM user_command USING r_ucomm TYPE sy-ucomm rs_selfield TYPE slis_selfield .
  204. * 设置ALV内容改变事件回调
  205. DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
  206. DATA: lv_index TYPE i.
  207. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
  208. IMPORTING
  209. e_grid = lr_grid.
  210. CALL METHOD lr_grid->check_changed_data.
  211. * 设置按钮触发事件
  212. CASE r_ucomm.
  213. WHEN '&IC1'. " ALV双击事件/热点链接事件
  214. "获取当前双击的行目索引"
  215. READ TABLE gt_data INDEX rs_selfield-tabindex ASSIGNING FIELD-SYMBOL(<fs_opt>).
  216. "判断是否是指定的字段?"
  217. IF rs_selfield-fieldname EQ 'CARRID'.
  218. MESSAGE '当前数据主键为:CARRID' TYPE 'S'.
  219. * PERFORM frm_alv_event_ic1.
  220. ENDIF.
  221. * WHEN '&PRINT'.
  222. * PERFORM FRM_ALV_EVENT_PRINT. " 调用SF打印事件子例程
  223. * WHEN '&BDC'.
  224. * PERFORM FRM_ALV_EVENT_BDC. " 调用BDC批导事件子例程
  225. * WHEN '&BAPI'.
  226. * PERFORM FRM_ALV_EVENT_BAPI. " 调用BAPI批导事件子例程
  227. * WHEN '&FC01'.
  228. * PERFORM FRM_ALV_EVENT_FC01. " 调用FC01按钮事件子例程
  229. * WHEN '&FC02'.
  230. * PERFORM FRM_ALV_EVENT_FC02. " 调用FC02按钮事件子例程
  231. * WHEN OTHERS.
  232. ENDCASE.
  233. rs_selfield-refresh = 'X'. " 刷新ALV屏幕
  234. ENDFORM.
  235. *&---------------------------------------------------------------------*
  236. *& Form TOP_OF_PAGE
  237. *&---------------------------------------------------------------------*
  238. *& TOP_OF_PAGE
  239. *&---------------------------------------------------------------------*
  240. FORM top_of_page.
  241. ENDFORM.
  242. *&---------------------------------------------------------------------*
  243. *& Form HTML_TOP_OF_PAGE
  244. *&---------------------------------------------------------------------*
  245. *& HTML_TOP_OF_PAGE
  246. *&---------------------------------------------------------------------*
  247. FORM html_top_of_page USING p_cl_dd TYPE REF TO cl_dd_document.
  248. "定义登录用户的描述
  249. DATA:l_name TYPE string,
  250. name_first LIKE adrp-name_first,
  251. name_last LIKE adrp-name_last.
  252. "定义登录日期
  253. DATA: l_date TYPE string .
  254. "定义缓冲区变量
  255. DATA:m_p TYPE i,
  256. m_buffer TYPE string.
  257. "得到登录用户的描述
  258. SELECT SINGLE adrp~name_first
  259. adrp~name_last
  260. INTO (name_first,name_last)
  261. FROM adrp
  262. INNER JOIN usr21 ON adrp~persnumber = usr21~persnumber
  263. WHERE usr21~bname = sy-uname .
  264. IF sy-subrc = 0 .
  265. CONCATENATE name_last name_first INTO l_name .
  266. ELSE .
  267. l_name = sy-uname .
  268. ENDIF.
  269. CLEAR name_first .
  270. CLEAR name_last .
  271. "拼接制表日期
  272. CONCATENATE sy-datum+0(4) '.'
  273. sy-datum+4(2) '.'
  274. sy-datum+6(2)
  275. INTO l_date .
  276. "开始输出表头标题
  277. m_buffer = '<HTML><CENTER><H1>ALV测试</H1></CENTER></HTML>' .
  278. CALL METHOD p_cl_dd->html_insert
  279. EXPORTING
  280. contents = m_buffer
  281. CHANGING
  282. position = m_p.
  283. "输出制表人和制表日期
  284. CONCATENATE '<P ALIGN = CENTER >出表人:' l_name'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;出表日期:' l_date INTO m_buffer .
  285. CALL METHOD p_cl_dd->html_insert
  286. EXPORTING
  287. contents = m_buffer
  288. CHANGING
  289. position = m_p.
  290. ENDFORM.