ich stecke gedanklich in einer Sackgasse bei folgendem Problem:
Wenn ein User im Dialog ein Material kalkuliert, sollen weitere Kalkulationen über eine Tabelle angelegt werden. Dazu rufe ich in einer Erweiterung beim Sichern der CK11N einen FB auf, der zuerst prüft oder diese Kalkulation relevant ist und loopt dann über eine Tabelle mit folgenden Feldern:
mit folgenden beispielhaften Inhalt:
1 PPC1 5051 ZPC1 5051
2 PPC1 5051 PPC1 5752
3 PPC1 5752 ZPC1 5752
Beim der ersten manuellen Kalkulation wird dann Eintrag 1 verarbeitet und eine ZPC1 erstellt. Beim 2. Loop wird dann die PPC1 in 5752 angelegt usw.
Aber: schon beim ersten Loop wird der FB wieder aufgerufen und loopt die Tabelle parallel zum anderen Prozess wieder ab, somit hätte ich eine Endlosschleife.
Ich müsste also sicherstellen, dass die Tabelle nur beim ersten Aufruf abgearbeitet wird, bei dem Zweiten dann nicht mehr. Ich habe schon an eine statische Klasseninstanz gedacht die ich abfrage, aber wie halte ich die bei parallel ausgeführten Transaktionen von Usern dann auseinender? Statische Variable mit Username?
Hat jemand vielleicht einen Tipp für meinen Knoten im Hirn?
Ich habe übers Wochenende nochmal nachgedacht und Google gequält, im Endeffekt muss ich mir nur Material, Kalk.variante und Werk merken das gerade prozessiert wird, einen zweiten Start kann ich damit verhindern. Die Frage war jetzt aber, wo ich das verwalte. Optionen sind Klasse mit statischem Attribut, MEMORY, SHARED MEMORY oder Datenbanktabelle. Dabei bin ich über den Post eines Users hier im Forum gestolpert:(https://www.abapforum.com/forum/viewtopic.php?t=25457
Da ich einen FB mit starting new Task aufrufe habe ich keinen Zugriff mehr auf die Klasse mit statischem Attribut und auch nicht auf IMPORT/EXPORT - MEMORY. Dann bleibt also nur Shared Memory oder eine DB Tabelle in der ich den aktuellen Status der Kalkulationserweiterung verwalte samt Sperrobjekt. Da ich die Datenbankabfrage in meinem FB mache, würde die Laufzeit nicht auf Kosten der Kalkulation selbst gehen.