Fragen zur ALV-Selektionsspalte

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
14 Beiträge • Seite 1 von 1
14 Beiträge Seite 1 von 1

Fragen zur ALV-Selektionsspalte

Beitrag von Ecoman68 (ForumUser / 13 / 10 / 0 ) »
Hallo,

leider habe ich, trotz intensiver Suche, für mein nachfolgendes Problem bislang noch keine Lösung finden können.

Ich nutze ein ALV-Grid der Klasse "cl_gui_alv_grid" mit diversen Event-Handlern (u.a. ondrag, ondrop, usw.).
ALV1.jpg
Wenn ich eine Zeile markiere (A) und diese anschliessen von einer Zelle aus verschiebe (B) vererbe ich über die "ondrag"- und "ondrop"-Events die "Neue Folge" der Zielposition:
ALV2.jpg
Wenn ich jedoch das Verschieben der Zeile in der Selektionsspalte durchführe, werden die Events des ALVs offensichtlich nicht ausgelöst...
ALV3.jpg
...und die "Neue Folge" dadurch nicht verändert, sondern bleibt auf dem Wert "3".

Wie eingangs beschrieben, finde ich keine Lösung. Folgende Fragen stellen sich mir momentan:

- Welche Events werden durch das Verschieben in der Selektionsspalte ausgelöst, die ich nutzen könnte?
- Oder wie kann ich verhindern, dass Zeilen über die Selektionsspalte verschoben werden können? Das Verschieben über die Zellen muss jedoch weiterhin funktionieren.

Ich bin für jeden hilfreichen Beitrag dankbar! :D

Vielen Dank!

Gruß,
Ecoman68

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Fragen zur ALV-Selektionsspalte

Beitrag von black_adept (Top Expert / 3943 / 105 / 886 ) »
Hallo Ecoman,

kannst du dein Problem in ein Miniprogramm packen und das hier posten oder mittels SAPLINK zur Verfügung stellen?
Denn um das Beantworten zu können müsste man sich wahrscheinlich erst mal deine Situation nachbauen.

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
Ecoman68

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Fragen zur ALV-Selektionsspalte

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
Schnelle Lösung: Wenn die Selektionsspalte nicht gebraucht wird einfach ausblenden. Wie das geht steht in der Hilfe vom ALV-Grid beim Layout zum Thema SELMODE bzw. NO_ROWMARK.
Dennoch klingt das Problem spannend und sollte unbedingt, wie black_adept schon vorgeschlagen hat, genauer untersucht werden.

lg ADT

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
Ecoman68

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Fragen zur ALV-Selektionsspalte

Beitrag von jensschladitz (Specialist / 417 / 0 / 56 ) »
Sali,

wird Event - ONDROPCOMPLETE -auch nicht durchlaufen ?

Gruss

Folgende Benutzer bedankten sich beim Autor jensschladitz für den Beitrag:
Ecoman68

thanks Jens

Re: Fragen zur ALV-Selektionsspalte

Beitrag von Ecoman68 (ForumUser / 13 / 10 / 0 ) »
Hallo,

erstmal vielen Dank für die bisherigen Antworten.

Ich benötige die Selektionsspalte, damit eine Mehrfachselektion möglich ist und kann sie daher nicht deaktivieren. Das Event ONDROPCOMPLETE wird leider auch nicht durchlaufen.

Ich habe eine kleine Demoapp erstellt. Es muss natürlich noch ein zugehöriges Dynpro 0100 manuell erstellt werden (SE80) mit folgender Ablauflogik:

Code: Alles auswählen.

PROCESS BEFORE OUTPUT.
  MODULE clear_ok_code.
  MODULE status_0100.
  MODULE display_alv.

PROCESS AFTER INPUT.
  MODULE user_command_0100.
In der Elementeliste des Dynpros muss für den Typ "OK" dann noch als Name "OK_CODE" eingetragen werden.

Zudem müssen per Doppelklick im Module "status_0100" (Zeile 232) ein PF-STATUS und ein TITLEBAR erzeugt werden:

Code: Alles auswählen.

MODULE status_0100 OUTPUT.
  SET PF-STATUS 'STATUS'.
  SET TITLEBAR  'DEMO'.
ENDMODULE.
Demo-App "ZTT_ALV_MOVE_TEST":

Code: Alles auswählen.

*&---------------------------------------------------------------------*
*& Report  ZTT_ALV_MOVE_TEST
*&
*&---------------------------------------------------------------------*

REPORT  ztt_alv_move_test.

*--- Daten-Definitionen:
CLASS alv_events DEFINITION DEFERRED.

TYPES:   BEGIN OF gty_s_demotab,
         folge_org   TYPE i,
         folge_neu   TYPE i,
         END OF gty_s_demotab.

DATA:    gt_demotab         TYPE TABLE OF gty_s_demotab,
         gs_demotab         LIKE LINE OF gt_demotab,
         gs_demotab2        LIKE LINE OF gt_demotab,
         go_alv_grid        TYPE REF TO cl_gui_alv_grid,
         gt_field_cat       TYPE lvc_t_fcat,
         gs_field_cat       TYPE lvc_s_fcat,
         gt_field_cat_slis  TYPE slis_t_fieldcat_alv,
         gs_field_cat_slis  TYPE slis_fieldcat_alv,
         gs_field_cat_stbl  TYPE lvc_s_stbl,
         go_alv_events      TYPE REF TO alv_events,
         ok_code            LIKE sy-ucomm,
         gv_zaehler         TYPE i.

FIELD-SYMBOLS:
         <feld>             TYPE any,
         <wa>               TYPE any.

