Wie benutze ich COMMIT WORK richtig

Getting started ... Alles für einen gelungenen Start.
17 Beiträge • Seite 1 von 2 (current) Nächste
17 Beiträge Seite 1 von 2 (current) Nächste

Wie benutze ich COMMIT WORK richtig

Beitrag von ABAPlerv (ForumUser / 73 / 23 / 1 ) »
Hallo,

Ich verstehe Commit Work nicht ganz.

Wenn ich in einem LOOP jedes Mal ein BAPI aufrufe und einzelne Datenbankeinträge(durch BAPI) ändere, soll dann anschließend bei jedem Erfolg Commit Work aufgerufen werden und bei Misserfolg ein rollback?

Oder Commit erst nach dem LOOP? Was passiert dann mit den Einträgen, die in ein Fehler gelaufen sind durch den BAPI?

Ziel ist es natürlich, bei jedem Erfolgsmeldung in die Datenbank zu schreiben und bei Misserfolge soll nichts in die Datenbank geschrieben werden (Rollback).

Soll ich auch mit einem WAIT beim COMMIT arbeiten?

Kann mir jemand weiterhelfen & die Unterschiede verständlich erklären?

Danke
Zuletzt geändert von ABAPlerv am 19.04.2024 06:06, insgesamt 1-mal geändert.

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten



Re: Wie benutze ich COMMIT WORK richtig

Beitrag von rob_abc (ForumUser / 59 / 12 / 18 ) »
Ob in, oder ausserhalb vom LOOP, hängt davon ab, was du erreichen möchtest.

Wenn du es ausserhalb des LOOPs machst, hast du die Möglichkeit bei einem ROLLBACK alle zuvor angelegten Datensätze auch zu löschen. Wenn du es innerhalb des LOOPs machst, dann bezieht sich dein ROLLBACK nur auf den aktuellen Datensatz. Die davor hast du ja dann schon commited.

Bei BAPIs und FMs der SAP muss du immer in die Doku schauen. In einigen schreibt die SAP, dass der BAPI kein zweites mal aufgerufen werden darf, bevor nicht ein COMMIT/ROLLBACK gemacht wurde. Da hast du dann gar nicht die Wahl.

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

Re: Wie benutze ich COMMIT WORK richtig

Beitrag von ewx (Top Expert / 4789 / 295 / 629 ) »
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
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!

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
rob_abc


Re: Wie benutze ich COMMIT WORK richtig

Beitrag von ABAPlerv (ForumUser / 73 / 23 / 1 ) »
Ich will den BAPI_PO_CHANGE in einem LOOP verwenden.

Was passiert mit den Einträgen, wo ein Fehler passiert ist, wenn ich einfach nach dem ENDLOOP ein COMMIT WORK mache?

Re: Wie benutze ich COMMIT WORK richtig

Beitrag von DeathAndPain (Top Expert / 1806 / 214 / 396 ) »
Die 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.

Re: Wie benutze ich COMMIT WORK richtig

Beitrag von ABAPlerv (ForumUser / 73 / 23 / 1 ) »
DeathAndPain hat geschrieben:
19.04.2024 11:10
Die 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.
Fehler ist, wenn ich vom BAPI in der Returntable eine Nachricht von Typ AEX habe.
Muss ich ein ROLLBACK machen, wenn ich nur diesen einen BAPI aufrufe und Fehler von Typ AEX habe? Kann ich direkt mit der nächsten Bestellung weitermachen, weil sowieso nichts in der Datenbank gespeichert wird bei dieser Fehlermeldung?

Hier 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/

Re: Wie benutze ich COMMIT WORK richtig

Beitrag von ewx (Top Expert / 4789 / 295 / 629 ) »
ABAPlerv hat geschrieben:
19.04.2024 13:43
Hier 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/
SEIN Programm ist dann auch zu Ende. DU machst mehrere Aufrufe. Von daher würde ich im Fehlerfall immer den BAPI_TRANSACTION_ROLLBACK aufrufen.

Denke auch daran, dass dein Programm einfach zwischendrin abbrechen kann. Wenn du die Protokollierung oder andere Nacharbeiten erst sammelst und am Ende durchführst, hast du Belege gebucht, aber im schlimmsten Fall kein Protokoll...!

