一、干货:

  1. 在fieldcat-ref_table 和 fieldcat-ref_field 填入参考表和参考字段,搜索帮助就自动出来了。
  2. 想要选择屏幕添加自定义搜索帮助-转到这里
  3. ALV自定义搜索帮助。
    实例效果:

    双击选择之后:

自定义搜索帮助的实现方法

1.定义事件类

CLASS lcl_event_receiver DEFINITION.PUBLIC SECTION.METHODS:handle_f4 FOR EVENT onf4 OF cl_gui_alv_gridIMPORTING e_fieldname   "列名es_row_no     "行号er_event_data et_bad_cells.
ENDCLASS.

2.实现handle_f4 方法

CLASS lcl_event_receiver IMPLEMENTATION.METHOD  handle_f4.*     窗口时间参数的自定义f4检索帮助CASE e_fieldname.WHEN 'EMPLOYEE'.   "内表字段名称PERFORM f4_help_employee USING e_fieldname  "列名es_row_no  "行号er_event_data.ENDCASE.
*     设置后,alv稳定刷新stbl-row = 'X'." 基于行的稳定刷新stbl-col = 'X'." 基于列稳定刷新CALL METHOD g_grid->refresh_table_displayEXPORTINGis_stable = stbl.ENDMETHOD.                    "HANDLE_F4
ENDCLASS.      "方法perform的内容
FORM f4_help_employee USING p_fieldname  TYPE lvc_fnamep_row_no     TYPE lvc_s_roider_event_data TYPE REF TO cl_alv_event_data.DATA: lt_return TYPE STANDARD TABLE OF ddshretval,ls_return TYPE ddshretval.DATA :lv_eqart TYPE eqart.CLEAR gs_alv.READ TABLE gt_alv INTO gs_alv INDEX p_row_no-row_id.IF p_fieldname = 'EMPLOYEE'.  "展示内表字段DATA:lt_VS TYPE TABLE OF ztemorg."收件人搜索帮助表CLEAR:lt_VS,lt_return.SELECT * FROM ztemorg  INTO TABLE @lt_VS ."Z开头自定义的表,也是你搜索帮助要显示的内容SORT lt_VS BY employee .CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'EXPORTING
*       DDIC_STRUCTURE   = ' 'retfield         = 'EMPLOYEE'            "这个参数为帮助表中返回到ALV的字段的参数
*       PVALKEY          = ' 'dynpprog         = sy-repid           "当前程序,不写会有问题dynpnr           = sy-dynnr           "当前屏幕,不写会有问题value_org        = 'S'                "默认为C但是此处不用S不行callback_program = sy-repidTABLESvalue_tab        = lt_VS            "F4帮助值的表return_tab       = lt_returnEXCEPTIONSparameter_error  = 1no_values_found  = 2OTHERS           = 3.IF sy-subrc = 0.
****将选的值填入ALV字段中READ TABLE gt_alv INTO gs_alv INDEX p_row_no-row_id.IF sy-subrc = 0.READ TABLE lt_return INTO ls_return  INDEX 1.IF ls_return-fieldval IS NOT INITIAL.gs_alv-employee = ls_return-fieldval.ENDIF.CLEAR:ls_return.MODIFY gt_alv FROM gs_alv INDEX p_row_no-row_idTRANSPORTING employee.ENDIF."X表示事件已经处理,不会去调取系统标准搜索帮助,(不填写参考字段参考表,也可以忽略这个标识)er_event_data->m_event_handled = 'X'.ENDIF.ENDIF.
ENDFORM.

3.注册事件