*----------------------------------------------------------------------*
*       CLASS alv_dragdrop_data DEFINITION
*----------------------------------------------------------------------*
CLASS alv_dragdrop_data DEFINITION.
  PUBLIC SECTION.

    DATA: gs_selected_rowno   TYPE lvc_s_roid,
          gs_selected_rows    TYPE lvc_t_row.

ENDCLASS.                    "alv_dragdrop_data DEFINITION

*----------------------------------------------------------------------*
*       CLASS alv_events DEFINITION
*----------------------------------------------------------------------*
CLASS alv_events DEFINITION.

  PUBLIC SECTION.
    METHODS:
*--- Datenänderungen behandeln:
      handle_data_changed
            FOR EVENT data_changed
            OF cl_gui_alv_grid
            IMPORTING er_data_changed sender,

*--- Zelle wird verschoben (ondrag):
      on_drag
          FOR EVENT ondrag
          OF  cl_gui_alv_grid
          IMPORTING e_column es_row_no e_dragdropobj,

*--- Zelle wird losgelassen (ondrop):
      on_drop
            FOR EVENT ondrop
            OF  cl_gui_alv_grid
            IMPORTING e_column es_row_no e_dragdropobj.

ENDCLASS.                    "alv_events DEFINITION

*----------------------------------------------------------------------*
*       CLASS alv_events IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS alv_events IMPLEMENTATION.

  METHOD handle_data_changed.

    DATA: ls_good TYPE lvc_s_modi.

    LOOP AT er_data_changed->mt_good_cells INTO ls_good.
      READ TABLE gt_demotab ASSIGNING <wa> INDEX ls_good-row_id.
      IF sy-subrc = 0.
        ASSIGN COMPONENT ls_good-fieldname OF STRUCTURE <wa> TO <feld>.

        IF sy-subrc = 0.
          <feld> = ls_good-value.
        ENDIF.
      ENDIF.
    ENDLOOP.
  ENDMETHOD.                    "handle_data_changed

*--- Zelle wird verschoben (ondrag):
  METHOD on_drag.
    DATA: lo_dragdrop_data TYPE REF TO alv_dragdrop_data,
          lt_sel_rows      TYPE lvc_t_row.

    CLEAR:
          lt_sel_rows.

    go_alv_grid->get_selected_rows(
      IMPORTING
        et_index_rows = lt_sel_rows
    ).

    CREATE OBJECT lo_dragdrop_data.

    "Aktuell Zeilennummer merken:
    lo_dragdrop_data->gs_selected_rowno = es_row_no.

    "Aktuell selektierte Zeilen merken:
    lo_dragdrop_data->gs_selected_rows  = lt_sel_rows.

    "Objekt übergeben:
    e_dragdropobj->object = lo_dragdrop_data.
  ENDMETHOD.                    "on_drag

*--- Zelle wird losgelassen (ondrop):
  METHOD on_drop.
    DATA: lo_dragdrop_data TYPE REF TO alv_dragdrop_data,
          ls_stable        TYPE lvc_s_stbl,
          lt_rows          TYPE lvc_t_row,
          ls_rows          LIKE LINE OF lt_rows,
          lt_rowno         TYPE lvc_t_roid,
          lt_demotab       TYPE TABLE OF gty_s_demotab,
          ls_demotab       LIKE LINE OF lt_demotab.

    CLEAR:
          lt_rows,
          lt_rowno,
          lt_demotab,
          gs_demotab,
          gs_demotab2.

    "Objekt übernehmen:
    lo_dragdrop_data ?= e_dragdropobj->object.

    "Selektierte Zeilen übernehmen:
    lt_rows = lo_dragdrop_data->gs_selected_rows.

    "Den neuen Reihenfolgewert der Zielzeile ermitteln:
    READ TABLE gt_demotab INTO gs_demotab2 INDEX es_row_no-row_id.

    "Markierte Zeilen absteigend sortieren:
    SORT lt_rows BY index DESCENDING.

    "Zu verschiebende Zeilen merken:
    LOOP AT lt_rows INTO ls_rows.
*     READ TABLE gt_auftraege INTO gs_auftraege INDEX lo_dragdrop_data->gs_selected_rowno-row_id.
      READ TABLE gt_demotab INTO gs_demotab INDEX ls_rows-index.

      "Folgewert übernehmen:
      gs_demotab-folge_neu = gs_demotab2-folge_neu.

      "Markierte Zeile merken:
      APPEND gs_demotab TO lt_demotab.

      "Markierte Zeile löschen:
      DELETE gt_demotab INDEX ls_rows-index.
    ENDLOOP.

    LOOP AT lt_demotab INTO ls_demotab.
      INSERT ls_demotab INTO gt_demotab INDEX es_row_no-row_id.
    ENDLOOP.

    ls_stable-col = abap_true.
    ls_stable-row = abap_true.

    go_alv_grid->refresh_table_display(
      EXPORTING
        is_stable      = ls_stable    " zeilen-/spaltenstabil
    ).

    "Zielzeile markieren:
    APPEND es_row_no TO lt_rowno.

    go_alv_grid->set_selected_rows(
      EXPORTING
         it_row_no                = lt_rowno    " Numerische ZeilenIDs
    ).
  ENDMETHOD.                    "on_drop
ENDCLASS.                    "alv_events IMPLEMENTATION

