Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
cuncon
Hallo a-dead-trousers,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.
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
cuncon
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
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.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
Code: Alles auswählen.
er_data_changed->mt_inserted_rows
er_data_changed->mt_mod_cells
er_data_changed->mt_deleted_rows
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.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
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.
Man könnte beim schließen des PopUps auch die Übernahme der ALV-Änderungen triggern:4byte hat geschrieben:Oder man erzwingt das ALV Event irgendwie wenn man den Button auf deinem Dynpro klickt.
Code: Alles auswählen.
CL_GUI_ALV_GRID->IF_CACHED_PROP~set_prop( propname = 'GridModified' propvalue = '1' )
Code: Alles auswählen.
DATA(lt_delta_cells) = VALUE lvc_t_modi(
( fieldname = 'FELD1'
row_id = es_row_no-row_id
value = 'WERT1'
tabix = 1 )
( fieldname = 'STATUS_GESAMT'
row_id = es_row_no-row_id
value = gc_stat_rueckfrage
tabix = 1 ) ).
go_alv_grid->set_delta_cells(
EXPORTING
it_delta_cells = lt_delta_cells
i_modified = abap_true ).
Folgende Benutzer bedankten sich beim Autor Murdock für den Beitrag (Insgesamt 2):
ewx • a-dead-trousers
du hättest dir doch einfach einen eigenen "Merker" setzen können, wenn die Funktion ON_BUTTON_CLICK aufgerufen wurde?
Ja klar, hätte ich, aber davon wäre on_data_changed (wo ich so einiges mache) auch nicht durchlaufen worden. Ich hätte mir also wieder extra merken müssen, was geändert wurde und evtl. auch wieder darauf extra reagieren,... etc.
Ich denke, da kann man sich drüber streiten, denn bei button_click müssen ja nicht unbedingt Datenänderungen gemacht werden. Von daher wäre für mich logisch - oder zumindest nachvollziehbar - dass das data_Changed Event nicht reagiert. ansonsten könnte man data_changed auch selbst aufrufen, muss aber die Parameter natürlich selber füllen. Von daher ist der Aufruf von SET_DELTA_CELLS eine gute Lösung.
Das stimmt, im button_click müssen nicht unbedingt Änderungen gemacht werden und daher braucht der data_changed auch erstmal nicht zu reagieren. Wenn ich nun aber im button_click Änderungen an der Ausgabetabelle mache (die durch ...refresh auch angezeigt werden) und dann explizit mittels check_changed_data() sage "guck doch mal ob sich was geändert hat und reagiere bitte darauf wie sonst auch", erwarte ich schon, dass der ALV bemerkt dass etwas geändert wurde und dann den data_changed auslöst.