SAP dialog 客制化容器中alv搜索帮助
在使用客制化容器的时候,在里面做alv展现的时候,同时可能对alv中的数据进行修改,然后再修改的时候还要进行搜索帮助来协助数据的填入
我这边就用一下之前的程序来做测试了,程序的构建看这个blog即可 https://www.cnblogs.com/pnj-owowa/p/17984569
结果展示
定义类型并实例化
TYPES: BEGIN OF ty_mara,
matnr TYPE mara-matnr,
mtart TYPE mara-mtart,
zbox TYPE char1,
END OF ty_mara.
DATA: gt_mara_f4 TYPE STANDARD TABLE OF ty_mara,
gs_mara_f4 TYPE ty_mara.
类构建
再类的包含文件中添加 类的定义和实施
CLASS lcl_event_receiverundo DEFINITION.
PUBLIC SECTION.
METHODS:
handle_f4 FOR EVENT onf4 OF cl_gui_alv_grid
IMPORTING e_fieldname "列名
es_row_no "行号
er_event_data
et_bad_cells.
ENDCLASS. "LCL_EVENT_RECEIVER
DATA: event_receiverundo TYPE REF TO lcl_event_receiverundo.
CLASS lcl_event_receiverundo IMPLEMENTATION.
METHOD handle_f4.
* 窗口时间参数的自定义f4检索帮助
CASE e_fieldname.
WHEN 'MATNR'. "内表字段名称
PERFORM f4_help_matnr USING e_fieldname "列名
es_row_no "行号
er_event_data.
ENDCASE.
ENDMETHOD.
ENDCLASS.
设置fieldcat
设置 edit 和 f4availabl 属性
DEFINE _set_fieldcat.
APPEND VALUE #(
fieldname = &1
ref_table = &2
ref_field = &3
coltext = &4
scrtext_l = &4
scrtext_m = &4
scrtext_s = &4
edit = SWITCH #( &1 WHEN 'MATNR' THEN abap_on )
f4availabl = SWITCH #( &1 WHEN 'MATNR' THEN abap_on )
) TO gt_fieldcat.
END-OF-DEFINITION.
_set_fieldcat 'MATNR' 'MARA' 'MATNR' '物料号'. "
_set_fieldcat 'MTART' 'MARA' 'MTART' '物料类型'. "
frm_screen
在构建屏幕的例程中 需要增加触发事件
PERFORM frm_set_layout. "设置ALV输出格式
PERFORM frm_set_fieldcat. "设置ALV输出字段
PERFORM frm_set_toolbar. "设置alv状态栏
IF wa_custom_container IS INITIAL .
CREATE OBJECT wa_custom_container
EXPORTING
container_name = wa_container.
CREATE OBJECT alv_grid
EXPORTING
i_parent = wa_custom_container.
PERFORM frm_set_event USING alv_grid. "设置触发事件
CALL METHOD alv_grid->set_table_for_first_display
EXPORTING
i_structure_name = 'GS_MARA'
is_layout = gs_layout
it_toolbar_excluding = gt_ui_func
CHANGING
it_outtab = gt_mara
it_fieldcatalog = gt_fieldcat.
ENDIF.
PERFORM frm_refresh_alv USING alv_grid.
frm_set_event
FORM frm_set_event USING pv_grid TYPE REF TO cl_gui_alv_grid.
"事件响应
DATA: gr_event_handler TYPE REF TO lcl_event_receiverundo .
CREATE OBJECT gr_event_handler.
DATA:lt_f4 TYPE lvc_t_f4,
ls_f4 TYPE lvc_s_f4.
CLEAR: lt_f4.
"设置事件-回车
CALL METHOD pv_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter
EXCEPTIONS
error = 1
OTHERS = 2.
" 单元格失去焦点触发
CALL METHOD pv_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified
EXCEPTIONS
error = 1
OTHERS = 2.
CLEAR ls_f4.
ls_f4-fieldname = 'MATNR'. "需要定义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_f4 FOR pv_grid.
CALL METHOD pv_grid->register_f4_for_fields
EXPORTING
it_f4 = lt_f4.
ENDFORM.
f4_help_matnr
实施类中的例程
FORM frm_set_event USING pv_grid TYPE REF TO cl_gui_alv_grid.
"事件响应
DATA: gr_event_handler TYPE REF TO lcl_event_receiverundo .
CREATE OBJECT gr_event_handler.
DATA:lt_f4 TYPE lvc_t_f4,
ls_f4 TYPE lvc_s_f4.
CLEAR: lt_f4.
"设置事件-回车
CALL METHOD pv_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter
EXCEPTIONS
error = 1
OTHERS = 2.
" 单元格失去焦点触发
CALL METHOD pv_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified
EXCEPTIONS
error = 1
OTHERS = 2.
CLEAR ls_f4.
ls_f4-fieldname = 'MATNR'. "需要定义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_f4 FOR pv_grid.
CALL METHOD pv_grid->register_f4_for_fields
EXPORTING
it_f4 = lt_f4.
ENDFORM.
注意事项
在使用搜索帮助回填数据的时候,检查alv更改数据的方法会报错,这里我就注释了一下,如果放到实际生产情况,需要做一个标识来 控制不走这个方法
我这里是在刷新例程中注释的,如果跟着看下来的应该知道在哪里
* CALL METHOD pv_grid->check_changed_data. "检查ALV更改数据