*&---------------------------------------------------------------------*
*&      Form  alv_dragdrop_prepare
*&---------------------------------------------------------------------*
*      -->CS_LAYOUT  text
*----------------------------------------------------------------------*
FORM alv_dragdrop_prepare  CHANGING cs_layout TYPE lvc_s_layo.
  DATA    lo_behaviour TYPE REF TO cl_dragdrop.

  DATA: lv_effect     TYPE i,
        lv_handle     TYPE i.

  lv_effect = cl_dragdrop=>move.                       "Verschieben

  CREATE OBJECT lo_behaviour.

  CALL METHOD lo_behaviour->add
    EXPORTING
      flavor          = 'LINEFLAVOR'
      dragsrc         = 'X'
      droptarget      = 'X'
      effect          = lv_effect
    EXCEPTIONS
      already_defined = 1
      obj_invalid     = 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.

  CALL METHOD lo_behaviour->get_handle
    IMPORTING
      handle      = lv_handle
    EXCEPTIONS
      obj_invalid = 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.

  cs_layout-s_dragdrop-row_ddid = lv_handle.
ENDFORM.                    "alv_dragdrop_prepare

*----------------------------------------------------------------------*
*  MODULE status_0100 OUTPUT
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'STATUS'.
  SET TITLEBAR  'DEMO'.
ENDMODULE.                 " STATUS_0100  OUTPUT

*----------------------------------------------------------------------*
*  MODULE clear_ok_code OUTPUT
*----------------------------------------------------------------------*
MODULE clear_ok_code OUTPUT.
  CLEAR ok_code.
ENDMODULE.                 " CLEAR_OK_CODE  OUTPUT

*----------------------------------------------------------------------*
*  MODULE display_alv OUTPUT
*----------------------------------------------------------------------*
MODULE display_alv OUTPUT.
  IF go_alv_grid IS INITIAL AND sy-batch IS INITIAL.
    CREATE OBJECT go_alv_grid
      EXPORTING
        i_parent          = cl_gui_container=>screen0
      EXCEPTIONS
        error_cntl_create = 1
        error_cntl_init   = 2
        error_cntl_link   = 3
        error_dp_create   = 4
        OTHERS            = 5.

    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                 WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.

    CALL METHOD go_alv_grid->register_edit_event
      EXPORTING
        i_event_id = cl_gui_alv_grid=>mc_evt_enter.

    CALL METHOD go_alv_grid->set_ready_for_input
      EXPORTING
        i_ready_for_input = 1.

    CREATE OBJECT go_alv_events.

    SET HANDLER go_alv_events->handle_data_changed FOR go_alv_grid ACTIVATION abap_true.
    SET HANDLER go_alv_events->on_drag             FOR go_alv_grid ACTIVATION abap_true.
    SET HANDLER go_alv_events->on_drop             FOR go_alv_grid ACTIVATION abap_true.

    PERFORM alv_first_display.
  ELSE.
    gs_field_cat_stbl-row = 'X'.

    CALL METHOD go_alv_grid->refresh_table_display
      EXPORTING
        is_stable = gs_field_cat_stbl.
  ENDIF.
ENDMODULE.                    "display_alv OUTPUT

*&---------------------------------------------------------------------*
*&      Form  alv_first_display
*&---------------------------------------------------------------------*
FORM alv_first_display .

  DATA: ls_variant  TYPE disvariant,
        ls_layout   TYPE lvc_s_layo,
        lt_exclude  TYPE ui_functions.

  CLEAR:  gs_field_cat,
          gt_field_cat.

  PERFORM create_fieldcat USING gs_demotab
                       CHANGING gs_field_cat
                                gt_field_cat.

  LOOP AT gt_field_cat INTO gs_field_cat.
    CASE gs_field_cat-fieldname.
      WHEN 'FOLGE_ORG'.
        gs_field_cat-scrtext_s  = 'Org Folge'.      "feldbezeichner s
        MODIFY gt_field_cat FROM gs_field_cat.

      WHEN 'FOLGE_NEU'.
        gs_field_cat-scrtext_s  = 'Neue Folge'.     "feldbezeichner s
        gs_field_cat-edit       = 'X'.              "editierbar
        MODIFY gt_field_cat FROM gs_field_cat.
    ENDCASE.
  ENDLOOP.

  ls_variant-report   = sy-cprog.

  ls_layout-grid_title = 'Demotabelle'.
  ls_layout-sel_mode   = 'A'.

*--- ALV-Drag & Drop Option nutzen:
  PERFORM alv_dragdrop_prepare CHANGING ls_layout.

*--- ALV-Grid anzeigen:
  CALL METHOD go_alv_grid->set_table_for_first_display
    EXPORTING
      i_bypassing_buffer            = 'X'
      is_variant                    = ls_variant
      i_save                        = 'A'
      is_layout                     = ls_layout
      it_toolbar_excluding          = lt_exclude
    CHANGING
      it_outtab                     = gt_demotab
      it_fieldcatalog               = gt_field_cat
    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_first_display

