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: 

ALV Object Model Drag and Drop

andy_dingfelder3
Participant
0 Kudos

Hi,

i want to use the "new" ALV object model. My question now ist whether this object model support drag and drop? I couldn´t find any examples for that.

I´ve found a class called CL_SALV_DRAG_DROP. But it seems that this class isn´t used...

Thanks in advance for your help.

Regards,

Andy

6 REPLIES 6

Former Member
0 Kudos

Check out this link it may be helpful,

http://help.sap.com/saphelp_47x200/helpdata/EN/87/1a4db7a3ad11d2bd69080009b4534c/frameset.htm

Regards,

Midhun Abraham

0 Kudos

Hi,

> Check out this link it may be helpful,

>

> http://help.sap.com/saphelp_47x200/helpdata/EN/87/1a4db7a3ad11d2bd69080009b4534c/frameset.htm

>

thanks for the link.

As I said in my origin post I want to use the ALV object model (class CL_SALV_TABLE). There I couldn´t find a possibility to subscribe to the events ON_DRAG, ON_DROP, etc. Therefore I´m wondering whether the Drag & Drop functionality can be used in the ALV object model, at all...

Regards,

Andy

0 Kudos

Yes its possible to use Drag and Drop in OO Alv

Former Member

Hi,

I've got the same problem and I solved it by grabbing the ALV_GRID behind the SALV instance through an adapter.

Once you get the reference to the ALV grid you can declare and use your drag and drop events (and others functionnalities also...) as usual.

I've attached a small progam as example.

Hope it helps you

Regards,


*&---------------------------------------------------------------------*
*& Report  ZTESTDND_WTH_SALV
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ZTESTDND_WTH_SALV.

CLASS LCL_APPLICATION DEFINITION DEFERRED.
CLASS LCL_SALV_MODEL DEFINITION DEFERRED.

DATA G_APP TYPE REF TO LCL_APPLICATION.

DATA CONTAINER1 TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
DATA GRID1_SALV TYPE REF TO CL_SALV_TABLE.
DATA DRAG TYPE REF TO CL_DRAGDROP.

DATA CONTAINER2 TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
DATA GRID2_SALV TYPE REF TO CL_SALV_TABLE.
DATA DROP TYPE REF TO CL_DRAGDROP.

DATA OK_CODE TYPE SY-UCOMM.
DATA GT_OUTTAB1 TYPE STANDARD TABLE OF T001.
DATA GT_OUTTAB2 TYPE STANDARD TABLE OF T001.
*----------------------------------------------------------------------*
*       CLASS LCL_SALV_MODEL DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS LCL_SALV_MODEL DEFINITION INHERITING FROM CL_SALV_MODEL_LIST.

  PUBLIC SECTION.

    DATA: O_CONTROL TYPE REF TO CL_SALV_CONTROLLER_MODEL,
          O_ADAPTER TYPE REF TO CL_SALV_ADAPTER.

    METHODS:
      GRABE_MODEL
        IMPORTING
          IO_MODEL TYPE REF TO CL_SALV_MODEL,

      GRABE_CONTROLLER,

      GRABE_ADAPTER.

  PRIVATE SECTION.

    DATA: LO_MODEL TYPE REF TO CL_SALV_MODEL.

ENDCLASS.                    "LCL_SALV_MODEL DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_dragdrop DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS LCL_DRAGDROP DEFINITION.
  PUBLIC SECTION.
    DATA: T001  TYPE T001,
          INDEX TYPE I.   "Index of Line to be moved
ENDCLASS.                    "LCL_DRAGDROP DEFINITION


*----------------------------------------------------------------------*
*       CLASS lcl_salv_model IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS LCL_SALV_MODEL IMPLEMENTATION.

  METHOD GRABE_MODEL.
*   save the model
    LO_MODEL = IO_MODEL.
  ENDMETHOD.                    "grabe_model

  METHOD GRABE_CONTROLLER.
*   save the controller
    O_CONTROL = LO_MODEL->R_CONTROLLER.
  ENDMETHOD.                    "grabe_controller

  METHOD GRABE_ADAPTER.
*   save the adapter from controller
    O_ADAPTER ?= LO_MODEL->R_CONTROLLER->R_ADAPTER.
  ENDMETHOD.                    "grabe_adapter

ENDCLASS.                    "LCL_SALV_MODEL IMPLEMENTATION

