Vous êtes sur la page 1sur 7

OO ALV WITH EVENT FUNCTIONALITIES

*&---------------------------------------------------------------------*
*& Report ZALV_OO_1
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT ZALV_OO_1 NO STANDARD PAGE HEADING.

TABLES ZEMPL_TABLE.

*Employee Custom Table


TYPES : BEGIN OF TY_EMP,
ENO TYPE ZEMPL_TABLE-ENO,
ENAME TYPE ZEMPL_TABLE-ENAME,
END OF TY_EMP.

DATA : GT_EMP TYPE STANDARD TABLE OF TY_EMP,


GWA_EMP LIKE LINE OF GT_EMP.

DATA : GT_EMP_MOD TYPE STANDARD TABLE OF TY_EMP, "For getting Modified rows
GWA_EMP_MOD LIKE LINE OF GT_EMP_MOD.

DATA : GT_EMP_DEL TYPE STANDARD TABLE OF TY_EMP, "For getting Deleted rows
GWA_EMP_DEL LIKE LINE OF GT_EMP_DEL.

CLASS LCL_EVENTS DEFINITION DEFERRED. "Class for handling events

DATA : R_CONT TYPE REF TO CL_GUI_CUSTOM_CONTAINER, "Container Reference


R_ALV TYPE REF TO CL_GUI_ALV_GRID, "ALV Reference
R_ALV_TOOLMGR TYPE REF TO CL_ALV_GRID_TOOLBAR_MANAGER, "Toolbar
R_EVENTS TYPE REF TO LCL_EVENTS.

DATA : GT_ROW TYPE LVC_T_ROW. "selected rows

DATA : TOOL_BUTTON TYPE STB_BUTTON. "Toolbar Button Structure

DATA : WA_FIELDCAT TYPE LVC_S_FCAT, "Field Catalog Structure


IT_FIELDCAT TYPE LVC_T_FCAT. "Field Catalog Table Type

DATA : WA_LAYO TYPE LVC_S_LAYO. "Layout Structure

DATA : OK_CODE LIKE SY-UCOMM. "SY-UCOMM

SELECT-OPTIONS : S_ENO FOR ZEMPL_TABLE-ENO.

DATA: T_FUN TYPE UI_FUNCTIONS, "Toolbar buttons Filtering Structure


FS_FUN TYPE UI_FUNC.

CLASS LCL_EVENTS DEFINITION.


PUBLIC SECTION.
*Method for Adding Toolbar button
METHODS : HANDLE_USER_COMMAND FOR EVENT USER_COMMAND
OF CL_GUI_ALV_GRID
IMPORTING E_UCOMM.

*Method for Functionality of Toolbar button


METHODS : HANDLE_TOOLBAR FOR EVENT TOOLBAR
OF CL_GUI_ALV_GRID
IMPORTING E_OBJECT E_INTERACTIVE.

*Method for Hotspot Click


METHODS : HOTSPOT_CLICK FOR EVENT HOTSPOT_CLICK
OF CL_GUI_ALV_GRID
IMPORTING
E_ROW_ID
E_COLUMN_ID
ES_ROW_NO
SENDER.

METHODS : HANDLE_DATA_CHANGED FOR EVENT DATA_CHANGED


OF CL_GUI_ALV_GRID
IMPORTING ER_DATA_CHANGED.

ENDCLASS.

CLASS LCL_EVENTS IMPLEMENTATION.


METHOD HANDLE_TOOLBAR.

*Seperator between buttons


CLEAR TOOL_BUTTON.
TOOL_BUTTON-BUTN_TYPE = '3'. "separator
APPEND TOOL_BUTTON TO E_OBJECT->MT_TOOLBAR.

*Delete button
CLEAR TOOL_BUTTON.
TOOL_BUTTON-ICON = '@11@'. "Delete icon
TOOL_BUTTON-FUNCTION = 'DELETE'. "e_ucomm Function Code for Delete
TOOL_BUTTON-BUTN_TYPE = 0.
TOOL_BUTTON-TEXT = 'Delete'.
TOOL_BUTTON-QUICKINFO = 'Delete'.
APPEND TOOL_BUTTON TO E_OBJECT->MT_TOOLBAR.

*Seperator between buttons


CLEAR TOOL_BUTTON.
TOOL_BUTTON-BUTN_TYPE = '3'. "separator
APPEND TOOL_BUTTON TO E_OBJECT->MT_TOOLBAR.