*&---------------------------------------------------------------------*
*&      Form  create_fieldcat
*&---------------------------------------------------------------------*
*      -->LS_STRUCTURE  text
*      -->LS_FIELDCAT   text
*      -->LT_FIELDCAT   text
*----------------------------------------------------------------------*
FORM create_fieldcat USING    ls_structure
                     CHANGING ls_fieldcat  TYPE lvc_s_fcat
                              lt_fieldcat  TYPE lvc_t_fcat.

  DATA: ref_structdescr TYPE REF TO cl_abap_structdescr,
        lt_fields       TYPE        ddfields.

  DATA: lv_col_i TYPE i VALUE 0.

  FIELD-SYMBOLS: <fs_fields> TYPE LINE OF ddfields.

  ref_structdescr ?= cl_abap_structdescr=>describe_by_data(
                                          p_data = ls_structure
                                          ).

  CALL METHOD cl_salv_data_descr=>read_structdescr
    EXPORTING
      r_structdescr = ref_structdescr
    RECEIVING
      t_dfies       = lt_fields.

  LOOP AT lt_fields ASSIGNING <fs_fields>.
    CLEAR ls_fieldcat.

    ADD 1 TO lv_col_i.

    ls_fieldcat-col_pos    = lv_col_i.               "spaltenposition
    ls_fieldcat-fieldname  = <fs_fields>-fieldname.  "Feldname
    ls_fieldcat-tabname    = <fs_fields>-tabname.    "LVC-Tabname ?
    ls_fieldcat-scrtext_l  = <fs_fields>-scrtext_l.  "feldbezeichner L
    ls_fieldcat-scrtext_m  = <fs_fields>-scrtext_m.  "feldbezeichner M
    ls_fieldcat-scrtext_s  = <fs_fields>-scrtext_s.  "feldbezeichner s
    ls_fieldcat-ref_field  = <fs_fields>-reffield.   "referenzfeld
    ls_fieldcat-ref_table  = <fs_fields>-reftable.   "referenztabelle
    ls_fieldcat-intlen     = <fs_fields>-intlen.     "interne länge
    ls_fieldcat-inttype    = <fs_fields>-inttype.    "interner datentyp
    ls_fieldcat-lowercase  = <fs_fields>-lowercase.  "kleinschreiben j/n
    ls_fieldcat-outputlen  = <fs_fields>-outputlen. "ausgabelänge
    ls_fieldcat-decimals_o = <fs_fields>-decimals. "ausgabedezimalstelln
    ls_fieldcat-convexit   = <fs_fields>-convexit. "konvertierunlsroutin
    ls_fieldcat-decimals   = <fs_fields>-decimals. "anzahl dezimalstelle
    ls_fieldcat-reptext    = <fs_fields>-reptext.  "
    ls_fieldcat-rollname   = <fs_fields>-rollname. "Datenelement für F1
    ls_fieldcat-domname    = <fs_fields>-domname.   "Name der Domäne
    ls_fieldcat-datatype   = <fs_fields>-datatype.  "DictionaryDatentyp
    ls_fieldcat-mac        = <fs_fields>-mac.      "suchhilfe j/n
    ls_fieldcat-f4availabl = <fs_fields>-f4availabl. "F4 hilfe j/n
    ls_fieldcat-checktable = <fs_fields>-checktable. "?????
    ls_fieldcat-col_opt    = abap_false.       "Spaltenoptimierung *X/''.,

    APPEND ls_fieldcat TO lt_fieldcat.
  ENDLOOP.
ENDFORM.                    "create_fieldcat

*--- Process after input (PAI) Modul:
MODULE user_command_0100 INPUT.
  CASE ok_code.
    WHEN 'EXIT'.
      SET SCREEN 0.
  ENDCASE.
ENDMODULE.                    "user_command_0100 INPUT

*--- Programmstart ----------------------------------------------------

START-OF-SELECTION.

  gv_zaehler = 0.

  DO 10 TIMES.
    ADD 1 TO gv_zaehler.

    gs_demotab-folge_org = gv_zaehler.
    gs_demotab-folge_neu = gv_zaehler.

    APPEND gs_demotab TO gt_demotab.
  ENDDO.

  CALL SCREEN 100.
Wie bereits im ersten Post beschrieben, ist das Ziel, dass beim Verschieben einer bzw. mehrer markierter Zeilen diese im Feld "Neue Folge" den "Org Folge"-Wert der Zielposition "vererbt" bekommen. Beim Ziehen über einer Zelle des markierten Bereiches funktioniert dies, jedoch nicht, wenn man im Bereich der Selektionsspalte die Zeilen verschiebt.

Vielen Dank nochmals für Eure Hilfe! :D

Viele Grüsse,
Ecoman68

Re: Fragen zur ALV-Selektionsspalte

Beitrag von jensschladitz (Specialist / 417 / 0 / 56 ) »
Sali,

also bei mir wird das Event ondropcomplete durchlaufen und dort kann man die Spalte anfragen - na und wenn man Spalte 0 = MAarkeirspalte den Drop nicht machen will - dann die Referencevariable die am Interface mit übergeben wird nutzen und die Aktion abbrechen (da hat es eine Methode) bzw. man bekommt ja auch den Index der benutzten Zeile mit - daher könnte man dann schon reagieren mit der Neuordnung.

Gruss

Folgende Benutzer bedankten sich beim Autor jensschladitz für den Beitrag:
Ecoman68

thanks Jens

Re: Fragen zur ALV-Selektionsspalte

Beitrag von Ecoman68 (ForumUser / 13 / 10 / 0 ) »
Hallo,

ich habe das Event "ONDROPCOMPLETE" nun noch in das Programm mit aufgenommen. Wenn ich beispielsweise in Zeile 191 einen Breakpoint setze und markierte Zeilen mit dem Mauszeiger innerhalb der Selektionsspalte verschiebe, wird der Event nicht ausgelöst. Lediglich wenn ich mit dem Mauszeiger den markierten Bereich über eine Zelle verschiebe, wird auch "ONDROPCOMPLETE", die auch "ONDRAG" und "ONDROP", durchlaufen und das Programm stoppt am gesetzen Breakpoint:

Code: Alles auswählen.

*&---------------------------------------------------------------------*
*& Report  ZTT_ALV_MOVE_TEST
*&
*&---------------------------------------------------------------------*

