Das ist so nicht ganz richtig. Es wird zwar immer behauptet, dass COMMIT WORK AND WAIT eine synchrone Verbuchung bewirkt, was aber nicht stimmt. Zumindest nicht bei BAPIs. Um einen BAPI synchron zu verbuchen, muss SET UPDATE TASK LOCAL verwendet werden!rob_abc hat geschrieben: ↑19.04.2024 08:12
Ein WAIT musst du verwenden, wenn du später in deinem Programm auf das erstellte Objekt zugreifen möchtest. Durch WAIT erfolgt die Buchung synchron, d.h. es geht erst weiter, wenn die Daten auch tatsächlich persistiert sind. Ohne Wait läuft dein Programm direkt weiter und die Buchung findet im Hintergrund statt.
Die SAP Hilfe ist sehr ausführlich bei dem Thema
https://help.sap.com/doc/abapdocu_lates ... commit.htm
Fehler ist, wenn ich vom BAPI in der Returntable eine Nachricht von Typ AEX habe.DeathAndPain hat geschrieben: ↑19.04.2024 11:10Die Frage ist, was Du unter "Fehler" verstehst. Wenn der Eintrag nicht geschrieben werden kann, kann er nicht geschrieben werden, egal wieviele COMMITs Du machst. Wenn Der Fehler allerdings so beschaffen ist, dass Du mehrere inhaltlich zusammenhängende Datensätze in die Datenbank geschrieben hast und der dritte davon konnte nicht geschrieben werden, daher willst Du auch nicht, dass die übrigen geschrieben werden, weil der Kram sonst nicht mehr konsistent ist, dann wäre es blöd, nach dem ersten geschriebenen Eintrag schon einen COMMIT zu machen, weil Du Dir damit die Möglichkeit nimmst, auch die erfolgreichen Schreibzugriffe mit einem ROLLBACK rückabzuwickeln. Das ist die Idee dahinter: Du schreibst alle inhaltlich zusammengehörigen Tabellenänderungen und machst dann einen COMMIT.
Wobei zu beachten ist, dass Puffer gefüllt werden, bis der COMMIT kommt, der sie auf die Datenbank schreibt. Wenn Du riesige Datenmengen schreibst, bevor Du irgendwann mal einen COMMIT machst, dann kannst Du hinsichtlich des Pufferspeicherplatzes in Probleme laufen.
SEIN Programm ist dann auch zu Ende. DU machst mehrere Aufrufe. Von daher würde ich im Fehlerfall immer den BAPI_TRANSACTION_ROLLBACK aufrufen.ABAPlerv hat geschrieben: ↑19.04.2024 13:43Hier wird nämlich auch kein ROLLBACK gemacht. Es wird nur ein COMMIT WORK gemacht, wenn keine Fehlermeldung vorhanden ist.
https://codezentrale.de/tag/bapi_po_change/
Nein. Wenn der BAPI gescheitert ist, hat er nichts geschrieben, das zurückge"rollt" werden müsste.
Wenn das für Dich ok ist, dass diese eine Bestellung halt auf die Nase gefallen ist und Du mit der Tagesordnung weitermachen möchtest, als sei nichts geschehen, dann kannst Du das machen. Kann auch Sinn ergeben, wenn die Bestellungen nichts miteinander zu tun haben und Du für die fehlgeschlagenen die Fehler in einem Protokoll sammelst, um das sich später jemand händisch kümmern soll, ohne dass die einwandfrei funktionierenden dadurch ausgebremst werden sollen.
Ich muss gestehen, dass ich nie verstanden habe, was der Vorteil dieses BAPIs gegenüber einem gewöhnlichen Befehl ROLLBACK WORK sein soll.black_adept hat geschrieben:Von daher würde ich im Fehlerfall immer den BAPI_TRANSACTION_ROLLBACK aufrufen.
Das ist aber nur die halbe Wahrheit. Entscheidend ist, wie der Funktionsbaustein die Daten auf die Datenbank schreibt. Erfolgt dies direkt via SQL-Befehlt, reicht ein COMMIT aus. Wenn der Funktionsbaustein allerdings intern die Daten über den Verbucher wegschreibt, was bei einer FORM-Routine oder Fuba durch den Zusatz ON COMMIT erfolgt, dann erfolgt die Verarbeitung erst beim COMMIT und dieses wartet nur, wenn man auch WAIT anhängt.
Muss ich ein ROLLBACK machen, wenn ich nur diesen einen BAPI aufrufe und Fehler von Typ AEX habe?
Woher weißt du, dass ein BAPI nichts schreibt, wenn er eine Fehlermeldung liefert?Nein. Wenn der BAPI gescheitert ist, hat er nichts geschrieben, das zurückge"rollt" werden müsste.
Code: Alles auswählen.
was der Vorteil dieses BAPIs gegenüber einem gewöhnlichen Befehl ROLLBACK WORK sein soll.
Weil ich in meiner Naivität davon ausgehe, dass der BAPI nicht komplett dilettantisch geschrieben ist. Wenn ich mich darauf nicht verlassen kann oder will, sollte ich den BAPI gar nicht benutzen.
Am Ende wird der BAPI auch nur mehrere SQL-Befehle absetzen, und wenn ab dem zweiten etwas schief geht, muss für den ersten ein ROLLBACK gemacht werden. Wenn der BAPI das selbst macht, ist ok. Dann kann es noch vorkommen, dass man mehrere BAPI hinter einander ruft. Wenn der erste durchläuft und der zweite einen Fehler bringt, muss man das ROLLBACK auch selbst als Aufrufer machen.DeathAndPain hat geschrieben: ↑20.04.2024 19:54Ein solcher BAPI wäre der ultimative unprofessionelle Schrott und daher grundsätzlich zu meiden,
So erwarte ich das. Einen BAPI, der nach halb geschriebenen Daten die Kontrolle an den Aufrufer zurückübergibt, ohne selbst einen vernünftigen ROLLBACK zu machen, halte ich für unprofessionellen Pfusch.
Das würde dann bedeuten, dass man als Aufrufer zwischen den einzelnen BAPI-Aufrufen einen logischen Zusammenhang sieht, so dass man sie gemeinsam oder gar nicht verbucht haben möchte. In dem Fall ja; das können die BAPIs ja nicht hellsehen.
@D&P: Das ist m.E. der entscheidende Hinweis. Es gibt diverse BAPIs, die sich Sachen merken, weil sie z.B. durch eine Kette von BAPI-Aufrufen quasi angefüttert werden bis es dann zum finalen Buchen kommt ( z.B. im Projektsystem ). Aber auch sonst kann es sein, dass sich die BAPIs Sachen merken bzw. bei einem neuen Aufruf nicht vollständig initialisiert werden. Daher sollte beim Abschluss einer logischen Sequenz einer der beiden BAPIs zum Rollback oder Commit aufgerufen werden in der Hoffnung, dass SAP sauber programmiert hat.