FORM fm_button USING E_grid TYPE slis_data_caller_exit.DATA: lv_event_receiver TYPE REF TO lcl_event_receiver,lt_f4             TYPE lvc_t_f4,ls_f4             TYPE lvc_s_f4.IF g_grid IS INITIAL.CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'IMPORTINGe_grid = g_grid.ENDIF.* 设置enter事件CALL METHOD g_grid->register_edit_eventEXPORTING*       I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER. "回车时触发i_event_id = cl_gui_alv_grid=>mc_evt_modified. "单元格失去焦点触发EXCEPTIONSerror      = 1OTHERS     = 2."注册事件,设置,触发F4的搜索帮助CREATE OBJECT lv_event_receiver.SET HANDLER lv_event_receiver->handle_f4 FOR g_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 g_grid->register_f4_for_fieldsEXPORTINGit_f4 = lt_f4[].
ENDFORM.

4.fieldcat的配置

 ls_fieldcat-edit = 'X'.    "把这一列变为可修改ls_fieldcat-f4availabl = 'X'. "这个一定要打上X

5.具体实例

TYPE-POOLS: slis.
TYPE-POOLS: kcde.*&---------------------------------------------------------------------*
*&      TABLES
*&---------------------------------------------------------------------*
TABLES: spfli,ztemorg.*----------------------------------------------------------------------*
* GLOBAL INTERNAL TABLES DECLARATION
*----------------------------------------------------------------------*
DATA: gt_file TYPE filetable.*----------------------------------------------------------------------*
* GLOBAL VARIANTS DECLARATION
*----------------------------------------------------------------------*
DATA: g_repid TYPE sy-repid.
DATA: gt_field TYPE slis_t_fieldcat_alv.
*定义读入EXCEL的内表TYPES : BEGIN OF typ_alv ,carrid   TYPE spfli-carrid    , "connid   TYPE spfli-connid,cityfrom TYPE spfli-cityfrom,airpfrom TYPE spfli-airpfrom,employee TYPE ztemorg-employee, "人sel      TYPE c,END OF typ_alv .
DATA : gs_alv   TYPE typ_alv,gt_print TYPE TABLE OF typ_alv,gt_alv   TYPE TABLE OF typ_alv.*创建字段宏定义
DEFINE add_field.ls_fieldcat-fieldname = '&1' .  "字段名称ls_fieldcat-ref_table = &2. "关联表格ls_fieldcat-ref_field = &3."参考字段ls_fieldcat-coltext = &4. "描述文本APPEND ls_fieldcat TO gt_fieldcat.CLEAR ls_fieldcat.
END-OF-DEFINITION.* ALV 用
DATA:gs_layout   TYPE lvc_s_layo,gv_repid    TYPE repid,gt_fieldcat TYPE lvc_t_fcat,ls_fieldcat TYPE lvc_S_fcat.
DATA: g_grid TYPE REF TO cl_gui_alv_grid.
DATA stbl TYPE lvc_s_stbl.
DATA:gt_event TYPE slis_t_event WITH HEADER LINE."定义事件
CLASS lcl_event_receiver DEFINITION.PUBLIC SECTION."F4METHODS:handle_f4 FOR EVENT onf4 OF cl_gui_alv_gridIMPORTING e_fieldname   "列名es_row_no     "行号er_event_dataet_bad_cells.
ENDCLASS."方法实施
CLASS lcl_event_receiver IMPLEMENTATION.METHOD  handle_f4.*     窗口时间参数的自定义f4检索帮助CASE e_fieldname.WHEN 'EMPLOYEE'.   "内表字段名称PERFORM f4_help_employee USING e_fieldname  "列名es_row_no  "行号er_event_data.ENDCASE.
*     设置后,alv稳定刷新stbl-row = 'X'." 基于行的稳定刷新stbl-col = 'X'." 基于列稳定刷新CALL METHOD g_grid->refresh_table_displayEXPORTINGis_stable = stbl.ENDMETHOD.                    "HANDLE_F4ENDCLASS.                    "LCL_EVENT_RECEIVER IMPLEMENTATION*--------选择条件
SELECTION-SCREEN BEGIN OF BLOCK bl01 WITH FRAME TITLE TEXT-001.SELECT-OPTIONS:S_carrid FOR spfli-carrid , "航线s_connid FOR spfli-connid."航班
SELECTION-SCREEN END OF BLOCK bl01.*DATA: GT_ALVDATA LIKE BDCDATA OCCURS 0 WITH HEADER LINE.
*DATA: G_LIGHTS_NAME TYPE LVC_CIFNM VALUE 'LIGHT'.
*&---------------------------------------------------------------------*
*&   EVENT AT INITIALIZATION
*&---------------------------------------------------------------------*
INITIALIZATION .AT SELECTION-SCREEN OUTPUT .*----------------------------------------------------------------------*
* EVENT OCCURS AFTER THE SELECTION SCREEN HAS BEEN PROCESSED
*----------------------------------------------------------------------*
START-OF-SELECTION.PERFORM frm_auth_check.  "权限检查PERFORM frm_getdata .    "获取数据  --GETTING DATAPERFORM frm_display_data.  "展示ALVEND-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form frm_auth_check
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_auth_check .ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_getdata
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_getdata .SELECT *FROM spfliWHERE spfli~carrid IN @s_carrid "航线AND  spfli~connid IN @s_connid"航班INTO CORRESPONDING FIELDS OF TABLE @gt_alv.IF sy-subrc = 0.SORT gt_alv BY carrid connid.ENDIF.ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_display_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display_data .DATA : lv_html_header TYPE slis_formname  .
*定义输出模式CLEAR:gs_layout,gt_fieldcat.gs_layout-cwidth_opt         = 'X'.gs_layout-zebra              = 'X'.gs_layout-box_fname              = 'SEL'.gv_repid = sy-repid.PERFORM frm_set_fieldcat.gt_event-name = 'CALLER_EXIT'.gt_event-form = 'FM_BUTTON'.APPEND gt_event.*  TRY .CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'EXPORTINGi_callback_program       = gv_repidi_callback_pf_status_set = 'FRM_PF_STATUS'   "状态is_layout_lvc            = gs_layout     "布局it_events                = gt_event[]    "事件it_fieldcat_lvc          = gt_fieldcat   "字段显示i_save                   = 'A'TABLESt_outtab                 = gt_alv     "显示的内表EXCEPTIONSprogram_error            = 1OTHERS                   = 2.IF sy-subrc <> 0.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_fieldcat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_fieldcat .add_field:carrid   'SPFLI'  'CARRID'     '航线',connid   'SPFLI'  'CONNID '    '航班',cityfrom 'SPFLI'  'CITYFROM '  '起飞城市',airpfrom 'SPFLI'  'AIRPFROM'   '起飞机场',employee ''       ''           '人物自定义帮助'.LOOP AT gt_fieldcat INTO ls_fieldcat.IF ls_fieldcat-fieldname = 'EMPLOYEE'.ls_fieldcat-edit = 'X'.    "把这一列变为可修改ls_fieldcat-f4availabl = 'X'. "字段尾部,添加搜索帮助的的小按钮ENDIF.MODIFY gt_fieldcat FROM ls_fieldcat.CLEAR:ls_fieldcat.ENDLOOP.
ENDFORM.FORM frm_pf_status USING extab TYPE slis_t_extab.DATA: fcode TYPE TABLE OF sy-ucomm.CLEAR:fcode[].SET PF-STATUS 'STANDARD' EXCLUDING fcode[] ."添加状态
ENDFORM.FORM fm_button USING E_grid TYPE slis_data_caller_exit.DATA: lv_event_receiver TYPE REF TO lcl_event_receiver,lt_f4             TYPE lvc_t_f4,ls_f4             TYPE lvc_s_f4.IF g_grid IS INITIAL.CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'IMPORTINGe_grid = g_grid.ENDIF.* 设置enter事件CALL METHOD g_grid->register_edit_eventEXPORTINGi_event_id = cl_gui_alv_grid=>mc_evt_enterEXCEPTIONSerror      = 1OTHERS     = 2."注册事件,设置,触发F4的搜索帮助CREATE OBJECT lv_event_receiver.SET HANDLER lv_event_receiver->handle_f4 FOR g_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 g_grid->register_f4_for_fieldsEXPORTINGit_f4 = lt_f4[].
ENDFORM.FORM f4_help_employee USING p_fieldname  TYPE lvc_fnamep_row_no     TYPE lvc_s_roider_event_data TYPE REF TO cl_alv_event_data.DATA: lt_return TYPE STANDARD TABLE OF ddshretval,ls_return TYPE ddshretval.DATA :lv_eqart TYPE eqart.CLEAR gs_alv.READ TABLE gt_alv INTO gs_alv INDEX p_row_no-row_id.IF p_fieldname = 'EMPLOYEE'.  "展示内表字段DATA:lt_VS TYPE TABLE OF ztemorg."收件人搜索帮助表CLEAR:lt_VS,lt_return.SELECT * FROM ztemorg  INTO TABLE @lt_VS .SORT lt_VS BY employee .CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'EXPORTING
*       DDIC_STRUCTURE   = ' 'retfield         = 'EMPLOYEE'            "这个参数为帮助表中返回到选择屏幕的字段的参数
*       PVALKEY          = ' 'dynpprog         = sy-repid           "当前程序,不写会有问题dynpnr           = sy-dynnr           "当前屏幕,不写会有问题" dynprofield      = 'P_PERSON'       "选择屏幕上需要加F4帮助的字段value_org        = 'S'                "默认为C但是此处不用S不行callback_program = sy-repid"   callback_form    = 'CB_FORM'TABLESvalue_tab        = lt_VS            "F4帮助值的表return_tab       = lt_returnEXCEPTIONSparameter_error  = 1no_values_found  = 2OTHERS           = 3.IF sy-subrc = 0.
****将选的值填入ALV字段中READ TABLE gt_alv INTO gs_alv INDEX p_row_no-row_id.IF sy-subrc = 0.READ TABLE lt_return INTO ls_return  INDEX 1.IF ls_return-fieldval IS NOT INITIAL.gs_alv-employee = ls_return-fieldval.ENDIF.CLEAR:ls_return.MODIFY gt_alv FROM gs_alv INDEX p_row_no-row_idTRANSPORTING employee.ENDIF."X表示事件已经处理,不会去调取系统标准搜索帮助,(不填写参考字段参考表,也可以忽略这个标识)er_event_data->m_event_handled = 'X'.ENDIF.ENDIF.
ENDFORM.

