PlugSpace
PlugSpace
Stack | Position | Beschreibung |
---|---|---|
Stack(In) | Top | ein Objekt / ein Vektor von Objekten |
Stack(Out) | Top | - |
Die Objekte vom Stack werden als Plug-Space registriert. 'Plug-Space' bezeichnet einen Kontext für die Vermittlung von Parametern, wie sie bei der Berechnung von Formeln (Klasse CX_FORMULA), beim Suchen in Conditioned Bags (Klasse CX_CONDITIONED_BAG), bei Aufruf der Anweisung Plug und bei der Makro-Substitution in Zeichenketten benutzt wird.
Jeder Aufruf von PlugSpace setzt den 'Plug-Space' neu, d.h. die Funktion arbeitet nicht additiv; mit anderen Worten: ein neuer 'Plug-Space' ersetzt den alten. Damit Objekte sich wie in der Abbildung unten überlagern können, müssen die Objekte vorher in einem Vektor gesammelt werden. Dieser Vektor wird dann für PlugSpace auf den Stack gebracht. Anschließend befinden sich alle Objekte des Vektors im 'PlugSpace'. Hierbei gilt: Das Objekt, was zuletzt dem Vektor hinzugefügt wurde, liegt im 'PlugSpace' ganz oben und wird bei der Auswertung zuerst gesehen. Siehe Beispiel.
Der PlugSpace wird zusammen mit dem InstantView-Stack nach jedem Toplevel-Event wieder geleert. Ein neues Widget-Event kann also davon ausgehen, dass der PlugSpace anfangs nicht gesetzt ist. Dies gilt übrigens auch für die asynchrone Auswertung der ListView-Formate.
Ein praktisches Beispiel für die Benutzung des Plugspaces ist die Ermittlung von Datumsfeldern in Aufträgen und Auftragspositionen.
Der Auftrag besitzt eine Gruppenposition, die wiederum eine Auftragsposition enthält.
Auf dem Auftrag steht ein Lieferdatum "01.09.2008", die Gruppe enthält aber ein abweichendes Datum (07.08.2008), da sie früher geliefert werden soll, als der komplette Auftrag ausgeliefert sein soll. Die Position hat kein eigenes Lieferdatum.
Das Lieferdatum wird an allen Objekten als "delivered.spanDate" gespeichert.
Soll nun für die Position das Lieferdatum ermittelt werden, so wird über die Positionsstruktur ein Vektor aufgebaut und in den PlugSpace gestellt, auf dem dann der Befehl Plug(delivered.spanDate) aufgerufen wird. Er liefert das "unterste" Lieferdatum, nämlich in diesem Beispiel das der Gruppe (07.08.2008).
Der Vektor besitzt an oberster Stelle (höchste Priorität) die Auftragsposition, dann die Auftragsgruppe und zuletzt den Auftrag selbst.
Jetzt wird beim Befehl Plug geschaut, ob das Objekt der höchsten Priorität das gesuchte Datenfeld "delivered.spanDate" besitzt.
Wenn nicht, wird das Objekt mit der nächst höheren Priorität durchsucht. Sollte dies ebenfalls nicht das gesuchte Datenfeld enthalten, wird so immer weiter nach "oben" gesucht, bis alle Objekte des PlugSpaces geprüft wurden.
Nicht nur der Befehl "Plug" benutzt den PlugSpace, sondern auch Berechnungen wie "Evaluate" oder die Verbuchungsregeln wie "Transaktionsbeschreibungen" und "Geschäftsprozesse".
Die Priorität des PlugSpace-Vektors ist folgendermaßen steuerbar: Das Objekt, was zuletzt in den Vektor eingefügt wurde, hat die höchste Priorität.
Wenn man nun vom Auftrag die Position holt, dann ihre übergeordnete Gruppe und zuletzt den Auftrag, wäre die Reihenfolge genau falsch herum. Es reicht nun, den Vektor durch den Befehl "Revert" einfach "umzudrehen":
Beispiel:
// Collect plug space vector
[] -> plugSpaceVector
orderItem
do
Dup plugSpaceVector Insert
Get(transaction) Dup ifnot { Drop break }
loop
// Turn around vector priority (Revert) and set PlugSpace
plugSpaceVector Revert PlugSpace
// Check value
Plug(delivered.spanDate)
// Result = Delivery date in priority of "from bottom to the top"
Ein einfacheres Beispiel:
Var(plugSpaceVector, txn1, txn2, txn3) // Variablen setzen CreateTransObject(CX_TRANSACTION) -> txn1 CreateTransObject(CX_TRANSACTION) -> txn2 CreateTransObject(CX_TRANSACTION) -> txn3 "Priorität 1" txn1 Put(comment) "Priorität 2" txn2 Put(comment) "Priorität 3" txn3 Put(comment) // Plugspace Vektor initialisieren [] -> plugSpaceVector // Plugspace Vektor zusammensuchen, das Objekt mit der höchsten Priorität wird zuletzt eingefügt txn3 plugSpaceVector Insert txn2 plugSpaceVector Insert txn1 plugSpaceVector Insert // PlugSpace setzen plugSpaceVector PlugSpace // Wert ermitteln lassen Plug(comment) // Ergebnis = "Priorität 1" // ############ Jetzt drehen wir den Vektor einmal um und machen den selben Aufruf ############## // PlugSpace setzen plugSpaceVector Revert PlugSpace // Wert ermitteln lassen Plug(comment) // Ergebnis = "Priorität 3" // ## Jetzt löschen wir vom dritten Objekt den Slot comment und machen den selben Aufruf ## txn3 DeleteSlot(comment) // Wert ermitteln lassen - Der PlugSpace braucht nicht neu gesetzt werden, da sich in ihm ja nur Referenzen auf die enthaltenen Objekte befinden. Wenn also ein Objekt verändert wird, hat dies auch Auswirkungen auf den PlugSpace Plug(comment) // Ergebnis = "Priorität 2"
Technische Beschreibung:
Beispiel 1:
1.a) Objekte A und B als PlugSpace registrieren:
[ B A ] PlugSpace
Stack | Position | Beschreibung | |
---|---|---|---|
Stack | Top | ] | |
|
A | ||
Top - 2 | B | ||
Top - 3 | [ |
1.b) Die folgende Abbildung zeigt die Rolle der Objekte im PlugSpace bei der Auswertung einer Formel:
Var(f) CreateTransObject (CX_FORMULA) -> f
" if (c < Date(\"today\")) b + 5 € else a / 2 m * 3 € " f Put
f Call (Evaluate)
Beispiel 2:
2.a) Objekte A, B und C als PlugSpace registrieren:
[ C B A ] PlugSpace
Stack | Positionen | Beschreibung | |
---|---|---|---|
Stack | Top | ] | |
|
A | ||
Top - 2 | B | ||
Top - 3 | C | ||
Top - 4 | [ |
2.b) Die folgende Abbildung zeigt die Rolle der Objekte im PlugSpace bei der Auswertung einer Formel:
Var(f) CreateTransObject (CX_FORMULA) -> f
" if ( ptr.name != “ABC” & e = links) 25 + sin( X * pi ) else ::Foo( X, Y ) " f Put
f Call (Evaluate)
Die Belegungen des PlugSpace bleibt bestehen bis
- zur nächsten Anweisung PlugSpace, PlugSpacePush, PlugSpacePop
Darüber hinaus können Funktionen der Objekte des CyberEnterprise® den PlugSpace modifizieren.
Suche im PlugSpace, Reihenfolge der Suche: