REUSE_ALV_GRID_DISPLAY_LVC 实现单元格值改变前(DATA_CHANGED)和单元格值改变后(DATA_CHANGED_FINISHED)的事件响应
  RdEelXhuDp09 2023年12月07日 18 0


1. 实现向ALV键入值的时候,触发事件

1. 用于当alv数据被修改之前对数据进行逻辑处理
2. 用于当ALV数据被修改之后,存入内表之后的逻辑处理
3. GO_GRID->GET_SELECTED_ROWS 实现获得ALV选取的所有行
4. GO_GRID->GET_CURRENT_CELL 实现获得ALV中值正在改变的行索引,从而到内表取得数据

2. 代码

  • GT_EVENTS-NAME可使用的事件
DATA: BEGIN OF gt_sflight OCCURS 0,
        box TYPE c.
        INCLUDE STRUCTURE sflight.
DATA: END OF gt_sflight.


DATA: gs_layout_lvc   TYPE lvc_s_layo,                      "显示布局参数
      gt_fieldcat_lvc TYPE lvc_t_fcat WITH HEADER LINE,     "字段
      gs_setting      TYPE lvc_s_glay,
      gt_events       TYPE slis_t_event WITH HEADER LINE,   "事件
      go_grid         TYPE  REF  TO cl_gui_alv_grid.        "ALV对象

"定义fieldcat脚本
DEFINE init_fieldcat.
  clear: gt_fieldcat_lvc.
  gt_fieldcat_lvc-fieldname    = &1.       "字段名
  gt_fieldcat_lvc-coltext      = &2.       "列标题Title
  gt_fieldcat_lvc-ref_table    = &3.       "内部表字段的参考表名称
  gt_fieldcat_lvc-ref_field    = &4.       "内部表字段的参考字段名称
  gt_fieldcat_lvc-no_zero      = &5.       "为输出隐藏零 X:隐藏
  gt_fieldcat_lvc-no_convext   = &6.       "是否应用转换出口函数 X:开启
  gt_fieldcat_lvc-edit         = &7.       "编辑模式
  gt_fieldcat_lvc-f4availabl   = &8.       "是否字段帮助

  case gt_fieldcat_lvc-fieldname.
    when 'CARRID'.
      gt_fieldcat_lvc-emphasize = 'C510'. "设置颜色
    when 'BOX'.
*      GT_FIELDCAT_LVC-TECH = 'X'.         "技术字段
      gt_fieldcat_lvc-checkbox = 'X'.
    when others.
      gt_fieldcat_lvc-emphasize = 'C110'. "设置颜色
  endcase.
  append gt_fieldcat_lvc.
END-OF-DEFINITION.


*_________________________________class________________________________*
CLASS lcl_event_receiver DEFINITION.
  PUBLIC SECTION.
    DATA: ucomm TYPE sy-ucomm.

    METHODS handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid
      IMPORTING er_data_changed.

    METHODS handle_data_changed_finished FOR EVENT data_changed_finished OF cl_gui_alv_grid
      IMPORTING e_modified et_good_cells sender.

  PRIVATE SECTION.
ENDCLASS.                    "lcl_event_receiver DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_event_receiver IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.
  METHOD handle_data_changed.
    PERFORM frm_when_changed USING er_data_changed.
  ENDMETHOD.                    "handle_data_changed

  METHOD handle_data_changed_finished.
    PERFORM frm_finished_changed USING e_modified et_good_cells.
  ENDMETHOD.                    "handle_data_changed_finished

ENDCLASS.                    "lcl_event_receiver IMPLEMENTATION

DATA: event_receiver TYPE REF TO lcl_event_receiver.
*_________________________________class________________________________*

INITIALIZATION.

AT SELECTION-SCREEN OUTPUT.

AT SELECTION-SCREEN.

START-OF-SELECTION.
  PERFORM frm_set_layout.                   "设置layout
  PERFORM frm_set_fieldcat.                 "设置Fieldcatlog
  PERFORM frm_set_setting.                  "参数回调
  PERFORM frm_get_data.                     "获取数据

END-OF-SELECTION.
  PERFORM frm_display_alv.

*__________________________________form____________________________*
FORM frm_set_layout .

  gs_layout_lvc-box_fname  = 'BOX'.
  gs_layout_lvc-zebra      = 'X'.
  gs_layout_lvc-cwidth_opt = 'X'.
  gs_layout_lvc-sel_mode   = 'A'.           "开启行多选

ENDFORM.                    "frm_set_layout

