TYPE-POOLS SLIS.
DATA: BEGIN OF GT_LIST OCCURS 0,
SEL TYPE CHAR4,
VAL TYPE I,
STYLE TYPE LVC_T_STYL,
END OF GT_LIST.
DATA: GS_STYL TYPE LVC_S_STYL,
GS_SCOL TYPE LVC_S_SCOL.
DEFINE MCR_FILL_STYL.
GS_STYL-FIELDNAME = &1.
GS_STYL-STYLE = &2.
INSERT GS_STYL INTO TABLE GT_LIST-STYLE.
CLEAR GS_STYL.
END-OF-DEFINITION.
DATA: GO_ALV_GRID TYPE REF TO CL_GUI_ALV_GRID.
*&---------------------------------------------------------------------*
*& START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM FRM_GET_DATA.
PERFORM FRM_DSP_DATA.
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
FORM FRM_GET_DATA .
DATA: LV_INDEX TYPE I.
DO 3 TIMES.
LV_INDEX = SY-INDEX.
DO SY-INDEX * 2 TIMES.
IF SY-INDEX NE 1.
MCR_FILL_STYL: 'SEL' CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
ELSE.
MCR_FILL_STYL: 'SEL' CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
ENDIF.
GT_LIST-VAL = LV_INDEX.
APPEND GT_LIST.
CLEAR GT_LIST.
ENDDO.
ENDDO.
ENDFORM. " FRM_GET_DATA
*&---------------------------------------------------------------------*
*& Form FRM_DSP_DATA
*&---------------------------------------------------------------------*
FORM FRM_DSP_DATA .
DATA: LS_LAYO TYPE LVC_S_LAYO,
LT_FCAT TYPE LVC_T_FCAT,
LS_FCAT TYPE LVC_S_FCAT,
LT_EVENT TYPE SLIS_T_EVENT,
LS_EVENT TYPE SLIS_ALV_EVENT.
LS_LAYO-ZEBRA = ABAP_TRUE.
LS_LAYO-CWIDTH_OPT = ABAP_TRUE.
LS_LAYO-STYLEFNAME = 'STYLE'.
LS_FCAT-FIELDNAME = 'SEL'.
LS_FCAT-CHECKBOX = 'X'.
LS_FCAT-EDIT = 'X'.
LS_FCAT-SCRTEXT_L =
LS_FCAT-SCRTEXT_M =
LS_FCAT-SCRTEXT_S = '选择'.
APPEND LS_FCAT TO LT_FCAT.
CLEAR LS_FCAT.
LS_FCAT-FIELDNAME = 'VAL'.
LS_FCAT-SCRTEXT_L =
LS_FCAT-SCRTEXT_M =
LS_FCAT-SCRTEXT_S = '值'.
APPEND LS_FCAT TO LT_FCAT.
CLEAR LS_FCAT.
LS_EVENT-NAME = SLIS_EV_CALLER_EXIT_AT_START.
LS_EVENT-FORM = SLIS_EV_CALLER_EXIT_AT_START.
APPEND LS_EVENT TO LT_EVENT.
LS_EVENT-NAME = SLIS_EV_DATA_CHANGED.
LS_EVENT-FORM = SLIS_EV_DATA_CHANGED.
APPEND LS_EVENT TO LT_EVENT.
* 显示alv列表
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID
IS_LAYOUT_LVC = LS_LAYO
IT_FIELDCAT_LVC = LT_FCAT
I_SAVE = 'A'
IT_EVENTS = LT_EVENT
TABLES
T_OUTTAB = GT_LIST
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_DSP_DATA
*&---------------------------------------------------------------------*
*& Form CALLER_EXIT
*&---------------------------------------------------------------------*
FORM CALLER_EXIT USING U_EXIT TYPE SLIS_DATA_CALLER_EXIT.
DATA: LS_F4 TYPE LVC_S_F4,
LT_F4 TYPE LVC_T_F4.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
E_GRID = GO_ALV_GRID.
* 设置回车事件
CALL METHOD GO_ALV_GRID->REGISTER_EDIT_EVENT
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER
EXCEPTIONS
ERROR = 1
OTHERS = 2.
* 设置光标焦点移开被修改单元格后触发事件
CALL METHOD GO_ALV_GRID->REGISTER_EDIT_EVENT
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED
EXCEPTIONS
ERROR = 1
OTHERS = 2.
ENDFORM. "CALLER_EXIT
*&---------------------------------------------------------------------*
*& Form DATA_CHANGED
*&---------------------------------------------------------------------*
* 数据改变检查
*----------------------------------------------------------------------*
FORM DATA_CHANGED USING OR_DATA_CHANGED TYPE REF TO CL_ALV_CHANGED_DATA_PROTOCOL.
DATA: LS_MOD_CELLS TYPE LVC_S_MODI.
FIELD-SYMBOLS: <FS_LINE> LIKE GT_LIST,
<FS_VALUE> TYPE ANY.
LOOP AT OR_DATA_CHANGED->MT_GOOD_CELLS INTO LS_MOD_CELLS.
CLEAR GT_LIST.
READ TABLE GT_LIST ASSIGNING <FS_LINE> INDEX LS_MOD_CELLS-ROW_ID.
IF SY-SUBRC EQ 0.
ASSIGN COMPONENT LS_MOD_CELLS-FIELDNAME OF STRUCTURE <FS_LINE> TO <FS_VALUE>.
IF SY-SUBRC EQ 0.
CALL METHOD OR_DATA_CHANGED->GET_CELL_VALUE
EXPORTING
I_ROW_ID = LS_MOD_CELLS-ROW_ID
I_FIELDNAME = LS_MOD_CELLS-FIELDNAME
IMPORTING
E_VALUE = <FS_VALUE>.
ENDIF.
ENDIF.
CASE LS_MOD_CELLS-FIELDNAME.
WHEN 'SEL'.
GT_LIST-SEL = ''.
MODIFY GT_LIST TRANSPORTING SEL WHERE SEL IS NOT INITIAL.
LOOP AT GT_LIST
WHERE VAL EQ <FS_LINE>-VAL .
GT_LIST-SEL = 'X'.
MODIFY GT_LIST TRANSPORTING SEL.
ENDLOOP.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
PERFORM FRM_REF_ALV.
ENDFORM. " DATA_CHANGED
*&---------------------------------------------------------------------*
*& Form FRM_REF_ALV
*&---------------------------------------------------------------------*
FORM FRM_REF_ALV .
DATA LS_STBL TYPE LVC_S_STBL.
LS_STBL-ROW = ABAP_TRUE.
LS_STBL-COL = ABAP_TRUE.
CALL METHOD GO_ALV_GRID->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = LS_STBL.
ENDFORM. " FRM_REF_ALV