Set Cursor on ALV GRID - CL_GUI_ALV_GRID Thema ist als GELÖST markiert

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

Set Cursor on ALV GRID - CL_GUI_ALV_GRID

Beitrag von AlexVienna (ForumUser / 5 / 2 / 0 ) »
Hi Abap Experten,

ich hole mir im ersten Step die alte Position vom Cursor und in einem Loop ermittle ich die neue Cursorposition. Danach setze ich die Position um die Eingabefähigen Felder direkt zu bearbeiten. Klappt alles wunderbar - jedoch nur im Debugg Modus.

Ohne Debugg Modus - springt der Focus in die nächste Position und dann muss ich wieder auf das Feld klicken um es bearbeiten zu können.

Gibt es eine Möglichkeit, dies ohne dem Klicken in die nächste Position zu machen? Wie gesagt, klappt alles wunderbar im Debugging Modus.

Wann wird dieses Event ausgelöst? Es wird in der Methode data_changed abgefangen sobald sich der Feldwert ändert und in einem Loop frage ich die er_data_changed->mt_good_cells ab.


Code:

Code: Alles auswählen.

*read old cursor pos
    sender->get_scroll_info_via_id( IMPORTING
                                     es_row_no   = lv_row_no
                                     es_row_info = lv_row_info
                                     es_col_info = lv_col_info ).

    sender->get_current_cell( IMPORTING
                               es_row_id = lv_row_id2
                               es_col_id = lv_col_id2
                               es_row_no = lv_row_no2 ).

    sender->refresh_table_display( EXPORTING is_stable = is_stable ). 

    DATA: lt_cell TYPE TABLE OF lvc_s_ceno.
    DATA: ls_cell LIKE LINE OF lt_cell.
    ls_cell-col_id = 7.
    ls_cell-row_id = ls_row_id.
    APPEND ls_cell TO lt_cell.

    sender->set_selected_cells_id( EXPORTING it_cells = lt_cell ).

    sender->set_scroll_info_via_id( is_row_info = lv_row_info
                               is_col_info = lv_col_info
                               is_row_no   = lv_row_no ).
    lv_row_no2-row_id = ls_row_id.
    sender->set_current_cell_via_id( EXPORTING is_row_id = ls_row_id  
                           is_column_id = ls_column_id is_row_no = lv_row_no2 ).

cl_gui_cfw=>flush( ).


Re: Set Cursor on ALV GRID - CL_GUI_ALV_GRID

Beitrag von a-dead-trousers (Top Expert / 3711 / 136 / 972 ) »
Ich würde mal spontan darauf tippen, dass REFRESH_TABLE_DISPLAY schuld daran hat. Das löst einen kompletten Refresh inkl. Verlust des Eingabefokus aus.
ABER
Soweit im mich erinnnern kann, wird, wenn die aktuell markierte Zelle eingabebereit ist und man munter drauflos schreibt, die Eingabe trotzdem angenommen (Wechsel in Eingabemodus).
(Ich verwende ALV nicht mehr für Eingaben weil es einfach nicht "sauber" implementiert werden kann und man ständig in irgendwelche Fallstricken läuft)
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.07
Basis: 7.40

Re: Set Cursor on ALV GRID - CL_GUI_ALV_GRID

Beitrag von AlexVienna (ForumUser / 5 / 2 / 0 ) »
Gut, wenn wir annehmen, dass REFRESH_TABLE_DISPLAY schuld daran hat - gibt es eine weitere Möglichkeit, die geänderten Daten im ALV anzuzeigen?

Leider funktioniert es mit dem munter drauflos schreiben nicht mehr, nachdem der Refresh_TABLE_DISPLAY ausgeführt wurde, weil wir uns quasi nicht im Eingabemodus befinden.

Das komische dran ist, dass es im Debugging Modus wunderbar funktioniert, d.h.
wir ändern die Zelle - Fokus auf die nächste Zelle wird gesetzt - Eingabe umgehend möglich (ohne auf die Zelle zu klicken) .

Re: Set Cursor on ALV GRID - CL_GUI_ALV_GRID