Re: Wie benutze ich COMMIT WORK richtig

Beitrag von DeathAndPain (Top Expert / 1806 / 214 / 396 ) »
ABAPlerv hat geschrieben:
19.04.2024 13:43
Muss ich ein ROLLBACK machen, wenn ich nur diesen einen BAPI aufrufe und Fehler von Typ AEX habe?
Nein. Wenn der BAPI gescheitert ist, hat er nichts geschrieben, das zurückge"rollt" werden müsste.
ABAPlerv hat geschrieben:
19.04.2024 13:43
Kann ich direkt mit der nächsten Bestellung weitermachen, weil sowieso nichts in der Datenbank gespeichert wird bei dieser Fehlermeldung?
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.

Einen Rollback brauchst Du dann und nur dann, wenn Du vorher schon Datensätze geschrieben hast, deren Schreiben geklappt hat, die Du aber auch mit rückabwickeln möchtest, weil sie durch Deinen Fehler keinen Sinn ergeben.

Frei erfundenes Beispiel: Du verringerst Deinen Lagerbestand um 1: erfolgreich. Dann schreibst Du den zugehörigen Warenausgang in die Datenbank: fehlgeschlagen. Dann willst Du auch den Lagerbestand (bis zur Klärung und Behebung des Sachverhalts) nicht verringert haben, daher machst Du einen ROLLBACK, der auch die erste Buchung rückgängig macht.

Hat hingegen beides geklappt, machst Du einen COMMIT, denn danach fängst Du mit der nächsten Buchung an, die mit diesem Vorgang nichts zu tun hat. Scheitert diese nächste Buchung, willst Du die erfolgreiche Bestandssenkung + Warenausgang nicht auch mit rückabwickeln. Ein ROLLBACK wickelt rück ab bis zum vorhergehenden COMMIT. Daher bestätigst Du mit einem COMMIT, dass Dein "Paket" zusammengehöriger Buchungen vollständig ist und in die Datenbank geschrieben werden darf, egal was danach dann noch scheitern mag.
black_adept hat geschrieben:Von daher würde ich im Fehlerfall immer den BAPI_TRANSACTION_ROLLBACK aufrufen.
Ich muss gestehen, dass ich nie verstanden habe, was der Vorteil dieses BAPIs gegenüber einem gewöhnlichen Befehl ROLLBACK WORK sein soll.

Re: Wie benutze ich COMMIT WORK richtig

Beitrag von msfox (Specialist / 313 / 50 / 64 ) »
rob_abc hat geschrieben:
19.04.2024 08:12
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.
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.
Ein WAIT lässt man bei der DialogVerarbeitung weg, weil der Anwender da nicht warten soll.
Ohne WAIT bei Batch, da hier die Wartezeit egal ist.
So macht es jedenfalls das BDT.
--
Und wenn man mit BAPI's arbeitet, dann nimmt man immer den FUba BAPI_TRANSACTION_COMMIT. Denn dieser macht intern nicht nur ein COMMIT, sondern verarbeitet/löscht auch noch Memories u.ä.
Muss ich ein ROLLBACK machen, wenn ich nur diesen einen BAPI aufrufe und Fehler von Typ AEX habe?
Nein. Wenn der BAPI gescheitert ist, hat er nichts geschrieben, das zurückge"rollt" werden müsste.
Woher weißt du, dass ein BAPI nichts schreibt, wenn er eine Fehlermeldung liefert?
Schon zur Sicherheit macht man bei einem Fehler immer ein ROLLBACK. Der BAPI ist eine BLACK-BOX, wo man nicht weiß, was er macht...

Code: Alles auswählen.

was der Vorteil dieses BAPIs gegenüber einem gewöhnlichen Befehl ROLLBACK WORK sein soll.
Vermutlich kein Vorteil, weil der BAPI auch nur eine ROLLBACK absetzt. Hab jetzt aber den Quellcode nicht noch einmal kontrolliert. Vielleicht hat die SAP auch was erweitert... Bei BAPI_TRANSACTION_COMMIT ist das schon entscheidender. Siehe oben...

Re: Wie benutze ich COMMIT WORK richtig

