1. 程式人生 > >ABAP ALV控制元件的使用

ABAP ALV控制元件的使用

REPORT  YTEST20160620004.

DATA:OK_CODE TYPE SY-UCOMM,
     SAVE_OK TYPE SY-UCOMM.
TABLES YTJAYSCHOOL.

DATA LS_SCHOOL TYPE YTJAYSCHOOL.

DATA WA_SCHOOL TYPE TABLE OF YTJAYSCHOOL.

DATA WADEL_SCHOOL TYPE TABLE OF YTJAYSCHOOL.

SELECT * INTO TABLE WA_SCHOOL FROM YTJAYSCHOOL.

DATA:WA_CONTAINER TYPE SCRFNAME VALUE 'ALVDATA',
     ALV_GRID TYPE REF TO CL_GUI_ALV_GRID,
     WA_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.

DATA WA_LAYOUT TYPE LVC_S_LAYO.
WA_LAYOUT-EDIT = 'X'.
CLASS LCL_EVENT_RECEIVER DEFINITION DEFERRED.

DATA EVENT_RECEIVER TYPE REF TO LCL_EVENT_RECEIVER.

CLASS LCL_EVENT_RECEIVER DEFINITION.
  PUBLIC SECTION.
    TYPES: DEL_ROWS TYPE STANDARD TABLE OF YTJAYSCHOOL.
    DATA: DDEL_ROWS TYPE STANDARD TABLE OF YTJAYSCHOOL.

    METHODS:
    HANDLE_DATA_CHANGED
      FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
        IMPORTING ER_DATA_CHANGED.

    METHODS:
    UPDATE_DELTA_TABLES
      IMPORTING
        PR_DATA_CHANGED TYPE REF TO CL_ALV_CHANGED_DATA_PROTOCOL.

    METHODS:
    GET_DELETED_ROWS
    EXPORTING
      DELETED_ROWS TYPE DEL_ROWS.
ENDCLASS.

CLASS LCL_EVENT_RECEIVER IMPLEMENTATION.
  METHOD HANDLE_DATA_CHANGED.
    CALL METHOD UPDATE_DELTA_TABLES( ER_DATA_CHANGED ).
  ENDMETHOD.

  METHOD UPDATE_DELTA_TABLES.
    DATA: L_DEL_ROW  TYPE LVC_S_MOCE.

    LOOP AT PR_DATA_CHANGED->MT_DELETED_ROWS INTO L_DEL_ROW.
      READ TABLE WA_SCHOOL INTO LS_SCHOOL INDEX L_DEL_ROW-ROW_ID.
      IF SY-SUBRC NE 0.
        MESSAGE E208(00) WITH '處理錯誤'.
      ELSE.
        APPEND LS_SCHOOL TO DDEL_ROWS.
      ENDIF.
    ENDLOOP.
  ENDMETHOD.

  METHOD GET_DELETED_ROWS.
    DELETED_ROWS = ME->DDEL_ROWS.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  CALL SCREEN 100.
  WRITE / '---------------刪除的內表記錄---------------'.
  WRITE / '____________________________________________'.
  CALL METHOD EVENT_RECEIVER->GET_DELETED_ROWS
    IMPORTING
      DELETED_ROWS = WADEL_SCHOOL.

  LOOP AT WADEL_SCHOOL INTO YTJAYSCHOOL.
    WRITE:/ YTJAYSCHOOL-YSH_ID,YTJAYSCHOOL-YSH_NAME,YTJAYSCHOOL-YSH_ADDR.
  ENDLOOP.

  WRITE:/ '---------------更新後的內表記錄---------------:'.
  WRITE:/ '____________________________________________'.
  LOOP AT WA_SCHOOL INTO YTJAYSCHOOL.
    WRITE:/ YTJAYSCHOOL-YSH_ID,YTJAYSCHOOL-YSH_NAME,YTJAYSCHOOL-YSH_ADDR.
  ENDLOOP.

*  WHEN 'SAVE'.
*    MODIFY YTJAYSCHOOL FROM TABLE WA_SCHOOL.
*    IF SY-SUBRC NE 0.
*      MESSAGE I005(YMESS) WITH '更新資料錯誤'.
*      EXIT.
*    ELSE.
*      MESSAGE I005(YMESS) WITH '更新資料OK'.
*    ENDIF.
*
*    DELETE YTJAYSCHOOL FROM TABLE DELA_SCHOOL.
*    IF SY_SUBRC NE 0.
*      MESSAGE I005(YMESS) WITH '更新資料錯誤'.
*    ELSE.
*      MESSAGE I005(YMESS) WITH '更新資料OK'.
*    ENDIF.


END-OF-SELECTION.

MODULE STATUS_0100 OUTPUT.
  SET PF-STATUS 'STATUS1'.
  IF WA_CUSTOM_CONTAINER IS INITIAL.
    CREATE OBJECT WA_CUSTOM_CONTAINER
    EXPORTING CONTAINER_NAME = WA_CONTAINER.
    CREATE OBJECT ALV_GRID
      EXPORTING I_PARENT = WA_CUSTOM_CONTAINER.

    CREATE OBJECT EVENT_RECEIVER.
    SET HANDLER EVENT_RECEIVER->HANDLE_DATA_CHANGED FOR ALV_GRID.

    CALL METHOD ALV_GRID->SET_TABLE_FOR_FIRST_DISPLAY
      EXPORTING
        I_STRUCTURE_NAME = 'YTJAYSCHOOL'
        IS_LAYOUT = WA_LAYOUT
      CHANGING
        IT_OUTTAB = WA_SCHOOL.
    ENDIF.
ENDMODULE.

MODULE USER_COMMAND_0100 INPUT.
  SAVE_OK = OK_CODE.
  CLEAR OK_CODE.
  CASE SAVE_OK.
    WHEN 'CANCEL'.
      DATA L_RET VALUE 'X'.
      CALL METHOD ALV_GRID->CHECK_CHANGED_DATA
        IMPORTING
          E_VALID = L_RET.
      LEAVE TO SCREEN 0.
  ENDCASE.
ENDMODULE.
輸出結果: