Die letzte Änderung eines Feldes von alv wurde nicht gemerkt


Getting started ... Alles für einen gelungenen Start.

Moderatoren: Jan, Steff

Die letzte Änderung eines Feldes von alv wurde nicht gemerkt

Beitragvon cuncon » 27.11.2018, 16:21

Hallo zusammen,

Ich habe eine alv Liste und die Liste ist editierbar. Auf einer Zeile möchte ich mehrere Felder ändern. Ich habe die Ereignisse benutzt, nämlich cl_gui_alv_grid=>mc_evt_modified und cl_gui_alv_grid=>mc_evt_enter und data_changed OF cl_gui_alv_grid für die Änderung. ZB: ich möchte das Feld A ändern und beim Debugger habe ich gesehen, dass das Änderung-Ereignis wird nur ausgelöst, wenn nach der Cursor zum anderen Feld gesprungen wurde. Dh, bei der letzte Änderung, solange wenn die Cursor nicht zu einem anderen Feld gesprungen wurde, wurde das Ereignis nicht ausgelöst, so dass die letzte Änderung nicht geändert werden konnte. Wie kann man das Problem lösen? Ich habe wirklich keine Idee mehr.

Vielen Dank für jede Hilfe.

cuncon
cuncon
Specialist
 
Beiträge: 124
Registriert: 18.10.2017, 21:03
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Sponsor

Alte ABAP-Entwicklerweisheit: Weißt du weder aus noch ein, baust du einen BADI ein

Re: Die letzte Änderung eines Feldes von alv wurde nicht gem

Beitragvon a-dead-trousers » 27.11.2018, 16:33

Ich nehme mal an, dein Problem bezieht sich darauf, dass dann im Anschluss bei einem PAI/PBO-Ereignis die Daten nicht zur Verfügung stehen, oder?
Den Feldtransport vom ALV-Grid kann man auch mit der Methode CHECK_CHANGED_DATA manuell anstoßen.
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

Für diese Nachricht hat a-dead-trousers einen Dank bekommen :
cuncon
a-dead-trousers
Top Expert
 
Beiträge: 3106
Registriert: 07.02.2011, 13:40
Dank erhalten: 767 mal
Ich bin: Entwickler/in

Re: Die letzte Änderung eines Feldes von alv wurde nicht gem

Beitragvon cuncon » 27.11.2018, 17:23

a-dead-trousers hat geschrieben:Ich nehme mal an, dein Problem bezieht sich darauf, dass dann im Anschluss bei einem PAI/PBO-Ereignis die Daten nicht zur Verfügung stehen, oder?
Den Feldtransport vom ALV-Grid kann man auch mit der Methode CHECK_CHANGED_DATA manuell anstoßen.


Hallo a-dead-trousers,


Sorry, ich muss etwas korrigieren. Eigentlich ist es, ob ich mehrere Änderungen oder nur eine Änderung gemacht habe. Angenommen, ich habe nur ein Feld geändert und solange, wenn ich kein Enter gedrückt habe oder die Cursor in anderem Feld gesetzt habe, dann wird überhaupt kein Ereignis ausgelöst für die Änderung. Dh, in der Tabelle MT_GOOD_CELLS von der Klasse cl_alv_changed_data_protocol ist leer. Daher konnte die geänderte Daten von dem Feld nicht abfangen. Die alv haben dann die alte Daten. Dann wie kann man den Feldtransport vom ALV-Grid auch mit der Methode CHECK_CHANGED_DATA manuell anstoßen, wenn ich die geänderte Daten nicht abfangen konnte? Oder war das ein Denkfehler von mir?

Danke.

cuncon
cuncon
Specialist
 
Beiträge: 124
Registriert: 18.10.2017, 21:03
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Die letzte Änderung eines Feldes von alv wurde nicht gem

Beitragvon a-dead-trousers » 27.11.2018, 23:11

