实现单元格可编辑:
假定将要显示在ALV屏幕上的内表名为:it_alv。
通过slis_fieldcat_alv-edit = 'X',将单元格所在列设为可编辑状态。
在it_alv的data定义里添加新列field_style,类型为lvc_t_styl。
将内表it_alv中不需要编辑的行中单元格设为不可编辑状态。代码示例如下:
DATA:ls_stylelin TYPE lvc_s_styl.
LOOP AT it_alv ASSIGNING <wa_alv>.
IF it_alv-werks = '1020'."当工厂为1020时,不允许编辑该行的工厂
ls_stylelin-fieldname = 'WERKS'.
ls_stylelin-style = cl_gui_alv_grid=>mc_style_disabled. " 设置为不可编辑状态
INSERT ls_stylelin INTO TABLE <wa_alv>-field_style .
ENDIF.
ENDLOOP.
实现插入可编辑的新行:
往it_alv里第一行插入新行
把该新行的field_style( lvc_t_styl )清空。
这样该新行的可编辑字段就是设置了slis_fieldcat_alv-edit = 'X'的列所存的字段。
代码示例如下:
INSERT INITIAL LINE INTO it_alv INDEX 1.
IF sy-subrc = 0.
READ TABLE it_alv ASSIGNING <wa_alv> INDEX 1.
CLEAR <wa_alv>-field_style .
ENDIF.
敲下回车后更新数据:
编写event类,在调用alv创建函数时添加输入参数。
ALV调用代码示例:
DATA: lt_events TYPE slis_t_event,
ls_events TYPE slis_alv_event. " Alv grid.
ls_events-name = 'CALLER_EXIT'.
ls_events-form = 'FRM_REGISTER_EVENTS'.
APPEND ls_events TO lt_events.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'FRM_SET_STATUS'
i_callback_user_command = 'FRM_USER_COMMAND'
is_layout_lvc = gs_layo
it_fieldcat_lvc = gt_fcat
it_events = lt_events
i_save = 'A'
TABLES
t_outtab = it_alv
EXCEPTIONS
program_error = 1
OTHERS = 2.
Event类定义代码示例:
*---------------------------------------------------------------------------------------------
*---------------------------------------------------------------------------------------------
*----------Reresh internal table data after input 'enter' command.
*----------------------------Enter event Definition-------------------------------------------
DATA:stbl TYPE lvc_s_stbl,
g_grid TYPE REF TO cl_gui_alv_grid.
*----------------------------------------------------------------------*
* CLASS lcl_event_handler DEFINITION
*----------------------------------------------------------------------*
* 类定义
*----------------------------------------------------------------------*
CLASS lcl_event_handler DEFINITION."类定义
PUBLIC SECTION.
METHODS:
handle_data_changed FOR EVENT data_changed_finished OF cl_gui_alv_grid
IMPORTING e_modified et_good_cells.
ENDCLASS. "lcl_event_handler DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_event_handler IMPLEMENTATION
*----------------------------------------------------------------------*
* 类实现
*----------------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION."类实现
METHOD handle_data_changed.
PERFORM handle_data_changed ."具体处理数据事件
* IF e_modified = 'X'.
stbl-row = 'X'." 基于行的稳定刷新
stbl-col = 'X'." 基于列稳定刷新
CALL METHOD g_grid->refresh_table_display
EXPORTING
is_stable = stbl.
* ENDIF.
ENDMETHOD. "HANDLE_DATA_CHANGED
ENDCLASS. "lcl_event_handler IMPLEMENTATION
*&---------------------------------------------------------------------*
*& Form register_events
*&---------------------------------------------------------------------*
* 注册回车事件
*----------------------------------------------------------------------
FORM frm_register_events USING e_grid TYPE slis_data_caller_exit.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = g_grid.
*
DATA: gr_event_handler TYPE REF TO lcl_event_handler.
CREATE OBJECT gr_event_handler.
*
CALL METHOD g_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter
EXCEPTIONS
error = 1
OTHERS = 2.
SET HANDLER gr_event_handler->handle_data_changed FOR g_grid.
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. "register_events
*&---------------------------------------------------------------------*
*& Form HANDLE_DATA_CHANGED
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM handle_data_changed ."Auto output data
LOOP AT it_alv ASSIGNING <wa_alv> .
SELECT SINGLE ekgrp
INTO <wa_alv>-ekgrp
FROM zmarc
WHERE wekrs = <wa_alv>-werks.
ENDLOOP.
ENDFORM. "HANDLE_DATA_CHANGED
完整程序代码示例:
*&---------------------------------------------------------------------*
*& Report ZTEST
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ztest.
TABLES:mara,marc,sscrfields.
TYPE-POOLS:slis.
DEFINE mro_fcat.
clear: ls_fcat.
ls_fcat-fieldname = &1.
ls_fcat-coltext = &2.
ls_fcat-scrtext_l = &2.
ls_fcat-scrtext_m = &2.
ls_fcat-scrtext_s = &2.
ls_fcat-no_zero = 'X'.
translate ls_fcat-fieldname to upper case.
if &3 ne space.
ls_fcat-ref_field = ls_fcat-fieldname.
ls_fcat-ref_table = &3.
ls_fcat-ref_field = &5.
endif.
* if &1 eq 'ztype'. " OR &1 EQ 'aufnr'.
* ls_fcat-hotspot = 'X'.
* endif.
ls_fcat-edit = &4.
translate ls_fcat-ref_table to upper case.
ls_fcat-datatype = &6 . " 指定数据类型
* ls_fcat-inttype = &7 . "这个是指定字段的类型为C
append ls_fcat to gt_fcat.
END-OF-DEFINITION.
"ALV data define
DATA: ls_fcat TYPE slis_fieldcat_alv,
gt_fcat TYPE lvc_t_fcat,
gs_layo TYPE lvc_s_layo.
DATA: lt_events TYPE slis_t_event,
ls_events TYPE slis_alv_event. " Alv grid.
"Red Green Color
CONSTANTS: c_green TYPE icon-id VALUE '@08@',
c_yellow TYPE icon-id VALUE '@09@',
c_red TYPE icon-id VALUE '@0A@'.
DATA: it_data LIKE TABLE OF zmarc WITH HEADER LINE.
DATA: BEGIN OF it_alv OCCURS 0,
box TYPE xfeld, " Check Box
message TYPE char255,
id TYPE char25,
werks LIKE zmm_rebaterule-werks ,
ekgrp LIKE zmm_rebaterule-ekgrp ,
field_style TYPE lvc_t_styl, "单元格可编辑
END OF it_alv.
FIELD-SYMBOLS: <wa_alv> LIKE it_alv.
SELECTION-SCREEN BEGIN OF BLOCK blk2 WITH FRAME TITLE text-000.
SELECT-OPTIONS: s_werks FOR zmm_rebaterule-werks OBLIGATORY.
SELECT-OPTIONS: s_ekgrp FOR zmm_rebaterule-ekgrp .
SELECTION-SCREEN END OF BLOCK blk2.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-000.
PARAMETERS:rd01 RADIOBUTTON GROUP rd USER-COMMAND zchg DEFAULT 'X'.
PARAMETERS:rd02 RADIOBUTTON GROUP rd.
SELECTION-SCREEN END OF BLOCK b1.
START-OF-SELECTION.
IF rd01 EQ 'X'."Create/Change
PERFORM get_data.
PERFORM process_alv_show.
PERFORM alv_display.
ELSEIF rd02 EQ 'X'."Display/Print
PERFORM get_data.
PERFORM alv_display.
ENDIF.
*&---------------------------------------------------------------------*
*& Form PROCESS_ALV_SHOW
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM process_alv_show.
DATA:ls_stylelin TYPE lvc_s_styl.
DATA:lt_lvc_t_styl TYPE lvc_t_styl.
LOOP AT it_alv ASSIGNING <wa_alv>.
ls_stylelin-fieldname = 'WERKS'.
ls_stylelin-style = cl_gui_alv_grid=>mc_style_disabled. " 设置为不可编辑状态
INSERT ls_stylelin INTO TABLE <wa_alv>-field_style .
ENDLOOP.
ENDFORM. "PROCESS_ALV_SHOW
*&---------------------------------------------------------------------*
*& Form get_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM get_data.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE it_alv
FROM zmarc
WHERE werks IN s_werks AND ekgrp IN s_ekgrp .
SORT it_alv BY werks lifnr matnr.
ENDFORM. "get_data
*&---------------------------------------------------------------------*
*& Form alv_display
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM alv_display.
DATA: ls_fcat TYPE lvc_s_fcat.
DATA: ls_disvariant TYPE disvariant.
gs_layo-zebra = 'X'.
gs_layo-cwidth_opt = 'X'.
gs_layo-box_fname = 'BOX'.
gs_layo-stylefname = 'FSTYLE'.
gs_layo-info_fname = 'ZCOL' .
gs_layo-stylefname = 'FIELD_STYLE'. " 将内表中的字段名存入显示格式
IF rd02 EQ 'X' ."Display/Print
mro_fcat 'WERKS' 'Plant Code' 'ZMARC' space '' ''.
mro_fcat 'EKGRP' 'Purchase Group' 'ZMARC' space '' ''.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'FRM_SET_STATUS'
i_callback_user_command = 'FRM_USER_COMMAND'
is_layout_lvc = gs_layo
it_fieldcat_lvc = gt_fcat
i_save = 'A'
TABLES
t_outtab = it_alv
EXCEPTIONS
program_error = 1
OTHERS = 2.
ELSEIF rd01 EQ 'X' ."Create/Change
ls_events-name = 'CALLER_EXIT'.
ls_events-form = 'FRM_REGISTER_EVENTS'.
APPEND ls_events TO lt_events.
mro_fcat 'message' 'MESSAGE' '' space '' ''.
mro_fcat 'id' 'ICON' '' space '' ''.
mro_fcat 'WERKS' 'Plant Code' 'ZMARC' 'X' '' ''.
mro_fcat 'EKGRP' 'Purchase Group' 'ZMARC' 'X' '' ''.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'FRM_SET_STATUS'
i_callback_user_command = 'FRM_USER_COMMAND'
is_layout_lvc = gs_layo
it_fieldcat_lvc = gt_fcat
it_events = lt_events
i_save = 'A'
TABLES
t_outtab = it_alv
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDIF.
ENDFORM. "alv_display
*&---------------------------------------------------------------------*
*& Form frm_set_status
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->RT_EXTAB text
*----------------------------------------------------------------------*
FORM frm_set_status USING rt_extab TYPE slis_t_extab.
IF rd02 EQ 'X'.
SET PF-STATUS '200'.
ELSE.
SET PF-STATUS '100'.
ENDIF.
DATA: lo_grid TYPE REF TO cl_gui_alv_grid.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lo_grid.
CALL METHOD lo_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 frm_user_command
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->R_UCOMM text
* -->RS_SELFIELD text
*----------------------------------------------------------------------*
FORM frm_user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
IF r_ucomm EQ '&SAVE'.
PERFORM update_data.
PERFORM insert_data.
rs_selfield-refresh = 'X'.
ELSEIF r_ucomm EQ '&NEWLINE'.
PERFORM add_new_line.
rs_selfield-refresh = 'X'.
ENDIF.
ENDFORM. "frm_user_command
*&---------------------------------------------------------------------*
*& Form update_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM update_data.
ENDFORM. "update_data
*&---------------------------------------------------------------------*
*& Form insert_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM insert_data.
ENDFORM. "insert_data
*&---------------------------------------------------------------------*
*& Form add_new_line
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM add_new_line.
DATA:ls_stylelin TYPE lvc_s_styl.
DATA:lt_lvc_t_styl TYPE lvc_t_styl.
INSERT INITIAL LINE INTO it_alv INDEX 1.
IF sy-subrc = 0.
READ TABLE it_alv ASSIGNING <wa_alv> INDEX 1.
<wa_alv>-zccstatus = '1'.
CLEAR <wa_alv>-field_style .
ENDIF.
ENDFORM. "add_new_line
*---------------------------------------------------------------------------------------------
*---------------------------------------------------------------------------------------------
*----------Reresh internal table data after input 'enter' command.
*----------------------------Enter event Definition-------------------------------------------
DATA:stbl TYPE lvc_s_stbl,
g_grid TYPE REF TO cl_gui_alv_grid.
*----------------------------------------------------------------------*
* CLASS lcl_event_handler DEFINITION
*----------------------------------------------------------------------*
* 类定义
*----------------------------------------------------------------------*
CLASS lcl_event_handler DEFINITION."类定义
PUBLIC SECTION.
METHODS:
handle_data_changed FOR EVENT data_changed_finished OF cl_gui_alv_grid
IMPORTING e_modified et_good_cells.
ENDCLASS. "lcl_event_handler DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_event_handler IMPLEMENTATION
*----------------------------------------------------------------------*
* 类实现
*----------------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION."类实现
METHOD handle_data_changed.
PERFORM handle_data_changed ."具体处理数据事件
* IF e_modified = 'X'.
stbl-row = 'X'." 基于行的稳定刷新
stbl-col = 'X'." 基于列稳定刷新
CALL METHOD g_grid->refresh_table_display
EXPORTING
is_stable = stbl.
* ENDIF.
ENDMETHOD. "HANDLE_DATA_CHANGED
ENDCLASS. "lcl_event_handler IMPLEMENTATION
*&---------------------------------------------------------------------*
*& Form register_events
*&---------------------------------------------------------------------*
* 注册回车事件
*----------------------------------------------------------------------
FORM frm_register_events USING e_grid TYPE slis_data_caller_exit.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = g_grid.
*
DATA: gr_event_handler TYPE REF TO lcl_event_handler.
CREATE OBJECT gr_event_handler.
*
CALL METHOD g_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter
EXCEPTIONS
error = 1
OTHERS = 2.
SET HANDLER gr_event_handler->handle_data_changed FOR g_grid.
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. "register_events
*&---------------------------------------------------------------------*
*& Form HANDLE_DATA_CHANGED
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM handle_data_changed ."Auto output data 自动刷新数据
LOOP AT it_alv ASSIGNING <wa_alv> .
SELECT SINGLE ekgrp
INTO <wa_alv>-ekgrp
FROM zmarc
WHERE wekrs = <wa_alv>-werks.
ENDLOOP.
ENDFORM. "HANDLE_DATA_CHANGED
*---------------------------------------------------------------------------------------------
*---------------------------------------------------------------------------------------------
*----------------------------Enter event Definition-------------------------------------------