REUSE_ALV_GRID_DISPLAY_LVC 实现单元格值改变前(DATA_CHANGED)和单元格值改变后(DATA_CHANGED_FINISHED)的事件响应
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对象DATA: gt_row_id TYPE lvc_t_row, "需要在changed获取编辑的行信息,changed change_finished使用;否则可能因为F4搜索帮助导致行ID异常gv_row TYPE i,gv_col TYPE i."定义fieldcat脚本 DEFINE init_fieldcat.CLEAR: gt_fieldcat_lvc.gt_fieldcat_lvc-fieldname = &1. "字段名gt_fieldcat_lvc-coltext = &2. "列标题Titlegt_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_gridIMPORTING er_data_changed.METHODS handle_data_changed_finished FOR EVENT data_changed_finished OF cl_gui_alv_gridIMPORTING e_modified et_good_cells sender.PRIVATE SECTION. ENDCLASS.CLASS lcl_event_receiver IMPLEMENTATION.METHOD handle_data_changed.PERFORM frm_when_changed USING er_data_changed.ENDMETHOD.METHOD handle_data_changed_finished.PERFORM frm_finished_changed USING e_modified et_good_cells.ENDMETHOD.ENDCLASS.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. "设置layoutPERFORM frm_set_fieldcat. "设置FieldcatlogPERFORM 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.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.FORM frm_get_data .SELECT *FROM sflightINTO CORRESPONDING FIELDS OF TABLE gt_sflight UP TO 50 ROWS. ENDFORM.FORM frm_display_alv ."注册CALLER_EXIT事件,在CALLER_EXIT事件中注册其他事件CLEAR: gt_events,gt_events[].gt_events-name = 'CALLER_EXIT'. "设置注册的事件gt_events-form = 'FRM_EVENTS_CALLER'. "设置响应事件的FORMAPPEND gt_events.CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'EXPORTINGi_callback_program = sy-repidi_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_lvcit_fieldcat_lvc = gt_fieldcat_lvc[] * I_DEFAULT = 'X'i_save = 'A' "Variant能保存it_events = gt_events[]TABLESt_outtab = gt_sflight[]EXCEPTIONSprogram_error = 1OTHERS = 2.IF sy-subrc <> 0. * Implement suitable error handling hereENDIF.ENDFORM.FORM frm_set_setting .gs_setting-edt_cll_cb = 'X'. ENDFORM.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.FORM frm_user_command USING i_ucomm TYPE sy-ucommi_wa_selfield TYPE slis_selfield. "响应user_commandENDFORM.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'IMPORTINGe_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.FORM frm_when_changed USING p_er_data_changed.DATA lt_errormsg TYPE tsmesg.DATA ls_errormsg LIKE LINE OF lt_errormsg.CLEAR:lt_errormsg[], ls_errormsg,gt_row_id,gv_row,gv_col.IF go_grid IS INITIAL.CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'IMPORTINGe_grid = go_grid.ENDIF.CALL METHOD go_grid->get_selected_rows "获取选中行列表IMPORTINGet_index_rows = gt_row_id.CALL METHOD go_grid->get_current_cell ""获取当前行列表IMPORTINGe_row = gv_rowe_col = gv_col.IF p_er_data_changed IS NOT INITIAL.ls_errormsg-msgty = 'S'.ls_errormsg-arbgb = 'Z001'.ls_errormsg-txtnr = '001'.ls_errormsg-msgv1 = |行:{ gv_row }值即将被改变|.APPEND ls_errormsg TO lt_errormsg.IF lt_errormsg[] IS NOT INITIAL.CALL FUNCTION 'FB_MESSAGES_DISPLAY_POPUP'EXPORTINGit_smesg = lt_errormsg[]EXCEPTIONSno_messages = 1popup_cancelled = 2OTHERS = 3.ENDIF.ENDIF. ENDFORM.FORM frm_finished_changed USING p_e_modifiedp_et_good_cells.DATA lt_errormsg TYPE tsmesg.DATA ls_errormsg LIKE LINE OF lt_errormsg.CLEAR:lt_errormsg[], ls_errormsg.IF p_et_good_cells IS NOT INITIAL.ls_errormsg-msgty = 'S'.ls_errormsg-arbgb = 'Z001'.ls_errormsg-txtnr = '001'.ls_errormsg-msgv1 = |行:{ gv_row }值已经改变完毕|.APPEND ls_errormsg TO lt_errormsg.IF lt_errormsg[] IS NOT INITIAL.CALL FUNCTION 'FB_MESSAGES_DISPLAY_POPUP'EXPORTINGit_smesg = lt_errormsg[]EXCEPTIONSno_messages = 1popup_cancelled = 2OTHERS = 3.ENDIF.ENDIF.ENDFORM.
3. 效果
- DATA_CHANGED值还未被改变,事件被触发
- DATA_CHANGED_FINISHED值被改变后,回写至内表后触发事件
REUSE_ALV_GRID_DISPLAY_LVC 实现单元格值改变前(DATA_CHANGED)和单元格值改变后(DATA_CHANGED_FINISHED)的事件响应相关推荐
- thymeleaf 获取yml中的值_Thymeleaf前后端传值 页面取值与js取值
目的: 后端通过Model传值到前端 页面通过Model取值显示 js通过Model取值作为变量使用 1.后台Controller @GetMapping("/message") ...
- java读取合并单元格_Java POI常用方法,读取单元格的值,设置单元格格式,合并单元格,获取已合并的单元格,导出至本地等...
一.设置单元格格式. 设置单元格边框.单元格背景颜色.单元格对齐方式.单元格字体,设置自动换行. /** Description: 设置单元格格式. * @author : ys. * @date : ...
- Excel中提取单元格中的部分内容或单元格中的数字公式大全(提取数字,提取前几位,提取指定文字之间的内容等等)
Excel如何提取单元格中的部分文字或单元格中的数字 Excel如何提取单元格中的部分文字或单元格中的数字,整理了Excel中所有的提取要求,写成了一个公式翻译工具. 支持以下提取方式,输入提取要求, ...
- excel空白单元格自动下下填充上一个单元格的值
excel空白单元格自动下下填充上一个单元格的值 适用情况 图片: [外链图片转存失败(img-PLzkQDdz-1566355138598)(]) vba代码 Sub test() Set sh = ...
- Pyqt5 在表格中单元格设置下拉框,并根据选项改变背景颜色
关于怎么在表格中单元格设置下拉框,并根据选项改变背景颜色 def table_combox_init(self):combox_statePlm_jria_list = ['', '无', 'O', ...
- Execl--获取任意当前单元格的前2个单元格数据做运算--求下降百分比
Execl–获取任意当前单元格的前2个单元格数据做运算 !*利用excel的INDIRECT函数! 1.获取当前单元格数据 INDIRECT函数是Microsoft Excel 中的公式,此函数立即对 ...
- Swift - 可编辑表格样例(可直接编辑单元格中内容、移动删除单元格)
(本文代码已升级至Swift3) 本文演示如何制作一个可以编辑单元格内容的表格(UITableView). 1,效果图 (1)默认状态下,表格不可编辑,当点击单元格的时候会弹出提示框显示选中的内容. ...
- 计算机所选区域单元格数值,计算机习题110、 在Excel工作表的单元格区域A1:A8各单元格中均存放数值1,单元格A9为空,单元格A10为一字符...
计算机习题110. 在Excel工作表的单元格区域A1:A8各单元格中均存放数值1,单元格A9为空,单元格A10为一字符 计算机习题1 10. 在Excel工作表的单元格区域A1:A8各单元格中均存放 ...
- java设置单元格格式_java报表开发之单元格格式设置
// 设置水平居中 style = style.deriveHorizontalAlignment(Constants.CENTER); 1.6 设置单元格边框 设置边框样式和边框颜色 style = ...
最新文章
- msvcrt.lib和LIBCD.lib链接冲突
- github 与git 使用 及配置
- cv2.inrange()用法
- python【力扣LeetCode算法题库】460- LFU缓存
- 阿里技术官最新总结一份105道Java面试题小册,看完我惊呆了
- beego使用php,介绍beego、nginx性能测试实例
- Java 9 新特性概述
- SOFA 源码分析 —— 服务发布过程
- 小说的逻辑与反逻辑_以理性的数学逻辑构筑推理小说
- HDU1229 还是A+B【水题】
- 系统日期oracle,oracle系统函数(日期函数)
- 当年,学姐把这份Java总结给我,让我在22k的校招王者局乱杀
- 什么音频剪辑软件好用?
- 我有博客了,泪流满面
- Android正方教务系统课程表+查成绩+查考试安排
- mysql useing_MySQL ON与USING?
- SQL2008服务器连接失败
- 多机Nomad+Consul+consul-template+Nginx反向代理
- Flink入门教程(三)——窗口(一)
- Jmeter源码分析(二)
热门文章
- 阿里云ACP大数据工程师认证,ACP,阿里云ACP认证,阿里云认证,大数据工程师认证
- pytorch复现经典生成对抗式的超分辨率网络
- 【题解】 bzoj1135: [POI2009]Lyz (线段树+霍尔定理)
- 徐小贱c语言试卷,纹了这条锦鲤,我遇见了现在的老公 | 纹身大赏No.12
- 一个链接泄露这么多隐私,你还敢拼多多助力吗?
- iOS11以及iPhone X遇到的相关问题
- 关于Git及GitLab的简单易懂的使用方法(将本地仓库的项目提交到master分支或者自定义的分支上)
- 004.前端面试排雷之唱、跳、rap三步曲(一)唱篇
- 参加python全栈开发培训需要多少钱?
- 微积分演绎(一)海底沉尸事件