Laufzeitfehler NESTED_PERFORM_ON_COMMIT

Der Laufzeitfehler tritt auf, wenn in einem Unterprogramm, welches per PERFORM ON COMMIT aufgerufen wird, ein weiteres Unterprogramm mit PERFORM ON COMMIT gerufen wird. Diese Seite beschreibt die Hintergründe des Laufzeitfehlers und wie das Problem umgangen werden kann.

Problem (Beispiel)

Mit der Transaktion CO01 wird ein Fertigungsauftrag erstellt. Durch das Sichern des Auftrags werden zunächst im Dialog diverse Prüfungen durchlaufen (1). Ebenso werden verschiedene Unterprogramme mit PERFORM ON COMMIT registriert (2). Durch den Aufruf vom COMMIT WORK werden diese in der Reihenfolge ihrer Registrierung abgearbeitet (3). Der User Exit EXIT_SAPLCOBT_001 wird ebenfalls bei der Abarbeitung der registrierten Unterprogramme verarbeitet. Die Kundenimplementierung des User Exits ruft SAP Funktionsbausteine auf. Einer der Bausteine registriert erneut ein Unterprogramm mit PERFORM ON COMMIT (4). Es wird ein Laufzeitfehler NESTED_PERFORM_ON_COMMIT ausgelöst.

Laufzeitfehler NESTED_PERFORM_ON_COMMIT
Laufzeitfehler NESTED_PERFORM_ON_COMMIT

Lösung

Das Problem lässt sich umgehen, in dem die Funktionen aus dem Unterprogramm P3_1 des Beispiels in einen separaten Funktionsbaustein ausgelagert werden. Dieser Funktionsbaustein muss als Verbuchungsbaustein angelegt werden. Der neue Baustein wird nun per CALL FUNCTION IN UPDATE TASK registriert und somit durch den COMMIT WORK angestoßen. Die ABAP Laufzeitumgebung führt bei einem COMMIT WORK zunächst alle per PERFORM ON COMMIT registrierten Unterprogramme aus. Anschließend werden die Verbuchungsbausteine (CALL FUNCTION IN UPDATE TASK) gestartet. Da der Verbuchungsprozess eine eigene SAP LUW darstellt, können erneut Unterprogramme mit PERFORM ON COMMIT registriert werden.

Der Ablauf ist dann wie folgt:

  1. Verarbeiten der Schritte im Dialog
    1. Registrieren von Unterprogrammen durch PERFORM ON COMMIT
  2. COMMIT WORK
  3. Verarbeiten der registrierten Unterprogramme
    1. Registrieren der neuen Funktion für die Verarbeitung durch den Verbucher
  4. Nach der Abarbeitung der Unterprogramme starten des Verbuchers
  5. Innerhalb der Verbuchung erfolgt die Registrierung von Unterprogrammen durch PERFORM ON COMMIT
  6. Implizites COMMIT WORK am Ende des Verbuchers stößt die Verarbeitung der registrierten Unterprogramme an
  7. weitere Verarbeitung im Dialog
Lösung zum Umgehen des Laufzeitfehlers NESTED_PERFORM_ON_COMMIT
Lösung zum Umgehen des Laufzeitfehlers NESTED_PERFORM_ON_COMMIT

Zusammenfassung

In einem Unterprogramm, welches durch ein COMMIT WORK verarbeitet wird, können keine weiteren Unterprogramme mit PERFORM ON COMMIT registriert werden. Es können aber Verbuchungsbausteine gerufen werden.

Innerhalb des Verbuchungsbausteins können Unterprogramme mit PERFORM ON COMMIT registriert werden. Diese werden beim Verlassen des Verbuchungsbausteins ausgeführt.