*Save button
CLEAR TOOL_BUTTON.
TOOL_BUTTON-ICON = '@2L@'. "Save icon
TOOL_BUTTON-FUNCTION = 'SAVE'. "e_ucomm Function Code for save
TOOL_BUTTON-BUTN_TYPE = 0.
TOOL_BUTTON-TEXT = 'SAVE'.
TOOL_BUTTON-QUICKINFO = 'SAVE'.
APPEND TOOL_BUTTON TO E_OBJECT->MT_TOOLBAR.
ENDMETHOD.

METHOD HANDLE_USER_COMMAND.
CASE E_UCOMM.
WHEN 'DELETE'.
PERFORM DEL_DATA USING E_UCOMM. "Delete Records from Database table
WHEN 'SAVE'.
PERFORM SAVE_DATA USING E_UCOMM. "Edit and Save Records to Database
table
ENDCASE.
ENDMETHOD.

METHOD HOTSPOT_CLICK.
DATA: LS_COL_ID TYPE LVC_S_COL.

READ TABLE GT_EMP INTO GWA_EMP


INDEX E_ROW_ID-INDEX.

CASE E_COLUMN_ID-FIELDNAME.
WHEN 'ENO'.
CALL TRANSACTION 'ZEMP_TCD'.
WHEN OTHERS.
* do nothing
ENDCASE.

CALL METHOD R_ALV->SET_CURRENT_CELL_VIA_ID


EXPORTING
IS_ROW_ID = E_ROW_ID
IS_COLUMN_ID = LS_COL_ID.

ENDMETHOD. "handle_hotspot_click

METHOD HANDLE_DATA_CHANGED.
FIELD-SYMBOLS : <FS> TYPE ANY TABLE.
DATA : GT_EMP TYPE TABLE OF ZEMPL_TABLE.

ASSIGN ER_DATA_CHANGED->MP_MOD_ROWS->* TO <FS>.


* gt_emp = <fs>.
"OR
MOVE-CORRESPONDING <FS> TO GT_EMP.

IF GT_EMP IS NOT INITIAL.


UPDATE ZEMPL_TABLE FROM TABLE GT_EMP.

DATA LV_SAVE(3) TYPE C.

DESCRIBE TABLE GT_EMP LINES LV_SAVE.

DATA : LV_MSG TYPE STRING.

CONCATENATE 'Records updated in the ZEMPL_TABLE :' LV_SAVE INTO LV_MSG.

IF SY-SUBRC = 0.
COMMIT WORK.
MESSAGE LV_MSG TYPE 'I'.
ENDIF.
ENDIF.
ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

CALL SCREEN 96.

*&---------------------------------------------------------------------*
*& Module STATUS_0096 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE STATUS_0096 OUTPUT.
SET PF-STATUS 'STAT96'.
* SET TITLEBAR 'xxx'.

SELECT ENO
ENAME
FROM ZEMPL_TABLE
INTO CORRESPONDING FIELDS OF TABLE GT_EMP
WHERE ENO IN S_ENO.

IF SY-SUBRC EQ 0.
SORT GT_EMP BY ENO.
ENDIF.

*Container Object
CREATE OBJECT R_CONT
EXPORTING
CONTAINER_NAME = 'CCUST'.

*ALV Grid object


CREATE OBJECT R_ALV
EXPORTING
I_PARENT = R_CONT.

CREATE OBJECT R_EVENTS.

*--Hiding and Disabling Toobar Icons


*---------------------------------------------------------------------
*fs_fun = cl_gui_alv_grid=>mc_fc_maximum.
*APPEND fs_fun TO t_fun.
*fs_fun = cl_gui_alv_grid=>mc_fc_minimum.
*APPEND fs_fun TO t_fun.
*fs_fun = cl_gui_alv_grid=>mc_fc_subtot.
*APPEND fs_fun TO t_fun.
*fs_fun = cl_gui_alv_grid=>mc_fc_sum.
*APPEND fs_fun TO t_fun.
*fs_fun = cl_gui_alv_grid=>mc_fg_sort.
*APPEND fs_fun TO t_fun.
*fs_fun = cl_gui_alv_grid=>mc_fc_filter.
*APPEND fs_fun TO t_fun.
*fs_fun = cl_gui_alv_grid=>mc_fc_detail.
*APPEND fs_fun TO t_fun.
*---------------------------------------------------------------------

*--Registering handler methods to handle ALV Grid events


SET HANDLER R_EVENTS->HANDLE_TOOLBAR FOR R_ALV.
SET HANDLER R_EVENTS->HANDLE_USER_COMMAND FOR R_ALV.
SET HANDLER R_EVENTS->HOTSPOT_CLICK FOR R_ALV.
SET HANDLER R_EVENTS->HANDLE_DATA_CHANGED FOR R_ALV.