使用注意点:
1.事件的使用是OOALV中使用的,我的是functionalv转OOALV,它的好处就是可以兼顾functionalv的便利和OOalv的事件。
2.要把里面的自定义表换成你的搜索帮助表。

参考链接: 阿胖的阿多-OOALV实现

ABAP ALV中自定义搜索帮助相关推荐

  1. ABAP:ALV中自定义搜索帮助

    如果希望ALV中某字段具有搜索帮助,第一种办法当然是对表中某字段的引用,设置ref_table.ref_field,将自动触发该字段所带的搜索帮助. 可不可以直接设置Searh Help呢?应该不可以 ...

  2. 77 行代码实现 ABAP ALV 中的双击事件处理试读版

    零基础 ABAP 学习教程系列文章的目录 ABAP 标准培训教程 BC400 学习笔记之一:ABAP 服务器的架构和一个典型的 ABAP 程序结构介绍 ABAP 标准培训教程 BC400 学习笔记之二 ...

  3. ABAP ALV中的字段目录fieldcat_lvc

    ABAP ALV报表中fieldcat_lvc 我一般会用到的写fieldcat的方式有两种,第一种是用FORM 和 PERFORM的子程序调用方式,另一种是用宏. 1. FORM的方式写field_ ...

  4. ABAP ALV OO 自定义Toolbar 和Command及listmenu按钮

    ALV OO 自定义Toolbar 和Command及listmenu按钮 前言 OOALV容器 OOALV 工具栏 1.定义OO 对象及字段 2.OO ALV FIELDCAT 字段定义 3.定义类 ...

  5. 77 行代码实现 ABAP ALV 中的双击事件处理

    我们在 ALV 开发专题的第二步骤里,为 ALV 输出的数据行,增添了颜色显示的功能: ALV 开发专题 27 行代码开发一个最简单的 SAP ALV 报表 给 ABAP ALV 报表的数据行增添颜色 ...

  6. 如何在ABAP ALV中具体的控制每个格子中的编辑属性

    代码如下:具体说明参见红色说明(本例子是从订单明细提取两个字段的数据到内表) REPORT ZALV_EDIT. TYPE-POOLS: SLIS. *- Fieldcatalog DATA: IT_ ...

  7. SAP ABAP alv中设置回车事件

    * 添加这段刷新代码   READ TABLE t_data_hz INDEX rs_selfield-tabindex.    " 将变动内容更新到内表   DATA: lr_grid T ...

  8. abap alv中设置数量(QUAN)字段输出时不要有小数位

    注意在做数据编辑的时候,必须要找出要出力的数量(QUAN)字段 对应的单位字段(UNIT),然后对于此字段的fieldcat中设置: fieldcat-fieldname      =  QUAN(数 ...

  9. ABAP ALV 总结

    ABAP ALV 总结整理 目录 一.ALV简介 1.简介 2.ALV_GRID介绍 3.其它描述 二.开发ALV的基本流程 三.ALV相关开发细节 1.标准ALV与对象ALV的共同开发细节 2.标准 ...

最新文章

  1. 工具安装===Sublime Text-安装
  2. threejs设置对象层次
  3. JDK源码解析之 Java.lang.Short
  4. Linux shell实例精讲 (一)
  5. Linux下DNS服务管理
  6. [转]NetBeans开发Applet方法实例学习
  7. VS C++ vector结构体 增加元素 删除元素 获取第一个元素 最后一个元素 清空元素
  8. Linux桌面文件被隐藏,在Deepin系统中隐藏桌面图标的好办法
  9. ios游戏开发 Sprite Kit教程:初学者 1
  10. 用于科学计算机的计算器特点是什么意思,科学计算器在线e
  11. 拆书帮第14期训练营——作业九:如何通过刻意练习来掌握临界知识
  12. su 与 su - 的区别
  13. 一元线性回归模型系数、方差估计、检验回归效果显著性,b的置信区间,Y约为X的指数函数时,求Y关于x的回归方程
  14. springboot 2.X——短信网关使用初体验
  15. 推荐系统中的bais系统(二)—Select Bais和Exposure Bias
  16. Qt - QLabel设置字体颜色
  17. Java——重写hashCode()和euqals()方法
  18. Android之Surface 与 SurfaceFlinger关系
  19. 全国大学生网络安全精英赛初赛(nisp一级)
  20. 阿里自然语言处理部总监分享:NLP技术的应用及思考

热门文章

  1. Oracle数据库监听启动报错
  2. 跬智信息(Kyligence)荣获浦东新区人工智能创新应用大赛一等奖
  3. HTML5的特效制作的基础介绍
  4. 逐步回归matlab函数,逐步回归matlab程序
  5. 去噪算法 matlab,经典滤波算法去噪对比实验(Matlab实现)
  6. 高精度GNSS定位的校正服务——状态域(SSR)校正和观测域(OSR)校正
  7. 2016中国国际石墨烯创新大会展商名录抢先看
  8. 完美卸载visual studio及其组件
  9. 非J2EE部署解决方案
  10. 吴恩达机器学习笔记week8——神经网络 Neutral network