REPORT  ztt_alv_move_test.

*--- Daten-Definitionen:
CLASS alv_events DEFINITION DEFERRED.

TYPES:   BEGIN OF gty_s_demotab,
         folge_org   TYPE i,
         folge_neu   TYPE i,
         END OF gty_s_demotab.

DATA:    gt_demotab         TYPE TABLE OF gty_s_demotab,
         gs_demotab         LIKE LINE OF gt_demotab,
         gs_demotab2        LIKE LINE OF gt_demotab,
         go_alv_grid        TYPE REF TO cl_gui_alv_grid,
         gt_field_cat       TYPE lvc_t_fcat,
         gs_field_cat       TYPE lvc_s_fcat,
         gt_field_cat_slis  TYPE slis_t_fieldcat_alv,
         gs_field_cat_slis  TYPE slis_fieldcat_alv,
         gs_field_cat_stbl  TYPE lvc_s_stbl,
         go_alv_events      TYPE REF TO alv_events,
         ok_code            LIKE sy-ucomm,
         gv_zaehler         TYPE i.

FIELD-SYMBOLS:
         <feld>             TYPE any,
         <wa>               TYPE any.

*----------------------------------------------------------------------*
*       CLASS alv_dragdrop_data DEFINITION
*----------------------------------------------------------------------*
CLASS alv_dragdrop_data DEFINITION.
  PUBLIC SECTION.

    DATA: gs_selected_rowno   TYPE lvc_s_roid,
          gs_selected_rows    TYPE lvc_t_row.

ENDCLASS.                    "alv_dragdrop_data DEFINITION

*----------------------------------------------------------------------*
*       CLASS alv_events DEFINITION
*----------------------------------------------------------------------*
CLASS alv_events DEFINITION.

  PUBLIC SECTION.
    METHODS:
*--- Datenänderungen behandeln:
      handle_data_changed
            FOR EVENT data_changed
            OF cl_gui_alv_grid
            IMPORTING er_data_changed sender,

*--- Zelle wird verschoben (ondrag):
      on_drag
          FOR EVENT ondrag
          OF  cl_gui_alv_grid
          IMPORTING e_column es_row_no e_dragdropobj,

*--- Zelle wird losgelassen (ondrop):
      on_drop
            FOR EVENT ondrop
            OF  cl_gui_alv_grid
            IMPORTING e_column es_row_no e_dragdropobj,

      on_drop_complete
            FOR EVENT ondropcomplete
            OF  cl_gui_alv_grid
            IMPORTING e_row e_column es_row_no e_dragdropobj.

ENDCLASS.                    "alv_events DEFINITION

*----------------------------------------------------------------------*
*       CLASS alv_events IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS alv_events IMPLEMENTATION.

  METHOD handle_data_changed.

    DATA: ls_good TYPE lvc_s_modi.

    LOOP AT er_data_changed->mt_good_cells INTO ls_good.
      READ TABLE gt_demotab ASSIGNING <wa> INDEX ls_good-row_id.
      IF sy-subrc = 0.
        ASSIGN COMPONENT ls_good-fieldname OF STRUCTURE <wa> TO <feld>.

        IF sy-subrc = 0.
          <feld> = ls_good-value.
        ENDIF.
      ENDIF.
    ENDLOOP.
  ENDMETHOD.                    "handle_data_changed

*--- Zelle wird verschoben (ondrag):
  METHOD on_drag.
    DATA: lo_dragdrop_data TYPE REF TO alv_dragdrop_data,
          lt_sel_rows      TYPE lvc_t_row.

    CLEAR:
          lt_sel_rows.

    go_alv_grid->get_selected_rows(
      IMPORTING
        et_index_rows = lt_sel_rows
    ).

    CREATE OBJECT lo_dragdrop_data.

    "Aktuell Zeilennummer merken:
    lo_dragdrop_data->gs_selected_rowno = es_row_no.

    "Aktuell selektierte Zeilen merken:
    lo_dragdrop_data->gs_selected_rows  = lt_sel_rows.

    "Objekt übergeben:
    e_dragdropobj->object = lo_dragdrop_data.
  ENDMETHOD.                    "on_drag

*--- Zelle wird losgelassen (ondrop):
  METHOD on_drop.
    DATA: lo_dragdrop_data TYPE REF TO alv_dragdrop_data,
          ls_stable        TYPE lvc_s_stbl,
          lt_rows          TYPE lvc_t_row,
          ls_rows          LIKE LINE OF lt_rows,
          lt_rowno         TYPE lvc_t_roid,
          lt_demotab       TYPE TABLE OF gty_s_demotab,
          ls_demotab       LIKE LINE OF lt_demotab.

    CLEAR:
          lt_rows,
          lt_rowno,
          lt_demotab,
          gs_demotab,
          gs_demotab2.

    "Objekt übernehmen:
    lo_dragdrop_data ?= e_dragdropobj->object.

    "Selektierte Zeilen übernehmen:
    lt_rows = lo_dragdrop_data->gs_selected_rows.

    "Den neuen Reihenfolgewert der Zielzeile ermitteln:
    READ TABLE gt_demotab INTO gs_demotab2 INDEX es_row_no-row_id.

    "Markierte Zeilen absteigend sortieren:
    SORT lt_rows BY index DESCENDING.

    "Zu verschiebende Zeilen merken:
    LOOP AT lt_rows INTO ls_rows.
