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. 效果
- DATA_CHANGED值还未被改变,事件被触发
- DATA_CHANGED_FINISHED值被改变后,回写至内表后触发事件