*----------------------------------------------------------------------*
*       CLASS lcl_application DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS LCL_APPLICATION DEFINITION.

  PUBLIC SECTION.

    METHODS PBO_100.

  PRIVATE SECTION.

    DATA O_SALV_MODEL TYPE REF TO LCL_SALV_MODEL.

    METHODS:
     HANDLE_GRID1_DRAG
       FOR EVENT ONDRAG
       OF CL_GUI_ALV_GRID
       IMPORTING E_ROW E_COLUMN E_DRAGDROPOBJ,

     HANDLE_GRID2_DROP
       FOR EVENT ONDROP
       OF CL_GUI_ALV_GRID
       IMPORTING E_ROW E_COLUMN E_DRAGDROPOBJ.

    METHODS GRAB_SALV_GRID
       IMPORTING
          IM_GRID TYPE REF TO CL_SALV_TABLE
       RETURNING VALUE(RE_GRID) TYPE REF TO CL_GUI_ALV_GRID.

ENDCLASS.                    "lcl_application DEFINITION

*---------------------------------------------------------------------*
*       CLASS LCL_APPLICATION IMPLEMENTATION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
CLASS LCL_APPLICATION IMPLEMENTATION.
*-------------------------------------------------------------------
  METHOD PBO_100.

    DATA  L_LAYOUT TYPE LVC_S_LAYO.
    DATA EFFECT TYPE I.
    DATA L_GRID_ALV TYPE REF TO CL_GUI_ALV_GRID.

    SET PF-STATUS '100'.

    CHECK CONTAINER1 IS NOT BOUND.

    CREATE OBJECT CONTAINER1
      EXPORTING
        CONTAINER_NAME              = 'GRID1'
      EXCEPTIONS
        CNTL_ERROR                  = 1
        CNTL_SYSTEM_ERROR           = 2
        CREATE_ERROR                = 3
        LIFETIME_ERROR              = 4
        LIFETIME_DYNPRO_DYNPRO_LINK = 5
        OTHERS                      = 6.

    IF SY-SUBRC <> 0.
      MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
                 WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.

    CREATE OBJECT CONTAINER2
      EXPORTING
        CONTAINER_NAME              = 'GRID2'
      EXCEPTIONS
        CNTL_ERROR                  = 1
        CNTL_SYSTEM_ERROR           = 2
        CREATE_ERROR                = 3
        LIFETIME_ERROR              = 4
        LIFETIME_DYNPRO_DYNPRO_LINK = 5
        OTHERS                      = 6.
    IF SY-SUBRC <> 0.
      MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
                 WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.

*** build SALV Table
    TRY.
        CALL METHOD CL_SALV_TABLE=>FACTORY
          EXPORTING
            R_CONTAINER  = CONTAINER1
          IMPORTING
            R_SALV_TABLE = GRID1_SALV
          CHANGING
            T_TABLE      = GT_OUTTAB1.

      CATCH CX_SALV_MSG .

    ENDTRY.

*** it is required to execute the display method otherwise the adapter
*** will not been instantiated when grabbing the alv grid

    GRID1_SALV->DISPLAY( ).

*** Grab the ALV grid from SALV_TABLE
    L_GRID_ALV = GRAB_SALV_GRID( GRID1_SALV ).

*** Now the L_GRID_ALV is a reference to the ALV grid of the SALV table object

*** set the DRAG event handler
    SET HANDLER G_APP->HANDLE_GRID1_DRAG FOR L_GRID_ALV.

*** set the drag linkage
    CREATE OBJECT DRAG.

    CALL METHOD DRAG->ADD
      EXPORTING
        FLAVOR     = 'Line'                                 "#EC NOTEXT
        DRAGSRC    = 'X'
        DROPTARGET = ' '
        EFFECT     = CL_DRAGDROP=>COPY.

    CALL METHOD DRAG->GET_HANDLE
      IMPORTING
        HANDLE = L_LAYOUT-S_DRAGDROP-GRID_DDID.

*** set the drag handle into the SAVL table 1 through the grabbed alv grid
    CALL METHOD L_GRID_ALV->SET_FRONTEND_LAYOUT
      EXPORTING
        IS_LAYOUT = L_LAYOUT.