*     READ TABLE gt_auftraege INTO gs_auftraege INDEX lo_dragdrop_data->gs_selected_rowno-row_id.
      READ TABLE gt_demotab INTO gs_demotab INDEX ls_rows-index.

      "Folgewert übernehmen:
      gs_demotab-folge_neu = gs_demotab2-folge_neu.

      "Markierte Zeile merken:
      APPEND gs_demotab TO lt_demotab.

      "Markierte Zeile löschen:
      DELETE gt_demotab INDEX ls_rows-index.
    ENDLOOP.

    LOOP AT lt_demotab INTO ls_demotab.
      INSERT ls_demotab INTO gt_demotab INDEX es_row_no-row_id.
    ENDLOOP.

    ls_stable-col = abap_true.
    ls_stable-row = abap_true.

    go_alv_grid->refresh_table_display(
      EXPORTING
        is_stable      = ls_stable    " zeilen-/spaltenstabil
    ).

    "Zielzeile markieren:
    APPEND es_row_no TO lt_rowno.

    go_alv_grid->set_selected_rows(
      EXPORTING
         it_row_no                = lt_rowno    " Numerische ZeilenIDs
    ).
  ENDMETHOD.                    "on_drop

  METHOD on_drop_complete.
    DATA: lo_dragdrop_data TYPE REF TO alv_dragdrop_data.

    "Objekt übernehmen:
    lo_dragdrop_data ?= e_dragdropobj->object.

  ENDMETHOD.                    "on_drop_complete
ENDCLASS.                    "alv_events IMPLEMENTATION

*&---------------------------------------------------------------------*
*&      Form  alv_dragdrop_prepare
*&---------------------------------------------------------------------*
*      -->CS_LAYOUT  text
*----------------------------------------------------------------------*
FORM alv_dragdrop_prepare  CHANGING cs_layout TYPE lvc_s_layo.
  DATA    lo_behaviour TYPE REF TO cl_dragdrop.

  DATA: lv_effect     TYPE i,
        lv_handle     TYPE i.

  lv_effect = cl_dragdrop=>move.                       "Verschieben

  CREATE OBJECT lo_behaviour.

  CALL METHOD lo_behaviour->add
    EXPORTING
      flavor          = 'LINEFLAVOR'
      dragsrc         = 'X'
      droptarget      = 'X'
      effect          = lv_effect
    EXCEPTIONS
      already_defined = 1
      obj_invalid     = 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.

  CALL METHOD lo_behaviour->get_handle
    IMPORTING
      handle      = lv_handle
    EXCEPTIONS
      obj_invalid = 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.

  cs_layout-s_dragdrop-row_ddid = lv_handle.
ENDFORM.                    "alv_dragdrop_prepare

*----------------------------------------------------------------------*
*  MODULE status_0100 OUTPUT
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'STATUS'.
  SET TITLEBAR  'DEMO'.
ENDMODULE.                 " STATUS_0100  OUTPUT

*----------------------------------------------------------------------*
*  MODULE clear_ok_code OUTPUT
*----------------------------------------------------------------------*
MODULE clear_ok_code OUTPUT.
  CLEAR ok_code.
ENDMODULE.                 " CLEAR_OK_CODE  OUTPUT

*----------------------------------------------------------------------*
*  MODULE display_alv OUTPUT
*----------------------------------------------------------------------*
MODULE display_alv OUTPUT.
  IF go_alv_grid IS INITIAL AND sy-batch IS INITIAL.
    CREATE OBJECT go_alv_grid
      EXPORTING
        i_parent          = cl_gui_container=>screen0
      EXCEPTIONS
        error_cntl_create = 1
        error_cntl_init   = 2
        error_cntl_link   = 3
        error_dp_create   = 4
        OTHERS            = 5.

    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                 WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.

    CALL METHOD go_alv_grid->register_edit_event
      EXPORTING
        i_event_id = cl_gui_alv_grid=>mc_evt_enter.

    CALL METHOD go_alv_grid->set_ready_for_input
      EXPORTING
        i_ready_for_input = 1.

    CREATE OBJECT go_alv_events.

    SET HANDLER go_alv_events->handle_data_changed FOR go_alv_grid ACTIVATION abap_true.
    SET HANDLER go_alv_events->on_drag             FOR go_alv_grid ACTIVATION abap_true.
    SET HANDLER go_alv_events->on_drop             FOR go_alv_grid ACTIVATION abap_true.
    SET HANDLER go_alv_events->on_drop_complete    FOR go_alv_grid ACTIVATION abap_true.

    PERFORM alv_first_display.
  ELSE.
    gs_field_cat_stbl-row = 'X'.

    CALL METHOD go_alv_grid->refresh_table_display
      EXPORTING
        is_stable = gs_field_cat_stbl.
  ENDIF.
ENDMODULE.                    "display_alv OUTPUT

*&---------------------------------------------------------------------*
*&      Form  alv_first_display
*&---------------------------------------------------------------------*
FORM alv_first_display .

  DATA: ls_variant  TYPE disvariant,
        ls_layout   TYPE lvc_s_layo,
        lt_exclude  TYPE ui_functions.

  CLEAR:  gs_field_cat,
          gt_field_cat.

  PERFORM create_fieldcat USING gs_demotab
                       CHANGING gs_field_cat
                                gt_field_cat.

  LOOP AT gt_field_cat INTO gs_field_cat.
    CASE gs_field_cat-fieldname.
      WHEN 'FOLGE_ORG'.
        gs_field_cat-scrtext_s  = 'Org Folge'.      "feldbezeichner s
        MODIFY gt_field_cat FROM gs_field_cat.

      WHEN 'FOLGE_NEU'.
        gs_field_cat-scrtext_s  = 'Neue Folge'.     "feldbezeichner s
        gs_field_cat-edit       = 'X'.              "editierbar
        MODIFY gt_field_cat FROM gs_field_cat.
    ENDCASE.
  ENDLOOP.

  ls_variant-report   = sy-cprog.

  ls_layout-grid_title = 'Demotabelle'.
  ls_layout-sel_mode   = 'A'.

