前言
我们ALV选择自定义值的方法有下拉列表,搜索帮助等。
ALV单元格下拉列表:(历史博文)https://blog.csdn.net/JZYDDFZJ/article/details/129492159?spm=1001.2014.3001.5502
接下来本文是自定义ALV单元格F4搜索帮助,为了使文章更加清晰,参考了寒武青锋_ABAP-CSDN博客寒武青锋老师的博客,希望能帮助到大家
一、介绍
具体方法如下:
1.FIELDCAT--F4AVAILABL = ABAP_TRUE;
2.触发F4搜索帮助事件:CL_GUI_ALV_GRID的ONF4事件;
3.响应事件
DATA: gr_event_handler TYPE REF TO lcl_event_handler .
CREATE OBJECT gr_event_handler.
DATA:lt_f4 TYPE lvc_t_f4,
ls_f4 TYPE lvc_s_f4.
ls_f4-fieldname = 'F4HELP'. "需要定义F4帮助的字段
ls_f4-register = 'X'.
ls_f4-getbefore = 'X'.
ls_f4-chngeafter = 'X'.
INSERT ls_f4 INTO TABLE lt_f4.
SET HANDLER gr_event_handler->handle_onf4 FOR go_grid.
CALL METHOD go_grid->register_f4_for_fields
EXPORTING
it_f4 = lt_f4.
4.最后F4的PERFORM调用函数 F4IF_INT_TABLE_VALUE_REQUEST 生成搜索帮助,最后代码是ALV的写入与刷新。
二、实现步骤
1.代码展示
代码如下(示例):
*&---------------------------------------------------------------------*
*& 程 序 名:YTEST_001
*& 程序描述:ABAP ALV自定义F4搜索帮助
*& 创 建 者:爱吃鱼香肉丝的abaper
*& 创建日期:2023/08/09
*&---------------------------------------------------------------------*
*& 版本 修改者(公司) 日期 修改描述
*& 1.0.0 XXXX YYYYMMDD 创建程序
*&---------------------------------------------------------------------*
REPORT ytest_001.
*&---------------------------------------------------------------------*
* TYPES
*&---------------------------------------------------------------------*
TABLES:sflight.
TYPES:
BEGIN OF ty_alv,
carrid TYPE sflight-carrid, " 航线代码
fldate TYPE sflight-fldate, " 航班日期
price TYPE sflight-price, " 航空运费
planetype TYPE sflight-planetype, " 飞机类型
paymentsum TYPE sflight-paymentsum, " 当前预定总数
f4help TYPE auart, " 搜索帮助(销售凭证类型)
END OF ty_alv,
tt_alv TYPE STANDARD TABLE OF ty_alv.
*&---------------------------------------------------------------------*
* CONSTANTS
*&---------------------------------------------------------------------*
CONSTANTS:
BEGIN OF c_ucomm,
action01 TYPE sy-ucomm VALUE '&ZALL',text01 TYPE text VALUE '全选 ',
action02 TYPE sy-ucomm VALUE '&ZSAL',text02 TYPE text VALUE '取消全选',
END OF c_ucomm,
BEGIN OF c_fcat,
name01 TYPE fieldname VALUE 'CARRID ',text01 TYPE fieldtext VALUE '航线代码',
name02 TYPE fieldname VALUE 'FLDATE ',text02 TYPE fieldtext VALUE '航班日期',
name03 TYPE fieldname VALUE 'PRICE ',text03 TYPE fieldtext VALUE '航空运费',
name04 TYPE fieldname VALUE 'PLANETYPE ',text04 TYPE fieldtext VALUE '飞机类型',
name05 TYPE fieldname VALUE 'PAYMENTSUM ',text05 TYPE fieldtext VALUE '当前预定总数',
name06 TYPE fieldname VALUE 'F4HELP ',text06 TYPE fieldtext VALUE '搜索帮助(销售凭证类型)',
END OF c_fcat.
*&---------------------------------------------------------------------*
* DEFIEN ALV
*&---------------------------------------------------------------------*
DATA:go_container TYPE REF TO cl_gui_docking_container,
go_grid TYPE REF TO cl_gui_alv_grid,
gt_exclude TYPE ui_functions,
gt_fieldcat TYPE lvc_t_fcat,
gs_layout TYPE lvc_s_layo,
gs_variant TYPE disvariant,
gv_save,
ok_code TYPE sy-ucomm,
save_code TYPE sy-ucomm.
*&---------------------------------------------------------------------*
* GLOBAL INTERNAL TABLES
*&---------------------------------------------------------------------*
DATA:
gt_out TYPE tt_alv.
*&---------------------------------------------------------------------*
* GLOBAL MACROS
*&---------------------------------------------------------------------*
DEFINE macro_fcat.
ls_fieldcat-fieldname = &1.
ls_fieldcat-reptext = &2.
APPEND ls_fieldcat TO ct_fieldcat.
CLEAR ls_fieldcat.
END-OF-DEFINITION.
*----------------------------------------------------------------------*
* CLASS LCL_EVENT_HANDLER DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_event_handler DEFINITION.
PUBLIC SECTION.
METHODS:
*-----F4
handle_onf4 FOR EVENT onf4 OF cl_gui_alv_grid
IMPORTING e_fieldname es_row_no er_event_data.
ENDCLASS.
*----------------------------------------------------------------------*
* CLASS LCL_EVENT_HANDLER IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION.
*--F4
METHOD handle_onf4.
PERFORM frm_onf4_help USING e_fieldname es_row_no er_event_data .
ENDMETHOD.
ENDCLASS.
*&---------------------------------------------------------------------*
* SELECTION-SCREEN
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS:
s_carrid FOR sflight-carrid.
SELECTION-SCREEN END OF BLOCK b01.
*&----------------------------------------------------------------------
*& INITIALIZATION.
*&----------------------------------------------------------------------
INITIALIZATION.
* 初始化
PERFORM frm_initial_data.
*&----------------------------------------------------------------------
*& AT SELECTION-SCREEN OUTPUT
*&----------------------------------------------------------------------
AT SELECTION-SCREEN OUTPUT.
*&----------------------------------------------------------------------
*& AT SELECTION-SCREEN
*&----------------------------------------------------------------------
AT SELECTION-SCREEN.
*&----------------------------------------------------------------------
*& START-OF-SELECTION
*&----------------------------------------------------------------------
START-OF-SELECTION.
* 数据处理
PERFORM frm_get_data.
PERFORM frm_show_alv.
*&---------------------------------------------------------------------*
*& Form FRM_INITIAL_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_initial_data .
CLEAR gt_out.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_data .
SELECT
carrid,
fldate,
price,
planetype,
paymentsum
FROM sflight
WHERE carrid IN @s_carrid
INTO CORRESPONDING FIELDS OF TABLE @gt_out
UP TO 20 ROWS.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SHOW_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_show_alv .
CALL SCREEN 9000.
ENDFORM.
*&---------------------------------------------------------------------*
*& Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9000 OUTPUT.
DATA:lv_title TYPE string.
CLEAR lv_title.
lv_title = 'ABAP ALV自定义F4搜索帮助'.
SET PF-STATUS '9000'. " 定义gui状态
SET TITLEBAR '9000' WITH lv_title. " 定义gui标题
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module ALV_DES OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE alv_des OUTPUT.
DATA:lt_sort TYPE lvc_t_sort.
IF go_grid IS INITIAL .
CREATE OBJECT go_container
EXPORTING
repid = sy-repid
dynnr = '9000'
extension = 2050
side = cl_gui_docking_container=>property_floating.
CREATE OBJECT go_grid
EXPORTING
i_parent = go_container.
* 获取字段目录
PERFORM prepare_field_catalog CHANGING gt_fieldcat .
* 获取样式
PERFORM prepare_layout CHANGING gs_layout .
* 取消没用的按钮
PERFORM exclude_tb_functions CHANGING gt_exclude.
* 响应事件
PERFORM eventload.
* 锚定ALV变式标记
CLEAR gs_variant.
gs_variant = sy-repid.
gv_save = 'A'.
gs_variant-report = |{ sy-repid }{ sy-dynnr }|.
*-----显示ALV-------------------------------------------
PERFORM frm_alv_display USING gt_out.
ELSE .
*----------------------------刷新ALV----------------------
" 刷新ALV
PERFORM frm_refresh_alv.
ENDIF .
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form PREPARE_LAYOUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->PS_LAYOUT text
*----------------------------------------------------------------------*
FORM prepare_layout
CHANGING ps_layout TYPE lvc_s_layo.
ps_layout-cwidth_opt = 'X'. " 优化行宽度
ps_layout-zebra = 'X'. " 斑马纹
ps_layout-sel_mode = 'D'. " 选择方式
ps_layout-box_fname = 'SEL'. " 指定行选择字段
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV_DISPLAY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> GT_OUT
*&---------------------------------------------------------------------*
FORM frm_alv_display
USING pt_table.
CALL METHOD go_grid->set_table_for_first_display
EXPORTING
is_layout = gs_layout
it_toolbar_excluding = gt_exclude
is_variant = gs_variant
i_save = gv_save
CHANGING
it_outtab = pt_table
it_fieldcatalog = gt_fieldcat.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_REFRESH_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_refresh_alv .
DATA:ls_stable TYPE lvc_s_stbl.
"刷新ALV
ls_stable-row = 'X'.
ls_stable-col = 'X'.
CALL METHOD go_grid->refresh_table_display
EXPORTING
is_stable = ls_stable.
ENDFORM.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
save_code = ok_code.
CLEAR ok_code.
CASE save_code.
* 定义返回按钮
WHEN 'BACK'.
LEAVE TO SCREEN 0.
WHEN 'EXIT' OR 'EXIT2'.
LEAVE PROGRAM.
WHEN 'SAVE'.
WHEN OTHERS.
CALL METHOD go_grid->set_function_code
CHANGING
c_ucomm = save_code.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form PREPARE_FIELD_CATALOG
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- GT_FIELDCAT
*&---------------------------------------------------------------------*
FORM prepare_field_catalog
CHANGING ct_fieldcat TYPE lvc_t_fcat.
DATA:
ls_fieldcat TYPE lvc_s_fcat.
macro_fcat:
c_fcat-name01 c_fcat-text01,
c_fcat-name02 c_fcat-text02,
c_fcat-name03 c_fcat-text03,
c_fcat-name04 c_fcat-text04,
c_fcat-name05 c_fcat-text05,
c_fcat-name06 c_fcat-text06.
LOOP AT ct_fieldcat ASSIGNING FIELD-SYMBOL(<fs_fieldcat>)
WHERE fieldname = 'F4HELP'.
<fs_fieldcat>-f4availabl = abap_true." F4 help
<fs_fieldcat>-edit = abap_true." 可编辑
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_BUTTEN_CLICK
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> ES_COL_ID
*& --> ES_ROW_NO
*&---------------------------------------------------------------------*
FORM frm_onf4_help
USING pv_fieldname " ALV列字段名称
ps_row_no TYPE lvc_s_roid " 行号
pr_event_data TYPE REF TO cl_alv_event_data .
DATA:lt_ddshretval TYPE TABLE OF ddshretval.
SELECT
auart AS f4help, " 字段一定要和ALV展示数据的字段一致 否则会错乱
bezei
FROM tvakt
WHERE spras = '1'
INTO TABLE @DATA(lt_auart).
CASE pv_fieldname.
WHEN 'F4HELP'.
READ TABLE gt_out INTO DATA(ls_out) INDEX ps_row_no-row_id.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'F4HELP' " ALV-F4字段
dynpprog = sy-repid " 当前程序
dynpnr = sy-dynnr " 当前屏幕
value_org = 'S' " 默认为C但是此处不用S不行
callback_program = sy-repid
TABLES
value_tab = lt_auart " F4帮助值的表
return_tab = lt_ddshretval
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc = 0.
* 将选的值填入ALV字段中
READ TABLE gt_out INTO ls_out INDEX ps_row_no-row_id.
IF sy-subrc = 0.
READ TABLE lt_ddshretval INTO DATA(ls_ddshretval) INDEX 1.
IF ls_ddshretval-fieldval IS NOT INITIAL.
ls_out-f4help = ls_ddshretval-fieldval.
ENDIF.
MODIFY gt_out FROM ls_out INDEX ps_row_no-row_id TRANSPORTING f4help.
ENDIF.
ENDIF.
WHEN OTHERS.
ENDCASE.
* "X表示事件已经处理,不会去调取系统标准搜索帮助,(不填写参考字段参考表,也可以忽略这个标识)
pr_event_data->m_event_handled = 'X'.
* ALV刷新
PERFORM frm_refresh_alv.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form EVENTLOAD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM eventload .
* 事件响应
DATA: gr_event_handler TYPE REF TO lcl_event_handler .
CREATE OBJECT gr_event_handler.
DATA:lt_f4 TYPE lvc_t_f4,
ls_f4 TYPE lvc_s_f4.
* 设置事件-回车
CALL METHOD go_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter
EXCEPTIONS
error = 1
OTHERS = 2.
" 单元格失去焦点触发
CALL METHOD go_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified
EXCEPTIONS
error = 1
OTHERS = 2.
ls_f4-fieldname = 'F4HELP'. "需要定义F4帮助按钮的字段
ls_f4-register = 'X'.
ls_f4-getbefore = 'X'.
ls_f4-chngeafter = 'X'.
INSERT ls_f4 INTO TABLE lt_f4.
SET HANDLER gr_event_handler->handle_onf4 FOR go_grid.
CALL METHOD go_grid->register_f4_for_fields
EXPORTING
it_f4 = lt_f4.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form EXCLUDE_TB_FUNCTIONS
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- GT_EXCLUDE
*&---------------------------------------------------------------------*
FORM exclude_tb_functions
CHANGING pt_exclude TYPE ui_functions .
DATA ls_exclude TYPE ui_func.
ls_exclude = cl_gui_alv_grid=>mc_fc_maximum .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_delete_row .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy_row .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_append_row .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_cut .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_insert_row .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_move_row .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste_new_row .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_undo .
APPEND ls_exclude TO pt_exclude.
ENDFORM.
2.效果如下
效果展示:
双击,数据填充,刷新ALV
总结
希望能帮助需要的人!