Functional ALV系列 (08) - Data Changed 事件

ALV 的 data changed 事件在离开单元格时触发,比如回车,tab 键等。利用 data changed 事件可以实现诸如校验,自动填充字段等功能。本文演示 data changed 事件的用法,实现对 ALV 界面编辑的数据自动保存到数据库,并且对 cityto 字段进行校验两个小的功能。

首先编写一个可以运行的 alv 程序,并且将 data changed 事件加入到关联到 ALV:

1) 声明 event 相关的变量

datagt_fieldcat  type slis_t_fieldcat_alv,
         gs_fieldcat  type slis_fieldcat_alv,
         gt_events   type slis_t_event,
         gs_event    type slis_alv_event.

2)将 data changed 事件添加到 gt_events 中:

form frm_add_events.
  clear gs_event.
  gs_event-name slis_ev_data_changed.
  gs_event-form 'FRM_ALV_DATA_CHANGED'.
  append gs_event to gt_events.
endform.

3)调用 reuse_alv_grid_display 函数时设置 gt_events 参数:

form frm_disp_data.
  call function 'Z_FALV_FIELD_CATALOG'
    exporting
      it_output     gt_spfli[]
    
tables
      field_catalog gt_fieldcat[].

  perform frm_add_events.
  gs_grid_settings-edt_cll_cb 'X'.

  使ALV可编辑
  loop at gt_fieldcat into gs_fieldcat.
    if gs_fieldcat-key 'X'.
      gs_fieldcat-edit ''.
    else.
      gs_fieldcat-edit 'X'.
    endif.
    modify gt_fieldcat from gs_fieldcat.
    clear gs_fieldcat.
  endloop.

  call function 'REUSE_ALV_GRID_DISPLAY'
    exporting
      i_callback_program sy-repid
      i_grid_settings    
gs_grid_settings
      it_fieldcat        
gt_fieldcat[]
      it_events          gt_events
    tables
      t_outtab           gt_spfli[].

endform.             

注意 gs_grid_settings-edit_cll_cb = 'X' 语句是必须的,否则事件不被触发。

4)编写子例程处理 data changed 事件,例程名为 frm_alv_data_changed:

form frm_alv_data_changed using p_changed_data type ref to cl_alv_changed_data_protocol.

  datafield_name(20),
        modified_cells type lvc_s_modi.

  datal_city like spfli-cityto.
  field-symbols <field_value>.

  对 cityto字段进行校验
  loop at p_changed_data->mt_mod_cells into modified_cells where fieldname 'CITYTO'.
    read table gt_cities with table key city modified_cells-value.
    if not sy-subrc is initial.
      call method p_changed_data->add_protocol_entry
        
exporting
          i_msgid     '00'
          i_msgty     'E'
          i_msgno     '001'
          i_msgv1     '您所输入的城市并不在范围内, 数据不会被保存. '
          i_fieldname modified_cells-fieldname.
      return.
    endif.
  endloop.

  " ALV 界面修改的数据自动保存
  loop at p_changed_data->mt_mod_cells into modified_cells.
    clear gt_spfli.
    read table gt_spfli index modified_cells-row_id.
    concatenate 'GT_SPFLI-'  modified_cells-fieldname into field_name .
    assign (field_nameto <field_value>.
    <field_value> modified_cells-value.

    modify gt_spfli index modified_cells-row_id.
  endloop.

  update spfli from table gt_spfli.
endform.

data changed 事件在单元格离开后才触发,所以刚才作为演示的程序存在最后编辑数据不被保存的风险。为了确保编辑的数据能被保存,可以使用 checkbox 字段,用户在修改后选中 checkbox,显示标识所修改的行,在工具栏上添加「保存」按钮,点击「保存」按钮才进行保存。checkbox 选中的时候,也会触发 data changed  事件。

使用 checkbox 的方法如下:

1)定义内表包含 checkbox 字段:

typesbegin of t_spfli.
        include structure spfli.
types:  check type c.
typesend of t_spfli.

datagt_spfli type standard table of t_spfli with header line.

2) 在 fieldcatlog 内表中标识该字段以 checkbox 方式显示:

  loop at gt_fieldcat into gs_fieldcat.  
    if gs_fieldcat-fieldname 'CHECK'.
      gs_fieldcat-checkbox 'X'.
      gs_fieldcat-seltext_m '选择'.
      gs_fieldcat-outputlen 6.
    endif.
    modify gt_fieldcat from gs_fieldcat.
    clear gs_fieldcat.
  endloop.

源码

08-Data changed event

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值