* 类型池
TYPE-POOLS:SLIS.
* 在这个类未真正定义之前暂时定义,供其他类或者变量参照定义(如 row-30 )
CLASS LCL_EVENT_RECEIVER DEFINITION DEFERRED.
*&---------------------------------------------------------------------*
*& TYPES定义
*&---------------------------------------------------------------------*
TYPES: BEGIN OF TYP_EDIT ,
MANDT TYPE MANDT, " 客户端
PERNR TYPE PERSNO, " 人员号
NACHN TYPE NACHN, " 姓
ZSEX TYPE CHAR2, " 性别
SCORE TYPE CHAR5, " 分数
END OF TYP_EDIT.
*&---------------------------------------------------------------------*
*& DATA定义
*&---------------------------------------------------------------------*
DATA: GT_FCAT TYPE LVC_T_FCAT,
GS_FCAT TYPE LVC_S_FCAT,
GT_F4 TYPE LVC_T_F4,
GS_F4 TYPE LVC_S_F4,
GS_EVENT TYPE SLIS_ALV_EVENT,
GT_EVENT TYPE SLIS_T_EVENT,
GS_LAYOUT TYPE LVC_S_LAYO,
GS_GLAY TYPE LVC_S_GLAY.
* 处理ALV用
DATA:
EVENT_RECEIVER TYPE REF TO LCL_EVENT_RECEIVER,
GO_GRID TYPE REF TO CL_GUI_ALV_GRID. " ALV List Viewer
* ALV结构
DATA:
BEGIN OF GS_DATA ,
PERNR TYPE PERSNO, " 人员号
NACHN TYPE NACHN, " 姓
ZSEX TYPE CHAR2, " 性别
SCORE TYPE CHAR5, " 分数
SEL(1), "被显示的内表,添加一个专用字段
LIGHT TYPE ICONNAME, "指示灯
MSG TYPE STRING, "消息
END OF GS_DATA,
GT_DATA LIKE STANDARD TABLE OF GS_DATA.
* F4帮助
DATA:
BEGIN OF GS_F4VALUE,
GESCH TYPE GESCH,
ZTEXT TYPE TEXT,
END OF GS_F4VALUE,
GT_F4VALUE LIKE TABLE OF GS_F4VALUE.
*&---------------------------------------------------------------------*
*& CLASS LCL_EVENT_RECEIVER DEFINITION
*&---------------------------------------------------------------------*
CLASS LCL_EVENT_RECEIVER DEFINITION. " 定义
PUBLIC SECTION.
METHODS:
* F4帮助
HANDLE_F4 FOR EVENT ONF4 OF CL_GUI_ALV_GRID
IMPORTING E_FIELDNAME
E_FIELDVALUE
ES_ROW_NO
ER_EVENT_DATA
ET_BAD_CELLS
E_DISPLAY,
* DATA_CHANGED
HANDLE_DATA_CHANGED FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
IMPORTING ER_DATA_CHANGED,
* DATA_CHANGED_FINISHED
HANDLE_MODIFY FOR EVENT DATA_CHANGED_FINISHED OF CL_GUI_ALV_GRID
IMPORTING E_MODIFIED
ET_GOOD_CELLS.
ENDCLASS.
*&---------------------------------------------------------------------*
*& CLASS LCL_EVENT_RECEIVER IMPLEMENTATION
*&---------------------------------------------------------------------*
CLASS LCL_EVENT_RECEIVER IMPLEMENTATION." 实施
METHOD HANDLE_F4.
PERFORM F_F4_HELP USING E_FIELDNAME
ES_ROW_NO.
ER_EVENT_DATA->M_EVENT_HANDLED = 'X' .
PERFORM REFRESH_TABLE_ALV.
ENDMETHOD.
METHOD HANDLE_DATA_CHANGED.
PERFORM FRM_HANDLE_CHANGED USING ER_DATA_CHANGED.
ENDMETHOD. "HANDLE_DATA_CHANGED
METHOD HANDLE_MODIFY.
PERFORM FRM_HANDLE_CHANGED_FINISHED USING E_MODIFIED ET_GOOD_CELLS.
ENDMETHOD. "HANDLE_MODIFY
ENDCLASS.
*&---------------------------------------------------------------------*
*& START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.
* 获取数据
PERFORM FRM_GET_DATA.
* 展示数据
PERFORM FRM_SHOW_DATA.
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
* 获取数据
*----------------------------------------------------------------------*
FORM FRM_GET_DATA .
SELECT *
INTO CORRESPONDING FIELDS OF TABLE GT_DATA
FROM ZALV_EDIT.
CLEAR GS_F4VALUE.
GS_F4VALUE-GESCH = 1.
GS_F4VALUE-ZTEXT = '男'.
APPEND GS_F4VALUE TO GT_F4VALUE.
CLEAR GS_F4VALUE.
GS_F4VALUE-GESCH = 2.
GS_F4VALUE-ZTEXT = '女'.
APPEND GS_F4VALUE TO GT_F4VALUE.
ENDFORM. " FRM_GET_DATA
*&---------------------------------------------------------------------*
*& Form FRM_SHOW_DATA
*&---------------------------------------------------------------------*
* 展示数据
*----------------------------------------------------------------------*
FORM FRM_SHOW_DATA.
DATA:
LS_LAYOUT TYPE LVC_S_LAYO.
* 宏:编辑fieldcat
DEFINE %%FCAT.
CLEAR gs_fcat.
gs_fcat-fieldname = &1.
gs_fcat-scrtext_l = &2.
gs_fcat-KEY = &3.
gs_fcat-edit = &4.
IF &1 = 'ZSEX'.
gs_fcat-f4availabl = 'X'.
ENDIF.
gs_fcat-NO_OUT = &5.
APPEND gs_fcat TO gt_fcat.
END-OF-DEFINITION.
%%FCAT: 'LIGHT' '红绿灯' 'X' 'X' 'X',
'PERNR' '人员编号' 'X' 'X' '',
'NACHN' '姓名' 'X' 'X' '',
'ZSEX' '性别' '' 'X' '',
'SCORE' '分数' '' 'X' '',
'MSG' '消息' '' 'X' 'X'.
* layout设定
LS_LAYOUT-ZEBRA = ABAP_TRUE.
LS_LAYOUT-CWIDTH_OPT = ABAP_TRUE.
LS_LAYOUT-BOX_FNAME = 'SEL'. "指定这个字段为【选择块】
* 注册事件
GS_EVENT-NAME = 'CALLER_EXIT'.
GS_EVENT-FORM = 'F_CALLER_EXIT'.
APPEND GS_EVENT TO GT_EVENT.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
I_CALLBACK_PROGRAM = SY-CPROG
I_CALLBACK_PF_STATUS_SET = 'PF_STATUS_SET'
I_CALLBACK_USER_COMMAND = 'FRM_USER_COMMAND'
IS_LAYOUT_LVC = LS_LAYOUT
IT_FIELDCAT_LVC = GT_FCAT
IT_EVENTS = GT_EVENT
TABLES
T_OUTTAB = GT_DATA.
ENDFORM. " FRM_SHOW_DATA
*&---------------------------------------------------------------------*
*& Form F_F4_HELP
*&---------------------------------------------------------------------*
* 设置GUI状态
*----------------------------------------------------------------------*
FORM PF_STATUS_SET USING RT_EXTAB TYPE SLIS_T_EXTAB.
SET PF-STATUS 'STANDARD_001'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV_USER_COMMAND
*&---------------------------------------------------------------------*
*& user_command功能实现
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_USER_COMMAND USING UCOMM TYPE SY-UCOMM
SELFIELD TYPE SLIS_SELFIELD.
DATA: LR_GRID TYPE REF TO CL_GUI_ALV_GRID.
DATA: L_ANSWER TYPE CHAR1.
DATA: LS_LAYOUT TYPE LVC_S_LAYO.
DATA LT_EDIT TYPE TABLE OF TYP_EDIT.
DATA LS_EDIT TYPE TYP_EDIT.
LS_LAYOUT-ZEBRA = ABAP_TRUE.
LS_LAYOUT-CWIDTH_OPT = ABAP_TRUE.
LS_LAYOUT-BOX_FNAME = 'SEL'. "指定这个字段为【选择块】
SELFIELD-REFRESH = 'X'.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
E_GRID = LR_GRID.
LR_GRID->CHECK_CHANGED_DATA( ). "refresh alv
* LR_GRID->REFRESH_TABLE_DISPLAY( ). "refresh alv
CASE UCOMM.
WHEN 'F03' OR 'F15'.
LEAVE PROGRAM.
* LEAVE LIST-PROCESSING. " 返回选择屏幕
WHEN 'F12'.
LEAVE PROGRAM. " 退出程序
WHEN '&INSERT'. " 双击事件
CLEAR GS_DATA.
INSERT GS_DATA INTO GT_DATA INDEX 1.
CLEAR GS_DATA.
SELFIELD-REFRESH = 'X'.
WHEN '©'.
READ TABLE GT_DATA WITH KEY SEL = 'X' INTO GS_DATA.
IF SY-SUBRC = 0.
DATA(L_I_DATA) = GT_DATA.
DELETE L_I_DATA WHERE SEL <> ABAP_TRUE.
APPEND LINES OF L_I_DATA TO GT_DATA.
ELSE.
MESSAGE '请选择复制行' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
WHEN '&DELETE'.
DELETE GT_DATA INDEX SELFIELD-TABINDEX.
WHEN '&DATA_SAVE'.
LOOP AT GT_DATA INTO GS_DATA.
MOVE-CORRESPONDING GS_DATA TO LS_EDIT.
LS_EDIT-MANDT = SY-MANDT.
APPEND LS_EDIT TO LT_EDIT.
CLEAR:GS_DATA,LS_EDIT.
ENDLOOP.
DELETE FROM ZALV_EDIT.
INSERT ZALV_EDIT FROM TABLE LT_EDIT.
IF SY-SUBRC = 0.
COMMIT WORK.
* MESSAGE '保存成功' TYPE 'S'.
DATA(ZFLG) = ABAP_TRUE.
ELSE.
CLEAR ZFLG.
ROLLBACK WORK.
MESSAGE '保存失败' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
LOOP AT GT_DATA ASSIGNING FIELD-SYMBOL(<FS_L_DATA>).
IF ZFLG = ABAP_TRUE.
<FS_L_DATA>-LIGHT = ICON_GREEN_LIGHT.
<FS_L_DATA>-MSG = '保存成功'.
ELSE.
<FS_L_DATA>-LIGHT = ICON_RED_LIGHT.
<FS_L_DATA>-MSG = '保存失败'.
ENDIF.
ENDLOOP.
PERFORM F_REFRESH_ALV
USING LR_GRID.
WHEN OTHERS.
* LR_GRID->SET_FRONTEND_LAYOUT( LS_LAYOUT ).
* LR_GRID->REFRESH_TABLE_DISPLAY( ). "refresh alv
ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_CALLER_EXIT
*&---------------------------------------------------------------------*
* 注册事件
*----------------------------------------------------------------------*
FORM F_CALLER_EXIT
USING E_GRID TYPE SLIS_DATA_CALLER_EXIT.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
E_GRID = GO_GRID.
* 注册F4字段
GS_F4-FIELDNAME = 'ZSEX'.
GS_F4-REGISTER = 'X'.
INSERT GS_F4 INTO TABLE GT_F4.
CALL METHOD GO_GRID->REGISTER_F4_FOR_FIELDS
EXPORTING
IT_F4 = GT_F4[].
* 创建事件对象
CREATE OBJECT EVENT_RECEIVER.
*注册事件
SET HANDLER EVENT_RECEIVER->HANDLE_F4 FOR GO_GRID.
SET HANDLER EVENT_RECEIVER->HANDLE_MODIFY FOR GO_GRID.
SET HANDLER EVENT_RECEIVER->HANDLE_DATA_CHANGED FOR GO_GRID.
* 设置相应方式
CALL METHOD GO_GRID->REGISTER_EDIT_EVENT
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER
EXCEPTIONS
ERROR = 1
OTHERS = 2.
CALL METHOD GO_GRID->REGISTER_EDIT_EVENT
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED
EXCEPTIONS
ERROR = 1
OTHERS = 2.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_F4_HELP
*&---------------------------------------------------------------------*
* F4帮助
*----------------------------------------------------------------------*
FORM F_F4_HELP
USING E_FIELDNAME TYPE LVC_FNAME ES_ROW_NO TYPE LVC_S_ROID.
DATA: LT_DDSHRETVAL TYPE STANDARD TABLE OF DDSHRETVAL,
LS_DDSHRETVAL TYPE DDSHRETVAL.
CHECK E_FIELDNAME = 'ZSEX'.
REFRESH LT_DDSHRETVAL.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
RETFIELD = 'ZSEX' " Name of return field in FIELD_TAB
DYNPPROG = SY-REPID
DYNPNR = SY-DYNNR
DYNPROFIELD = 'ZTEXT' " Name of screen field for value return
VALUE_ORG = 'S'
CALLBACK_PROGRAM = SY-REPID
TABLES
VALUE_TAB = GT_F4VALUE
RETURN_TAB = LT_DDSHRETVAL
EXCEPTIONS
PARAMETER_ERROR = 1
NO_VALUES_FOUND = 2
OTHERS = 3.
IF SY-SUBRC = 0 AND LT_DDSHRETVAL IS NOT INITIAL .
CLEAR LS_DDSHRETVAL.
READ TABLE LT_DDSHRETVAL INTO LS_DDSHRETVAL INDEX 1.
IF LS_DDSHRETVAL-FIELDVAL IS NOT INITIAL.
CLEAR GS_DATA.
READ TABLE GT_DATA INTO GS_DATA INDEX ES_ROW_NO-ROW_ID.
GS_DATA-ZSEX = LS_DDSHRETVAL-FIELDVAL.
MODIFY GT_DATA FROM GS_DATA INDEX ES_ROW_NO-ROW_ID
TRANSPORTING ZSEX.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_F4_HELP
*&---------------------------------------------------------------------*
* 稳定刷新
*----------------------------------------------------------------------*
FORM REFRESH_TABLE_ALV.
DATA: LS_STBL TYPE LVC_S_STBL.
LS_STBL-ROW = 'X'."
LS_STBL-COL = 'X'.
CALL METHOD GO_GRID->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = LS_STBL.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_REFRESH_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM F_REFRESH_ALV
USING UR_GRID TYPE REF TO CL_GUI_ALV_GRID.
CLEAR GT_FCAT.
CALL METHOD UR_GRID->GET_FRONTEND_FIELDCATALOG
IMPORTING
ET_FIELDCATALOG = GT_FCAT[].
LOOP AT GT_FCAT ASSIGNING FIELD-SYMBOL(<FS_L_FACT>)
WHERE FIELDNAME = 'LIGHT'
OR FIELDNAME = 'MSG'.
<FS_L_FACT>-NO_OUT = SPACE.
<FS_L_FACT>-EDIT = SPACE.
ENDLOOP.
CALL METHOD UR_GRID->SET_FRONTEND_FIELDCATALOG
EXPORTING
IT_FIELDCATALOG = GT_FCAT[].
CALL METHOD UR_GRID->GET_FRONTEND_LAYOUT
IMPORTING
ES_LAYOUT = GS_LAYOUT.
CALL METHOD UR_GRID->SET_FRONTEND_LAYOUT
EXPORTING
IS_LAYOUT = GS_LAYOUT.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_HANDLE_CHANGED_FINISHED
*&---------------------------------------------------------------------*
*& 当数据修改完成后触发
*&---------------------------------------------------------------------*
*& --> E_MODIFIED
*& --> ET_GOOD_CELLS
*&---------------------------------------------------------------------*
FORM FRM_HANDLE_CHANGED_FINISHED
USING UP_MODIFIED UP_I_GOOD_CELLS.
DATA: LI_MODI TYPE LVC_T_MODI,
LW_MODI TYPE LVC_S_MODI.
DATA: LW_STABLE TYPE LVC_S_STBL,
LW_S_COL TYPE LVC_S_COL.
CLEAR: LW_STABLE .
* CLEAR LI_DATA.
MOVE UP_I_GOOD_CELLS TO LI_MODI.
READ TABLE LI_MODI INDEX 1 INTO LW_MODI.
IF LW_MODI-FIELDNAME = 'SCORE'.
READ TABLE GT_DATA ASSIGNING FIELD-SYMBOL(<FS_L_DATA>) INDEX LW_MODI-ROW_ID.
IF <FS_L_DATA> IS ASSIGNED.
IF LW_MODI-VALUE < 0.
<FS_L_DATA>-LIGHT = ICON_RED_LIGHT.
<FS_L_DATA>-MSG = '分数不能小于0啊'.
ELSE.
<FS_L_DATA>-LIGHT = ICON_GREEN_LIGHT.
<FS_L_DATA>-MSG = ''.
ENDIF.
ENDIF.
ELSE.
RETURN.
ENDIF.
*刷新ALV
DATA:O_GRID TYPE REF TO CL_GUI_ALV_GRID.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
E_GRID = O_GRID.
PERFORM F_REFRESH_ALV
USING O_GRID.
LW_STABLE-ROW = 'X'.
LW_STABLE-COL = 'X'.
"刷新ALV
CALL METHOD O_GRID->REFRESH_TABLE_DISPLAY
EXPORTING
I_SOFT_REFRESH = 'X'
IS_STABLE = LW_STABLE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_HANDLE_CHANGED
*&---------------------------------------------------------------------*
*& 在可编辑字段的数据发生变化时触发,可用来检查数据的输入正确性
*&---------------------------------------------------------------------*
*& --> ER_DATA_CHANGED
*&---------------------------------------------------------------------*
FORM FRM_HANDLE_CHANGED
USING UP_ER_DATA_CHANGED TYPE REF TO CL_ALV_CHANGED_DATA_PROTOCOL.
BREAK-POINT.
ENDFORM.