Beitrag von a-dead-trousers (Top Expert / 3711 / 136 / 972 ) »
Die Daten werden nach dem Durchlaufen von CHANGED_DATA automatisch dargestellt.
Wenn du zusätzliche Daten zu den vom Benutzer eigegebenen Werten brauchst musst du diese über das CL_ALV_CHANGED_DATA_PROTOCOL eingeben (MODIFY_CELL).
Was ist dieser ominöse Debugging Modus?
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.07
Basis: 7.40

Re: Set Cursor on ALV GRID - CL_GUI_ALV_GRID

Beitrag von AlexVienna (ForumUser / 5 / 2 / 0 ) »
Debugging Modus = ein Breakpoint wird im Eventhandler data_changed gesetzt. Somit befinden wir uns jedes mal im Eventhandler, wenn die Eingabebereite Zelle geändert wird.

Re: Set Cursor on ALV GRID - CL_GUI_ALV_GRID

Beitrag von a-dead-trousers (Top Expert / 3711 / 136 / 972 ) »
Ach so.
Bislang hatte ich eher mehr Probleme als weniger, wenn ich das ALV Grid gedebugged habe. Meine Vermutung ist daher, dass im "normalen" Ablauf, nachdem der Eventhandler durchlaufen wurde noch ein "repaint" des GUI ausgeführt wird, was dazu führt, dass das Grid den (Eingabe-)Fokus verliert. Im Debug-Modus "frisst" der Debugger dieses "Repaint", sodass das Grid im anderen Modus den Eingabefokus behällt. Das ist dann eher auch ein Problem im GUI Control Framework bzw. Windows und wird mit ABAP-Mitteln (Appl.Server) wohl kaum zu beheben sein.
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.07
Basis: 7.40

Re: Set Cursor on ALV GRID - CL_GUI_ALV_GRID

Beitrag von black_adept (Top Expert / 3565 / 76 / 722 ) »
Moin Alex,
wie triggerst du den DATA_CHANGED Event? Mit <ENTER>?
Und was passiert wenn du einfach weitertippst? Gar nichts ( weil der Focus nicht nicht in der eingabebereiten ALV-Zelle steht ) oder wird in der falschen ( vorherigen?) Zelle etwas eingetragen?

Was passiert, wenn du den Flush hinter den Refresh schiebst oder dort zusätzlich einbaust ( beide Möglichkeiten ).

Kannst du einen Minireport posten, der dein Problem reproduziert?
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Set Cursor on ALV GRID - CL_GUI_ALV_GRID

Beitrag von AlexVienna (ForumUser / 5 / 2 / 0 ) »
Hi Stefan,

DATA_CHANGED wird mit EVT_MODIFIED getriggert - bzw. hab ich zum Testen auch das EVT_ENTER eingefügt.

Ich bin mir nicht sicher, was du mit einfach weitertippst meinst? Enter? Cursortasten?
Naja, wenn ich einfach weitertippe, wird der Focus auf die nächste Zelle gesetzt, jedoch ist diese dann nicht mehr Eingabebereit, sondern muss mit einem extra Klick in die Zelle, quasi den Eingabemodus wieder öffnen.

Bzgl. Minireport, da stell ich was zusammen und werde es hier posten. Danke dir!

Re: Set Cursor on ALV GRID - CL_GUI_ALV_GRID

Beitrag von a-dead-trousers (Top Expert / 3711 / 136 / 972 ) »
EVT_MODIFIED triggert beim "Verlassen" der Zelle (Wechsel zu einer anderen z.B. mit TAB oder Mausklick) wenn sich etwas geändert hat.
EVT_ENTER triggert beim Drücken von "Enter" in der Zelle.

Um nun sicherzustellen, dass die Anzeige nicht den (Eingabe-)Fokus verliert, darf man daher im Eventhandler keinen "Refresh" oder ähnliches im Grd auslösen das ein "Neuzeichnen" auslöst. Solange man also im Eventhandler keine Daten ändern oder hinzufügen möchte, funktioniert alles wunderbar. Möchte man nun Daten "ergänzen" (z.B. der User hat in Feld B X eingetrgen und in Feld A soll daraufhin Y stehen) muss man das über das CL_ALV_CHANGED_DATA_PROTOCOL bewerkstelligen.