*--- ALV-Drag & Drop Option nutzen:
  PERFORM alv_dragdrop_prepare CHANGING ls_layout.

*--- ALV-Grid anzeigen:
  CALL METHOD go_alv_grid->set_table_for_first_display
    EXPORTING
      i_bypassing_buffer            = 'X'
      is_variant                    = ls_variant
      i_save                        = 'A'
      is_layout                     = ls_layout
      it_toolbar_excluding          = lt_exclude
    CHANGING
      it_outtab                     = gt_demotab
      it_fieldcatalog               = gt_field_cat
    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_first_display

*&---------------------------------------------------------------------*
*&      Form  create_fieldcat
*&---------------------------------------------------------------------*
*      -->LS_STRUCTURE  text
*      -->LS_FIELDCAT   text
*      -->LT_FIELDCAT   text
*----------------------------------------------------------------------*
FORM create_fieldcat USING    ls_structure
                     CHANGING ls_fieldcat  TYPE lvc_s_fcat
                              lt_fieldcat  TYPE lvc_t_fcat.

  DATA: ref_structdescr TYPE REF TO cl_abap_structdescr,
        lt_fields       TYPE        ddfields.

  DATA: lv_col_i TYPE i VALUE 0.

  FIELD-SYMBOLS: <fs_fields> TYPE LINE OF ddfields.

  ref_structdescr ?= cl_abap_structdescr=>describe_by_data(
                                          p_data = ls_structure
                                          ).

  CALL METHOD cl_salv_data_descr=>read_structdescr
    EXPORTING
      r_structdescr = ref_structdescr
    RECEIVING
      t_dfies       = lt_fields.

  LOOP AT lt_fields ASSIGNING <fs_fields>.
    CLEAR ls_fieldcat.

    ADD 1 TO lv_col_i.

    ls_fieldcat-col_pos    = lv_col_i.               "spaltenposition
    ls_fieldcat-fieldname  = <fs_fields>-fieldname.  "Feldname
    ls_fieldcat-tabname    = <fs_fields>-tabname.    "LVC-Tabname ?
    ls_fieldcat-scrtext_l  = <fs_fields>-scrtext_l.  "feldbezeichner L
    ls_fieldcat-scrtext_m  = <fs_fields>-scrtext_m.  "feldbezeichner M
    ls_fieldcat-scrtext_s  = <fs_fields>-scrtext_s.  "feldbezeichner s
    ls_fieldcat-ref_field  = <fs_fields>-reffield.   "referenzfeld
    ls_fieldcat-ref_table  = <fs_fields>-reftable.   "referenztabelle
    ls_fieldcat-intlen     = <fs_fields>-intlen.     "interne länge
    ls_fieldcat-inttype    = <fs_fields>-inttype.    "interner datentyp
    ls_fieldcat-lowercase  = <fs_fields>-lowercase.  "kleinschreiben j/n
    ls_fieldcat-outputlen  = <fs_fields>-outputlen. "ausgabelänge
    ls_fieldcat-decimals_o = <fs_fields>-decimals. "ausgabedezimalstelln
    ls_fieldcat-convexit   = <fs_fields>-convexit. "konvertierunlsroutin
    ls_fieldcat-decimals   = <fs_fields>-decimals. "anzahl dezimalstelle
    ls_fieldcat-reptext    = <fs_fields>-reptext.  "
    ls_fieldcat-rollname   = <fs_fields>-rollname. "Datenelement für F1
    ls_fieldcat-domname    = <fs_fields>-domname.   "Name der Domäne
    ls_fieldcat-datatype   = <fs_fields>-datatype.  "DictionaryDatentyp
    ls_fieldcat-mac        = <fs_fields>-mac.      "suchhilfe j/n
    ls_fieldcat-f4availabl = <fs_fields>-f4availabl. "F4 hilfe j/n
    ls_fieldcat-checktable = <fs_fields>-checktable. "?????
    ls_fieldcat-col_opt    = abap_false.       "Spaltenoptimierung *X/''.,

    APPEND ls_fieldcat TO lt_fieldcat.
  ENDLOOP.
ENDFORM.                    "create_fieldcat

*--- Process after input (PAI) Modul:
MODULE user_command_0100 INPUT.
  CASE ok_code.
    WHEN 'EXIT'.
      SET SCREEN 0.
  ENDCASE.
ENDMODULE.                    "user_command_0100 INPUT

*--- Programmstart ----------------------------------------------------

START-OF-SELECTION.

  gv_zaehler = 0.

  DO 10 TIMES.
    ADD 1 TO gv_zaehler.

    gs_demotab-folge_org = gv_zaehler.
    gs_demotab-folge_neu = gv_zaehler.

    APPEND gs_demotab TO gt_demotab.
  ENDDO.

  CALL SCREEN 100.
Mh - hat vielleicht jemand noch einen weiteren Tipp?

Vielen Dank für die Hilfe! :up:

Gruß,
Ecoman68

Re: Fragen zur ALV-Selektionsspalte

Beitrag von jensschladitz (Specialist / 417 / 0 / 56 ) »
Sali,

