*代码部分为修改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.