Ok, die Frage die sich mir stellt, ist, wofür brauchst du die geänderten Daten, wenn du dich mit dem Cursor noch in dem Feld befindest?
Wie du schon bemerkt hast, kann man einen Event registrieren, der beim Verlassen des Feldes (nach einer Änderung) ausgelöst wird oder erst wenn man Enter drückt (und etwas geändert hat).
Die beiden Events machen insofern Sinn, als dass man entweder sofort beim Wechsel auf ein anderes Feld schon auf die (validierten) Daten des zuvor geänderten Feldes zugreifen kann, oder wenn man mehrere Felder gleichzeitig (nach Enter) prüfen möchte. Daher denke ich eher, du hast da einen Denkfehler in deiner Applikation, denn ich sehe keinen Sinn, warum man die geänderten Daten sofort während des Änderns schon prüfen sollte (in einer Applikation die mit "Buchungen" arbeitet, die SAP ja ist)

Ich habe mir bei meiner ursprünglichen Antwort gedacht, du meinst, dass vielleicht, wenn man bei der letzten Änderung eines Feldes sofort auf einen Speichern-Knopf drückt der PAI/PBO auslöst, die Events nicht ordnungsgemäß ausgelöst werden und daher deine Feldprüfungen nicht durchlaufen werden. Das editierbare ALV Grid ist in diesem Bereich meines Erachtens nicht sehr ausgereift und kann unter Umständen auch mal etwas unerwartet reagieren. Daher die Erwähnung der Methode CHECK_CHANGED_DATA. Aber inzwischen glaube ich, dass das nicht dein Problem ist.

lg ADT
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

Für diese Nachricht hat a-dead-trousers einen Dank bekommen :
cuncon
a-dead-trousers
Top Expert
 
Beiträge: 3106
Registriert: 07.02.2011, 13:40
Dank erhalten: 767 mal
Ich bin: Entwickler/in

Re: Die letzte Änderung eines Feldes von alv wurde nicht gem

Beitragvon cuncon » 28.11.2018, 11:07

a-dead-trousers hat geschrieben:vielen Dank für deine Antwort. Ich habe die Methode CHECK_CHANGED_DATA aufgerufen, nachdem man ein Feld geändert hat UND das Feld NICHT verlassen hat oder KEIN ENTER gedückt hat, dann habe ich bei Debugger gesehen, dass der Flag für die Änderung gesetzt wurde, dh es gab Änderung, aber die Tabelle MT_GOOD_CELLS war leer, so dass man die Änderung nicht holen konnte und
a-dead-trousers hat geschrieben:Ok, die Frage die sich mir stellt, ist, wofür brauchst du die geänderten Daten, wenn du dich mit dem Cursor noch in dem Feld befindest?
Wie du schon bemerkt hast, kann man einen Event registrieren, der beim Verlassen des Feldes (nach einer Änderung) ausgelöst wird oder erst wenn man Enter drückt (und etwas geändert hat).
Die beiden Events machen insofern Sinn, als dass man entweder sofort beim Wechsel auf ein anderes Feld schon auf die (validierten) Daten des zuvor geänderten Feldes zugreifen kann, oder wenn man mehrere Felder gleichzeitig (nach Enter) prüfen möchte. Daher denke ich eher, du hast da einen Denkfehler in deiner Applikation, denn ich sehe keinen Sinn, warum man die geänderten Daten sofort während des Änderns schon prüfen sollte (in einer Applikation die mit "Buchungen" arbeitet, die SAP ja ist)

Ich habe mir bei meiner ursprünglichen Antwort gedacht, du meinst, dass vielleicht, wenn man bei der letzten Änderung eines Feldes sofort auf einen Speichern-Knopf drückt der PAI/PBO auslöst, die Events nicht ordnungsgemäß ausgelöst werden und daher deine Feldprüfungen nicht durchlaufen werden. Das editierbare ALV Grid ist in diesem Bereich meines Erachtens nicht sehr ausgereift und kann unter Umständen auch mal etwas unerwartet reagieren. Daher die Erwähnung der Methode CHECK_CHANGED_DATA. Aber inzwischen glaube ich, dass das nicht dein Problem ist.

lg ADT


