ALV: Zeilen sperren/löschen, Änderungen nach DDIC, etc.

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

ALV: Zeilen sperren/löschen, Änderungen nach DDIC, etc.

Beitrag von Spaulding (ForumUser / 21 / 0 / 0 ) »
Hallo Leute,

heute klappt mal wieder gar nichts. Habe einige Problem mit dem editierbaren ALV-Grid :(

Meine Fragen:
Hi,

ich arbeite gerade an einem Programm mit ALV-Grids.
Dazu hätte ich einige Fragen:

1. In dem Alv-Grid sollen nur bestimmte Zeilen auswählbar sein. Gibt es eine Möglichkeit, dies zu realisieren? Anders ausgedrückt: Die Tabelle in meinem ALV-Grid hat mehrere Spalten, u.a. COMPONENT. Im ALV sollen alle Daten der Tabelle angezeigt werden. Jedoch dürfen keine Zeilen mit z.B. COMPONENT == 'APP' gelöscht werden...

2. Falls 1. nicht klappt, wie kann ich dann sicherstellen, dass z.B. nur bestimmte Zeilen gelöscht werden können? Sobald eine Zeile gelöscht wird, tritt das Event "data_changed" auf. In "mt_deleted_rows" sind dann alle gelöschten Zeilen enthalten. Bevor diese jedoch aus meiner internen Tabelle für das ALV-Grid entfernt werden, würde ich gerne einige Prüfungen machen und ggfs. eine Löschung rückgängig machen - Wie geht das? Besagte Zeilen aus "mt_deleted_rows" löschen führte zu einem Shortdump :(

3. Wie kann ich die im ALV-Grid vollzogenen Änderungen in die darunterliegende Tabelle übernehmen. Mit einem "Update from" ist es hier sicherlich nicht getan...

4. Wo finde ich eine gescheite Doku zu ALV-Grids.

Danke und Gruß,
Spaulding

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


Beitrag von Flo (Specialist / 161 / 0 / 0 ) »
Wie löschst du die einzelnen Zeilen? Durch drücken des Standard Löschen Knopfes im Grid? oder durch drücken von Entf? (Bei Entf weis ich leider nicht ob überhaupt ein Event kommt bzw. wüst ich gern wie man das abschalten kann:) ).

Wir benutzen zum löschen von Zeilen im ALV Grid eigene Knöpfe die wir in die Toolbar eingebaut haben. In den Methoden der Knöpfe holen wir uns dann mit get_selected_rows die markierten Zeilen und haben dann Zugriff auf die Daten. Können unsere Prüfungen machen und die Zeilen löschen bzw Meldungen bringen dass das löschen nicht erlaubt ist.(Einfach die Zeilen aus der Tabelle löschen dann nen refresh_table_display und das grid zeigt sie nicht mehr an)

Beitrag von Gast ( / / 0 / 3 ) »
Hi Flo,

zurzeit nutze ich noch die Standard-Buttons im Grid. Hatte auch über eigene Buttons nachgedacht, aber da schon welche vorhanden sind, wollte ich die nutzen ;)

Wo könnte ich denn "MC_FC_LOC_DELETE_ROW" anfangen?
"Before_user_command" scheint nicht zu reagieren?

Danke,
Spaulding

Beitrag von Spaulding (ForumUser / 21 / 0 / 0 ) »
Hi Flo,

beim Druck auf "ENTF" wird wohl das gleiche Event ausgelöst, wie beim Klick auf den Standard-Zeilen-Löschen-Button (wußte vorher gar nicht, dass man ENTF zum Löschen von Zeilen nutzen kann ;))

Jetzt habe ich jedoch noch ein anderes Problem. Der Toolbar habe ich nun neue Buttons hinzugefügt. Leider sind sie immer da. Wie kann ich es anstellen, dass die meine Funktionen erst angezeigt werden, nachdem ich in den Edit-Modus gesprungen bin?

Gruß,
Spaulding

Beitrag von Flo (Specialist / 161 / 0 / 0 ) »
Hallo,
nutzt du das Grid über den FuBa reuse_alv_grid oder direkt eine instanz der klasse cl_gui_alv_grid?
Wenn es eine Klasseninstanz ist dann geht das mit der Toolbar folgendermassen:
Du musst in der Methode die die Toolbar aufbaut (also auf das Event Toolbar reagiert) eine Abfrage einbauen ob das Grid gerade editierbar oder nicht editierbar ist und die Knöpfe nur anhängen wenn das Grid editierbar ist.

