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. 效果

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

REUSE_ALV_GRID_DISPLAY_LVC 实现单元格值改变前(DATA_CHANGED)和单元格值改变后(DATA_CHANGED_FINISHED)的事件响应相关推荐

  1. thymeleaf 获取yml中的值_Thymeleaf前后端传值 页面取值与js取值

    目的: 后端通过Model传值到前端 页面通过Model取值显示 js通过Model取值作为变量使用 1.后台Controller @GetMapping("/message") ...

  2. java读取合并单元格_Java POI常用方法,读取单元格的值,设置单元格格式,合并单元格,获取已合并的单元格,导出至本地等...

    一.设置单元格格式. 设置单元格边框.单元格背景颜色.单元格对齐方式.单元格字体,设置自动换行. /** Description: 设置单元格格式. * @author : ys. * @date : ...

  3. Excel中提取单元格中的部分内容或单元格中的数字公式大全(提取数字,提取前几位,提取指定文字之间的内容等等)

    Excel如何提取单元格中的部分文字或单元格中的数字 Excel如何提取单元格中的部分文字或单元格中的数字,整理了Excel中所有的提取要求,写成了一个公式翻译工具. 支持以下提取方式,输入提取要求, ...

  4. excel空白单元格自动下下填充上一个单元格的值

    excel空白单元格自动下下填充上一个单元格的值 适用情况 图片: [外链图片转存失败(img-PLzkQDdz-1566355138598)(]) vba代码 Sub test() Set sh = ...

  5. Pyqt5 在表格中单元格设置下拉框,并根据选项改变背景颜色

    关于怎么在表格中单元格设置下拉框,并根据选项改变背景颜色 def table_combox_init(self):combox_statePlm_jria_list = ['', '无', 'O', ...

  6. Execl--获取任意当前单元格的前2个单元格数据做运算--求下降百分比

    Execl–获取任意当前单元格的前2个单元格数据做运算 !*利用excel的INDIRECT函数! 1.获取当前单元格数据 INDIRECT函数是Microsoft Excel 中的公式,此函数立即对 ...

  7. Swift - 可编辑表格样例(可直接编辑单元格中内容、移动删除单元格)

    (本文代码已升级至Swift3) 本文演示如何制作一个可以编辑单元格内容的表格(UITableView). 1,效果图 (1)默认状态下,表格不可编辑,当点击单元格的时候会弹出提示框显示选中的内容. ...

  8. 计算机所选区域单元格数值,计算机习题110、 在Excel工作表的单元格区域A1:A8各单元格中均存放数值1,单元格A9为空,单元格A10为一字符...

    计算机习题110. 在Excel工作表的单元格区域A1:A8各单元格中均存放数值1,单元格A9为空,单元格A10为一字符 计算机习题1 10. 在Excel工作表的单元格区域A1:A8各单元格中均存放 ...

  9. java设置单元格格式_java报表开发之单元格格式设置

    // 设置水平居中 style = style.deriveHorizontalAlignment(Constants.CENTER); 1.6 设置单元格边框 设置边框样式和边框颜色 style = ...

最新文章

  1. msvcrt.lib和LIBCD.lib链接冲突
  2. github 与git 使用 及配置
  3. cv2.inrange()用法
  4. python【力扣LeetCode算法题库】460- LFU缓存
  5. 阿里技术官最新总结一份105道Java面试题小册,看完我惊呆了
  6. beego使用php,介绍beego、nginx性能测试实例
  7. Java 9 新特性概述
  8. SOFA 源码分析 —— 服务发布过程
  9. 小说的逻辑与反逻辑_以理性的数学逻辑构筑推理小说
  10. HDU1229 还是A+B【水题】
  11. 系统日期oracle,oracle系统函数(日期函数)
  12. 当年,学姐把这份Java总结给我,让我在22k的校招王者局乱杀
  13. 什么音频剪辑软件好用?
  14. 我有博客了,泪流满面
  15. Android正方教务系统课程表+查成绩+查考试安排
  16. mysql useing_MySQL ON与USING?
  17. SQL2008服务器连接失败
  18. 多机Nomad+Consul+consul-template+Nginx反向代理
  19. Flink入门教程(三)——窗口(一)
  20. Jmeter源码分析(二)

热门文章

  1. 阿里云ACP大数据工程师认证,ACP,阿里云ACP认证,阿里云认证,大数据工程师认证
  2. pytorch复现经典生成对抗式的超分辨率网络
  3. 【题解】 bzoj1135: [POI2009]Lyz (线段树+霍尔定理)
  4. 徐小贱c语言试卷,纹了这条锦鲤,我遇见了现在的老公 | 纹身大赏No.12
  5. 一个链接泄露这么多隐私,你还敢拼多多助力吗?
  6. iOS11以及iPhone X遇到的相关问题
  7. 关于Git及GitLab的简单易懂的使用方法(将本地仓库的项目提交到master分支或者自定义的分支上)
  8. 004.前端面试排雷之唱、跳、rap三步曲(一)唱篇
  9. 参加python全栈开发培训需要多少钱?
  10. 微积分演绎(一)海底沉尸事件