vielen Dank für deine Antwort. Ich habe die Methode CHECK_CHANGED_DATA für die Abfrage auch verwendet, ob es Änderung gibt oder nicht, aber habe Feldtransport vom ALV nicht gemacht, weil ich nicht weiß genau, wie man das macht.
Ich glaube mit dem Bild kann ich mein Problem besser beschreiben. Auf dem Bild sieht man die weiße Felder, bei den man die Werte ändern kann. Zum Beispiel ich möchte bei dem Feld Posnr ändern, statt 3 schreibe ich 4 und drücke auf den Button 'Übernehmen', dh, ich habe kein ENTER gedrückt und nicht zu einem anderen Feld gesprungen, dann habe ich bei Debugger gesehen, dass die Tabelle MT_GOOD_CELLS von der Klasse cl_alv_changed_data_protocol LEER war, obwohl der Flag von der Methode CHECK_CHANGED_DATA auf 'X' gesetzt wurde, das bedeutet, dass das System gemerkt hat, es gibt Änderung, aber die geänderte Daten wurde leider nicht gespeichert und auf der alv List standen nur die alten Daten nach der Änderung, weil ich KEIN ENTER gedrückt oder zu einem anderen Feld gesprungen habe, sondern direkt auf dem Button 'Übernehmen' gedrückt habe. Es kann solchen Fall passieren. Der Benutzer kann nicht immer an ENTER-Drücken oder die Cursor auf einem anderen Feld extra klicken muss, damit die Änderung abgespeichert werden muss. Das ist auch Benutzerunfreundlich. Aber ich glaube es muss eine Lösung dafür geben, aber welche ich bin im Moment überfragt :(. Hast du oder hat jemand eine Idee ?

Vielen Dank für Eure Hilfe
cuncon
cuncon
Specialist
 
Beiträge: 124
Registriert: 18.10.2017, 21:03
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Die letzte Änderung eines Feldes von alv wurde nicht gem

Beitragvon 4byte » 28.11.2018, 13:18

Hallo cuncon,

ich habe es folgendermaßen realisiert:
Zuerst eine Methode, die auf das Event DATA_CHANGED der Klasse CL_GUI_ALV_GRID reagiert. Die hat als Importparameter
ER_DATA_CHANGED
E_ONF4
E_ONF4_BEFORE
E_ONF4_AFTER
E_UCOMM

Die neuen/ gelöschten/ geänderten Zellen stehen dann in:
Code: Alles auswählen
er_data_changed->mt_inserted_rows
er_data_changed->mt_mod_cells
er_data_changed->mt_deleted_rows


Hast du das Event am ALV Objekt registriert?

Grüße 4Byte
Es gibt 10 Menschen die binär verstehen :)

Für diese Nachricht hat 4byte einen Dank bekommen :
cuncon
4byte
Specialist
 
Beiträge: 118
Registriert: 24.10.2017, 09:16
Dank erhalten: 34 mal
Ich bin: Entwickler/in

Re: Die letzte Änderung eines Feldes von alv wurde nicht gem

Beitragvon cuncon » 28.11.2018, 13:51

4byte hat geschrieben:Hallo cuncon,

ich habe es folgendermaßen realisiert:
Zuerst eine Methode, die auf das Event DATA_CHANGED der Klasse CL_GUI_ALV_GRID reagiert. Die hat als Importparameter
ER_DATA_CHANGED
E_ONF4
E_ONF4_BEFORE
E_ONF4_AFTER
E_UCOMM

Die neuen/ gelöschten/ geänderten Zellen stehen dann in:
Code: Alles auswählen
er_data_changed->mt_inserted_rows
er_data_changed->mt_mod_cells
er_data_changed->mt_deleted_rows





Hast du das Event am ALV Objekt registriert?

Grüße 4Byte


Ja, ich habe die Methode geschrieben, die auf der Klasse CL_GUI_ALV_GRID reagiert. Die Änderung wurde auch gemacht, aber nur wenn ich entweder auf ENTER gedrückt habe oder das geänderte Feld verlassen und zum anderen Feld springen und dann auf den Button 'Übernehmen' drücken. Dann steht auf der ALV List die geänderten Daten. Aber wenn ich ein Feld geändert habe und ohne ENTER gedrückt, sondern direkt auf den Button 'Übernehmen' drücke, dann wurde Ereignis für die Änderung nicht ausgelöst, sondern nur PAI ausgelöst wegen Drücken des Buttons 'Übernehmen'. Nach der alv refresh sehe ich die alte Daten von vor der Änderung, also die Änderung wurde nicht gemacht. Aber mein Ziel ist, wenn der Benutzer ein Feld geändert habe und muss nicht auf ENTER drücken, sondern nur auf den Button 'Übernehmen' drücken, soll aber die Änderung erfolgt werden.

Unten ist mein coding:

Code: Alles auswählen

