Lade...
 

PlugSpace

PlugSpace

PlugSpace

Stack
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.

Iv01371
 

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:

Var(plugSpaceVector)
// 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:

Plugspace01
 

1.a) Objekte A und B als PlugSpace registrieren:

[ B A ] PlugSpace

 

Stack
Stack Position Beschreibung
Stack  Top   ]
 

Top - 1

 A 
   Top - 2   B
   Top - 3   [

Plugspace02 De

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)

Plugspace03 De

 

Beispiel 2:

Plugspace04

2.a) Objekte A, B und C als PlugSpace registrieren:

[ C B A ] PlugSpace

 

Stack
Stack Positionen Beschreibung
Stack  Top   ]
 

Top - 1

 A 
   Top - 2   B
   Top - 3  C
   Top - 4   [

Plugspace05 De

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)

 Plugspace06 De

 

  Die Belegungen des PlugSpace bleibt bestehen bis

Darüber hinaus können Funktionen der Objekte des CyberEnterprise® den PlugSpace modifizieren.

Suche im PlugSpace, Reihenfolge der Suche:

Verwandte Themen