1. 程式人生 > >Funcation ALV 事件用法(編輯ALV ,直接保存修改數據到DB)

Funcation ALV 事件用法(編輯ALV ,直接保存修改數據到DB)

acs mit lba ngs stand orm suitable fail cells

技術分享圖片*&---------------------------------------------------------------------*
*& 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.

Funcation ALV 事件用法(編輯ALV ,直接保存修改數據到DB)