Lade...
 

CX_DATA_CUBE::DataCube

CX_DATA_CUBE::DataCube

Beschreibung:

Diese Funktion vergleicht die Dimensionen aus dem übergebenen Vektor mit den Elementen aus dem Datenfeld "dimensions" (this.dimensions) . Es wird jedes Dimension- Element  mit den Elementen des Vektors verglichen. Die Reihenfolge spielt dabei keine Rolle. Die elementaren Objekte (CX_VALUE ...) werden auf die Gleichheit geprüft, z.B. 2 m = 200 cm, und die komplexe Objekte auf die Objektidentität. Der Vergleich wird als positiv bezeichnet, wenn es zu jedem Element aus dem Vektor (Parameter) ein passendes Element in this.dimensions gibt. 

Fällt dieser Vergleich positiv aus, wird als Ergebnis das aufrufende Objekt (this) zurückgegeben. Bei einem negativen Ergebnis wird den obenbeschriebene Test für die Objekte aus dem  Datenfeld "subMonitors" (this.subMonitors) durchgeführt (d.h. die Funktion DataCube() wird rekursiv aufgerufen). Beim einem positiven Vergleichsergebnis wird das relevante Monitor-Objekt zurückgegeben. 

Die Funktion liefert NULL zurück, wenn kein passende Monitor- Objekt gefunden wurde und der Flag- Parameter der Wert 0 hatte. 

Der Flag- Parameter steuert, ob bei einem negativen Vergleichsergebnis einen neuen Monitor-Objekt erzeugt werden soll. (TRUE=Ja/FALSE=Nein)

Das neue Monitor- Objekt (m) bekommt als Dimensionen (m.dimensions)  das aufrufende Objekt (self) und alle Elemente des übergebene Vektors, gleichzeitig wird das Objekt m bei jedem Dimensionsobjekt (d) registriert und zwar wenn d ein Objekt der CX_MONITOR- Klasse ist, dann im Datenfeld "subMonitors" (d.subMonitors), oder falls d ein Objekt der CX_BUSSINESS_OBJECT- Klasse - im Datenfeld "monitors" (d.monitors). 

 

Achtung: Wird DataCube() auf einem transienten Objekt aufgerufen, dann wird ein transienter Datenwürfel zurückgegeben. Falls dieser durch DataCube() erzeugt wurde, dann ist dieser transiente Datenwürfel in der GarbageCollection angemeldet und muss in einer Variablen oder einem Vektor geschützt werden.

Achtung: Es kann kein transienter Datenwürfel zu einer persistenten Dimension angelegt werden, weil die implizit angelegte Rückreferenz eine Referenz aus dem persistenten in den transienten Speicher bedeuten würde.

 

Programmierhinweis:

Die Methoden DataCube und DataCubeCore sollten immer von dem Objekt - also der Dimension - aufgerufen werden, welche (voraussichtlich) die geringere Anzahl an Monitoren besitzt. Aus Sicht der Performance muss so die kleine Collection durchsucht werden.

Code-Beispiel:
periodBalance Copy(opening.illTime) Dup if { illTimeBalance Swap + illTimeBalance Put } else Drop periodBalance Copy(current.illTime) Dup if { illTimeBalance Swap + illTimeBalance Put } else Drop // Get next balance flextimePeriod Get(term.StartOfPeriod()) Dup 1 Swap Call(AddMonth) -> nextStartDate // Check, if year remains the same [ worktimeAccount nextStartDate Call(Year) ] TRUE worktimeAccount Call(DataCube) Dup yearBalance @ ifnot 1 else 0 -> isNextYearBalance -> yearBalance [ yearBalance nextStartDate Call(Month) ] 3 yearBalance Call(DataCube) -> nextBalance

 

Stack
Stack Position Objekttyp Kurzbeschreibung
Stack(In) Top CX_DATA_CUBE Monitor
  Top-1 INTEGER Soll ein Datenwürfel angelegt werden, wenn keiner gefunden wurde?
  Top-2 VECTOR〈OBJECT〉 Vektor der Dimensionen
Stack(Out) Top CX_LOG_CUBE Ergebnis
Funktionsaufruf: Call(DataCube)