*&---------------------------------------------------------------------*
*&      Form  frm_set_fieldcat
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_set_fieldcat .
*  "USE CLASS CL_ABAP_TYPEDESCR Dynamic table
*  DATA: lt_table_type  TYPE REF TO cl_abap_tabledescr,
*        ls_struct_type TYPE REF TO cl_abap_structdescr,
*        lt_comp_table TYPE cl_abap_structdescr=>component_table,
*        gt_itab_type          TYPE REF TO cl_abap_tabledescr,
*        gs_struct_type        TYPE REF TO cl_abap_structdescr.
*
*  DATA: dref_str              TYPE REF TO data,
*        dref_tab              TYPE REF TO data.
*
*  FIELD-SYMBOLS: <dyn_table>      TYPE STANDARD TABLE,
*                 <dyn_wa>         TYPE any.
*
*  "从内表读取字段表
*  lt_table_type ?= cl_abap_tabledescr=>describe_by_data( gt_bseg ).
*
*  "获取字段DDIC属性
*  ls_struct_type ?= lt_table_type->get_table_line_type( ).
*
*  "获取字段组件属性
*  lt_comp_table[] = ls_struct_type->get_components( ).
*
*  "创建结构类
*  gs_struct_type = cl_abap_structdescr=>create( lt_comp_table[] ).
*
*  "根据结构类创建内表类
*  gt_itab_type = cl_abap_tabledescr=>create( gs_struct_type ).
*
*  "创建结构对象
*  CREATE DATA dref_str TYPE HANDLE gs_struct_type.
*
*  "创建内表对象
*  CREATE DATA dref_tab TYPE HANDLE gt_itab_type.
*
*  "assign对象
*  ASSIGN dref_tab->* TO <dyn_table>.
*  ASSIGN dref_str->* TO <dyn_wa>.

  init_fieldcat:
  'BOX' '复选框' '' '' '' '' 'X' 'X',
  'CARRID' '航线代码' 'SFLIGHT' 'CARRID' '' '' 'X' 'X',
  'CONNID' '航班连接编号' 'SFLIGHT' 'CONNID' '' '' 'X' 'X',
  'FLDATE' '航班日期' 'SFLIGHT' 'FLDATE' '' '' 'X' 'X',
  'PRICE' '航空运费' 'SFLIGHT' 'PRICE' '' '' 'X' 'X',
  'CURRENCY' '航班的本地货币 ' 'SFLIGHT' 'CURRENCY' '' '' 'X' 'X',
  'PLANETYPE' '飞机类型' 'SFLIGHT' 'PLANETYPE' '' '' 'X' 'X',
  'SEATSMAX' '经济舱的最大容量 ' 'SFLIGHT' 'SEATSMAX' '' '' 'X' 'X',
  'SEATSOCC' '占据的经济舱座位' 'SFLIGHT' 'SEATSOCC' '' '' 'X' 'X',
  'PAYMENTSUM' '当前预定总数' 'SFLIGHT' 'PAYMENTSUM' '' '' 'X' 'X',
  'SEATSMAX_B' '商务舱的最大容量 ' 'SFLIGHT' 'SEATSMAX_B' '' '' 'X' 'X',
  'SEATSOCC_B' '占据的商务舱座位' 'SFLIGHT' 'SEATSOCC_B' '' '' 'X' 'X',
  'SEATSMAX_F' '头等舱的最大容量 ' 'SFLIGHT' 'SEATSMAX_F' '' '' 'X' 'X',
  'SEATSOCC_F' '占据的头等舱座位' 'SFLIGHT' 'SEATSOCC_F' '' '' 'X' 'X'.

ENDFORM.                    "frm_set_fieldcat

*&---------------------------------------------------------------------*
*&      Form  frm_get_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_get_data .
  SELECT *
    FROM sflight
    INTO CORRESPONDING FIELDS OF TABLE gt_sflight UP TO 50 ROWS.
ENDFORM.                    "frm_get_data

*&---------------------------------------------------------------------*
*&      Form  frm_display_alv
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_display_alv .

  "注册CALLER_EXIT事件,在CALLER_EXIT事件中注册其他事件
  CLEAR: gt_events,gt_events[].
  gt_events-name = 'CALLER_EXIT'.                                   "设置注册的事件
  gt_events-form = 'FRM_EVENTS_CALLER'.                             "设置响应事件的FORM
  APPEND gt_events.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'FRM_PF_STATUS'
      i_callback_user_command  = 'FRM_USER_COMMAND'
*     I_STRUCTURE_NAME         =
*     I_BACKGROUND_ID          = ' '
*     I_GRID_TITLE             =
      i_grid_settings          = gs_setting               "设置参数回调,屏幕修改值,自动保存到ALV 内表
      is_layout_lvc            = gs_layout_lvc
      it_fieldcat_lvc          = gt_fieldcat_lvc[]
*     I_DEFAULT                = 'X'
      i_save                   = 'A'                      "Variant能保存
      it_events                = gt_events[]
    TABLES
      t_outtab                 = gt_sflight[]
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.

  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

ENDFORM.                    "frm_display_alv

*&---------------------------------------------------------------------*
*&      Form  frm_set_setting
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_set_setting .
  gs_setting-edt_cll_cb = 'X'.
ENDFORM.                    "frm_set_setting