Zudem darf auch der Parameter I_APPL_EVENTS im CONSTRUCTOR des ALV-Grid nicht gesetzt sein. Sonst würden alle Events als PAI/PBO ablaufen, was ein noch viel umfangreicheres "Repaint" des GUI auslösen würde, das garantiert zu einem Fokus-Verlust führt.

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

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.07
Basis: 7.40

Re: Set Cursor on ALV GRID - CL_GUI_ALV_GRID

Beitrag von black_adept (Top Expert / 3565 / 76 / 722 ) »
a-dead-trousers hat geschrieben:
21.06.2021 12:35
EVT_MODIFIED triggert beim "Verlassen" der Zelle (Wechsel zu einer anderen z.B. mit TAB oder Mausklick) wenn sich etwas geändert hat.
In etwa so - aber eben nicht ganz. Wenn z.B. mit <ALT>+<TAB> in ein anderes Fenster ( nicht unbedingt GUI ) gesprungen wird, wird m.W. die Zelle nicht wirklich im Sinne des Grid verlassen. Verlassen wird sie erst dann glaube ich, wenn man via Klick oder Enter tatsächlich explizit den Fokus auf eine andere Zelle des Grid verändert, weil das Grid das dann mitbekommt.
Daher auch meine Frage an Alex wie sie den DATA_CHANGED auslösen. Er muss das ja irgendwie machen, sonst würde er ja nicht auf seinem Breakpoint landen.
a-dead-trousers hat geschrieben:
21.06.2021 10:21
(Ich verwende ALV nicht mehr für Eingaben weil es einfach nicht "sauber" implementiert werden kann und man ständig in irgendwelche Fallstricken läuft)
Geht mir ähnlich. Manchmal mache ich es noch, weil man gut mit Copy & Paste ganze Blöcke eintragen kann über Seitengrenzen hinaus.
Und wenn es um ( halbwegs ) einfache Berechnungen aus Eingaben geht nehme ich manchmal ABAP2XLSX mit eingebettetem Excel und Formeln. Das ist auch recht komfortabel, hat aber auch seine Problemchen. Und HTML habe ich nie wirklich ausprobiert weil ich mir nie sicher war, dass JavaScript im eingebetteten HTML als lauffähig angesehen werden kann, obwohl in älteren Systemen diese Methodik für feinere Interrupts sorgen konnte als der CL_GUI_TIMER mit seinen damaligen x-sekündigen Countdowns.
Richtig sauber und für den User halbwegs gut handlebar sehe ich eigentlich nur TableControls. Dafür gibt es dort keine gute Positionierung/Suche/Filtern über eine Seite hinaus.
Aber egals wofür man sich entscheidet - alles hat leider so seine Nachteile und es gibt nicht "DIE" beste Alternative.

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

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Set Cursor on ALV GRID - CL_GUI_ALV_GRID

Beitrag von AlexVienna (ForumUser / 5 / 2 / 0 ) »
Hi,
danke danke danke! Genau das war die Lösung "Parameter I_APPL_EVENTS im CONSTRUCTOR des ALV-Grid nicht gesetzt sein"

Der Parameter wurde entfernt und schon klappt es genau wie ich es haben wollte.

Großes Lob an euch beiden & macht weiter so.

LG

Alex

Seite 1 von 1

Über diesen Beitrag



ABAP & SAP eBook Flatrate von Espresso Tutorials Sponsorlink
Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

DB-Update setzt kein Subrc
vor 22 Stunden von ewx gelöst 6 / 85
Zukunft ABAP?
Gestern von mbsr 1 / 53

Vergleichbare Themen

ALV-Grid Cursor neu positionieren
von uwe » 20.09.2005 15:53
Cursor im ALV-Grid setzen
von made » 20.12.2005 17:10
ALV Grid Sortierung aktualisieren im grid 1 und grid 2
von c oco » 06.02.2012 10:09
ALV Grid
von lisa » 17.09.2008 17:10