ich schreibe ein Programm das Projektstrukturen im PS über das SAP-Programm R_BAPI_PROJECT_MAINAIN anlegt.
Soweit so gut nur muß ich dieses SAP-Programm aus meinem Programm mehrmals in einem Modus aufrufen. Hier beginnt der Ärger das der Rollbereich nicht richtig initialisiert wird.
D.h. ich kann das Projekt A anlegen, wenn ich dann aber gleich danach das Projekt B anlege bekomme ich von dem obigen SAP-Programm eine Fehlermeldung die besagt das das Projekt A schon angelegt ist.
Im OSS gibt es mehrere Hinweise dazu, in einem heißt es wörtlich:
"Beim erneuten Aufruf der BAPIs wird der Rollbereich nicht geputzt. Aus diesem Grund war nicht sichergestellt, daß innerhalb der gleichen Session alle Tabellen und globale Daten zurückgesetzt wurden."
Was genau hat es mit diesem Rollbereich auf sich? Gibt es im ABAP selbst irgendeine Möglichkeit diesen Bereich zu löschen?
beim Aufruf eines APAP-Programmes (Moduls, Funktionsbausteins etc.) bleibt das ganze Coding bis zum Schluß im Hauptspeicher.
Wenn ein Programm (s.o.) globale Daten benutzt, greift es beim zweiten und folgenden Start (oder Benutzung) auf schon vorhandene Daten zu.
Beim Funktionsbaustein nennt man das auch das "Gedächtnis". Meistens wird das bewußt benutzt, um z.B. schon einmal gelesene Daten zu puffern.
Manchmal kommt aber ein Programm beim zweiten Aufruf durcheinander weil der Programmierer irgendwie etwas vergessen hat wieder zu initialisieren oder sonstwas.
Beim Bapi muß man ggf. noch ein BAPI_xxx_SAVE oder ein BAPI_COMMIT hinterherschieben (so ist es zumindest bei den PM-Meldungen), damit das CREATE-BAPI von neuem arbeiten kann.
Der Rollbereich wird vom System verwaltet, um den muß man sich nicht kümmern.
Es liegt entweder ein Fehler im Bapi vor, oder das Bapi muß anders bedient werden, oder die Aufrufsequenz ist nicht korrekt.
du kannst das Problem durchaus selbst lösen, indem du jeden Aufruf des BAPI-FB jeweils in einem neuen Modus ausführst. Dazu benötigst du ein kleines Hilfsprogramm, dass du mit SUBMIT aufrufst und über zwei Parameter einen Programmnamen und den Namen einer Form-Routine mitgibst. Dieses Programm macht nichts anderes als die mitgegebene Form-Routine in dem mitgegebenen Programm aufzurufen.
Die Vorgehensweise ist wie folgt.
- Alle für den jeweiligen Aufruf erforderlichen Daten mit EXPORT TO MEMORY speichern
- Dann das besagte Hilfsprogramm per Submit aufrufen. (Als Programmnamen gibst du sinnvollerweise, das aktuelle Programm an)
- Dieses Hilfs-Programm ruft nun die entsprechende Form-Routine auf
- In dieser Form-Routine musst du mit IMPORT FROM MEMORY die Daten wieder "einlesen"
- Jetzt kannst du den BAPI-FB aufrufen. Durch den Submit bist du dann immer in einem neuen Modus und der BAPI wird immer wieder "jungfräulich" ausgeführt.
Dieses Verfahren nutzen wir bereits einige Male, da es das Problem mit einigen BAPIs und Funktionsbausteinen gibt.