*** repeat the same process for the second grid
    TRY.

        CALL METHOD CL_SALV_TABLE=>FACTORY
          EXPORTING
            R_CONTAINER  = CONTAINER2
          IMPORTING
            R_SALV_TABLE = GRID2_SALV
          CHANGING
            T_TABLE      = GT_OUTTAB2.

      CATCH CX_SALV_MSG .

    ENDTRY.

    GRID2_SALV->DISPLAY( ).

    L_GRID_ALV = GRAB_SALV_GRID( GRID2_SALV ).

    SET HANDLER G_APP->HANDLE_GRID2_DROP FOR L_GRID_ALV.

    CREATE OBJECT DROP.

    CALL METHOD DROP->ADD
      EXPORTING
        FLAVOR     = 'Line'                                 "#EC NOTEXT
        DRAGSRC    = ' '
        DROPTARGET = 'X'
        EFFECT     = CL_DRAGDROP=>COPY.

    CALL METHOD DROP->GET_HANDLE
      IMPORTING
        HANDLE = L_LAYOUT-S_DRAGDROP-CNTR_DDID.

    CALL METHOD L_GRID_ALV->SET_FRONTEND_LAYOUT
      EXPORTING
        IS_LAYOUT = L_LAYOUT.

  ENDMETHOD.                                                "pbo_100

  METHOD HANDLE_GRID1_DRAG.

    DATA: DATAOBJ TYPE REF TO LCL_DRAGDROP.

    CREATE OBJECT DATAOBJ.

    READ TABLE GT_OUTTAB1 INTO DATAOBJ->T001 INDEX E_ROW-INDEX .

    MOVE E_ROW-INDEX TO DATAOBJ->INDEX.

    E_DRAGDROPOBJ->OBJECT = DATAOBJ.

  ENDMETHOD.                    "handle_alv_drag
*--------------------------------------------------------------------

  METHOD HANDLE_GRID2_DROP.

    DATA: DATAOBJ TYPE REF TO LCL_DRAGDROP.

    CATCH SYSTEM-EXCEPTIONS MOVE_CAST_ERROR = 1.
      DATAOBJ ?= E_DRAGDROPOBJ->OBJECT.
    ENDCATCH.

    IF SY-SUBRC = 1.
      CALL METHOD E_DRAGDROPOBJ->ABORT.
      EXIT.
    ENDIF.

    APPEND DATAOBJ->T001 TO GT_OUTTAB2.

    GRID2_SALV->REFRESH( ).

  ENDMETHOD.                    "handle_tree_drop
*-------------------------------------------------------------------
  METHOD GRAB_SALV_GRID.

*** use the following adapter when ctrl is in a container
    DATA  LO_ADAP TYPE REF TO CL_SALV_GRID_ADAPTER.

*** use the following adapter when ctrl is in full screen mode
*    DATA  LO_ADAP TYPE REF TO CL_SALV_FULLSCREEN_ADAPTER.

    DATA: LO_ALV_MOD TYPE REF TO CL_SALV_MODEL.

*   Narrow casting
    LO_ALV_MOD ?= IM_GRID.

*   object for the local inherited class from the CL_SALV_MODEL_LIST
    CREATE OBJECT O_SALV_MODEL.

*   grabe model to use it later
    CALL METHOD O_SALV_MODEL->GRABE_MODEL
      EXPORTING
        IO_MODEL = LO_ALV_MOD.

    CALL METHOD O_SALV_MODEL->GRABE_CONTROLLER.

*       Adapter
    CALL METHOD O_SALV_MODEL->GRABE_ADAPTER.

*       Adapter (Down Casting)
    LO_ADAP ?= O_SALV_MODEL->O_ADAPTER.

*       Get the Grid
    RE_GRID = LO_ADAP->GET_GRID( ).

  ENDMETHOD.                    "grab_salv_grid
ENDCLASS.                    "lcl_application IMPLEMENTATION

*----------------------------------------------------------------------*
*  MODULE USER_COMMAND_0100 INPUT
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
  CASE OK_CODE.
    WHEN 'BACK'.
      LEAVE TO SCREEN 0.
  ENDCASE.
ENDMODULE.                 " USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE PBO_0100 OUTPUT.
  G_APP->PBO_100( ).
ENDMODULE.                    "STATUS_0100 OUTPUT

START-OF-SELECTION.

  CREATE OBJECT G_APP.

  SELECT * FROM T001 INTO TABLE GT_OUTTAB1.

  CALL SCREEN 100.

Former Member
0 Kudos

Hi Andy,

use this thread to solve your issues,

and also Check program SALV_DEMO_TABLE_COLUMNS for more information.

Regards ,

Saravana

Former Member
0 Kudos

Hi,

You will need to access the grid object... There is a trick:

Check this useful blog:

You can use the same trick for drag&dropping event.

Kr,

m.