CLASS lcl_event_receiver DEFINITION DEFERRED.
DATA: event_receiver TYPE REF TO lcl_event_receiver.
DATA: gt_fcat TYPE lvc_t_fcat,
gs_fcat TYPE lvc_s_fcat,
gs_layo TYPE lvc_s_layo,
gs_variant TYPE disvariant,
it_toolbar_excluding TYPE ui_functions,
stbl TYPE lvc_s_stbl.
DATA: alv_grid TYPE REF TO cl_gui_alv_grid,
gs_parent TYPE REF TO cl_gui_custom_container .
DATA: gs_dropdowm TYPE lvc_s_drop,
gt_dropdowm TYPE lvc_t_drop.
CLASS lcl_event_receiver DEFINITION.
PUBLIC SECTION.
" 声明单击事件的方法
METHODS handle_hotspot_click
FOR EVENT hotspot_click OF cl_gui_alv_grid
IMPORTING e_row_id e_column_id ES_ROW_NO.
METHODS handle_double_click FOR EVENT double_click OF cl_gui_alv_grid "定义类中的方法---双击
IMPORTING e_row e_column es_row_no. "
" "
METHODS handle_onf4 FOR EVENT onf4 OF cl_gui_alv_grid "定义类中的方法---F4帮助
IMPORTING e_fieldname es_row_no er_event_data . "
"
METHODS handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid "定义类中的方法---ALV状态栏按钮
IMPORTING e_object e_interactive . "
"
METHODS handle_user_command FOR EVENT user_command OF cl_gui_alv_grid "定义类中的方法---按钮触发方法
IMPORTING e_ucomm . "
"
METHODS handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid "定义类中的方法---数据修改时的方法
IMPORTING er_data_changed e_onf4 e_onf4_before e_onf4_after e_ucomm. "
METHODS handle_data_changed_finished FOR EVENT data_changed_finished OF cl_gui_alv_grid
IMPORTING e_modified et_good_cells.
ENDCLASS. "LCL_EVENT_RECEIVER
CLASS lcl_event_receiver IMPLEMENTATION.
METHOD handle_hotspot_click.
PERFORM FRM_handle_hotspot_click USING e_row_id e_column_id ES_ROW_NO.
ENDMETHOD. "handle_HOTSPOT_CLICK
METHOD handle_double_click."HANDLE_DOUBLE_CLICK双击后触发该段代码,可接T-CODE跳转等功能
* PERFORM frm_double_click USING e_row e_column es_row_no.
ENDMETHOD.
METHOD handle_onf4."需在ALV中调用触发一般与filedcat中的 f4availabl 参数同用
PERFORM frm_f4 USING e_fieldname es_row_no er_event_data.
ENDMETHOD.
METHOD handle_data_changed. "数据修改后触发,一般用在数据联动修改如数量字段修改,同时联动修改金额字段
PERFORM frm_data_changed USING er_data_changed e_onf4 e_onf4_before e_onf4_after e_ucomm.
ENDMETHOD.
METHOD handle_data_changed_finished."用途在于修改后的数据联动,
PERFORM frm_data_changed_finished USING e_modified et_good_cells.
ENDMETHOD.
METHOD handle_user_command."一般与HANDLE_TOOLBAR同用
PERFORM frm_user_command USING e_ucomm.
ENDMETHOD.
METHOD handle_toolbar. "在ALV状态栏增加按钮,一般是汇总按钮,新增后的按钮可触发HANDLE_USER_COMMAND方法
PERFORM frm_handle_toolbar USING e_object e_interactive.
ENDMETHOD.
ENDCLASS. "LCL_EVENT_RECEIVER IMPLEMENTATION
IF alv_grid IS NOT BOUND .
*--实例化 容器
CREATE OBJECT gs_parent
EXPORTING
container_name = 'ALV'.
*--将alv植入到容器中
CREATE OBJECT alv_grid
EXPORTING
i_parent = gs_parent.
CALL METHOD alv_grid->set_table_for_first_display
EXPORTING
is_layout = gs_layo
i_save = 'A'
i_default = 'X'
is_variant = VALUE disvariant( report = sy-repid handle = COND #( WHEN p_dr = 'X' THEN 1 WHEN p_wh = 'X' THEN 2 WHEN p_cx = 'X' THEN 3 ) )
it_toolbar_excluding = it_toolbar_excluding
CHANGING
it_outtab = gt_data
it_fieldcatalog = gt_fcat.
*--创建事件
CREATE OBJECT event_receiver.
SET HANDLER event_receiver->handle_double_click FOR alv_grid. "双击事件
SET HANDLER event_receiver->handle_onf4 FOR alv_grid. "F4帮助事件
SET HANDLER event_receiver->handle_toolbar FOR alv_grid. "ALV状态栏
SET HANDLER event_receiver->handle_user_command FOR alv_grid. "按钮事件
SET HANDLER event_receiver->handle_hotspot_click FOR alv_grid. "按钮事件
* SET HANDLER event_receiver->handle_data_changed FOR alv_grid. "修改事件
* SET HANDLER event_receiver->handle_data_changed_finished FOR alv_grid. "数据修改后触发事件
alv_grid->set_toolbar_interactive( ).
CALL METHOD alv_grid->set_drop_down_table
EXPORTING
it_drop_down = gt_dropdowm. "添加下拉框方法到ALV中顯示
alv_grid->register_f4_for_fields( VALUE lvc_t_f4( register = abap_true getbefore = abap_true chngeafter = abap_true ( fieldname = 'ZWTEJLX' ) ( fieldname = 'ZFZSQE' ) ( fieldname = 'ZSGTXT' ) ) ).
CALL METHOD alv_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified.
CALL METHOD alv_grid->set_frontend_layout
EXPORTING
is_layout = gs_layo.
CALL METHOD alv_grid->refresh_table_display
EXPORTING
is_stable = stbl.
CALL METHOD cl_gui_control=>set_focus
EXPORTING
control = alv_grid.
CALL METHOD cl_gui_cfw=>flush.
ELSE."刷新
CALL METHOD alv_grid->set_frontend_layout
EXPORTING
is_layout = gs_layo.
CALL METHOD alv_grid->refresh_table_display
EXPORTING
is_stable = stbl.
ENDIF.
FORM frm_handle_hotspot_click USING p_e_row_id
p_e_column_id
p_es_row_no.
READ TABLE gt_data INTO gs_data INDEX p_e_row_id.
IF sy-subrc NE '0'.
RETURN.
ENDIF.
gs_data-zsn = 'CLICK'.
MODIFY gt_data FROM gs_data INDEX p_e_row_id TRANSPORTING zsn.
PERFORM frm_refresh.
ENDFORM.
*----------------------------------------------------------------------*
* -->P_E_FIELDNAME text
* -->P_E_FIELDVALUE text
* -->P_ES_ROW_NO text
*----------------------------------------------------------------------*
FORM frm_f4 USING iv_fldnm TYPE lvc_fname
is_row TYPE lvc_s_roid
irf_evt TYPE REF TO cl_alv_event_data.
CASE iv_fldnm.
WHEN 'ZWTEJLX'.
PERFORM frm_f4_zwtejlx USING iv_fldnm is_row irf_evt.
WHEN 'ZFZSQE'.
PERFORM frm_f4_zfzsqe USING iv_fldnm is_row irf_evt.
WHEN 'ZSGTXT'.
PERFORM frm_f4_zsgtxt USING iv_fldnm is_row irf_evt.
WHEN OTHERS.
ENDCASE.
PERFORM frm_refresh.
ENDFORM.
FORM frm_f4_zwtejlx USING iv_fldnm TYPE lvc_fname
is_row TYPE lvc_s_roid
irf_evt TYPE REF TO cl_alv_event_data.
irf_evt->m_event_handled = abap_true.
DATA: lt_return TYPE STANDARD TABLE OF ddshretval.
READ TABLE gt_data ASSIGNING FIELD-SYMBOL(<ls_data>) INDEX is_row-row_id.
IF sy-subrc <> 0.
RETURN.
ENDIF.
t_f4_ejfl = t_022b.
DELETE t_f4_ejfl WHERE zwtyjlx NE <ls_data>-zwtyjlx.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'ZWTEJLX' "lt内表里面的字段
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = 'ZWTEJLX' "画面上绑定字段
value_org = 'S'
callback_program = sy-repid
TABLES
value_tab = t_f4_ejfl "需要显示帮助的值内表
return_tab = lt_return "返回值
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc <> 0 OR lt_return[] IS INITIAL.
RETURN.
ENDIF.
<ls_data>-zwtejlx = VALUE #( lt_return[ 1 ]-fieldval OPTIONAL ).
ENDFORM.
FORM frm_refresh .
CALL METHOD alv_grid->set_frontend_layout
EXPORTING
is_layout = gs_layo.
* CALL METHOD alv_grid->check_changed_data.
CALL METHOD alv_grid->refresh_table_display
EXPORTING
is_stable = stbl.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DATA_CHANGED
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_ER_DATA_CHANGED text
* -->P_E_ONF4 text
* -->P_E_ONF4_BEFORE text
* -->P_E_ONF4_AFTER text
* -->P_E_UCOMM text
*----------------------------------------------------------------------*
FORM frm_data_changed USING uv_r_data_changed TYPE REF TO cl_alv_changed_data_protocol
uv_onf4 TYPE char1
uv_onf4_before TYPE char1
uv_onf4_after TYPE char1
uv_ucomm TYPE sy-ucomm.
LOOP AT uv_r_data_changed->mt_good_cells ASSIGNING FIELD-SYMBOL(<ls_good>).
READ TABLE gt_data INTO gs_data INDEX <ls_good>-row_id.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
CASE <ls_good>-fieldname .
WHEN 'ZWTYJLX'.
IF <ls_good>-value NE gs_data-zwtyjlx.
CLEAR gs_data-zwtejlx.
MODIFY gt_data FROM gs_data INDEX <ls_good>-row_id TRANSPORTING zwtejlx .
ENDIF.
WHEN 'ZFZSQE'.
IF <ls_good>-value IS NOT INITIAL.
SELECT SINGLE zrydm,zrymc FROM zmmt0020 INTO @DATA(s_020) WHERE zrydm = @<ls_good>-value.
IF sy-subrc = 0.
gs_data-zfzsqenm = s_020a-zrymc.
MODIFY gt_data FROM gs_data INDEX <ls_good>-row_id TRANSPORTING zfzsqenm .
ELSE.
uv_r_data_changed->add_protocol_entry( EXPORTING i_msgid = '00'
i_msgty = 'E'
i_msgno = '208'
i_msgv1 = 'SQE代码不可用'
i_fieldname = 'ZFZSQE'
i_row_id = <ls_good>-row_id ).
ENDIF.
ELSE.
CLEAR:gs_data-zfzsqenm.
ENDIF.
WHEN 'PSPNR_O'.
IF gs_data-pspnr_o IS NOT INITIAL.
CALL FUNCTION 'CONVERSION_EXIT_KONPD_INPUT'
EXPORTING
input = gs_data-pspnr_o
IMPORTING
output = gs_data-pspnr
EXCEPTIONS
not_found = 1
OTHERS = 2.
IF sy-subrc NE 0.
uv_r_data_changed->add_protocol_entry( EXPORTING i_msgid = '00'
i_msgty = 'E'
i_msgno = '208'
i_msgv1 = '项目定义不可用'
i_fieldname = 'PSPNR_O'
i_row_id = <ls_good>-row_id ).
ENDIF.
ENDIF.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
CALL METHOD alv_grid->set_frontend_layout
EXPORTING
is_layout = gs_layo.
CALL METHOD alv_grid->refresh_table_display
EXPORTING
is_stable = stbl.
ENDFORM.
FORM frm_data_changed_finished USING uv_modified TYPE char1
ut_good_cells TYPE lvc_t_modi.
CHECK uv_modified = 'X'.
CLEAR:gt_datac.
"用途在于修改后的数据联动,
LOOP AT ut_good_cells INTO DATA(ls_et_good_cell) .
READ TABLE gt_data INTO gs_data INDEX ls_et_good_cell-row_id.
IF sy-subrc = 0.
gs_data-cgindex = ls_et_good_cell-row_id.
APPEND gs_data TO gt_datac.
ENDIF.
ENDLOOP.
IF gt_datac IS NOT INITIAL.
SORT gt_datac.
DELETE ADJACENT DUPLICATES FROM gt_datac COMPARING ALL FIELDS.
PERFORM frm_hand_data TABLES gt_datac USING 'X' ''.
FREE gt_datac.
ENDIF.
* CALL METHOD alv_grid->set_frontend_layout
* EXPORTING
* is_layout = gs_layo.
*
* CALL METHOD alv_grid->refresh_table_display
* EXPORTING
* is_stable = stbl.
ENDFORM.
FORM frm_user_command USING uv_ucomm LIKE sy-ucomm.
CASE uv_ucomm.
WHEN 'SAVE'.
PERFORM frm_save_data.
WHEN '&F03' OR '&F15'OR '&F12'.
LEAVE TO SCREEN 0.
WHEN OTHERS.
ENDCASE.
CALL METHOD alv_grid->refresh_table_display
EXPORTING
is_stable = stbl.
PERFORM frm_refresh.
ENDFORM.
FORM frm_handle_toolbar USING uv_object TYPE REF TO cl_alv_event_toolbar_set
uv_interactive TYPE char1.
DATA: ls_toolbar TYPE stb_button.
*--分隔符
CLEAR ls_toolbar.
MOVE 3 TO ls_toolbar-butn_type.
APPEND ls_toolbar TO uv_object->mt_toolbar.
*--保存
CLEAR ls_toolbar.
MOVE 'SAVE' TO ls_toolbar-function. "功能码
MOVE icon_system_save TO ls_toolbar-icon. "图标
MOVE '保存' TO ls_toolbar-quickinfo.
MOVE '保存' TO ls_toolbar-text. "显示名称
MOVE ' ' TO ls_toolbar-disabled.
APPEND ls_toolbar TO uv_object->mt_toolbar.
IF p_cx = 'X'.
DELETE uv_object->mt_toolbar WHERE function = 'SAVE'.
ENDIF.
ENDFORM.
OOALV EVENTS
于 2022-01-27 10:59:14 首次发布