Folgende Benutzer bedankten sich beim Autor Unit605 für den Beitrag:
black_adept
Heißt soviel wie: Wir können nicht hellsehen. Du musst schon etwas mehr posten um den Fehler analysieren zu können.Unit605 hat geschrieben:Fehler im Coding Zeile 227.
Ich glaube du versuchst mit dem Update auch neue Zeilen einzufügen bzw. den Schlüssel von vorhandenen Einträgen zu ändern. Das funktioniert so nicht.ABAP Hilfe hat geschrieben:Bei Angabe von SET oder eines Arbeitsbereichs in source wurde keine Zeile geändert oder bei Angabe einer internen Tabelle in source wurden nicht alle angegebenen Zeilen geändert, da entweder keine passende Zeile gefunden wurde oder die Änderung eine Zeile erzeugen würde, die zu doppelten Einträgen im Primärschlüssel bzw. in einem eindeutigen Sekundärindex der Datenbanktabelle führt.
Code: Alles auswählen.
DATA: ls_good TYPE lvc_s_modi.
FIELD-SYMBOLS: <wa> TYPE ANY,
<feld> TYPE ANY.
*** alle Inhalte der geänderten Zellen in die interne Tabelle schreiben
LOOP AT er_data_changed->mt_good_cells INTO ls_good.
*** Dazu auf die richtige Zeile in der ITAB positionieren:
READ TABLE gt_perlog ASSIGNING <wa> INDEX ls_good-row_id.
IF sy-subrc = 0.
*** Und das geänderte Feld dem Feldsymbol zuweisen
ASSIGN COMPONENT ls_good-fieldname OF STRUCTURE <wa> TO <feld>.
IF sy-subrc = 0.
*** Feldwert zuweisen
<feld> = ls_good-value.
ENDIF.
ENDIF.
ENDLOOP.
CALL METHOD gr_alv->refresh_table_display.
Vorschlag wie ich sowas meistens löse:a-dead-trousers hat geschrieben:Ich glaube du versuchst mit dem Update auch neue Zeilen einzufügen bzw. den Schlüssel von vorhandenen Einträgen zu ändern. Das funktioniert so nicht.
In solchen Fällen musst du wirklich explizit zwischen UPDATE, INSERT und DELETE unterscheiden.
Code: Alles auswählen.
loop at gt_outtab assigning <ls_outtab>.
* Kommt der neue Eintrag in der DB überhaupt vor?
read table gt_save assigning <ls_save> with key ... "Der genaue Key muss hier angegeben werden!!!
if sy-subrc ne 0.
* Nein? Dann einfügen
insert ... from <ls_outtab>.
else.
if <ls_outtab> ne <ls_save>.
* Hat sich was verändert?
update ... from <ls_outtab>.
endif.
* Auf alle Fälle aus der Tabelle löschen, damit der REST anschließend von der DB gelöscht werden kann
delete gt_save index sy-tabix. "= sy-tabix von READ TABLE. Aufpassen, dass kein anderer Befehl die sy-tabix verändert.
endif.
endloop.
* Den Rest löschen!
loop at gt_save assigning <ls_save>.
delete ... from <ls_save>.
endloop.
* Die neuen Daten entsprechen nun dem was auf der DB ist!
gt_save = gt_outtab.
Code: Alles auswählen.
IF sy-subrc <> 0.
WRITE: 'Fehler beim ...'.
ROLLBACK WORK.
STOP.
ENDIF.
COMMIT WORK.