*&---------------------------------------------------------------------*
*&      Form  frm_pf_status
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->I_IT_EXTAB text
*----------------------------------------------------------------------*
FORM frm_pf_status USING i_it_extab TYPE slis_t_extab.        "设置状态栏
  DATA: i_is_extab LIKE LINE OF i_it_extab.
  i_is_extab = '&ABC'.
  APPEND i_is_extab TO i_it_extab.

  IF 1 = 2.
    SET PF-STATUS 'STANDARD'.
  ELSE.
    SET PF-STATUS 'STANDARD' EXCLUDING i_it_extab.
  ENDIF.

ENDFORM.                    "frm_pf_status

*&---------------------------------------------------------------------*
*&      Form  frm_user_command
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->I_UCOMM        text
*      -->I_WA_SELFIELD  text
*----------------------------------------------------------------------*
FORM frm_user_command USING i_ucomm       TYPE sy-ucomm
                            i_wa_selfield TYPE slis_selfield.     "响应user_command

ENDFORM.                    "frm_user_command

*&---------------------------------------------------------------------*
*&      Form  frm_events_caller
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->LS_DATA    text
*----------------------------------------------------------------------*
FORM frm_events_caller USING ls_data TYPE slis_data_caller_exit.        "ls_data形参

  IF go_grid IS INITIAL.
    CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
      IMPORTING
        e_grid = go_grid.
  ENDIF.

  "如果call ALV未设置参数回调参数I_GRID_SETTINGS,需要注册EDIT事件
*  CALL METHOD go_grid->register_edit_event
*    EXPORTING
*      i_event_id = cl_gui_alv_grid=>mc_evt_modified.

  CREATE OBJECT event_receiver.
  SET HANDLER event_receiver->handle_data_changed FOR go_grid.
  SET HANDLER event_receiver->handle_data_changed_finished FOR go_grid.

ENDFORM.                    "frm_events_caller

*&---------------------------------------------------------------------*
*&      Form  frm_when_changed
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PR_DATA_CHANGED  text
*----------------------------------------------------------------------*
FORM frm_when_changed  USING    pr_data_changed TYPE REF TO cl_alv_changed_data_protocol.


  DATA: ls_mod_cells TYPE lvc_s_modi.

  DATA lt_errormsg TYPE tsmesg.
  DATA ls_errormsg LIKE LINE OF lt_errormsg.
  CLEAR:lt_errormsg[], ls_errormsg.


  IF pr_data_changed->mt_mod_cells IS NOT INITIAL.
    READ TABLE pr_data_changed->mt_mod_cells INTO ls_mod_cells INDEX 1.
    IF sy-subrc EQ 0.
      ls_errormsg-msgty = 'S'.
      ls_errormsg-arbgb = 'Z001'.
      ls_errormsg-txtnr =  '001'.
      ls_errormsg-msgv1 = |行:{ ls_mod_cells-row_id }值即将被改变|.
      APPEND ls_errormsg TO lt_errormsg.

      IF lt_errormsg[] IS NOT INITIAL.
        CALL FUNCTION 'FB_MESSAGES_DISPLAY_POPUP'
          EXPORTING
            it_smesg        = lt_errormsg[]
          EXCEPTIONS
            no_messages     = 1
            popup_cancelled = 2
            OTHERS          = 3.
      ENDIF.
    ENDIF.

  ENDIF.
ENDFORM.                    "frm_when_changed

*&---------------------------------------------------------------------*
*&      Form  frm_finished_changed
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PV_MODIFIED    text
*      -->PT_GOOD_CELLS  text
*----------------------------------------------------------------------*
FORM frm_finished_changed  USING    pv_modified
                                    pt_good_cells TYPE lvc_t_modi.

  DATA: ls_mod_cells TYPE lvc_s_modi.

  DATA lt_errormsg TYPE tsmesg.
  DATA ls_errormsg LIKE LINE OF lt_errormsg.
  CLEAR:lt_errormsg[], ls_errormsg.

  IF pt_good_cells  IS NOT INITIAL.
    READ TABLE pt_good_cells INTO ls_mod_cells INDEX 1.
    IF sy-subrc EQ 0.
      ls_errormsg-msgty = 'S'.
      ls_errormsg-arbgb = 'Z001'.
      ls_errormsg-txtnr =  '001'.
      ls_errormsg-msgv1 = |行:{ ls_mod_cells-row_id }值已经改变完毕|.
      APPEND ls_errormsg TO lt_errormsg.
      IF lt_errormsg[] IS NOT INITIAL.
        CALL FUNCTION 'FB_MESSAGES_DISPLAY_POPUP'
          EXPORTING
            it_smesg        = lt_errormsg[]
          EXCEPTIONS
            no_messages     = 1
            popup_cancelled = 2
            OTHERS          = 3.
      ENDIF.
    ENDIF.
  ENDIF.
ENDFORM.                    "frm_finished_changed

3. 效果

  1. DATA_CHANGED值还未被改变,事件被触发
  2. DATA_CHANGED_FINISHED值被改变后,回写至内表后触发事件



【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月07日 0

暂无评论

RdEelXhuDp09