*&---------------------------------------------------------------------**& REPORT Y_ALV_OO_JAMES_4*&*&---------------------------------------------------------------------**& THIS REPORT SHOW YOU HOW TO USE FUNCATION ALV AND EVENT*&---------------------------------------------------------------------*REPORT Y_FCUNCA_ALV_DEMON.TABLES:YCACS_CTRTBU.*&---------------------------------------------------------------------**& DATA DEFINE*&---------------------------------------------------------------------*DATA: CTRTBU_ID TYPE CACS_CTRTBU_ID.DATA: LT_CACS_CTRTBU_TEMP TYPE TABLE OF YCACS_CTRTBU1, LT_CACS_CTRTBU TYPE TABLE OF YCACS_CTRTBU1, LS_CACS_CTRTBU TYPE YCACS_CTRTBU1,* ALV DEFINIE GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV, GS_FIELDCAT TYPE SLIS_FIELDCAT_ALV, GS_LAYOUT TYPE SLIS_LAYOUT_ALV,* EVENT用 GT_EVENT TYPE SLIS_T_EVENT, GS_EVENT TYPE SLIS_ALV_EVENT,* 当用户选择复选框时,立刻出发DATA_CHANGED 事件. GS_GLAY TYPE LVC_S_GLAY.*&---------------------------------------------------------------------**& PARAMETERS DEFINITION*&---------------------------------------------------------------------*START-OF-SELECTION.SELECTION-SCREEN BEGIN OF BLOCK B01 WITH FRAME TITLE TEXT-B01.PARAMETERS: P_CLIK AS CHECKBOX DEFAULT ‘X‘.PARAMETERS: P_EDIT AS CHECKBOX DEFAULT ‘X‘.SELECT-OPTIONS:S_COMM FOR CTRTBU_ID.SELECTION-SCREEN END OF BLOCK B01.*&---------------------------------------------------------------------**& INITIALIZATION*&---------------------------------------------------------------------*INITIALIZATION. CLEAR: LT_CACS_CTRTBU_TEMP, LT_CACS_CTRTBU, LS_CACS_CTRTBU, GT_FIELDCAT, GS_LAYOUT, GT_EVENT, GS_EVENT.*&---------------------------------------------------------------------**& START-OF-SELECTION*&---------------------------------------------------------------------*START-OF-SELECTION.* GET DATA PERFORM GET_DATA. PERFORM SET_ALV_FIELDCAT. PERFORM SET_ALV_LAYOUT. PERFORM SET_ALV_EVENT. PERFORM SET_ALV_SHOW.* 和SE80里自己设置的 GUI_STATUS 进行关联。 FORM ALV_STATUS_SET USING PT_EXTAB TYPE SLIS_T_EXTAB. CLEAR: PT_EXTAB.* SET PF-STATUS ‘ALV_STATUS‘. " 这是我自己设置的GUI STATUS,具体方法SE80-->GUI STATUS -APPLICATION TOOLBAR SET PF-STATUS ‘STANDARD_FULLSCREEN‘. " 这是我参照SAP 系统标准的GUI STATUS 进行设置的,功能比较齐全,具体方法,复制STANDARD_FULLSCREEN名 ENDFORM.* USER_COMMAND 事件 FORM ALV_USER_COMMAND USING P_UCOMM LIKE SY-UCOMM P_SELFIELD TYPE SLIS_SELFIELD. " 可以获取某一个单元格内的值 CASE P_UCOMM. WHEN ‘CLOSE‘. LEAVE PROGRAM. WHEN ‘&DATA_SAVE‘. MODIFY YCACS_CTRTBU FROM TABLE LT_CACS_CTRTBU. IF SY-SUBRC = 0. COMMIT WORK. MESSAGE ‘SUCCESSS‘ TYPE ‘S‘. ELSE. MESSAGE ‘FAIL‘ TYPE ‘E‘. ENDIF. WHEN OTHERS. ENDCASE. ENDFORM.* ALV_DATA_CHANGED 事件 FORM ALV_DATA_CHANGED USING PCL_DATA TYPE REF TO CL_ALV_CHANGED_DATA_PROTOCOL. DATA: L_NAME(100), LS_CELLS TYPE LVC_S_MODI. FIELD-SYMBOLS <FS_VALUE>. LOOP AT PCL_DATA->MT_MOD_CELLS INTO LS_CELLS. CLEAR:LS_CACS_CTRTBU. READ TABLE LT_CACS_CTRTBU INTO LS_CACS_CTRTBU INDEX LS_CELLS-ROW_ID. CONCATENATE ‘LT_CACS_CTRTBU-‘LS_CELLS-FIELDNAME INTO L_NAME. ASSIGN (L_NAME) TO <FS_VALUE>. <FS_VALUE> = LS_CELLS-VALUE. MODIFY LT_CACS_CTRTBU INDEX LS_CELLS-ROW_ID FROM LS_CACS_CTRTBU. ENDLOOP. ENDFORM.*&---------------------------------------------------------------------**& FORM SET_ALV_FIELDCAT*&---------------------------------------------------------------------** THIS PERFORM IS FOR GET ALL FIELDCAT REFERENCE CACS_CTRTBU*----------------------------------------------------------------------** --> CACS_CTRTBU REFERENCE* <-- GT_FIELDCAT*----------------------------------------------------------------------*FORM SET_ALV_FIELDCAT . CALL FUNCTION ‘REUSE_ALV_FIELDCATALOG_MERGE‘ EXPORTING I_PROGRAM_NAME = ‘Y_FCUNCA_ALV_DEMON‘* I_INTERNAL_TABNAME = I_STRUCTURE_NAME = ‘CACS_CTRTBU‘* I_CLIENT_NEVER_DISPLAY = ‘X‘* I_INCLNAME =* I_BYPASSING_BUFFER =* I_BUFFER_ACTIVE = CHANGING CT_FIELDCAT = GT_FIELDCAT EXCEPTIONS INCONSISTENT_INTERFACE = 1 PROGRAM_ERROR = 2 OTHERS = 3 . IF SY-SUBRC <> 0.* IMPLEMENT SUITABLE ERROR HANDLING HERE ENDIF.* ALV 显示的时候增加出2列CHECK BOX DELETE和ADD 列 GS_FIELDCAT-FIELDNAME = ‘DELETE_LINE‘."FIELDNAME GS_FIELDCAT-TABNAME = ‘YCACS_CTRTBU‘."TABNAME GS_FIELDCAT-CHECKBOX = ‘X‘.* GS_FIELDCAT-COLTEXT = ‘DELETE LINE‘##NO_TEXT . GS_FIELDCAT-SELTEXT_L = ‘DELETE_LINE‘. GS_FIELDCAT-SELTEXT_M = ‘DELETE_LINE‘. GS_FIELDCAT-SELTEXT_S = ‘DELETE_LINE‘. INSERT GS_FIELDCAT INTO TABLE GT_FIELDCAT. CLEAR GS_FIELDCAT. GS_FIELDCAT-FIELDNAME = ‘NEW_LINE‘."FIELDNAME GS_FIELDCAT-TABNAME = ‘YCACS_CTRTBU‘."TABNAME GS_FIELDCAT-CHECKBOX = ‘X‘. GS_FIELDCAT-SELTEXT_L = ‘NEW_LINE‘. GS_FIELDCAT-SELTEXT_M = ‘NEW_LINE‘. GS_FIELDCAT-SELTEXT_S = ‘NEW_LINE‘. INSERT GS_FIELDCAT INTO TABLE GT_FIELDCAT.ENDFORM.*&---------------------------------------------------------------------**& FORM SET_ALV_LAYOUT*&---------------------------------------------------------------------** EDIT THE LAYOUT*----------------------------------------------------------------------** --> P1 TEXT* <-- GS_LAYOUT LAYOUT*----------------------------------------------------------------------*FORM SET_ALV_LAYOUT .* SET LAYOUT GS_LAYOUT-ZEBRA = ABAP_TRUE. GS_LAYOUT-COLWIDTH_OPTIMIZE = ABAP_TRUE.* Set edit mode IF P_EDIT = ABAP_TRUE. GS_LAYOUT-EDIT = ABAP_TRUE. GS_GLAY-EDT_CLL_CB = ABAP_TRUE. " 选中复选款,立刻触发data changed 事件 ENDIF.ENDFORM.*&---------------------------------------------------------------------**& FORM SET_ALV_GUI_STATUS*&---------------------------------------------------------------------** TEXT*----------------------------------------------------------------------** --> P1 TEXT* <-- P2 TEXT*----------------------------------------------------------------------*FORM SET_ALV_EVENT.* SET GUI STATUS EVENT MOVE ‘PF_STATUS_SET‘ TO GS_EVENT-NAME. " ALV的事件名 MOVE ‘ALV_STATUS_SET‘ TO GS_EVENT-FORM. " ALV 程序内设置GUI STATUS的语句 APPEND GS_EVENT TO GT_EVENT.* SET ALV DATA_CHANGED EVENT MOVE ‘DATA_CHANGED‘ TO GS_EVENT-NAME. MOVE ‘ALV_DATA_CHANGED‘ TO GS_EVENT-FORM. APPEND GS_EVENT TO GT_EVENT.ENDFORM.*&---------------------------------------------------------------------**& FORM SET_ALV_SHOW*&---------------------------------------------------------------------** TEXT*----------------------------------------------------------------------** --> P1 TEXT* <-- P2 TEXT*----------------------------------------------------------------------*FORM SET_ALV_SHOW . CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY‘ EXPORTING* I_INTERFACE_CHECK = ‘ ‘* I_BYPASSING_BUFFER = ‘ ‘* I_BUFFER_ACTIVE = ‘ ‘ I_CALLBACK_PROGRAM = ‘Y_FCUNCA_ALV_DEMON‘* I_CALLBACK_PF_STATUS_SET = ‘ ‘ I_CALLBACK_USER_COMMAND = ‘ALV_USER_COMMAND‘* I_CALLBACK_TOP_OF_PAGE = ‘ ‘* I_CALLBACK_HTML_TOP_OF_PAGE = ‘ ‘* I_CALLBACK_HTML_END_OF_LIST = ‘ ‘ I_STRUCTURE_NAME = ‘CACS_CTRTBU‘* I_BACKGROUND_ID = ‘ ‘* I_GRID_TITLE =* I_GRID_SETTINGS = GS_GLAY " 复选框触发data changed 事件 IS_LAYOUT = GS_LAYOUT IT_FIELDCAT = GT_FIELDCAT* IS_SEL_HIDE =* I_DEFAULT = ‘X‘* I_SAVE = ‘ ‘* IS_VARIANT = IT_EVENTS = GT_EVENT* IT_EVENT_EXIT =* IS_PRINT =* IS_REPREP_ID = TABLES T_OUTTAB = LT_CACS_CTRTBU EXCEPTIONS PROGRAM_ERROR = 1 OTHERS = 2 . IF SY-SUBRC <> 0.* IMPLEMENT SUITABLE ERROR HANDLING HERE ENDIF.ENDFORM.*&---------------------------------------------------------------------**& FORM GET_DATA*&---------------------------------------------------------------------** TEXT*----------------------------------------------------------------------** --> P1 TEXT* <-- P2 TEXT*----------------------------------------------------------------------*FORM GET_DATA . IF P_CLIK = ABAP_TRUE. SELECT * INTO CORRESPONDING FIELDS OF TABLE LT_CACS_CTRTBU_TEMP FROM CACS_CTRTBU. IF LT_CACS_CTRTBU_TEMP IS NOT INITIAL. LT_CACS_CTRTBU = LT_CACS_CTRTBU_TEMP. ENDIF. ELSE. SELECT * INTO CORRESPONDING FIELDS OF TABLE LT_CACS_CTRTBU FROM CACS_CTRTBU WHERE CTRTBU_ID IN S_COMM. ENDIF. IF LT_CACS_CTRTBU IS INITIAL. MESSAGE ‘SORRY, NOT ABLE TO FIND THE DATA‘ TYPE ‘E‘. ENDIF.ENDFORM.