************************************************************************
* DEFINE CLASS EVENT
************************************************************************
DATA: GT_EVENTS TYPE SLIS_T_EVENT,
GS_EVENTS TYPE SLIS_ALV_EVENT.
DATA: G_GRID TYPE REF TO CL_GUI_ALV_GRID.
CLASS GCL_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. "gcl_event_handler DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_event_handler IMPLEMENTATION
*----------------------------------------------------------------------*
* 类实现
*----------------------------------------------------------------------*
CLASS GCL_EVENT_HANDLER IMPLEMENTATION."类实现
METHOD HANDLE_DATA_CHANGED.
DATA: LV_STBL TYPE LVC_S_STBL.
PERFORM HANDLE_DATA_CHANGED ."检查或自动赋值等
IF E_MODIFIED = 'X'."数据有更改才会X
LV_STBL-ROW = 'X'." 基于行的稳定刷新
LV_STBL-COL = 'X'." 基于列稳定刷新
CALL METHOD G_GRID->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = LV_STBL.
ENDIF.
ENDMETHOD.
ENDCLASS. "gcl_event_handler IMPLEMENTATION
DATA: GS_LAYOUT TYPE LVC_S_LAYO,
GT_FIELDCAT TYPE LVC_T_FCAT,
GV_TITLE TYPE LVC_TITLE.
GV_TITLE = '抬头'.
GS_LAYOUT-SEL_MODE ='A'."单元格区域选择
GS_LAYOUT-ZEBRA ='X'."斑马线
GS_LAYOUT-CWIDTH_OPT ='X'."最佳列宽
GS_LAYOUT-BOX_FNAME ='SEL'."设置选择字段
GT_FIELDCAT = VALUE #( BASE GT_FIELDCAT
( FIELDNAME = '' "字段名
COLTEXT = '' "列标题
SCRTEXT_L = '' "长字段标签
REF_TABLE = '' "参考表/结构
REF_FIELD = '' "参考字段
CHECKBOX = '' "作为复选框输出(需搭配EDIT参数使用)
KEY = '' "关键字段(滚动时列位置不变,且自动移动至左侧
NO_ZERO = '' "不输出前导0
ICON = '' "作为图标输出
EDIT = '' "编辑
)
).
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
I_STRUCTURE_NAME = 'ZMMS_R004' "结构或表
CHANGING
CT_FIELDCAT = GT_FIELDCAT
EXCEPTIONS
INCONSISTENT_INTERFACE = 1
PROGRAM_ERROR = 2
OTHERS = 3.
**增加ALV事件
CLEAR: GS_EVENTS.
GS_EVENTS-NAME = 'CALLER_EXIT'.
GS_EVENTS-FORM = 'FRM_REGISTER_EVENTS'.
APPEND GS_EVENTS TO GT_EVENTS.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID
I_GRID_TITLE = GV_TITLE
IS_LAYOUT_LVC = GS_LAYOUT
IT_FIELDCAT_LVC = GT_FIELDCAT[]
I_CALLBACK_PF_STATUS_SET = 'FRM_STATUS_SET'
I_CALLBACK_USER_COMMAND = 'FRM_USER_COMMAND'
I_CALLBACK_HTML_TOP_OF_PAGE = 'FRM_TOP_OF_PAGE'
IT_EVENTS = GT_EVENTS[]
I_SAVE = 'A' "保存布局 A:全局和特定用户
TABLES
T_OUTTAB = GT_DATA.
FORM FRM_STATUS_SET USING U_EXTAB TYPE SLIS_T_EXTAB.
SET PF-STATUS 'PF_1000'.
ENDFORM.
FORM FRM_USER_COMMAND USING U_UCOMM TYPE SY-UCOMM
P_RS_SELFIELD TYPE SLIS_SELFIELD.
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->CHECK_CHANGED_DATA.
* P_RS_SELFIELD-REFRESH = ABAP_TRUE.
CASE U_UCOMM.
WHEN 'XXXX'."
WHEN '&IC1'."双击
READ TABLE GT_DATA INTO GS_DATA INDEX P_RS_SELFIELD-TABINDEX.
IF SY-SUBRC = 0.
IF P_RS_SELFIELD-FIELDNAME EQ 'EBELN' OR P_RS_SELFIELD-FIELDNAME EQ 'EBELP'.
IF GS_DATA-EBELN IS NOT INITIAL.
SET PARAMETER ID 'BES' FIELD GS_DATA-EBELN.
CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN."采购订单
ENDIF.
ELSEIF P_RS_SELFIELD-FIELDNAME EQ 'VBELN' AND GS_DATA-LFART EQ 'EL'.
IF GS_DATA-ZLOG_ID IS NOT INITIAL.
SET PARAMETER ID 'VL' FIELD GS_DATA-VBELN.
CALL TRANSACTION 'VL33N' AND SKIP FIRST SCREEN."内向交货单
ENDIF.
ELSEIF P_RS_SELFIELD-FIELDNAME EQ 'VBELN' AND GS_DATA-LFART EQ 'NL*'.
IF GS_DATA-ZLOG_ID IS NOT INITIAL.
SET PARAMETER ID 'VL' FIELD GS_DATA-VBELN.
CALL TRANSACTION 'VL03N' AND SKIP FIRST SCREEN."外向交货单
ENDIF.
ELSEIF P_RS_SELFIELD-FIELDNAME EQ 'MATNR'.
IF GS_DATA-MATNR IS NOT INITIAL.
SET PARAMETER ID 'MAT' FIELD GS_DATA-MATNR.
CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN."物料主数据
ENDIF.
ELSEIF P_RS_SELFIELD-FIELDNAME EQ 'MBLNR'. "物料凭证MIGO
CALL FUNCTION 'MIGO_DIALOG'
EXPORTING
I _ ACTION = 'A04' "显示
I _ REFDOC = 'R02' "物料配置
I _ MBLNR = GS_DATA-MBLNR "物料凭证
I _ MJAHR = GS_DATA-MJAHR "凭证年度
EXCEPTIONS
ILLEGAL _ COMBINATION = 1
OTHERS = 2.
ENDIF.
ENDIF.
WHEN OTHERS.
ENDCASE.
CALL METHOD LO_GRID->GET_FRONTEND_LAYOUT
IMPORTING
ES_LAYOUT = GS_LAYOUT.
GS_LAYOUT-CWIDTH_OPT = 'X'.
CALL METHOD LO_GRID->SET_FRONTEND_LAYOUT
EXPORTING
IS_LAYOUT = GS_LAYOUT.
CALL METHOD LO_GRID->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = VALUE LVC_S_STBL( ROW = 'X' COL = 'X' ).
ENDFORM.
FORM FRM_TOP_OF_PAGE USING DOCUMENT TYPE REF TO CL_DD_DOCUMENT.
DATA: LV_TEXT TYPE SDYDO_TEXT_ELEMENT.
DATA(LV_LINES1) = LINES( GT_DATA[] )."总条目数
DATA(LT_DATA) = GT_DATA[].
DELETE LT_DATA WHERE STATU NE ICON_LED_RED.
DATA(LV_LINES2) = LINES( LT_DATA[] )."红灯条目数
LT_DATA[] = GT_DATA[].
DELETE LT_DATA WHERE STATU NE ICON_LED_YELLOW.
DATA(LV_LINES3) = LINES( LT_DATA[] )."黄灯条目数
LT_DATA[] = GT_DATA[].
DELETE LT_DATA WHERE STATU NE ICON_LED_GREEN.
DATA(LV_LINES4) = LINES( LT_DATA[] )."绿灯条目数
LV_TEXT = |共| && LV_LINES1 && |条数据,其中:|.
LV_TEXT = LV_TEXT && |红灯| && LV_LINES2 && |条、|.
LV_TEXT = LV_TEXT && |黄灯| && LV_LINES3 && |条、|.
LV_TEXT = LV_TEXT && |绿灯| && LV_LINES4 && |条。|.
CALL METHOD DOCUMENT->ADD_TEXT
EXPORTING
TEXT = LV_TEXT
SAP_STYLE = CL_DD_AREA=>HEADING.
CALL METHOD DOCUMENT->NEW_LINE.
LV_TEXT = |状态灯 红色:失效日期<=30天、黄色:30天<失效日期<=60天、绿色:失效日期>60天|.
CALL METHOD DOCUMENT->ADD_TEXT
EXPORTING
TEXT = LV_TEXT
SAP_EMPHASIS = CL_DD_AREA=>SMALL.
ENDFORM.
FORM FRM_REGISTER_EVENTS USING P_EXIT TYPE SLIS_DATA_CALLER_EXIT.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
E_GRID = G_GRID.
* 设置回车事件
CALL METHOD G_GRID->REGISTER_EDIT_EVENT
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER
EXCEPTIONS
ERROR = 1
OTHERS = 2.
CALL METHOD G_GRID->SET_READY_FOR_INPUT
EXPORTING
I_READY_FOR_INPUT = 1.
* 设置光标焦点移开被修改单元格后触发事件
CALL METHOD G_GRID->REGISTER_EDIT_EVENT
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED
EXCEPTIONS
ERROR = 1
OTHERS = 2.
DATA: GR_EVENT_HANDLER TYPE REF TO GCL_EVENT_HANDLER.
CREATE OBJECT GR_EVENT_HANDLER.
SET HANDLER GR_EVENT_HANDLER->HANDLE_DATA_CHANGED FOR G_GRID.
ENDFORM.
1、GS_LAYOUT-SEL_MODE有四种取值A,B,C或D
A:多行多列选择。有选择块,通过前面的选择块选择行,但不可以选择单元格区域。
B:单行选择。没有前面的选择块,单击任一单元格,就选中单元格所在的行。
C:多行选择。没有选择块,可以拖动选择多行。
D:单元格区域选择,可以按住鼠标拖动选择单元格区域,也可以通过选择块选择多行。