OOALV EVENTS

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.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值