Und wie vergleicht man diese Kopie dann mit dem aktuellen Inhalt? Wenn ich die erste Option nehmen würdea-dead-trousers hat geschrieben: ↑20.10.2022 15:03Ich nehme mal an du verwendest für das Editieren ein ALV Grid oder?
Um nun einen "Unterschied" zwischen der ursprünglichen Tabelle und der aktuellen Tabelle zu erkennen gibt es im Grunde zwei Möglichkeiten:
1. Der "klassische" Ansatz indem man vor der Anzeige im ALV Grid eine Kopie der Tabelle macht und beim Verlassen die Kopie mit dem aktuellen Inhalt vergleicht und so die Änderungen erkennt.
2. Der "objektorientierte" Ansatz indem man mit den Event DATA_CHANGED (vor der Änderung in der internen Tabelle) oder DATA_CHANGED_FINISHED (nach der Änderungen in der internen Tabelle) die genaue Position (Zeile und Spalte) der Änderung erhällt.
Ich persönlich bevorzugen den ersten Ansatz weil beim zweiten Ansatz sehr viele "synchrone" Aufrufe zwischen SAPgui und Applikationsserver erfolgen und es dadurch je nach Umfang der durchgeführten Zusatzverarbeitung zu merkbaren Verzögerungen auf Seiten der Benutzer kommt.
Code: Alles auswählen.
LOOP AT itab1 ASSIGNING FIELD-SYMBOL(<line1>).
READ TABLE itab2 ASSIGNING FIELD-SYMBOL(<line2>) INDEX sy-tabix.
IF sy-subrc eq 0.
IF <line1> NE <line2>.
* Daten haben sich verändert
ELSE.
* Daten sind gleich
ENDIF.
ELSE.
* Daten wurden hinzugefügt
ENDIF.
ENDLOOP.
LOOP AT itab2 ASSIGNING FIELD-SYMBOL(<line3>).
READ TABLE itab1 TRANSPORTING NO FIELDS INDEX sy-tabix.
IF sy-subrc NE 0.
* Daten wurden gelöscht
ENDIF.
ENDLOOP.
Code: Alles auswählen.
LOOP AT itab1 ASSIGNING FIELD-SYMBOL(<line1>).
READ TABLE itab2 ASSIGNING FIELD-SYMBOL(<line2>) FROM <line1>.
IF sy-subrc eq 0.
IF <line1> NE <line2>.
* Daten haben sich verändert
ELSE.
* Daten sind gleich
ENDIF.
ELSE.
* Daten wurden hinzugefügt
ENDIF.
ENDLOOP.
LOOP AT itab2 ASSIGNING FIELD-SYMBOL(<line3>).
READ TABLE itab1 TRANSPORTING NO FIELDS FROM <line3>.
IF sy-subrc NE 0.
* Daten wurden gelöscht
ENDIF.
ENDLOOP.
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
Gekomo