ABAP ALV中自定义搜索帮助
一、干货:
- 在fieldcat-ref_table 和 fieldcat-ref_field 填入参考表和参考字段,搜索帮助就自动出来了。
- 想要选择屏幕添加自定义搜索帮助-转到这里
- 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中自定义搜索帮助相关推荐
- ABAP:ALV中自定义搜索帮助
如果希望ALV中某字段具有搜索帮助,第一种办法当然是对表中某字段的引用,设置ref_table.ref_field,将自动触发该字段所带的搜索帮助. 可不可以直接设置Searh Help呢?应该不可以 ...
- 77 行代码实现 ABAP ALV 中的双击事件处理试读版
零基础 ABAP 学习教程系列文章的目录 ABAP 标准培训教程 BC400 学习笔记之一:ABAP 服务器的架构和一个典型的 ABAP 程序结构介绍 ABAP 标准培训教程 BC400 学习笔记之二 ...
- ABAP ALV中的字段目录fieldcat_lvc
ABAP ALV报表中fieldcat_lvc 我一般会用到的写fieldcat的方式有两种,第一种是用FORM 和 PERFORM的子程序调用方式,另一种是用宏. 1. FORM的方式写field_ ...
- ABAP ALV OO 自定义Toolbar 和Command及listmenu按钮
ALV OO 自定义Toolbar 和Command及listmenu按钮 前言 OOALV容器 OOALV 工具栏 1.定义OO 对象及字段 2.OO ALV FIELDCAT 字段定义 3.定义类 ...
- 77 行代码实现 ABAP ALV 中的双击事件处理
我们在 ALV 开发专题的第二步骤里,为 ALV 输出的数据行,增添了颜色显示的功能: ALV 开发专题 27 行代码开发一个最简单的 SAP ALV 报表 给 ABAP ALV 报表的数据行增添颜色 ...
- 如何在ABAP ALV中具体的控制每个格子中的编辑属性
代码如下:具体说明参见红色说明(本例子是从订单明细提取两个字段的数据到内表) REPORT ZALV_EDIT. TYPE-POOLS: SLIS. *- Fieldcatalog DATA: IT_ ...
- SAP ABAP alv中设置回车事件
* 添加这段刷新代码 READ TABLE t_data_hz INDEX rs_selfield-tabindex. " 将变动内容更新到内表 DATA: lr_grid T ...
- abap alv中设置数量(QUAN)字段输出时不要有小数位
注意在做数据编辑的时候,必须要找出要出力的数量(QUAN)字段 对应的单位字段(UNIT),然后对于此字段的fieldcat中设置: fieldcat-fieldname = QUAN(数 ...
- ABAP ALV 总结
ABAP ALV 总结整理 目录 一.ALV简介 1.简介 2.ALV_GRID介绍 3.其它描述 二.开发ALV的基本流程 三.ALV相关开发细节 1.标准ALV与对象ALV的共同开发细节 2.标准 ...
最新文章
- 工具安装===Sublime Text-安装
- threejs设置对象层次
- JDK源码解析之 Java.lang.Short
- Linux shell实例精讲 (一)
- Linux下DNS服务管理
- [转]NetBeans开发Applet方法实例学习
- VS C++ vector结构体 增加元素 删除元素 获取第一个元素 最后一个元素 清空元素
- Linux桌面文件被隐藏,在Deepin系统中隐藏桌面图标的好办法
- ios游戏开发 Sprite Kit教程:初学者 1
- 用于科学计算机的计算器特点是什么意思,科学计算器在线e
- 拆书帮第14期训练营——作业九:如何通过刻意练习来掌握临界知识
- su 与 su - 的区别
- 一元线性回归模型系数、方差估计、检验回归效果显著性,b的置信区间,Y约为X的指数函数时,求Y关于x的回归方程
- springboot 2.X——短信网关使用初体验
- 推荐系统中的bais系统(二)—Select Bais和Exposure Bias
- Qt - QLabel设置字体颜色
- Java——重写hashCode()和euqals()方法
- Android之Surface 与 SurfaceFlinger关系
- 全国大学生网络安全精英赛初赛(nisp一级)
- 阿里自然语言处理部总监分享:NLP技术的应用及思考