*Field Catalog
CLEAR WA_FIELDCAT.
WA_FIELDCAT-COL_POS = 1 .
WA_FIELDCAT-FIELDNAME = 'ENO'.
WA_FIELDCAT-COLTEXT = 'EMP. NO'.
WA_FIELDCAT-HOTSPOT = 'X'.
WA_FIELDCAT-SELTEXT = 'EMP NO'.
WA_FIELDCAT-OUTPUTLEN = 10.
APPEND WA_FIELDCAT TO IT_FIELDCAT.

CLEAR WA_FIELDCAT.
WA_FIELDCAT-COL_POS = 2.
WA_FIELDCAT-FIELDNAME = 'ENAME'.
WA_FIELDCAT-COLTEXT = 'EMP. NAME'.
WA_FIELDCAT-SELTEXT = 'EMP. NAME'.
WA_FIELDCAT-OUTPUTLEN = 50.
WA_FIELDCAT-EDIT = 'X'.
APPEND WA_FIELDCAT TO IT_FIELDCAT.

* Layout
WA_LAYO-CWIDTH_OPT = 'X'.
WA_LAYO-ZEBRA = 'X'.
WA_LAYO-CWIDTH_OPT = 'X'.

*ALV Display
CALL METHOD R_ALV->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
IT_TOOLBAR_EXCLUDING = T_FUN
IS_LAYOUT = WA_LAYO
CHANGING
IT_OUTTAB = GT_EMP
IT_FIELDCATALOG = IT_FIELDCAT.

ENDMODULE. " STATUS_0096 OUTPUT

*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0096 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0096 INPUT.

CASE OK_CODE.
WHEN 'BACK' OR 'CANCEL' OR 'EXIT'.
LEAVE PROGRAM.
ENDCASE.

ENDMODULE. " USER_COMMAND_0096 INPUT


*&---------------------------------------------------------------------*
*& Form DEL_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->E_UCOMM text
*----------------------------------------------------------------------*
FORM DEL_DATA USING E_UCOMM.

DATA : GT_ROW_ID TYPE LVC_T_ROID,


GWA_ROW_ID TYPE LINE OF LVC_T_ROID.

CLEAR: GT_ROW,GT_ROW_ID,GT_EMP_DEL.
CLEAR GWA_EMP.

CALL METHOD R_ALV->GET_SELECTED_ROWS


IMPORTING
ET_INDEX_ROWS = GT_ROW
ET_ROW_NO = GT_ROW_ID.

LOOP AT GT_ROW_ID INTO GWA_ROW_ID.


READ TABLE GT_EMP INTO GWA_EMP INDEX GWA_ROW_ID-ROW_ID.
IF SY-SUBRC EQ 0.
APPEND GWA_EMP TO GT_EMP_DEL.
CLEAR GWA_EMP.
ENDIF.
CLEAR GWA_ROW_ID.
ENDLOOP.

DATA : LV_DEL(3) TYPE C.

DESCRIBE TABLE GT_EMP_DEL LINES LV_DEL.

LOOP AT GT_EMP_DEL INTO GWA_EMP_DEL.


DELETE FROM ZEMPL_TABLE WHERE ENO = GWA_EMP_DEL-ENO.
ENDLOOP.

DATA : V_VALID TYPE C.

CALL METHOD R_ALV->CHECK_CHANGED_DATA "Check Changed Data


IMPORTING
E_VALID = V_VALID.
* CHANGING
* C_REFRESH = 'X'.

DATA LV_MSG TYPE STRING.

CONCATENATE 'Number of Entries deleted from ZEMPL_TABLE :' LV_DEL INTO


LV_MSG.

IF V_VALID EQ 'X'.
MESSAGE LV_MSG TYPE 'I'.
ENDIF.

*data declaration for refreshing of alv


DATA : STABLE TYPE LVC_S_STBL.
*Row and column of the alv are refreshed after changing values
STABLE-ROW = 'X'.
STABLE-COL = 'X'.

*REfreshed ALV display with the changed values


*This ALV is non editable and contains new values
CALL METHOD R_ALV->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = STABLE
EXCEPTIONS
FINISHED = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

ENDFORM. " DEL_DATA


*&---------------------------------------------------------------------*
*& Form SAVE_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->E_UCOMM text
*----------------------------------------------------------------------*
FORM SAVE_DATA USING E_UCOMM.

CASE E_UCOMM.
WHEN 'SAVE'.
DATA LV_VALID.
* DATA LV_REFRESH.
CALL METHOD R_ALV->CHECK_CHANGED_DATA "Check Changed Data
IMPORTING
E_VALID = LV_VALID. " Entries are Consistent
WHEN OTHERS.
" Do Nothing
ENDCASE.

ENDFORM. " SAVE_DATA

Vous aimerez peut-être aussi