CLASS: lcl_handler DEFINITION.
  PUBLIC SECTION.
    METHODS:   on_data_changed_310 FOR EVENT data_changed OF cl_gui_alv_grid
                                      IMPORTING er_data_changed.
ENDCLASS.

CLASS: lcl_handler IMPLEMENTATION.
   METHOD on_data_changed_310.
    PERFORM data_changed_310 USING er_data_changed.
  ENDMETHOD.                  
ENDCLASS.

FORM data_changed_310  USING p_data_changed TYPE REF TO
                                         cl_alv_changed_data_protocol.
...
...
  LOOP AT p_data_changed->mt_good_cells INTO ls_good.
...
  ENDLOOP.


ENDFORM.

MODULE create_and_transfer_0310 OUTPUT.
...
...
    CREATE OBJECT g_handler.
    CALL METHOD go_alv_grid_310->register_edit_event
      EXPORTING
        i_event_id = cl_gui_alv_grid=>mc_evt_modified."mc_evt_enter.

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

    SET HANDLER g_handler->on_data_changed_310 FOR go_alv_grid_310.

    CALL METHOD go_alv_grid_310->set_table_for_first_Display
...
ENDMODULE.

 


cucncon
cuncon
Specialist
 
Beiträge: 124
Registriert: 18.10.2017, 21:03
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Die letzte Änderung eines Feldes von alv wurde nicht gem

Beitragvon 4byte » 29.11.2018, 10:02

Hallo cuncon,

damit das Event getriggert wird, musst du ein ALV Event auslösen. Mein Lösungsvorschlag wäre die ALV Toolbar einzublenden und einen eigenen Button hinzuzufügen, der dann Übernehmen heißt :P
Oder man erzwingt das ALV Event irgendwie wenn man den Button auf deinem Dynpro klickt.
Grüße 4Byte
Es gibt 10 Menschen die binär verstehen :)

Für diese Nachricht hat 4byte einen Dank bekommen :
cuncon
4byte
Specialist
 
Beiträge: 118
Registriert: 24.10.2017, 09:16
Dank erhalten: 34 mal
Ich bin: Entwickler/in

Re: Die letzte Änderung eines Feldes von alv wurde nicht gem

Beitragvon JHM » 29.11.2018, 14:06

4byte hat geschrieben:Oder man erzwingt das ALV Event irgendwie wenn man den Button auf deinem Dynpro klickt.


Man könnte beim schließen des PopUps auch die Übernahme der ALV-Änderungen triggern:

CL_GUI_ALV_GRID->CHECK_CHANGED_DATA()

Über den Rückgabewert p_valid weiß man ob die Datenänderung im ALV verarbeitet werden kann oder ob der User nochmal ran muss (PAI verlassen, PopUp muss offen bleiben!)
Gruß Hendrik

Für diese Nachricht hat JHM einen Dank bekommen :
cuncon
JHM
Top Expert
 
Beiträge: 1127
Registriert: 15.02.2006, 12:39
Wohnort: Aachen
Dank erhalten: 178 mal


Zurück zu ABAP® für Anfänger

  Aktuelle Beiträge   
Applikations-Toolbar dynamisch erzeugen
vor 8 Stunden von ralf.wenzel 0 Antw.
CP_BD_DIRECT_INPUT_PLAN
Gestern von Gottschall 0 Antw.
Logische Datenbank: Selektieren mit Loop
vor 4 Stunden von deejey 12 Antw.
Globale Konstanten - Organisationseinheiten
vor 13 Stunden von ralf.wenzel 5 Antw.
Kein Zugriff auf Dateien im Applikationsserver
Gestern von zzcpak 1 Antw.

  Ähnliche Beiträge beta
gelöst Selektieren eines Feldes
29.08.2003, 12:10 von Thomas 4 Antw.
gelöst Anbindung eines Feldes an Schhilfe
14.10.2014, 22:38 von a-dead-trousers 1 Antw.
Prüfung eines Feldes auf Richtigkeit + F4Hilfe
02.05.2007, 09:10 von MarkusW 2 Antw.
Ändern eines Feldes in einer dynamischen WA
29.08.2008, 08:48 von David11384 2 Antw.
Gesamtsumme eines Feldes / Interne Tabelle
01.11.2012, 18:13 von wreichelt 3 Antw.

 

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder

cron