Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

Does ALV support multiple Lines Drag & Drop Functionality

Former Member
0 Kudos

Hi Sap Gurus,

I have a requirment where i need to drag multiple lines (TO's) in ALV & Drop in a Queue.

I am sucessfull in dragging & dropping asingle line item into the queue, but am unsuccessfull in dragging multiple lines.

Does ALV support multiple Lines Drag & Drop ?

Any responce is higly appreciated.

Thanks & Regards,

Sridhar.

3 REPLIES 3

GrahamRobbo
Active Contributor
0 Kudos

Hi Sriddy,

I'm not sure about ALV, but you can certainly do it with the TREE control. Look at sample program RSDEMO_DRAG_DROP_TREE_MULTI.

Cheers

Graham Robbo

Former Member
0 Kudos

check this code:

REPORT zalv_dragdrop.*Structure declaration for T016T

TYPES : BEGIN OF ty_t016t,

brsch TYPE brsch,

brtxt TYPE text1_016t,

spras TYPE spras,

END OF ty_t016t.*Work area and internal table for T016T

DATA : it_t016t TYPE STANDARD TABLE OF ty_t016t,

wa_t016t TYPE ty_t016t.*class declaration

CLASS lcl_objdragdropapp DEFINITION DEFERRED.*data declarations for alv

DATA: c_dragdropapp TYPE REF TO lcl_objdragdropapp,

c_dockingcont TYPE REF TO cl_gui_docking_container,

c_alv TYPE REF TO cl_gui_alv_grid,

  • reference variable to CL_DRAGDROP:

c_dragdropalv TYPE REF TO cl_dragdrop,

it_layout TYPE lvc_s_layo,

it_fcat TYPE lvc_t_fcat. "Field catalogue*declarations for handle event

DATA: effect TYPE i,

handle_alv TYPE i.initialization eventINITIALIZATION.start of selection event

START-OF-SELECTION.*select data

PERFORM fetch_data.*ALV output

PERFORM alv_output.* Class definitions and method implementation for drag and drop

CLASS lcl_dragdrop DEFINITION.

PUBLIC SECTION.

DATA: wa TYPE ty_t016t,

index TYPE i. "Index of Line to be movedENDCLASS. "LCL_DRAGDROP DEFINITION*Application class definition

CLASS lcl_objdragdropapp DEFINITION. PUBLIC SECTION.

METHODS:

*Handling Event Drag

handle_alv_drag

FOR EVENT ondrag

OF cl_gui_alv_grid

IMPORTING e_row e_column e_dragdropobj,*Handling event DROP

handle_alv_drop

FOR EVENT ondrop

OF cl_gui_alv_grid

IMPORTING e_row e_column e_dragdropobj.ENDCLASS. "LCL_objdragdropapp DEFINITION*Application class implementation

CLASS lcl_objdragdropapp IMPLEMENTATION.* OnDrag event is used to 'fetch' information from the drag source.

METHOD handle_alv_drag.

DATA: dataobj TYPE REF TO lcl_dragdrop,

line TYPE ty_t016t.

  • Read dragged row

READ TABLE it_t016t INDEX e_row-index INTO line.* create and fill dataobject for events ONDROP

CREATE OBJECT dataobj.* Remembering row index to move a line

MOVE e_row-index TO dataobj->index.* store the dragged line.

READ TABLE it_t016t INTO dataobj->wa INDEX e_row-index.* Assigning data object to the refering event parameter e_dragdropobj->object = dataobj. ENDMETHOD. "HANDLE_ALV_DRAG*Event handler for event 'OnDrop'. This event is used

*to use your dragged information in combination with your drop source. METHOD handle_alv_drop. DATA: dataobj TYPE REF TO lcl_dragdrop,

drop_index TYPE i,

stable TYPE lvc_s_stbl.* Refresh Alv Grid Control without scrolling

stable-row = 'X'.

stable-col = 'X'.

  • Catch-Statement to ensure the drag&drop-Operation is aborted properly. CATCH SYSTEM-EXCEPTIONS move_cast_error = 1. dataobj ?= e_dragdropobj->object. DELETE it_t016t INDEX dataobj->index.

INSERT dataobj->wa INTO it_t016t INDEX e_row-index.*Refreshing the ALV

CALL METHOD c_alv->refresh_table_display

EXPORTING

i_soft_refresh = 'X'

is_stable = stable. ENDCATCH.

IF sy-subrc <> 0.* If anything went wrong aborting the drag and drop operation: CALL METHOD e_dragdropobj->abort. ENDIF. ENDMETHOD. "HANDLE_ALV_DROPENDCLASS. "LCL_objdragdropapp IMPLEMENTATION&----


*& Form alv_output

&----


  • text

----


  • --> p1 text

  • <-- p2 text

----


FORM alv_output . CALL SCREEN 600.

ENDFORM. " alv_output** Calling the ALV screen with custom container

On this statement double click it takes you to the screen painter SE51.Enter the attributes

*Create a Custom container and name it CC_CONT and OK code as OK_CODE.

*Save check and Activate the screen painter.

*Now a normal screen with number 600 is created which holds the ALV grid.

  • PBO of the actual screen ,Here we can give a title and customized menus&---------------------------------------------------------------------

*& Module STATUS_0600 OUTPUT

&----


  • text

----


MODULE status_0600 OUTPUT.

  • SET PF-STATUS 'xxxxxxxx'.

  • SET TITLEBAR 'xxx'.

IF c_alv IS INITIAL.

PERFORM alv_controls.

ENDIF.

ENDMODULE. " STATUS_0600 OUTPUT&----


*& Form alv_CONTROLS

&----


  • text

----


  • --> p1 text

  • <-- p2 text

----


FORM alv_controls.

  • create docking container for alv control

CREATE OBJECT c_dockingcont

EXPORTING

dynnr = '600'

extension = 300

side = cl_gui_docking_container=>dock_at_top.

  • create alv control

CREATE OBJECT c_alv

EXPORTING i_parent = c_dockingcont.* create the application object to handle the ABAP Objects Events CREATE OBJECT c_dragdropapp.* Events alv control

*For Dragging

SET HANDLER c_dragdropapp->handle_alv_drag FOR c_alv.

*For Dropping

SET HANDLER c_dragdropapp->handle_alv_drop FOR c_alv.* build tree nodes for drag&drop

PERFORM build_handle.* Fieldcatalogue for ALV PERFORM alv_build_fieldcat.* ALV attributes FOR LAYOUT PERFORM alv_report_layout.* Call ALV GRID CALL METHOD c_alv->set_table_for_first_display

EXPORTING

is_layout = it_layout

CHANGING

it_outtab = it_t016t

it_fieldcatalog = it_fcat

EXCEPTIONS

invalid_parameter_combination = 1

program_error = 2

too_many_lines = 3

OTHERS = 4.

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. "ALV_CONTROLS

&----


*& Form build_handle

&----


  • text

----


  • --> p1 text

  • <-- p2 text

----


FORM build_handle.

  • define a drag & Drop behaviour for the whole grid

CREATE OBJECT c_dragdropalv. effect = cl_dragdrop=>move + cl_dragdrop=>copy. CALL METHOD c_dragdropalv->add

EXPORTING

flavor = 'Line'

dragsrc = 'X'

droptarget = 'X'

effect = effect.*getting the handle for drag and drop

CALL METHOD c_dragdropalv->get_handle

IMPORTING

handle = handle_alv.

ENDFORM. " build_handle

&----


*& Form fetch_data

&----


  • text

----


  • --> p1 text

  • <-- p2 text

----


FORM fetch_data .* select and display data from t016

SELECT brtxt brsch spras FROM t016t INTO CORRESPONDING FIELDS OF TABLE it_t016t

WHERE spras = 'EN'.

ENDFORM. " fetch_data

&----


*& Form alv_report_layout

&----


  • text

----


  • --> p1 text

  • <-- p2 text

----


FORM alv_report_layout . it_layout-grid_title = 'ALV Drag Drop'.* provide handle to alv control to all rows for same drag & drop behaviour

it_layout-s_dragdrop-row_ddid = handle_alv.

ENDFORM. " alv_report_layout

&----


*& Form alv_build_fieldcat

&----


  • text

----


  • --> p1 text

  • <-- p2 text

----


FORM alv_build_fieldcat . DATA lv_fldcat TYPE lvc_s_fcat.

CLEAR lv_fldcat. lv_fldcat-row_pos = '1'.

lv_fldcat-col_pos = '1'.

lv_fldcat-fieldname = 'BRSCH'.

lv_fldcat-tabname = 'IT_T016T'.

lv_fldcat-outputlen = 8.

lv_fldcat-scrtext_m = 'Industry'. APPEND lv_fldcat TO it_fcat.

CLEAR lv_fldcat. lv_fldcat-row_pos = '1'.

lv_fldcat-col_pos = '2'.

lv_fldcat-fieldname = 'BRTXT'.

lv_fldcat-tabname = 'IT_T016T'.

lv_fldcat-outputlen = 15.

lv_fldcat-scrtext_m = 'Description'. APPEND lv_fldcat TO it_fcat.

CLEAR lv_fldcat.

ENDFORM. " alv_build_fieldcat* PAI module of the screen created. In case we use an interactive ALV or

*for additional functionalities we can create OK codes

and based on the user command we can do the coding.&----


*

*& Module USER_COMMAND_0600 INPUT

&----


  • text

----


MODULE user_command_0600 INPUT.ENDMODULE. " USER_COMMAND_0600 INPUT

uwe_schieferstein
Active Contributor

Hello Sridhar

You may be mislead that the drag event (e.g. ONDROP) has only a single row as IMPORTING parameter. However, the selected rows are actually "transported" by the dragdrop object and here you can have a many rows as you like.

I modified sample BCALV_TEST_GRID_DRAG_DROP (available on ECC 6.0) to demonstrate how simple it is to define drag&drop functionality for multiple rows. The major changes are in event handler methods ONDRAG, ONDROP, and ONDROPCOMPLETE (search for $ in the coding).


*&---------------------------------------------------------------------*
*& Report  BCALV_TEST_GRID_DRAG_DROP                                   *
*&                                                                     *
*&---------------------------------------------------------------------*
*& Thread: Does ALV support multiple Lines Drag & Drop Functionality   *
*& <a class="jive_macro jive_macro_thread" href="" __jive_macro_name="thread" modifiedtitle="true" __default_attr="935725"></a>     *
*&---------------------------------------------------------------------*
REPORT zus_sdn_bcalv_test_grid_dd.

TYPES: g_ty_s_sflight TYPE alv_t_t2.

CONSTANTS: con_sflight TYPE lvc_fname VALUE 'ALV_T_T2'.

CONSTANTS: con_exit TYPE sy-ucomm VALUE 'EXIT',
           con_canc TYPE sy-ucomm VALUE 'CANC',
           con_back TYPE sy-ucomm VALUE 'BACK',

           con_true TYPE char1 VALUE 'X',

           con_edit_grid         TYPE i VALUE 1,
           con_edit_column       TYPE i VALUE 2,
           con_edit_cell         TYPE i VALUE 3,

           con_edit_mode_display TYPE i VALUE 1,
           con_edit_mode_change  TYPE i VALUE 2,

           con_edit_event_enter  TYPE i VALUE 1,
           con_edit_event_modify TYPE i VALUE 2,

           con_source          TYPE i VALUE 1,
           con_target          TYPE i VALUE 2,

           con_dragdrop_row    TYPE i VALUE 1,
           con_dragdrop_column TYPE i VALUE 2,
           con_dragdrop_cell   TYPE i VALUE 3,

           con_dragdrop_effect_move TYPE i VALUE 1,
           con_dragdrop_effect_copy TYPE i VALUE 2,
           con_dragdrop_effect_all  TYPE i VALUE 3.

CLASS cl_gui_resources DEFINITION LOAD.
CLASS lcl_events_d0100 DEFINITION DEFERRED.

TYPES: BEGIN OF g_ty_s_test,
         select_amount     TYPE i,
         no_info_popup     TYPE char1,
         info_popup_once   TYPE char1,
         events_info_popup TYPE lvc_fname OCCURS 0,
         edit_type         TYPE i,
         edit_mode         TYPE i,
         edit_event        TYPE i,
         edit_fields       TYPE lvc_fname OCCURS 0,
         dragdrop_type     TYPE i,
         dragdrop_effect   TYPE i,
         dragdrop_fields   TYPE lvc_fname OCCURS 0,
         bypassing_buffer  TYPE char1,
         buffer_active     TYPE char1,
       END   OF g_ty_s_test,

       BEGIN OF g_ty_s_outtab.
INCLUDE TYPE g_ty_s_sflight.
TYPES:   table                TYPE char10,
         count                TYPE i,
         box                  TYPE char1,
         lights               TYPE char1,
         handle_style         TYPE lvc_t_styl,
         handle_dragdrop      TYPE lvc_t_drdr,
         tabcolor             TYPE lvc_t_scol,
       END   OF g_ty_s_outtab,
       g_ty_t_outtab TYPE TABLE OF g_ty_s_outtab.

DATA: g_field TYPE lvc_fname.

DATA: g_okcode TYPE sy-ucomm.

DATA: gs_test TYPE g_ty_s_test.

DATA: gt_outtab_source TYPE g_ty_t_outtab,
      gt_outtab_target TYPE g_ty_t_outtab,

      gr_container_d0100_source    TYPE REF TO cl_gui_custom_container,
      gr_grid_d0100_source         TYPE REF TO cl_gui_alv_grid,

      gr_container_d0100_target    TYPE REF TO cl_gui_custom_container,
      gr_grid_d0100_target         TYPE REF TO cl_gui_alv_grid,

      gr_events_d0100              TYPE REF TO lcl_events_d0100,
      gr_dragdrop_d0100            TYPE REF TO cl_dragdrop,
      gr_dragdrop_background_d0100 TYPE REF TO cl_dragdrop.

*---------------------------------------------------------------------*
*       CLASS lcl_events_d0100 DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_events_d0100 DEFINITION.
  PUBLIC SECTION.
    DATA:
    m_grid TYPE i.

    METHODS:
    data_changed         FOR EVENT data_changed
                         OF cl_gui_alv_grid
                         IMPORTING er_data_changed
                                   e_onf4
                                   e_onf4_before
                                   e_onf4_after,

    data_changed_finished
                         FOR EVENT data_changed_finished
                         OF cl_gui_alv_grid,

    ondrag               FOR EVENT ondrag
                         OF cl_gui_alv_grid
                         IMPORTING e_row
                                   e_column
                                   es_row_no
                                   e_dragdropobj,

    ondrop               FOR EVENT ondrop
                         OF cl_gui_alv_grid
                         IMPORTING e_row
                                   e_column
                                   es_row_no
                                   e_dragdropobj,

    ondropcomplete       FOR EVENT ondropcomplete
                         OF cl_gui_alv_grid
                         IMPORTING e_row
                                   e_column
                                   es_row_no
                                   e_dragdropobj,

    ondropgetflavor      FOR EVENT ondropgetflavor
                         OF cl_gui_alv_grid
                         IMPORTING e_row
                                   e_column
                                   es_row_no
                                   e_dragdropobj
                                   e_flavors.
ENDCLASS.                    "lcl_events_d0100 DEFINITION

*---------------------------------------------------------------------*
*       CLASS lcl_events_d0100 IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_events_d0100 IMPLEMENTATION.
*---------------------------------------------------------------------*
*       METHOD data_cahnged                                           *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  METHOD data_changed.
    PERFORM d0100_event_data_changed USING er_data_changed
                                           e_onf4
                                           e_onf4_before
                                           e_onf4_after
                                           m_grid.
  ENDMETHOD.                    "data_changed
*---------------------------------------------------------------------*
*       METHOD data_changed_finished                                  *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  METHOD data_changed_finished.
    PERFORM d0100_event_data_changed_finis.
  ENDMETHOD.                    "data_changed_finished
*---------------------------------------------------------------------*
*       METHOD ondrag                                                 *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  METHOD ondrag.
    PERFORM d0100_event_ondrag USING e_row
                                     e_column
                                     e_dragdropobj.
  ENDMETHOD.                    "ondrag

*---------------------------------------------------------------------*
*       METHOD ondrop                                                 *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  METHOD ondrop.
    PERFORM d0100_event_ondrop USING e_row
                                     e_column
                                     e_dragdropobj.
  ENDMETHOD.                    "ondrop

*---------------------------------------------------------------------*
*       METHOD ondropcomplete                                         *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  METHOD ondropcomplete.
    PERFORM d0100_event_ondropcomplete USING e_row
                                             e_column
                                             e_dragdropobj.
  ENDMETHOD.                    "ondropcomplete

*---------------------------------------------------------------------*
*       METHOD ondropgetflavor                                        *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  METHOD ondropgetflavor.
    PERFORM d0100_event_ondropgetflavor USING e_row
                                              e_column
                                              es_row_no
                                              e_dragdropobj
                                              e_flavors.
  ENDMETHOD.                    "ondropgetflavor
ENDCLASS.                    "lcl_events_d0100 IMPLEMENTATION

*---------------------------------------------------------------------*
*       CLASS lcl_dragdrop_obj_d0100 DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_dragdrop_obj_d0100 DEFINITION.
  PUBLIC SECTION.
    DATA: line  TYPE g_ty_s_outtab,
          lines TYPE g_ty_t_outtab, " $INSERT
          rows  TYPE lvc_t_rows,
          index TYPE i.
ENDCLASS.                    "lcl_dragdrop_obj_d0100 DEFINITION

*----------------------------------------------------------------------*
* SELECTION-SCREEN                                                     *
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK gen WITH FRAME.
PARAMETERS:
p_amount TYPE i DEFAULT 30.
SELECTION-SCREEN END OF BLOCK gen.

SELECTION-SCREEN BEGIN OF BLOCK inf WITH FRAME.
PARAMETERS:
p_inf01 AS CHECKBOX DEFAULT con_true,
p_inf02 AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK inf.

SELECTION-SCREEN BEGIN OF BLOCK drd WITH FRAME.
PARAMETERS:
p_rows    RADIOBUTTON GROUP drdr,
p_cols    RADIOBUTTON GROUP drdr.
SELECT-OPTIONS:
p_colsf FOR g_field NO INTERVALS DEFAULT 'CARRID'.
PARAMETERS:
p_cells   RADIOBUTTON GROUP drdr.
SELECT-OPTIONS:
p_cellsf FOR g_field NO INTERVALS DEFAULT 'CARRID'.
SELECTION-SCREEN END OF BLOCK drd.

SELECTION-SCREEN BEGIN OF BLOCK eff WITH FRAME.
PARAMETERS:
p_both   RADIOBUTTON GROUP eff,
p_move   RADIOBUTTON GROUP eff,
p_copy   RADIOBUTTON GROUP eff.
SELECTION-SCREEN END OF BLOCK eff.

SELECTION-SCREEN BEGIN OF BLOCK ed1 WITH FRAME.
PARAMETERS:
p_grid   RADIOBUTTON GROUP edit DEFAULT 'X',
p_ecols   RADIOBUTTON GROUP edit.
SELECT-OPTIONS:
p_ecolsf FOR g_field NO INTERVALS DEFAULT 'CARRID'.
PARAMETERS:
p_ecells  RADIOBUTTON GROUP edit.
SELECT-OPTIONS:
p_ecelsf FOR g_field NO INTERVALS DEFAULT 'CARRID'.
PARAMETERS:
p_noedit RADIOBUTTON GROUP edit.
SELECTION-SCREEN   END OF BLOCK ed1.

SELECTION-SCREEN BEGIN OF BLOCK ed2 WITH FRAME.
PARAMETERS:
p_change RADIOBUTTON GROUP tgle DEFAULT 'X',
p_disp   RADIOBUTTON GROUP tgle.
SELECTION-SCREEN   END OF BLOCK ed2.

SELECTION-SCREEN BEGIN OF BLOCK ed3 WITH FRAME.
PARAMETERS:
p_evedit RADIOBUTTON GROUP eevt DEFAULT 'X',
p_evmod  RADIOBUTTON GROUP eevt,
p_noevt  RADIOBUTTON GROUP eevt.
SELECTION-SCREEN   END OF BLOCK ed3.

*----------------------------------------------------------------------*
* AT SELECTION-SCREEN ON VALUE-REQUEST                                 *
*----------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_colsf-low.
  PERFORM d0100_f4_fcode CHANGING p_colsf-low.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_cellsf-low.
  PERFORM d0100_f4_fcode CHANGING p_cellsf-low.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_ecolsf-low.
  PERFORM d0100_f4_fcode  CHANGING p_ecolsf-low.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_ecelsf-low.
  PERFORM d0100_f4_fcode CHANGING p_ecelsf-low.

*----------------------------------------------------------------------*
* START-OF-SELECTION                                                   *
*----------------------------------------------------------------------*
START-OF-SELECTION.
  gs_test-select_amount = p_amount.

  gs_test-no_info_popup   = p_inf01.
  gs_test-info_popup_once = p_inf02.

  CASE con_true.
    WHEN p_rows.
      gs_test-dragdrop_type = con_dragdrop_row.
    WHEN p_cols.
      gs_test-dragdrop_type = con_dragdrop_column.
      LOOP AT p_colsf.
        IF NOT p_colsf-low IS INITIAL.
          APPEND p_colsf-low TO gs_test-dragdrop_fields.
        ENDIF.
      ENDLOOP.
    WHEN p_cells.
      gs_test-dragdrop_type = con_dragdrop_cell.
      LOOP AT p_cellsf.
        IF NOT p_cellsf-low IS INITIAL.
          APPEND p_cellsf-low TO gs_test-dragdrop_fields.
        ENDIF.
      ENDLOOP.
  ENDCASE.
  CASE con_true.
    WHEN p_move.
      gs_test-dragdrop_effect = con_dragdrop_effect_move.
    WHEN p_copy.
      gs_test-dragdrop_effect = con_dragdrop_effect_copy.
    WHEN p_both.
      gs_test-dragdrop_effect = con_dragdrop_effect_all.
  ENDCASE.

  CASE con_true.
    WHEN p_grid.
      gs_test-edit_type     = con_edit_grid.
    WHEN p_ecols.
      gs_test-edit_type     = con_edit_column.
      LOOP AT p_ecolsf.
        IF NOT p_ecolsf-low IS INITIAL.
          APPEND p_ecolsf-low TO gs_test-edit_fields.
        ENDIF.
      ENDLOOP.
    WHEN p_ecells.
      gs_test-edit_type     = con_edit_cell.
      LOOP AT p_ecelsf.
        IF NOT p_ecelsf-low IS INITIAL.
          APPEND p_ecelsf-low TO gs_test-edit_fields.
        ENDIF.
      ENDLOOP.
  ENDCASE.
  CASE con_true.
    WHEN p_disp.
      gs_test-edit_mode     = con_edit_mode_display.
    WHEN p_change.
      gs_test-edit_mode     = con_edit_mode_change.
  ENDCASE.
  CASE con_true.
    WHEN p_evedit.
      gs_test-edit_event    = con_edit_event_enter.
    WHEN p_evmod.
      gs_test-edit_event    = con_edit_event_modify.
  ENDCASE.

  gs_test-bypassing_buffer = space.
  gs_test-buffer_active    = space.

*----------------------------------------------------------------------*
* END-OF-SELECTION                                                     *
*----------------------------------------------------------------------*
END-OF-SELECTION.
  CALL SCREEN 100.

*&---------------------------------------------------------------------*
*&      Module  d0100_set_status  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE d0100_set_status OUTPUT.
  PERFORM d0100_set_status.
ENDMODULE.                 " d0100_set_status  OUTPUT

*&---------------------------------------------------------------------*
*&      Module  d0100_prepare_container  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE d0100_prepare_container OUTPUT.
  PERFORM d0100_prepare_container.
ENDMODULE.                 " d0100_prepare_container  OUTPUT

*&---------------------------------------------------------------------*
*&      Module  d0100_exit  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE d0100_exit INPUT.
  PERFORM d0100_exit.
ENDMODULE.                 " d0100_exit  INPUT

*&---------------------------------------------------------------------*
*&      Module  d0100_fcode  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE d0100_fcode INPUT.
  PERFORM d0100_fcode.
ENDMODULE.                 " d0100_fcode  INPUT

*&---------------------------------------------------------------------*
*&      Form  d0100_set_status
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM d0100_set_status .

  TYPES: BEGIN OF l_ty_s_excl,
           func TYPE syucomm,
         END   OF l_ty_s_excl,
         l_ty_t_excl TYPE STANDARD TABLE OF l_ty_s_excl.

  DATA: lt_excl TYPE l_ty_t_excl.

  SET PF-STATUS 'D0100' EXCLUDING lt_excl.
  SET TITLEBAR 'D0100'.

ENDFORM.                    " d0100_set_status

*&---------------------------------------------------------------------*
*&      Form  d0100_prepare_container
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM d0100_prepare_container .

  DATA: lt_fcat             TYPE lvc_t_fcat,
        ls_layo             TYPE lvc_s_layo,
        ls_vari             TYPE disvariant,
        l_consistency_check TYPE char1.

  IF gr_container_d0100_source IS INITIAL.
    IF cl_gui_alv_grid=>offline( ) IS INITIAL.
      CREATE OBJECT gr_container_d0100_source
        EXPORTING
          container_name = 'D0100_CONTAINER_SOURCE'.
    ENDIF.

    CREATE OBJECT gr_grid_d0100_source
      EXPORTING
        i_parent = gr_container_d0100_source.

    PERFORM d0100_get_outtab.

    PERFORM d0100_set_grid_vari CHANGING ls_vari.
    PERFORM d0100_set_grid_layo CHANGING ls_layo.
    PERFORM d0100_set_grid_fcat CHANGING lt_fcat.
    PERFORM d0100_set_grid_events USING con_source.
    PERFORM d0100_set_grid_edit USING    con_source
                                CHANGING ls_layo
                                         lt_fcat.
    PERFORM d0100_set_drag_drop USING    con_source
                                CHANGING ls_layo
                                         lt_fcat.

    CALL METHOD gr_grid_d0100_source->set_table_for_first_display
      EXPORTING
        i_buffer_active     = gs_test-buffer_active
        i_bypassing_buffer  = gs_test-bypassing_buffer
        i_consistency_check = l_consistency_check
        is_variant          = ls_vari
        i_save              = 'A'
        i_default           = con_true
        is_layout           = ls_layo
      CHANGING
        it_outtab           = gt_outtab_source[]
        it_fieldcatalog     = lt_fcat.
  ENDIF.

  IF gr_container_d0100_target IS INITIAL.
    CREATE OBJECT gr_container_d0100_target
      EXPORTING
        container_name = 'D0100_CONTAINER_TARGET'.

    CREATE OBJECT gr_grid_d0100_target
      EXPORTING
        i_parent = gr_container_d0100_target.

    PERFORM d0100_set_grid_vari CHANGING ls_vari.
    PERFORM d0100_set_grid_layo CHANGING ls_layo.
    PERFORM d0100_set_grid_fcat CHANGING lt_fcat.
    PERFORM d0100_set_grid_events USING con_target.
    PERFORM d0100_set_grid_edit USING    con_target
                                CHANGING ls_layo
                                         lt_fcat.
    PERFORM d0100_set_drag_drop USING    con_target
                                CHANGING ls_layo
                                         lt_fcat.

    CALL METHOD gr_grid_d0100_target->set_table_for_first_display
      EXPORTING
        i_buffer_active     = space
        i_consistency_check = l_consistency_check
        is_variant          = ls_vari
        i_save              = 'A'
        i_default           = con_true
        is_layout           = ls_layo
      CHANGING
        it_outtab           = gt_outtab_target[]
        it_fieldcatalog     = lt_fcat.
  ENDIF.

ENDFORM.                    " d0100_prepare_container

*&---------------------------------------------------------------------*
*&      Form  d0100_exit
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM d0100_exit .

  DATA: l_okcode LIKE sy-ucomm.

  l_okcode = g_okcode.
  CLEAR g_okcode.

  CASE l_okcode.
    WHEN con_exit OR con_back OR con_canc.
      CALL METHOD gr_grid_d0100_source->free.
      CALL METHOD gr_container_d0100_source->free.
      CALL METHOD gr_grid_d0100_target->free.
      CALL METHOD gr_container_d0100_target->free.

      CALL METHOD cl_gui_cfw=>flush.

      CLEAR gr_container_d0100_source.
      CLEAR gr_grid_d0100_source.
      CLEAR gr_container_d0100_target.
      CLEAR gr_grid_d0100_target.
      CLEAR gr_events_d0100.

      SET SCREEN 0.
      LEAVE SCREEN.
  ENDCASE.

ENDFORM.                    " d0100_exit

*&---------------------------------------------------------------------*
*&      Form  d0100_fcode
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM d0100_fcode .

  DATA: l_okcode LIKE sy-ucomm.

  l_okcode = g_okcode.
  CLEAR g_okcode.

  CASE l_okcode.
    WHEN con_exit OR con_back OR con_canc.
      g_okcode = l_okcode.
      PERFORM d0100_exit.
  ENDCASE.

ENDFORM.                    " d0100_fcode

*&---------------------------------------------------------------------*
*&      Form  d0100_set_grid_vari
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM d0100_set_grid_vari CHANGING cs_vari TYPE disvariant.

  cs_vari-report      = sy-repid.
  cs_vari-handle      = space.
  cs_vari-log_group   = space.
  cs_vari-username    = space.
  cs_vari-variant     = space.
  cs_vari-text        = space.
  cs_vari-dependvars  = space.

ENDFORM.                    " d0100_set_grid_vari

*&---------------------------------------------------------------------*
*&      Form  d0100_set_grid_layo
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM d0100_set_grid_layo  CHANGING cs_layo TYPE lvc_s_layo.

*... ALV-Control: Allgemeine Anzeigeoptionen
  cs_layo-stylefname  = space.

  cs_layo-cwidth_opt  = con_true.
  cs_layo-zebra       = space.
  cs_layo-smalltitle  = space.
  cs_layo-graphics    = space.
  cs_layo-frontend    = space.
  cs_layo-template    = space.

*... ALV-Control: Gridcustomizing
  cs_layo-no_colexpd  = space.
  cs_layo-no_hgridln  = space.
  cs_layo-no_vgridln  = space.
  cs_layo-no_rowmark  = space.
  cs_layo-no_headers  = space.
  cs_layo-no_merging  = space.
  cs_layo-grid_title  = space.

  cs_layo-no_toolbar  = space.

  cs_layo-sel_mode    = 'D'.

  cs_layo-box_fname   = space.

  cs_layo-sgl_clk_hd  = space.

*... ALV-Control: Summenoptionen
  cs_layo-totals_bef  = space.
  cs_layo-no_totline  = space.
  cs_layo-numc_total  = space.
  cs_layo-no_utsplit  = space.

*... ALV-Control: Exceptions
  cs_layo-excp_fname  = space.
  cs_layo-excp_rolln  = space.
  cs_layo-excp_conds  = space.
  cs_layo-excp_led    = space.

*... ALV-Control: Steuerung Interaktion
  cs_layo-detailinit  = space.
  cs_layo-detailtitl  = space.
  cs_layo-keyhot      = space.
  cs_layo-no_keyfix   = space.
  cs_layo-no_author   = space.
  CLEAR cs_layo-s_dragdrop.

*... ALV-Control: Farben
  cs_layo-info_fname  = space.
  cs_layo-ctab_fname  = 'TABCOLOR'.

*... ALV-Control: Eingabefähigkeit
  cs_layo-edit        = con_true.
  cs_layo-edit_mode   = space.

  cs_layo-no_rowins   = space.
  cs_layo-no_rowmove  = space.

*... ALV-Control: Web-Optionen
  cs_layo-weblook     = space.
  cs_layo-webstyle    = space.
  cs_layo-webrows     = space.
  cs_layo-webxwidth   = space.
  cs_layo-webxheight  = space.

ENDFORM.                    " d0100_set_grid_layo

*&---------------------------------------------------------------------*
*&      Form  d0100_set_grid_fcat
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM d0100_set_grid_fcat CHANGING ct_fcat TYPE lvc_t_fcat.

  DATA: l_bypassing_buffer TYPE char1,
        l_buffer_active    TYPE char1,
        ls_fcat            TYPE lvc_s_fcat.

  CLEAR ct_fcat[].

  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      i_buffer_active        = l_buffer_active
      i_structure_name       = con_sflight
      i_client_never_display = con_true
      i_bypassing_buffer     = l_bypassing_buffer
    CHANGING
      ct_fieldcat            = ct_fcat[]
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  CLEAR ls_fcat.
  ls_fcat-tabname   = '1'.
  ls_fcat-fieldname = 'TABLE'.
  ls_fcat-inttype   = 'C'.
  ls_fcat-datatype  = 'CHAR'.
  ls_fcat-intlen    = 10.
  ls_fcat-scrtext_s = ls_fcat-fieldname.
  ls_fcat-scrtext_m = ls_fcat-fieldname.
  ls_fcat-scrtext_l = ls_fcat-fieldname.
  APPEND ls_fcat TO ct_fcat.

ENDFORM.                    " d0100_set_grid_fcat

*&---------------------------------------------------------------------*
*&      Form  d0100_set_grid_events
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM d0100_set_grid_events USING i_grid TYPE i.

  CREATE OBJECT gr_events_d0100.

  CASE i_grid.
    WHEN con_source.
      gr_events_d0100->m_grid = con_source.

      SET HANDLER gr_events_d0100->ondrag
                  FOR gr_grid_d0100_source.

      SET HANDLER gr_events_d0100->ondrop
                  FOR gr_grid_d0100_source.

      SET HANDLER gr_events_d0100->ondropcomplete
                  FOR gr_grid_d0100_source.

      SET HANDLER gr_events_d0100->ondropgetflavor
                  FOR gr_grid_d0100_source.

      SET HANDLER gr_events_d0100->data_changed
                  FOR gr_grid_d0100_source.

      SET HANDLER gr_events_d0100->data_changed_finished
                  FOR gr_grid_d0100_source.

    WHEN con_target.
      gr_events_d0100->m_grid = con_target.

      SET HANDLER gr_events_d0100->ondrag
                  FOR gr_grid_d0100_target.

      SET HANDLER gr_events_d0100->ondrop
                  FOR gr_grid_d0100_target.

      SET HANDLER gr_events_d0100->ondropcomplete
                  FOR gr_grid_d0100_target.

      SET HANDLER gr_events_d0100->ondropgetflavor
                  FOR gr_grid_d0100_target.

      SET HANDLER gr_events_d0100->data_changed
                  FOR gr_grid_d0100_target.

      SET HANDLER gr_events_d0100->data_changed_finished
                  FOR gr_grid_d0100_target.
  ENDCASE.

ENDFORM.                    " d0100_set_grid_events

*&---------------------------------------------------------------------*
*&      Form  d0100_set_grid_edit
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM d0100_set_grid_edit USING i_grid TYPE i
                         CHANGING cs_layo TYPE lvc_s_layo
                                  ct_fcat TYPE lvc_t_fcat.

  FIELD-SYMBOLS: <ls_fcat> TYPE lvc_s_fcat.

  DATA: ls_edit   TYPE lvc_s_styl,
        lt_edit   TYPE lvc_t_styl,
        ls_field  TYPE lvc_fname,
        ls_outtab TYPE g_ty_s_outtab.

  DATA: l_index   TYPE i,
        l_erg     TYPE i.

  CASE gs_test-edit_type.
    WHEN con_edit_grid.
*... Grid Editerbar
*    In Layout wird Feld EDIT auf 'X' gesetzt
      cs_layo-edit = con_true.

    WHEN con_edit_column.
*... Spalteneditierbar
*    In Feldkatalog wird Feld EDIT auf 'X' gesetzt für Spalte CARRID
      LOOP AT gs_test-edit_fields INTO ls_field.
        READ TABLE ct_fcat ASSIGNING <ls_fcat>
                   WITH KEY fieldname = ls_field.
        IF sy-subrc EQ 0.
          <ls_fcat>-edit = con_true.
        ENDIF.
      ENDLOOP.

    WHEN con_edit_cell.
*... Zellen-Editierbar
*    In Layout wird Feld SYTLEFNAME auf 'HANDLE_STYLE' gesetzt
      cs_layo-stylefname = 'HANDLE_STYLE'.

      LOOP AT gt_outtab_source INTO ls_outtab.
        l_index = sy-tabix.
        l_erg   = l_index MOD 2.
        IF l_erg EQ 0.
          LOOP AT gs_test-edit_fields INTO ls_field.
            ls_edit-fieldname = ls_field.
            ls_edit-style     = cl_gui_alv_grid=>mc_style_enabled.
            ls_edit-style2    = space.
            ls_edit-style3    = space.
            ls_edit-style4    = space.
            ls_edit-maxlen    = 8.
            INSERT ls_edit INTO TABLE lt_edit.
          ENDLOOP.

          INSERT LINES OF lt_edit INTO TABLE ls_outtab-handle_style.

          MODIFY gt_outtab_source INDEX l_index FROM ls_outtab
                                  TRANSPORTING handle_style.
        ENDIF.
      ENDLOOP.

    WHEN OTHERS.
      EXIT.
  ENDCASE.

  CASE gs_test-edit_event.
    WHEN con_edit_event_enter.
*... hiermit erfolgt eine Prüfung nach Eingabe wenn ENTER gedrückt wird
      CASE i_grid.
        WHEN con_source.
          CALL METHOD gr_grid_d0100_source->register_edit_event
            EXPORTING
              i_event_id = cl_gui_alv_grid=>mc_evt_enter.
        WHEN con_target.
          CALL METHOD gr_grid_d0100_target->register_edit_event
            EXPORTING
              i_event_id = cl_gui_alv_grid=>mc_evt_enter.
      ENDCASE.

    WHEN con_edit_event_modify.
*... hiermit erfolgt eine Prüfung nach jeder Änderung
      CASE i_grid.
        WHEN con_source.
          CALL METHOD gr_grid_d0100_source->register_edit_event
            EXPORTING
              i_event_id = cl_gui_alv_grid=>mc_evt_modified.
        WHEN con_target.
          CALL METHOD gr_grid_d0100_target->register_edit_event
            EXPORTING
              i_event_id = cl_gui_alv_grid=>mc_evt_modified.
      ENDCASE.
  ENDCASE.

  CASE gs_test-edit_mode.
    WHEN con_edit_mode_change.
*... hier wird alles was editierbar sein kann auch editierbar gemacht
      CASE i_grid.
        WHEN con_source.
          CALL METHOD gr_grid_d0100_source->set_ready_for_input
            EXPORTING
              i_ready_for_input = 1.
        WHEN con_target.
          CALL METHOD gr_grid_d0100_target->set_ready_for_input
            EXPORTING
              i_ready_for_input = 1.
      ENDCASE.
    WHEN con_edit_mode_display.
*... hier wird alles was editierbar sein kann nicht editierbar gemacht
      CASE i_grid.
        WHEN con_source.
          CALL METHOD gr_grid_d0100_source->set_ready_for_input
            EXPORTING
              i_ready_for_input = 0.
        WHEN con_target.
          CALL METHOD gr_grid_d0100_target->set_ready_for_input
            EXPORTING
              i_ready_for_input = 0.
      ENDCASE.
  ENDCASE.

*  cs_layo-no_rowins   = gs_test-no_row_ins.
*  cs_layo-no_rowmove  = gs_test-no_row_move.

ENDFORM.                    " d0100_set_grid_edit

*&---------------------------------------------------------------------*
*&      Form  d0100_get_outtab
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM d0100_get_outtab .

  DATA: ls_outtab TYPE g_ty_s_outtab.

  SELECT * FROM (con_sflight) INTO CORRESPONDING FIELDS
             OF TABLE gt_outtab_source
             UP TO gs_test-select_amount ROWS
             ORDER BY PRIMARY KEY.

  gs_test-select_amount = sy-dbcnt.

  ls_outtab-table = 'SOURCE'.
  MODIFY gt_outtab_source FROM ls_outtab
                          TRANSPORTING table
                          WHERE TABLE ne LS_OUTTAB-TABLE.

  gt_outtab_target[] = gt_outtab_source[].

  ls_outtab-table = 'TARGET'.
  MODIFY gt_outtab_target FROM ls_outtab
                          TRANSPORTING table
                          WHERE TABLE ne LS_OUTTAB-TABLE.

ENDFORM.                    " d0100_get_outtab

*&---------------------------------------------------------------------*
*&      Form  d0100_event_ondrag
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM d0100_event_ondrag USING e_row         TYPE lvc_s_row
                              e_column      TYPE lvc_s_col
                              e_dragdropobj TYPE REF TO
                                            cl_dragdropobject."#EC *


  DATA: l_event TYPE lvc_fname.                             "#EC NEEDED

  DATA: lo_sender TYPE REF TO cl_gui_alv_grid,
        lt_outtab TYPE g_ty_t_outtab,
        lt_rows   TYPE lvc_t_row,
        ls_row    TYPE lvc_s_row. " $INSERT



  lo_sender ?= e_dragdropobj->dragsourcectrl.
" (1) Get all selected rows...
  CALL METHOD lo_sender->get_selected_rows
    IMPORTING
      et_index_rows = lt_rows
*      et_row_no     =
      .


  IF gs_test-info_popup_once EQ con_true.
    READ TABLE gs_test-events_info_popup INTO l_event
               WITH KEY table_line = 'ONDRAG'.
    IF sy-subrc NE 0.
      INSERT 'ONDRAG'
             INTO gs_test-events_info_popup INDEX 1.
      MESSAGE i000(0k) WITH text-t01.
    ENDIF.
  ELSEIF gs_test-no_info_popup EQ space.
    MESSAGE i000(0k) WITH text-t01.
  ENDIF.

  DATA: ls_outtab TYPE g_ty_s_outtab,
        l_obj     TYPE REF TO lcl_dragdrop_obj_d0100.

" (2)...and store them in the dragdrop object. This information
"    is required when the flavor=MOVE so we have to delete the
" selected rows from the source grid
  CREATE OBJECT l_obj.
  l_obj->rows = lt_rows.  " $INSERT


  CASE e_dragdropobj->dragsourcectrl.
    WHEN gr_grid_d0100_source.
      lt_outtab = gt_outtab_source.

    WHEN gr_grid_d0100_target.
      lt_outtab = gt_outtab_target.
  ENDCASE.

" Instead of saving the single row which was dragged we save
" all selected rows including the dragged one in the dragdrop object
  LOOP AT lt_rows INTO ls_row.
    READ TABLE lt_outtab INTO ls_outtab INDEX ls_row-index.

    IF ( syst-tabix = 1 ).
      l_obj->line           = ls_outtab.
      l_obj->index          = ls_row-index.
    ENDIF.

    APPEND ls_outtab TO l_obj->lines.
  ENDLOOP.

  e_dragdropobj->object = l_obj.  " $INSERT & MODIFY

**  CASE e_dragdropobj->dragsourcectrl.
**    WHEN gr_grid_d0100_source.
**      READ TABLE gt_outtab_source INTO ls_outtab INDEX e_row-index.
**    WHEN gr_grid_d0100_target.
**      READ TABLE gt_outtab_target INTO ls_outtab INDEX e_row-index.
**  ENDCASE.
**  IF sy-subrc EQ 0.
**    l_obj->line           = ls_outtab.
**    l_obj->index          = e_row-index.
**    e_dragdropobj->object = l_obj.
**  ENDIF.

ENDFORM.                    " d0100_event_ondrag

*&---------------------------------------------------------------------*
*&      Form  d0100_event_ondrop
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM d0100_event_ondrop USING e_row         TYPE lvc_s_row
                              e_column      TYPE lvc_s_col
                              e_dragdropobj TYPE REF TO
                                             cl_dragdropobject."#EC *

  DATA: l_event TYPE lvc_fname.                             "#EC NEEDED

  IF gs_test-info_popup_once EQ con_true.
    READ TABLE gs_test-events_info_popup INTO l_event
               WITH KEY table_line = 'ONDROP'.
    IF sy-subrc NE 0.
      INSERT 'ONDROP'
             INTO gs_test-events_info_popup INDEX 1.
      MESSAGE i000(0k) WITH text-t02.
    ENDIF.
  ELSEIF gs_test-no_info_popup EQ space.
    MESSAGE i000(0k) WITH text-t02.
  ENDIF.

  DATA: l_obj     TYPE REF TO lcl_dragdrop_obj_d0100,
        ls_outtab TYPE g_ty_s_outtab.

  CREATE OBJECT l_obj.

  IF e_row-index IS INITIAL.
    e_row-index = 1.
  ENDIF.

  CATCH SYSTEM-EXCEPTIONS move_cast_error = 1.
    l_obj ?= e_dragdropobj->object.
**    ls_outtab = l_obj->line.  "$DELETE

"   Since we can have multiple rows that should be dropped we
"   replace the single-row coding with a loop over the selected rows
    LOOP AT l_obj->lines INTO ls_outtab.  " $INSERT

      CASE e_dragdropobj->effect.
        WHEN cl_dragdrop=>move.
          CASE e_dragdropobj->droptargetctrl.
            WHEN gr_grid_d0100_source.
              INSERT ls_outtab INTO gt_outtab_source INDEX e_row-index.
            WHEN gr_grid_d0100_target.
              INSERT ls_outtab INTO gt_outtab_target INDEX e_row-index.
          ENDCASE.
        WHEN cl_dragdrop=>copy.
          CASE e_dragdropobj->droptargetctrl.
            WHEN gr_grid_d0100_source.
              INSERT ls_outtab INTO gt_outtab_source INDEX e_row-index.
            WHEN gr_grid_d0100_target.
              INSERT ls_outtab INTO gt_outtab_target INDEX e_row-index.
          ENDCASE.
      ENDCASE.

    ENDLOOP.

  ENDCATCH.
  IF sy-subrc <> 0.
    CALL METHOD e_dragdropobj->abort.
  ENDIF.

ENDFORM.                    " d0100_event_ondrop

*&---------------------------------------------------------------------*
*&      Form  d0100_event_ondropcomplete
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM d0100_event_ondropcomplete USING e_row         TYPE lvc_s_row
                                      e_column      TYPE lvc_s_col
                                      e_dragdropobj TYPE REF TO
                                              cl_dragdropobject."#EC *

  DATA: l_event TYPE lvc_fname.                             "#EC NEEDED

  IF gs_test-info_popup_once EQ con_true.
    READ TABLE gs_test-events_info_popup INTO l_event
               WITH KEY table_line = 'ONDROPCOMPLETE'.
    IF sy-subrc NE 0.
      INSERT 'ONDROPCOMPLETE'
             INTO gs_test-events_info_popup INDEX 1.
      MESSAGE i000(0k) WITH text-t03.
    ENDIF.
  ELSEIF gs_test-no_info_popup EQ space.
    MESSAGE i000(0k) WITH text-t03.
  ENDIF.

  DATA: l_obj      TYPE REF TO lcl_dragdrop_obj_d0100,
        ls_row     TYPE lvc_s_row,  " $INSERT
        ls_stable  TYPE lvc_s_stbl,
        lr_grid    TYPE REF TO cl_gui_alv_grid.

  ls_stable-row = con_true.
  ls_stable-col = con_true.

  CATCH SYSTEM-EXCEPTIONS move_cast_error = 1.
    l_obj ?= e_dragdropobj->object.
    IF e_dragdropobj->effect = cl_dragdrop=>move.
"     Since we can have multiple lines for the drag&drop events
"     we replace the single-row coding with a loop over all
"     selected rows.

**      DELETE gt_outtab_source INDEX l_obj->index. " $DELETE
      LOOP AT l_obj->rows INTO ls_row.  " $INSERT
        DELETE gt_outtab_source INDEX ls_row-index.
      ENDLOOP.
    ENDIF.
  ENDCATCH.
  CASE sy-subrc.
    WHEN 0.
      CASE e_dragdropobj->effect.
        WHEN cl_dragdrop=>move.
          lr_grid ?= e_dragdropobj->dragsourcectrl.
          CALL METHOD lr_grid->refresh_table_display
            EXPORTING
              is_stable = ls_stable.
          lr_grid ?= e_dragdropobj->droptargetctrl.
          CALL METHOD lr_grid->refresh_table_display
            EXPORTING
              is_stable = ls_stable.

        WHEN cl_dragdrop=>copy.
          lr_grid ?= e_dragdropobj->droptargetctrl.
          CALL METHOD lr_grid->refresh_table_display
            EXPORTING
              is_stable = ls_stable.
      ENDCASE.
    WHEN OTHERS.
      CALL METHOD e_dragdropobj->abort.
  ENDCASE.

ENDFORM.                    " d0100_event_ondropcomplete

*&---------------------------------------------------------------------*
*&      Form  d0100_event_ondropgetflavor
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM d0100_event_ondropgetflavor USING e_row         TYPE lvc_s_row
                                       e_column      TYPE lvc_s_col
                                       es_row_no     TYPE lvc_s_roid
                                       e_dragdropobj TYPE REF TO
                                                      cl_dragdropobject
                                       e_flavors     TYPE cndd_flavors.
                                                            "#EC *

  DATA: l_event TYPE lvc_fname.                             "#EC NEEDED

  IF gs_test-info_popup_once EQ con_true.
    READ TABLE gs_test-events_info_popup INTO l_event
               WITH KEY table_line = 'ONDROPGETFLAVOR'.
    IF sy-subrc NE 0.
      INSERT 'ONDROPGETFLAVOR'
             INTO gs_test-events_info_popup INDEX 1.
      MESSAGE i000(0k) WITH text-t04.
    ENDIF.
  ELSEIF gs_test-no_info_popup EQ space.
    MESSAGE i000(0k) WITH text-t04.
  ENDIF.

ENDFORM.                    " d0100_event_ondropgetflavor

*&---------------------------------------------------------------------*
*&      Form  d0100_set_drag_drop
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM d0100_set_drag_drop USING i_grid TYPE i
                         CHANGING cs_layo TYPE lvc_s_layo
                                  ct_fcat TYPE lvc_t_fcat.

  DATA: l_effect                     TYPE i,
        l_dragdrop_handle            TYPE i,
        ls_dragdrop                  TYPE lvc_s_dd01,
        ls_drag_cell                 TYPE lvc_s_drdr,
        lt_drag_cells                TYPE lvc_t_drdr,
        ls_fcat                      TYPE lvc_s_fcat,
        l_field                      TYPE lvc_fname,
        l_source                     TYPE char1,
        l_target                     TYPE char1,
        ls_outtab                    TYPE g_ty_s_outtab,
        ls_tabcolor                  TYPE lvc_s_scol,
        lt_tabcolor                  TYPE lvc_t_scol.

  CASE i_grid.
    WHEN con_source.
      l_source = con_true.
    WHEN con_target.
      l_target = con_true.
  ENDCASE.
  l_source = con_true.
  l_target = con_true.

  CREATE OBJECT gr_dragdrop_d0100.
  CREATE OBJECT gr_dragdrop_background_d0100.

  CASE gs_test-dragdrop_effect.
    WHEN con_dragdrop_effect_move.
      l_effect = cl_dragdrop=>move.
    WHEN con_dragdrop_effect_copy.
      l_effect = cl_dragdrop=>copy.
    WHEN con_dragdrop_effect_all.
      l_effect = cl_dragdrop=>move + cl_dragdrop=>copy.
  ENDCASE.

  CASE gs_test-dragdrop_type.
    WHEN con_dragdrop_row.
*... setzen für alle Zeilen
*    Im Layout wird S_DRAGDROP mit Handle gefüllt
      CALL METHOD gr_dragdrop_d0100->add
        EXPORTING
          flavor     = 'Line'                               "#EC NOTEXT
          dragsrc    = l_source
          droptarget = l_target
          effect     = l_effect.

      CALL METHOD gr_dragdrop_d0100->get_handle
        IMPORTING
          handle = l_dragdrop_handle.

      ls_dragdrop-cntr_ddid = l_dragdrop_handle. "auch bei leerem Grid
      ls_dragdrop-grid_ddid = space.
      ls_dragdrop-col_ddid  = space.
      ls_dragdrop-row_ddid  = l_dragdrop_handle.
      ls_dragdrop-fieldname = space.
      cs_layo-s_dragdrop    = ls_dragdrop.

    WHEN con_dragdrop_column.
*... setzen für Spalten
*    Im Feldkatalog wird DRAGDROPID mit Handle gefüllt
      CALL METHOD gr_dragdrop_d0100->add
        EXPORTING
          flavor     = 'Line'                               "#EC NOTEXT
          dragsrc    = l_source
          droptarget = l_target
          effect     = l_effect.

      CALL METHOD gr_dragdrop_d0100->get_handle
        IMPORTING
          handle = l_dragdrop_handle.

      ls_dragdrop-cntr_ddid = l_dragdrop_handle. "auch bei leerem Grid
      ls_dragdrop-grid_ddid = space.
      ls_dragdrop-col_ddid  = l_dragdrop_handle.
      ls_dragdrop-row_ddid  = space.
      ls_dragdrop-fieldname = space.
      cs_layo-s_dragdrop    = ls_dragdrop.

      ls_fcat-dragdropid    = l_dragdrop_handle.
      LOOP AT gs_test-dragdrop_fields INTO l_field.
        ls_tabcolor-fname     = l_field.
        ls_tabcolor-color-col = cl_gui_resources=>list_col_negative.
        ls_tabcolor-color-int = 0.
        ls_tabcolor-color-inv = 0.
        ls_tabcolor-nokeycol  = con_true.
        APPEND ls_tabcolor TO lt_tabcolor.

        MODIFY ct_fcat FROM ls_fcat
                       TRANSPORTING dragdropid
                       WHERE fieldname = l_field.
      ENDLOOP.

      ls_outtab-tabcolor = lt_tabcolor.
      MODIFY gt_outtab_source FROM ls_outtab
                       TRANSPORTING tabcolor
                       WHERE tabcolor IS INITIAL.

    WHEN con_dragdrop_cell.
*... setzen für Zellen
      CALL METHOD gr_dragdrop_d0100->add
        EXPORTING
          flavor     = 'Line'                               "#EC NOTEXT
          dragsrc    = l_source
          droptarget = l_target
          effect     = l_effect.

      CALL METHOD gr_dragdrop_d0100->get_handle
        IMPORTING
          handle = l_dragdrop_handle.

      ls_dragdrop-cntr_ddid = l_dragdrop_handle. "auch bei leerem Grid
      ls_dragdrop-grid_ddid = space.
      ls_dragdrop-col_ddid  = space.
      ls_dragdrop-row_ddid  = space.
      ls_dragdrop-fieldname = 'HANDLE_DRAGDROP'.
      cs_layo-s_dragdrop    = ls_dragdrop.

      LOOP AT gs_test-dragdrop_fields INTO l_field.
        ls_drag_cell-fieldname  = l_field.
        ls_drag_cell-dragdropid = l_dragdrop_handle.
        INSERT ls_drag_cell INTO TABLE lt_drag_cells.

        ls_tabcolor-fname     = l_field.
        ls_tabcolor-color-col = cl_gui_resources=>list_col_negative.
        ls_tabcolor-color-int = 0.
        ls_tabcolor-color-inv = 0.
        ls_tabcolor-nokeycol  = con_true.
        APPEND ls_tabcolor TO lt_tabcolor.
      ENDLOOP.

      DATA: l_index   TYPE i,
            l_erg     TYPE i.

      LOOP AT gt_outtab_source INTO ls_outtab.
        l_index = sy-tabix.
        l_erg = sy-tabix MOD 2.
        IF l_erg EQ 0.
          ls_outtab-handle_dragdrop = lt_drag_cells.
          ls_outtab-tabcolor        = lt_tabcolor.
          MODIFY gt_outtab_source INDEX l_index FROM ls_outtab
                           TRANSPORTING handle_dragdrop
                                        tabcolor.
        ENDIF.
      ENDLOOP.
  ENDCASE.

ENDFORM.                    " d0100_set_drag_drop

*&---------------------------------------------------------------------*
*&      Form  d0100_f4_fcode
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM d0100_f4_fcode CHANGING c_value TYPE lvc_s_fcat-fieldname.

  DATA: lt_fcat TYPE lvc_t_fcat,
        ls_fcat TYPE lvc_s_fcat.

  PERFORM d0100_set_grid_fcat CHANGING lt_fcat.

  DATA: lt_values TYPE TABLE OF seahlpres,
        lt_fields TYPE TABLE OF dfies,
        lt_return TYPE TABLE OF ddshretval,
        ls_value  TYPE seahlpres,
        ls_field  TYPE dfies,
        ls_return TYPE ddshretval.

  CLEAR ls_field.
  ls_field-fieldname = 'FIELDNAME'.
  ls_field-intlen    = 30.
  ls_field-leng      = 30.
  ls_field-outputlen = 30.
  ls_field-scrtext_s = ls_field-fieldname.
  ls_field-scrtext_m = ls_field-fieldname.
  ls_field-scrtext_l = ls_field-fieldname.
  ls_field-reptext   = ls_field-fieldname.
  APPEND ls_field TO lt_fields.

  LOOP AT lt_fcat INTO ls_fcat WHERE tech EQ space.
    ls_value-string = ls_fcat-fieldname.
    APPEND ls_value TO lt_values.
  ENDLOOP.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
   EXPORTING
*     DDIC_STRUCTURE         = ' '
     retfield               = 'FIELDNAME'
*     PVALKEY                = ' '
*     DYNPPROG               = ' '
*     DYNPNR                 = ' '
*     DYNPROFIELD            = ' '
*     STEPL                  = 0
*     WINDOW_TITLE           =
*     VALUE                  = ' '
*     VALUE_ORG              = 'C'
*     MULTIPLE_CHOICE        = ' '
     display                = space
*     CALLBACK_PROGRAM       = ' '
*     CALLBACK_FORM          = ' '
   TABLES
     value_tab              = lt_values
     field_tab              = lt_fields
     return_tab             = lt_return
*     DYNPFLD_MAPPING        =
   EXCEPTIONS
     parameter_error        = 1
     no_values_found        = 2
     OTHERS                 = 3.
  IF sy-subrc <> 0 AND sy-subrc NE 3.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  READ TABLE lt_return INTO ls_return
             WITH KEY fieldname = 'FIELDNAME'.
  IF sy-subrc EQ 0.
    c_value = ls_return-fieldval.
  ENDIF.

ENDFORM.                    " d0100_f4_fcode

*&---------------------------------------------------------------------*
*&      Form  d0100_event_data_changed
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM d0100_event_data_changed USING er_data_changed
                              TYPE REF TO cl_alv_changed_data_protocol
                                    e_onf4
                                    e_onf4_before
                                    e_onf4_after
                                    i_grid TYPE i.          "#EC *

  DATA: l_text1 TYPE string,
        l_text2 TYPE string,
        l_text3 TYPE string.

  CONCATENATE text-100 e_onf4 INTO l_text3.
  CONCATENATE text-101 e_onf4_before INTO l_text1.
  CONCATENATE text-102 e_onf4_after INTO l_text2.

  DATA: l_event TYPE lvc_fname.                             "#EC NEEDED

  IF gs_test-info_popup_once EQ con_true.
    READ TABLE gs_test-events_info_popup INTO l_event
               WITH KEY table_line = 'DATA_CHANGED'.
    IF sy-subrc NE 0.
      INSERT 'DATA_CHANGED'
             INTO gs_test-events_info_popup INDEX 1.
      MESSAGE i000(0k) WITH text-001
                            l_text3
                            l_text1
                            l_text2.
    ENDIF.
  ELSEIF gs_test-no_info_popup EQ space.
    MESSAGE i000(0k) WITH text-001
                          l_text3
                          l_text1
                          l_text2.
  ENDIF.

  DATA: ls_row TYPE lvc_s_moce.

  LOOP AT er_data_changed->mt_deleted_rows INTO ls_row.
    CASE i_grid.
      WHEN con_source.
        DELETE gt_outtab_source INDEX ls_row-row_id.
      WHEN con_target.
        DELETE gt_outtab_target INDEX ls_row-row_id.
    ENDCASE.
  ENDLOOP.

*... die Ausgabetabelle ist noch nicht aktualisiert
*    hier sollen semantische Prüfungen zunächst erfolgen über
*      er_data_changed->mt_good_cells
*    Fehler können dann dem Fehlerprotokoll angehängt werden
*      er_data_changed->add_protocol_entry
*    Es darf an dieser Stelle kein Refresh erfolgen!

ENDFORM.                    " d0100_event_data_changed

*&---------------------------------------------------------------------*
*&      Form  d0100_event_data_changed_finis
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM d0100_event_data_changed_finis .                       "#EC *

  DATA: l_event TYPE lvc_fname.                             "#EC NEEDED

  IF gs_test-info_popup_once EQ con_true.
    READ TABLE gs_test-events_info_popup INTO l_event
               WITH KEY table_line = 'DATA_CHANGED_FINISHED'.
    IF sy-subrc NE 0.
      INSERT 'DATA_CHANGED_FINISHED'
             INTO gs_test-events_info_popup INDEX 1.
      MESSAGE i000(0k) WITH text-002.
    ENDIF.
  ELSEIF gs_test-no_info_popup EQ space.
    MESSAGE i000(0k) WITH text-002.
  ENDIF.

*... die Ausgabetabelle ist nun aktualisiert

ENDFORM.                    " d0100_event_data_changed_finis

Regards

Uwe