verstehe dein Voorgehen gerade nicht ? Wenn ich z.Bsp. die Markierspalte 10 markiere / anklicke - dann die Spalte in Richtung Zeile 5 bewege (drag/drop) und dann da ablegen wollte - dann wird der Event bei mir durchlaufen - egal ob ich den Drop auf der Markierspalte 5 , der Spalte 1 von Zeile 5 oder Spalte 2 von Spalte 5 (im Beispiel von dir) ablege.
Daher meine Frage - was genau meinst du mit deiner letzten Erläuterung des Problems ?


Gruss

Folgende Benutzer bedankten sich beim Autor jensschladitz für den Beitrag:
Ecoman68

thanks Jens

Re: Fragen zur ALV-Selektionsspalte

Beitrag von Ecoman68 (ForumUser / 13 / 10 / 0 ) »
Hallo Jens,

Danke, dass Du nochmals nachfragst und es nicht einfach sein lässt... :wink:

Also: der Drop selbst scheint eigentlich egal zu sein. Jedoch macht es wohl beim Drag einen Unterschied, ob ich mit dem Mauszeiger eine beliebige Datenzelle innerhalb des markierten Bereiches zum Ziehen anklicke oder eben die Fläche in der Selektionsspalte (Spalte 0):
ALV-Zeile_ziehen.jpg
...keines der 3 Events wird dann ausgelöst - es wird lediglich "optisch" die Zeile verschoben.

Vielen Dank nochmals!

Gruß,
Ecoman68

Re: Fragen zur ALV-Selektionsspalte

Beitrag von jensschladitz (Specialist / 417 / 0 / 56 ) »
Sali,

nun ich kann dem nicht zustimmen
- wenn ich die 1.Spalte der Zeile 10 anklicke und nach oben ziehe - z.Bsp. Zeile 3 Spalte 2 - dann Event
- wenn ich die 2.Spalte der 5 Zeile markiere und nach unten ziehe - Bsp. Spalte 1 Zeile 9 - dann Event
- wenn ich die Markierfläche der Zeile 7 markiere und dann nach rechts - Spalte 2 Zeile 7 ziehe - Event
- wenn ich die Markierfläche der Zeile 10 markiere und dann nach ganz oben ziehe auf die Markierfläche - dann Event

... egal - immer wird bei mir der Eventhandler angesprungen und in den Übergabeparametern des Interfaces ist erkennbar woher ich komme - wenn E_COLUMN = 0 -> dann immer von der MArkeirspalte
- wenn etwas anderes also - E_COLUMN = FOLGE_ORG - dann von dieser Spalte etc.

damit klappt das doch wie gedacht oder (?)

Gruss

Folgende Benutzer bedankten sich beim Autor jensschladitz für den Beitrag:
Ecoman68

thanks Jens

Re: Fragen zur ALV-Selektionsspalte

Beitrag von Ecoman68 (ForumUser / 13 / 10 / 0 ) »
Hallo nochmals,

ich habe das Szenario im folgenden Video dokumentiert:

https://drive.google.com/file/d/0B3QFMm ... sp=sharing

Im ersten Teil ist zu sehen, wie beim Ziehen von einer Zelle aus beim Drop die 3 Events ausgelöst werden. Im zweiten Teil, von der Markierungsspalte aus, hält das Programm bei keinem der 3 Breakpoints an und verschiebt nur einfach die Zeile.

Eventuell ist noch wichtig zu wissen, dass wir das Release 702 nutzen.

Vielen Dank für Eure Hilfe!

Gruß,
Ecoman68

Re: Fragen zur ALV-Selektionsspalte

Beitrag von jensschladitz (Specialist / 417 / 0 / 56 ) »
Sali,

also bei mir klappt es tadellos - egal was ich mache und von wo. Wir haben Release 7.70 EHP7 im Einsatz

Gruss

Folgende Benutzer bedankten sich beim Autor jensschladitz für den Beitrag:
Ecoman68

thanks Jens

Re: Fragen zur ALV-Selektionsspalte

Beitrag von black_adept (Top Expert / 3943 / 105 / 886 ) »
Hallo ecoman,

setze mal im Layout das Feld "NO_ROWMOVE"

Code: Alles auswählen.

  ls_layout-grid_title = 'Demotabelle'.
  ls_layout-sel_mode   = 'A'.
  ls_layout-no_rowmove = 'X'.   " <-- Das hier hinzufügen

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
Ecoman68

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Fragen zur ALV-Selektionsspalte

Beitrag von Ecoman68 (ForumUser / 13 / 10 / 0 ) »
Hallo Black_Adapt,

vielen Dank für Deine Antwort - sie hat mein Problem gelöst! :up:

Aber ich möchte natürlich auch nochmals allen anderen danken, die sich mit meinem Problem beschäftigt haben.

Ich wünsch' Euch noch nen schönen Tag!

Herzlichen Dank nochmals.

Gruss,
Ecoman68 :D

Seite 1 von 1

Vergleichbare Themen

2
Antw.
2909
Views
Fragen zum ALV
von ABAP_User » 10.04.2012 19:41 • Verfasst in ABAP® für Anfänger
2
Antw.
419
Views
GUI Fragen
von il.ost » 09.07.2019 13:23 • Verfasst in ABAP® für Anfänger
10
Antw.
6324
Views
Dynpro Fragen
von stony007_de » 21.12.2014 10:10 • Verfasst in ABAP® für Anfänger
3
Antw.
933
Views
Algemeine Fragen
von MG1993 » 21.07.2014 09:43 • Verfasst in ABAP® für Anfänger
1
Antw.
1596
Views
Fragen zu WebDynpro
von Trulchen » 21.01.2013 09:34 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.