Beitrag von Spaulding (ForumUser / 21 / 0 / 0 ) »
Ich nutze direkt die Klasse und habe davon eine Instanz abgeleitet...
Du musst in der Methode die die Toolbar aufbaut (also auf das Event Toolbar reagiert) eine Abfrage einbauen ob das Grid gerade editierbar oder nicht editierbar ist und die Knöpfe nur anhängen wenn das Grid editierbar ist.
Genau hier liegt das Problem, da ich nicht weiß, wie man "Knöpfe nur anhängt, wenn das Grid editierbar ist".

Code: Alles auswählen.

methods handle_toolbar for event toolbar of cl_gui_alv_grid
  importing o_object e_interactive.
Das Event fange ich bereits ab, aber ich kenne keine Methode, die Knöpfe bei Bedarf hinzuzufügen. Mit "IS_READY_FOR_INPUT" kann ich auch die Editierbarkeit abfragen, aber das hört es auch schon wieder auf :(

Ein kleiner Code-Ausschnitt könnte mir helfen ;)

Danke,
Spaulding[/b]

Beitrag von Flo (Specialist / 161 / 0 / 0 ) »
Hallo,

du schaust ob eingabebereit und nur wenn eingabebereit hängst du an e_object->mt_toolbar deine knöpfe dran. die Toolbar wird nach jedem Grid Refresh neu aufgebaut, also alle angehängten Knöpfe sind weg und werden durch den event_handler wieder neu angehängt. Wenn nun das Grid nicht editierbar ist werden keine knöpfe an die Toolbar angehängt und gut ists.
Gruss Flo

Beitrag von Arno Simon (ForumUser / 84 / 0 / 1 ) »
Hallo Spaulding,

dazu muß man sich die (geschützte) Methode set_toolbar_buttons der Klasse cl_gui_alv_grid nutzbar machen, was wie in folgender CodeStrecke funktionieren sollte:

Code: Alles auswählen.

CLASS lcl_gui_alv_grid DEFINITION INHERITING FROM cl_gui_alv_grid.
  PUBLIC SECTION.
    METHODS: pbl_optimize_all_columns.
    METHODS: pbl_set_toolbar_buttons
              IMPORTING toolbar_table TYPE ttb_button.
ENDCLASS.


*---------------------------------------------------------------------*
*       CLASS lcl_gui_alv_grid
*---------------------------------------------------------------------*
CLASS lcl_gui_alv_grid IMPLEMENTATION.
  METHOD pbl_optimize_all_columns.
    CALL METHOD me->optimize_all_cols
      EXPORTING
        include_header = 1
      EXCEPTIONS
        error          = 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.
  ENDMETHOD.
  METHOD pbl_set_toolbar_buttons.
    CALL METHOD me->set_toolbar_buttons
      EXPORTING
        toolbar_table = toolbar_table.
  ENDMETHOD.
ENDCLASS.
Anstelle das Programmobjekt dann auf cl_gui_alv_grid referenzieren zu lassen, läßt man es auf lcl_gui_alv_grid referenzieren und spricht dann die pbl_*-Methode an. Alles andere bleibt wie gehabt.

Die zweite Methode in der Klassenüberarbeitung macht die - ebenfalls geschützte - Klassenmethode für die Spaltenoptimierung gangbar. Nützlich, wenn man beim Switchen der Ausgabetabelle die Spaltenbreite auf die neuen Inhalte anpassen möchte.

vG

Arno

Beitrag von Arno Simon (ForumUser / 84 / 0 / 1 ) »
Flo hat geschrieben:.... die Toolbar wird nach jedem Grid Refresh neu aufgebaut, also alle angehängten Knöpfe sind weg und werden durch den event_handler wieder neu angehängt.....
Hmmmm.... ein Effekt den ich bislang nicht beobachten konnte... bei mir bleiben zur Laufzeit die Buttons so erhalten, wie einmal eingestellt. Auch baue ich die Objekte etc. pp. immer nur einmal auf und erzeuge somit keinen Refresh.

vG

Arno

