动态修改ALV(自定义 From)

*代码部分为修改alv必须部分
*& 动态修改alv和内表
*& 步骤: 1.定义ls_events。
2.在layout部分写入events参数
3.在filecat将需编辑字段设置为可编辑。
4.在pf_status 和 user_commd部分注册和实现功能。
5.在CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY_LVC’中调用pf_status 和user_commd.

tips: 
如果不在pf_status 和user_commd中定义events,
使用alv刷新,CALL METHOD ref_grid->refresh_table_display.会downp。
动态修改alv功能会实现不了

DATA:BEGIN OF gs_data,
a TYPE int8,
b TYPE int8,
c TYPE int8,
END OF gs_data.
DATA gt_data LIKE TABLE OF gs_data.

DATA: gs_fieldcat TYPE lvc_s_fcat,
gt_fieldcat TYPE lvc_t_fcat,
gt_fieldcat2 TYPE lvc_t_fcat,
gs_fieldcat2 TYPE lvc_s_fcat,
gs_layout TYPE lvc_s_layo,

ls_events TYPE slis_alv_event, "ALV修改
lt_events TYPE slis_t_event,
ref_grid TYPE REF TO cl_gui_alv_grid.

SELECTION-SCREEN BEGIN OF BLOCK blk0 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS:s_a FOR gs_data-a.
SELECTION-SCREEN END OF BLOCK blk0.

INITIALIZATION.

START-OF-SELECTION.
PERFORM frm_get_data.
PERFORM frm_init_fieldcat.
PERFORM frm_init_layout.
PERFORM frm_display_alv.

FORM frm_init_fieldcat .
DEFINE fcat.
CLEAR gs_fieldcat.
gs_fieldcat-fieldname = &1.
gs_fieldcat-coltext = &2.
gs_fieldcat-edit = &3.
gs_fieldcat-ref_table = &4.
gs_fieldcat-ref_field = &5.

gs_fieldcat-key = &6.
APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.

fcat ‘A’ ‘A’ ‘X’ ‘’ ‘’ ‘’.
fcat ‘B’ ‘B’ ‘’ ‘’ ‘’ ‘’.
fcat 'C' 'C' '' '' '' 'X'.
ENDFORM.
&---------------------------------------------------------------------
*& Form INIT_LAYOUT
&---------------------------------------------------------------------

  •   text ALV输出格式
    

----------------------------------------------------------------------
FORM frm_init_layout."ALV输出格式
i_grid_settings-edt_cll_cb = 'X'. "ALV 控制: 退出可编辑单元格时回调 ls_events-form = 'DATA_CHANGED_METHOD'.
ls_events-name = slis_ev_data_changed.
APPEND ls_events TO lt_events.
ENDFORM."FRM_INIT_LAYOUT
&---------------------------------------------------------------------
*& Form DISPLAY_ALV
&---------------------------------------------------------------------

  •   text  输出ALV
    

----------------------------------------------------------------------
FORM frm_display_alv."输出ALV
CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY_LVC’
EXPORTING
i_callback_program = sy-repid
is_layout_lvc = gs_layout
i_grid_settings = i_grid_settings ""设置参数回调,屏幕修改值,自动保存到ALV 内表
i_callback_pf_status_set = 'FRM_SET_STATUS'
i_callback_user_command = 'FRM_USER_COMMAND'
it_fieldcat_lvc = gt_fieldcat
i_save = ‘A’
it_events = lt_events[]
TABLES
t_outtab = gt_data[]
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM."FRM_DISPLAY_ALV
*&---------------------------------------------------------------------
**& Form FRM_SET_STATUS
*&---------------------------------------------------------------------
** text 状态栏
*----------------------------------------------------------------------
FORM frm_set_status USING pu_extab TYPE kkblo_t_extab .
DATA:lt_fcode TYPE TABLE OF sy-ucomm.
* SET PF-STATUS 'STATU'.
"获取grid
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = ref_grid.
"注册事件
CALL METHOD ref_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified.
IF sy-subrc <> 0. ENDIF.
ENDFORM. " FRM_SET_STATUS

*&---------------------------------------------------------------------
**& Form USER_COMMAND
*&---------------------------------------------------------------------

FORM frm_user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.

CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = ref_grid. "获取全局变量

CALL METHOD ref_grid->check_changed_data. "获取响应事件
CASE r_ucomm.
WHEN ‘&IC1’.

ENDCASE.
rs_selfield-refresh = 'X'."刷新界面
rs_selfield-col_stable = 'X'. "列保持
rs_selfield-row_stable = ‘X’. "行保持`

ENDFORM. "FRM_USER_COMMAND

FORM data_changed_method USING pcl_data TYPE REF TO cl_alv_changed_data_protocol.
DATA: mod_data TYPE lvc_t_modi,
wa_mod_data TYPE lvc_s_modi.
DATA: count TYPE n.
mod_data = pcl_data->mt_mod_cells.

LOOP AT mod_data INTO wa_mod_data WHERE fieldname = 'A'.
gs_data-c = wa_mod_data-value + gs_data-b.
MODIFY gt_data FROM gs_data INDEX wa_mod_data-row_id.
ENDLOOP.
CALL METHOD ref_grid->refresh_table_display.

ENDFORM.

&---------------------------------------------------------------------
*& Form frm_get_data
&---------------------------------------------------------------------
*& text
&---------------------------------------------------------------------
*& --> p1 text
*& <-- p2 text
&---------------------------------------------------------------------
FORM frm_get_data .

gs_data = VALUE #( a = s_a-low b = 2 ) .
gs_data-c = gs_data-a + gs_data-b.
APPEND gs_data TO gt_data.

gs_data = VALUE #( a = s_a-low b = 3 ) .
gs_data-c = gs_data-a + gs_data-b.
APPEND gs_data TO gt_data.

gs_data = VALUE #( a = s_a-low ) .
gs_data-c = gs_data-a + gs_data-b.
APPEND gs_data TO gt_data.

gs_data = VALUE #( b = 2 ) .
gs_data-c = gs_data-a + gs_data-b.
APPEND gs_data TO gt_data.

ENDFORM.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值