案例:实现ALV——编辑库存地点字段提供搜索帮助.

代码实现步骤:

1.设置LGORT字段编辑及F4属性

  1. CLEAR gs_fieldcat.
  2. gs_fieldcat-edit = 'X'. "ALV字段可编辑"
  3. gs_fieldcat-f4availabl = 'X'. "ALV字段F4帮助"
  4. MODIFY gt_fieldcat FROM gs_fieldcat TRANSPORTING edit f4availabl
  5. WHERE fieldname = 'LGORT' .

2.定义需要的参数变量

  1. DATA: gt_event TYPE slis_t_event. "ALV事件参数"
  2. DATA: stbl TYPE lvc_s_stbl, "ALV屏幕刷新参数
  3. g_grid TYPE REF TO cl_gui_alv_grid. "ALV容器对象

3.定义ALV实例类及F4方法

  1. *----------------------------------------------------------------------*
  2. * CLASS lcl_event_handler DEFINITION
  3. *----------------------------------------------------------------------*
  4. * 类定义 && F4方法声明
  5. *----------------------------------------------------------------------*
  6. CLASS lcl_event_handler DEFINITION."类定义
  7. PUBLIC SECTION.
  8. METHODS:
  9. * F4搜索帮助事件
  10. handle_f4 FOR EVENT onf4 OF cl_gui_alv_grid
  11. IMPORTING e_fieldname
  12. es_row_no
  13. er_event_data
  14. et_bad_cells.
  15. ENDCLASS. "lcl_event_handler DEFINITION
  16. *----------------------------------------------------------------------*
  17. * CLASS lcl_event_handler IMPLEMENTATION
  18. *----------------------------------------------------------------------*
  19. * 类实现 && F4方法实现
  20. *----------------------------------------------------------------------*
  21. CLASS lcl_event_handler IMPLEMENTATION."类实现
  22. METHOD:handle_f4.
  23. * 窗口时间参数的自定义f4检索帮助
  24. CASE e_fieldname.
  25. WHEN 'LGORT'. "内表字段名称
  26. PERFORM f4_help_lgort USING e_fieldname
  27. es_row_no.
  28. er_event_data->m_event_handled = 'X'.
  29. ENDCASE.
  30. * 设置后,alv稳定刷新
  31. stbl-row = 'X'." 基于行的稳定刷新
  32. stbl-col = 'X'." 基于列稳定刷新
  33. CALL METHOD g_grid->refresh_table_display
  34. EXPORTING
  35. is_stable = stbl.
  36. ENDMETHOD. "HANDLE_F4
  37. ENDCLASS. "lcl_event_handler IMPLEMENTATION

4.注册事件

  1. *&---------------------------------------------------------------------*
  2. *& Form frm_display_alv
  3. *&---------------------------------------------------------------------*
  4. *& ALV展示函数
  5. *&---------------------------------------------------------------------*
  6. FORM frm_display_alv .
  7. * 在调用ALV函数之前,将事件注册到事件参数里面。
  8. APPEND VALUE #( name = 'CALLER_EXIT' form = 'FRM_REGISTER_EVENTS' ) TO gt_event.
  9. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
  10. EXPORTING
  11. i_callback_program = sy-repid
  12. i_callback_pf_status_set = 'SET_PF_STATUS'
  13. i_callback_user_command = 'ALV_USER_COMMAND'
  14. is_layout_lvc = gs_layout
  15. it_fieldcat_lvc = gt_fieldcat
  16. it_events = gt_event
  17. i_save = 'A'
  18. TABLES
  19. t_outtab = gt_output
  20. EXCEPTIONS
  21. program_error = 1
  22. OTHERS = 2.
  23. ENDFORM.

5.实现注册事件内容

  1. *&---------------------------------------------------------------------*
  2. *& Form register_events
  3. *&---------------------------------------------------------------------*
  4. * 注册事件
  5. *----------------------------------------------------------------------
  6. FORM frm_register_events USING e_grid TYPE slis_data_caller_exit.
  7. DATA:lt_f4 TYPE lvc_t_f4,
  8. ls_f4 TYPE lvc_s_f4.
  9. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
  10. IMPORTING
  11. e_grid = g_grid.
  12. *
  13. DATA: gr_event_handler TYPE REF TO lcl_event_handler.
  14. CREATE OBJECT gr_event_handler.
  15. * 如果有多个字段需要搜素帮助,以同样方式插入数据
  16. ls_f4-fieldname = 'LGORT'.
  17. ls_f4-register = 'X'.
  18. ls_f4-getbefore = 'X'.
  19. ls_f4-chngeafter = 'X'.
  20. INSERT ls_f4 INTO TABLE lt_f4.
  21. * 注册F4帮助事件
  22. SET HANDLER gr_event_handler->handle_f4 FOR g_grid.
  23. CALL METHOD g_grid->register_f4_for_fields
  24. EXPORTING
  25. it_f4 = lt_f4.
  26. ENDFORM. "register_events

6.实现F4子程序块

  1. *&---------------------------------------------------------------------*
  2. *& Form f4_help_route
  3. *&---------------------------------------------------------------------*
  4. *& ROUTE搜索帮助
  5. *&---------------------------------------------------------------------*
  6. FORM f4_help_route USING p_fieldname TYPE lvc_fname
  7. p_row_no TYPE lvc_s_roid.
  8. DATA: lt_return TYPE STANDARD TABLE OF ddshretval,
  9. ls_return TYPE ddshretval.
  10. * 获取ALV上点击的行数据
  11. READ TABLE gt_output ASSIGNING <fs_opt> INDEX p_row_no-row_id.
  12. IF p_fieldname = 'LGORT'.
  13. SELECT lgort,lgobe INTO TABLE @DATA(lt_t001l) FROM t001l .
  14. SORT lt_t001l BY lgort.
  15. CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
  16. EXPORTING
  17. retfield = 'LGORT' "筛选内表里面的字段
  18. dynpprog = sy-repid
  19. dynpnr = sy-dynnr
  20. dynprofield = 'GS_OUTPUT-LGORT' "ALV内表字段
  21. value_org = 'S'
  22. " CALLBACK_PROGRAM = SY-REPID
  23. TABLES
  24. value_tab = lt_t001l "需要显示帮助的值内表
  25. return_tab = lt_return "返回值
  26. EXCEPTIONS
  27. parameter_error = 1
  28. no_values_found = 2
  29. OTHERS = 3.
  30. * 将搜索帮助选中的返回值写到ALV上
  31. IF sy-subrc = 0.
  32. READ TABLE lt_return INTO ls_return INDEX 1.
  33. IF ls_return-fieldval IS NOT INITIAL .
  34. <fs_opt>-lgort = ls_return-fieldval.
  35. ENDIF.
  36. ENDIF.
  37. ENDIF.
  38. ENDFORM.

效果:


image.png