Beitrag von DeathAndPain (Top Expert / 1806 / 214 / 396 ) »
msfox hat geschrieben:
20.04.2024 19:31
Woher weißt du, dass ein BAPI nichts schreibt, wenn er eine Fehlermeldung liefert?
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.

Wenn ich einem BAPI die Anweisung gebe, einen logischen Informationsblock zu verbuchen und in die Datenbank wegzuschreiben, dann muss ich davon ausgehen können, dass er das entweder erledigt oder einen Fehler feststellt und daraufhin gar nichts verbucht, aber nicht, dass er möglicherweise die Hälfte verbucht und mir dann ohne Rollback eine Fehlermeldung zurückliefert und die Kontrolle zurückgibt. Ein solcher BAPI wäre der ultimative unprofessionelle Schrott und daher grundsätzlich zu meiden, weil man dann unterstellen muss, dass er auch in anderer Hinsicht unzuverlässig ist und nichts taugt.

Selbst wenn der BAPI einen Bug enthalten und dadurch komplett crashen würde (ABAP Dump), würde das intern automatisch einen Rollback auslösen. Er müsste also schon so dämlich geschrieben sein, meinem aufrufenden Code halb verbucht koordiniert die Kontrolle zurückzugeben. So einen Müll habe ich bei der SAP zum Glück noch nicht erlebt.

Re: Wie benutze ich COMMIT WORK richtig

Beitrag von msfox (Specialist / 313 / 50 / 64 ) »
DeathAndPain hat geschrieben:
20.04.2024 19:54
Ein solcher BAPI wäre der ultimative unprofessionelle Schrott und daher grundsätzlich zu meiden,
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.

Folgende Benutzer bedankten sich beim Autor msfox für den Beitrag:
ewx


Re: Wie benutze ich COMMIT WORK richtig

Beitrag von ABAPlerv (ForumUser / 73 / 23 / 1 ) »
Danke euch.

Das heißt zur Sicherheit, nehme ich nach einem Fehlschlagen von BAPI immer ein ROLLBACK.

Re: Wie benutze ich COMMIT WORK richtig

Beitrag von DeathAndPain (Top Expert / 1806 / 214 / 396 ) »
Ein Fehler ist das auf keinen Fall.
msfox hat geschrieben:
21.04.2024 09:47
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.
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.
msfox hat geschrieben:
21.04.2024 09:47
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.
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.

Re: Wie benutze ich COMMIT WORK richtig

Beitrag von black_adept (Top Expert / 3953 / 105 / 886 ) »
msfox hat geschrieben:
20.04.2024 19:31
Und wenn man mit BAPI's arbeitet, dann nimmt man immer den FUba BAPI_TRANSACTION_COMMIT. Denn dieser macht intern nicht nur ein COMMIT, sondern verarbeitet/löscht auch noch Memories u.ä.
@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.
In seltenen Fällen/BAPIS hilft aber selbst das nicht, so dass es dann zu Fehlermeldungen beim erneuten Aufruf des BAPIs kommt weil SAP ( oder der Kunde durch tolle Erweiterungen) vergessen hat etwas zu initialisieren. In solchen Fällen muss man als Ultima Ratio zu weiteren Maßnahmen greifen, um sicherzustellen, dass jeder BAPI ( evlt. BAPISequenz) vollständig initialisiert wird.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Vergleichbare Themen

9
Antw.
4886
Views
Wie benutze ich den Funktionsbaustein richtig?
von SteveOh » 16.06.2010 13:34 • Verfasst in ABAP® für Anfänger
11
Antw.
558
Views
COMMIT WORK
von retsch » 25.05.2023 07:40 • Verfasst in ABAP® für Anfänger
3
Antw.
2905
Views
Commit work im Debugger
von c oco » 12.06.2006 16:45 • Verfasst in ABAP® für Anfänger
0
Antw.
1065
Views
Nachrichtenfindung und COMMIT WORK
von schmitzandreas » 21.01.2008 13:25 • Verfasst in ABAP® Core
2
Antw.
4940
Views
COMMIT WORK AND WAIT
von Barney » 21.01.2015 15:02 • Verfasst in ABAP® für Anfänger

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.