Beitrag von Spaulding (ForumUser / 21 / 0 / 0 ) »
Erst einmal danke an euch beide.

Während Arno seine Antwort geschrieben hat, habe ich Flo's Anweisung implementiert :)

Dazu habe ich mir eine Tabelle mit meinen eigenen Buttons erstellt und diese mit Werten gefüllt:

Code: Alles auswählen.

gt_toolbar type table of stb_button

...
data:
  ls_toolbar type stb_button.


  clear ls_toolbar.
  move 3 to ls_toolbar-butn_type.
  append ls_toolbar to lt_toolbar.

  clear ls_toolbar.
  move 'INS_ROW' to ls_toolbar-function.
  move icon_insert_row to ls_toolbar-icon.
  move space to ls_toolbar-disabled.
  move 'Insert Row' to ls_toolbar-quickinfo.
  append ls_toolbar to lt_toolbar.

  clear ls_toolbar.
  move 'DEL_ROW' to ls_toolbar-function.
  move icon_delete_row to ls_toolbar-icon.
  move space to ls_toolbar-disabled.
  move 'Delete Rows' to ls_toolbar-quickinfo.
  append ls_toolbar to lt_toolbar.
Anschließend das event "toolbar" registiert, welches in der Methode "handle_toolbar" angefangen wird:

Code: Alles auswählen.

form handle_toolbar using i_object type ref to cl_alv_event_toolbar_set
                          i_interactive.
  data:
    ls_toolbar type stb_button,
    lv_ready type i,
    lv_index type i.

  call method gr_alvgrid->is_ready_for_input
    receiving
      ready_for_input = lv_ready.

  if lv_ready EQ 1.
    loop at i_object->mt_toolbar into ls_toolbar.
      if ls_toolbar-function EQ '&REFRESH'.
        lv_index = sy-tabix + 1.
        insert lines of gt_toolbar into i_object->mt_toolbar
                                   index lv_index.
      endif.
    endloop.
  endif.
endform.
Hinter dem "Refresh"-button füge ich nun meine eigenen Buttons sein.

Wie bereits von Flo erwähnt, verschwinden die Knöpfe wieder, sobald "ready_for_input" == 0 ist.

Funktioniert alles wunderbar :)

@Arno:
Keine Sorge, Deinen Code kann ich wahrscheinlich später auch noch gebrauchen ;)

Noch einmal ein großes Danke an euch.

Gruß,
Spaulding

Beitrag von Flo (Specialist / 161 / 0 / 0 ) »
@Arno
Vielleicht liegt es daran das du deine Knöpfe über die geschützten Methoden hart an die Toolbar hängst, wir aber "nur" die Methode set_table_for_first_display eine toolbar mitgeben und per aufruf von set_toolbar_interactive das toolbar_event auslösen und im handler unsere Knöpfe dranhängen?

Beitrag von Arno Simon (ForumUser / 84 / 0 / 1 ) »
@Flo,

kann ich jetzt weder bestätigen noch dementieren. Werde mir mal einen Link auf den Artikel in die Termine eintragen und das ganze bei Gelegenheit - Termindruck - näher austesten.

vG

Arno

Seite 1 von 1

Vergleichbare Themen

2
Antw.
2727
Views
Zeilen aus ALV Löschen
von moee » 12.03.2009 13:18 • Verfasst in ABAP® für Anfänger
2
Antw.
1138
Views
Löschen von itab-Zeilen
von Patrick1982 » 08.07.2021 12:30 • Verfasst in ABAP® für Anfänger
15
Antw.
6270
Views
Dem ALV Änderungen an anderen Zeilen "mitteilen"
von Nordlicht » 13.11.2013 09:33 • Verfasst in ABAP Objects®
6
Antw.
4842
Views
ALV Drucktaste zum Zeilen einfügen/löschen
von Ibiza90 » 27.08.2013 08:24 • Verfasst in ABAP® für Anfänger
4
Antw.
2583
Views
Mehrere Zeilen aus SALV löschen
von ManMan » 21.07.2017 10:53 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


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

Aktuelle Forenbeiträge

RFC vs. ODATA
vor einer Stunde von ralf.wenzel 4 / 207
Frage zur redefinierten Methode
vor einer Stunde von ralf.wenzel 8 / 291

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.