* ====================================================================== * Stefanos Moschidis - SAP Certified Technical Consultant * ====================================================================== * ====================================================================== * This program is an example of two ALV Grid controls * with Drag and Drop effects between them * ====================================================================== REPORT Z_ALV_GRID_CONTROLS_DRAG_DROP . * ------------------------------------------------- * FOR THIS EXAMPLE A CUSTOMER DEFINED TABLE HAS * BEEN BUILT IN TRANSACTION SE11, * NAMED ZTRANSACTIONS WITH THE FOLLOWING STRUCTURE * ------------------------------------------------- * FIELD NAME | DATA ELEMENT | KEY * ------------------------------------------------- * MANDT | MANDT | yes * KUNNR | KUNNR | yes * BELNR | MBLNR | yes * BLDAT | BLDAT | * DMBTR | DMBTR | * WAERS | WAERS | * ------------------------------------------------- DAta : i_ztransactions type table of ztransactions WITH HEADER LINE. DAta : i_ztransactions2 type table of ztransactions WITH HEADER LINE. DATA : OK_CODE LIKE SY-UCOMM . DATA : MCONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER . DATA : MCONTLEFT TYPE REF TO CL_GUI_CONTAINER . DATA : MCONTRIGHT TYPE REF TO CL_GUI_CONTAINER . DATA : MSPLITCONT TYPE REF TO CL_GUI_EASY_SPLITTER_CONTAINER . DATA : MALV_LEFT TYPE REF TO CL_GUI_ALV_GRID . DATA : MALV_RIGHT TYPE REF TO CL_GUI_ALV_GRID . DATA : MROW TYPE LVC_S_ROW . Data: gs_layout type lvc_s_layo , g_behaviour_alv TYPE REF TO CL_DRAGDROP . DATA : MLINES TYPE I . *---------------------------------------------------------------------* * CLASS lcl_dragdropobj DEFINITION *---------------------------------------------------------------------* * This is the Class of Drag Drop Object . This Object is used as a * temporary storage means of the information extracted with drag *---------------------------------------------------------------------* CLASS lcl_dragdropobj DEFINITION. PUBLIC SECTION. DATA: I_ZTRANSACTIONS TYPE ZTRANSACTIONS , index TYPE i , ORIGINAL_TABLE(5) TYPE C , PROCEED_TRANS(1) TYPE C . ENDCLASS. DATA : MDATA TYPE REF TO LCL_DRAGDROPOBJ . *---------------------------------------------------------------------* * CLASS DND_TOOLS DEFINITION *---------------------------------------------------------------------* * This class contains the methods responding to the events ONDRAG , * ONDROP , ONDROPCOMPLETE of the ALV Grid Controls *---------------------------------------------------------------------* CLASS DND_TOOLS DEFINITION . PUBLIC SECTION . METHODS : HANDLE_DRAG_FROM_LEFT FOR EVENT ONDRAG OF CL_GUI_ALV_GRID IMPORTING E_ROW E_DRAGDROPOBJ . METHODS : HANDLE_DROPCOMPLETE_FROM_LEFT FOR EVENT ONDROPCOMPLETE OF CL_GUI_ALV_GRID IMPORTING E_ROW E_DRAGDROPOBJ . METHODS : HANDLE_DRAG_FROM_RIGHT FOR EVENT ONDRAG OF CL_GUI_ALV_GRID IMPORTING E_ROW E_DRAGDROPOBJ . METHODS : HANDLE_DROPCOMPLETE_FROM_RIGHT FOR EVENT ONDROPCOMPLETE OF CL_GUI_ALV_GRID IMPORTING E_ROW E_DRAGDROPOBJ . METHODS : HANDLE_DROP_TO_LEFT FOR EVENT ONDROP OF CL_GUI_ALV_GRID IMPORTING E_DRAGDROPOBJ . METHODS : HANDLE_DROP_TO_RIGHT FOR EVENT ONDROP OF CL_GUI_ALV_GRID IMPORTING E_DRAGDROPOBJ . ENDCLASS . *---------------------------------------------------------------------* * CLASS DND_TOOLS IMPLEMENTATION *---------------------------------------------------------------------* CLASS DND_TOOLS IMPLEMENTATION . * ----------------------------------------------------------------- METHOD HANDLE_DRAG_FROM_LEFT . MROW = E_ROW-INDEX . READ TABLE I_ZTRANSACTIONS INDEX MROW INTO I_ZTRANSACTIONS . CREATE OBJECT MDATA . MOVE I_ZTRANSACTIONS TO MDATA->I_ZTRANSACTIONS . MOVE MROW TO MDATA->INDEX . MOVE 'LEFT' TO MDATA->ORIGINAL_TABLE . E_DRAGDROPOBJ->OBJECT = MDATA . ENDMETHOD . * ----------------------------------------------------------------- METHOD HANDLE_DROPCOMPLETE_FROM_LEFT . * NB : the following data object MDATA is local to the method * and contains the inforamtion from the import parameter of the * method E_DRAGDROPOBJ DATA : MDATA TYPE REF TO LCL_DRAGDROPOBJ . MDATA ?= E_DRAGDROPOBJ->OBJECT . CHECK MDATA->PROCEED_TRANS = 'X' . MROW = mdata->INDEX . DELETE I_ZTRANSACTIONS INDEX MROW . APPEND MDATA->I_ZTRANSACTIONS TO I_ZTRANSACTIONS2 . SORT I_ZTRANSACTIONS2 BY KUNNR BELNR . delete i_ztransactions2 where kunnr is initial . DESCRIBE TABLE i_ztransactions LINES MLINES . IF MLINES EQ 0 . CLEAR i_ztransactions . APPEND i_ztransactions TO i_ztransactions . ENDIF . CALL METHOD Malv_LEFT->refresh_table_display. CALL METHOD Malv_RIGHT->refresh_table_display. ENDMETHOD . * ----------------------------------------------------------------- METHOD HANDLE_DRAG_FROM_RIGHT. MROW = E_ROW-INDEX . READ TABLE I_ZTRANSACTIONS2 INDEX MROW INTO I_ZTRANSACTIONS2 . CREATE OBJECT MDATA . MOVE I_ZTRANSACTIONS2 TO MDATA->I_ZTRANSACTIONS . MOVE MROW TO MDATA->INDEX . MOVE 'RIGHT' TO MDATA->ORIGINAL_TABLE . E_DRAGDROPOBJ->OBJECT = MDATA . ENDMETHOD . * ----------------------------------------------------------------- METHOD HANDLE_DROPCOMPLETE_FROM_RIGHT . DATA : MDATA TYPE REF TO LCL_DRAGDROPOBJ . MDATA ?= E_DRAGDROPOBJ->OBJECT . CHECK MDATA->PROCEED_TRANS = 'X' . MROW = mdata->INDEX . DELETE I_ZTRANSACTIONS2 INDEX MROW . APPEND MDATA->I_ZTRANSACTIONS TO I_ZTRANSACTIONS . SORT I_ZTRANSACTIONS BY KUNNR BELNR . delete i_ztransactions where kunnr is initial . DESCRIBE TABLE i_ztransactions2 LINES MLINES . IF MLINES EQ 0 . CLEAR i_ztransactions2 . APPEND i_ztransactions2 TO i_ztransactions2 . ENDIF . CALL METHOD Malv_LEFT->refresh_table_display. CALL METHOD Malv_RIGHT->refresh_table_display. ENDMETHOD . * ----------------------------------------------------------------- METHOD HANDLE_DROP_TO_LEFT . DATA : MDATA TYPE REF TO LCL_DRAGDROPOBJ . MDATA ?= E_DRAGDROPOBJ->OBJECT . IF MDATA->ORIGINAL_TABLE = 'RIGHT' . MDATA->PROCEED_TRANS = 'X' . ELSE . MDATA->PROCEED_TRANS = ' ' . ENDIF . E_DRAGDROPOBJ->OBJECT = MDATA . ENDMETHOD . * ----------------------------------------------------------------- METHOD HANDLE_DROP_TO_RIGHT . DATA : MDATA TYPE REF TO LCL_DRAGDROPOBJ . MDATA ?= E_DRAGDROPOBJ->OBJECT . IF MDATA->ORIGINAL_TABLE = 'LEFT' . MDATA->PROCEED_TRANS = 'X' . ELSE . MDATA->PROCEED_TRANS = ' ' . ENDIF . E_DRAGDROPOBJ->OBJECT = MDATA . ENDMETHOD . ENDCLASS . data : mlistener type ref to dnd_tools . * ====================================================================== * START OF SELECTION * ====================================================================== START-OF-SELECTION . PERFORM GET_DATA . CALL SCREEN 100 . * -------------------------------------------------------------------- * The screen 100 has the custom control MCONTAINER and on the flow * logic has the following modules : * * PROCESS BEFORE OUTPUT. * * MODULE STATUS_0100. * * MODULE PREPARE_SCREEN . * * PROCESS AFTER INPUT. * * MODULE USER_COMMAND_0100. * * -------------------------------------------------------------------- * (Off course not commented out in the real flow logic) * -------------------------------------------------------------------- *---------------------------------------------------------------------* * FORM GET_DATA * *---------------------------------------------------------------------* * FOR THIS EXAMPLE THE DATA SELECTION IS HARD CODED * *---------------------------------------------------------------------* FORM GET_DATA . CLEAR : I_ZTRANSACTIONS , I_ZTRANSACTIONS[] . I_ZTRANSACTIONS-MANDT = SY-MANDT . I_ZTRANSACTIONS-WAERS = 'EUR ' . I_ZTRANSACTIONS-KUNNR = '0000000001' . I_ZTRANSACTIONS-BELNR = '0000000001' . I_ZTRANSACTIONS-BLDAT = '20030101' . I_ZTRANSACTIONS-DMBTR = '1000' . append I_ZTRANSACTIONS . I_ZTRANSACTIONS-BELNR = '0000000002' . I_ZTRANSACTIONS-BLDAT = '20030202' . I_ZTRANSACTIONS-DMBTR = '1010' . append I_ZTRANSACTIONS . I_ZTRANSACTIONS-BELNR = '0000000003' . I_ZTRANSACTIONS-BLDAT = '20030323' . I_ZTRANSACTIONS-DMBTR = '1020' . append I_ZTRANSACTIONS . I_ZTRANSACTIONS-BELNR = '0000000004' . I_ZTRANSACTIONS-BLDAT = '20030404' . I_ZTRANSACTIONS-DMBTR = '1030' . append I_ZTRANSACTIONS . I_ZTRANSACTIONS-BELNR = '0000000005' . I_ZTRANSACTIONS-BLDAT = '20030505' . I_ZTRANSACTIONS-DMBTR = '1040' . append I_ZTRANSACTIONS . I_ZTRANSACTIONS-BELNR = '0000000006' . I_ZTRANSACTIONS-BLDAT = '20030606' . I_ZTRANSACTIONS-DMBTR = '1050' . append I_ZTRANSACTIONS . I_ZTRANSACTIONS-BELNR = '0000000007' . I_ZTRANSACTIONS-BLDAT = '20030707' . I_ZTRANSACTIONS-DMBTR = '1060' . append I_ZTRANSACTIONS . I_ZTRANSACTIONS-BELNR = '0000000008' . I_ZTRANSACTIONS-BLDAT = '20030808' . I_ZTRANSACTIONS-DMBTR = '1070' . append I_ZTRANSACTIONS . I_ZTRANSACTIONS-BELNR = '0000000009' . I_ZTRANSACTIONS-BLDAT = '20030909' . I_ZTRANSACTIONS-DMBTR = '1080' . append I_ZTRANSACTIONS . I_ZTRANSACTIONS-BELNR = '0000000010' . I_ZTRANSACTIONS-BLDAT = '20031010' . I_ZTRANSACTIONS-DMBTR = '1090' . append I_ZTRANSACTIONS . CLEAR : i_ztransactions2 , i_ztransactions2[] . APPEND i_ztransactions2 . ENDFORM . *&---------------------------------------------------------------------* *& Module STATUS_0100 OUTPUT *&---------------------------------------------------------------------* * ------------------------------------------------------------------- * The PF STATUS STATUS100 called from the module below, has on the * Standard toolbar the buttons BACK , EXIT and CANCEL . * These buttons are provided with function code = 'EXIT' * ------------------------------------------------------------------- MODULE STATUS_0100 OUTPUT. set titlebar 'TITLEDRAGDROP' . SET PF-STATUS 'STATUS100'. ENDMODULE. " STATUS_0100 OUTPUT *&---------------------------------------------------------------------* *& Module USER_COMMAND_0100 INPUT *&---------------------------------------------------------------------* * The following module checks the User Command and ends the program * ---------------------------------------------------------------------- MODULE USER_COMMAND_0100 INPUT. IF OK_CODE = 'EXIT' . CLEAR : MCONTAINER , MCONTLEFT , MCONTRIGHT , MSPLITCONT , MALV_LEFT , MALV_RIGHT . LEAVE TO SCREEN 0 . ENDIF . ENDMODULE. " USER_COMMAND_0100 INPUT *&---------------------------------------------------------------------* *& Module PREPARE_SCREEN OUTPUT *&---------------------------------------------------------------------* MODULE PREPARE_SCREEN OUTPUT. IF MCONTAINER IS INITIAL . CREATE OBJECT MCONTAINER EXPORTING CONTAINER_NAME = 'MCONTAINER' . CREATE OBJECT MSPLITCONT EXPORTING PARENT = MCONTAINER ORIENTATION = 1 . MCONTLEFT = MSPLITCONT->TOP_LEFT_CONTAINER . MCONTRIGHT = MSPLITCONT->BOTTOM_RIGHT_CONTAINER . CREATE OBJECT MALV_LEFT EXPORTING I_PARENT = MCONTLEFT . CREATE OBJECT MALV_RIGHT EXPORTING I_PARENT = MCONTRIGHT . perform set_layout_capable_of_drag_dro USING 'X' 'X' . CALL METHOD MALV_LEFT->SET_TABLE_FOR_FIRST_DISPLAY EXPORTING I_STRUCTURE_NAME = 'ZTRANSACTIONS' IS_LAYOUT = gS_LAYOUT CHANGING IT_OUTTAB = I_ZTRANSACTIONS[] . CALL METHOD MALV_RIGHT->SET_TABLE_FOR_FIRST_DISPLAY EXPORTING I_STRUCTURE_NAME = 'ZTRANSACTIONS' IS_LAYOUT = gs_layout CHANGING IT_OUTTAB = I_ZTRANSACTIONS2[] . create object mlistener . SET HANDLER mlistener->HANDLE_DRAG_FROM_LEFT FOR MALV_LEFT . SET HANDLER mlistener->HANDLE_dROPcomplete_FROM_LEFT FOR MALV_LEFT . SET HANDLER mlistener->HANDLE_DRAG_FROM_RIGHT FOR MALV_RIGHT. SET HANDLER mlistener->HANDLE_dROPcomplete_FROM_RIGHT FOR MALV_RIGHT . SET HANDLER mlistener->HANDLE_DROP_TO_RIGHT FOR MALV_RIGHT . SET HANDLER mlistener->HANDLE_DROP_TO_LEFT FOR MALV_LEFT . ENDIF . ENDMODULE. " PREPARE_SCREEN OUTPUT * ---------------------------------------------------------------------* * Form SET_LAYOUT_CAPABLE_OF_DRAG_DRO * ---------------------------------------------------------------------* * Definition of a Drag & Drop behaviour for the ALV grid * ---------------------------------------------------------------------- FORM SET_LAYOUT_CAPABLE_OF_DRAG_DRO USING DRAG DROP. data : effect type i , handle_alv TYPE i . CREATE OBJECT g_behaviour_alv. effect = cl_dragdrop=>move + cl_dragdrop=>copy . CALL METHOD g_behaviour_alv->add EXPORTING flavor = 'Line' dragsrc = DRAG droptarget = DROP effect = effect. CALL METHOD g_behaviour_alv->get_handle IMPORTING handle = handle_alv. gs_layout-s_dragdrop-row_ddid = handle_alv. ENDFORM. " SET_LAYOUT_CAPABLE_OF_DRAG_DRO