Kopie eines CyberEnterprise®-Objekts
Mit den InstantView®-Befehlen CopyPersObject und CopyTransObject wird ein neues Objekt erzeugt, das eine Kopie des auf dem Stack übergebenen Ausgangs-Objektes ist.
Die Klasse des Objekts bestimmt, was alles kopiert wird. Bei bestimmten Klassen kann ein Modus angeben werden (erster Parameter), um den Umfang der beim Kopieren zu berücksichtigenden Daten zu bestimmen.
Allgemein gilt für das Kopieren von Objekten:
- Alle in einer Klasse fest definierten (embedded) Datenfelder werden kopiert
- Pointer auf andere Objekte werden nur übernommen, die referenzierten Objekte selbst werden jedoch nicht kopiert
- Alle Einträge von Collections werden übernommen, die referenzierten Objekte selbst werden jedoch nicht kopiert
Basis Klassen
Objekte der primitiven Basis-Klassen (CX_NUMERIC, CX_VALUE, CX_VALUE_PER ..., CX_DATE, CX_SPAN_DATE; ...)
werden vollständig kopiert: Kopie und Original sind vollkommen gleich.
Die folgende Tabelle führt Ausnahmen von dieser Regel und andere, nicht so offensichtliche Fälle für die Basis Klassen auf (CK J, Klasse hat einen eigenen Copy Konstruktor; PC J, Klasse hat eine überladene PersistentCopy() Funktion)
Klasse | abgeleitet von | CK | PC | Mode-Flag | |||
---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | ||||
CX_CONDITIONED_BAG | CX_AMOUNT | J | J | Nur das Datenfeld flags und die Spaltenvariablen werden kopiert | Es werden zusätzlich alle Einträge (CX_FCONDITION / CX_NAMED_FCONDITION) kopiert, ohne allerdings die Referenzen (_object) mitzukopieren | Die Referenzen der Einträge werden übernommen | Die referenzierten Objekte werden mitkopiert |
CX_FCONDITION | CX_AMOUNT, CX_FORMULA | J | J | Nur die Formel wird kopiert | Die Referenz wird übernommen. Ist die CX_FCONDITION persistent und das referenzierte Objekt transient, wird eine persistente Kopie des referenzierten Objekts angelegt. Im umgekehrten Fall wird eine transiente Kopie angelegt. es muss geklärt werden, ob bei primitiva durch Assign() wirklich nur die Referenz übernommen wird (was eigentlich falsch wäre), oder ob eigene Kopien entstehen | Das referenzierte Objekt wird kopiert | |
CX_NAMED_FCONDITION | CX_FCONDITION | J | J | ||||
CX_SUM_AMOUNT | CX_AMOUNT, CX_VECTOR_AMOUNT | ||||||
CX_PRODUCT_AMOUNT | CX_AMOUNT, CX_VECTOR_AMOUNT | ||||||
CX_DATETIME | CX_TERM | ||||||
Klassen abgeleitet von CX_EXPANDABLE
Generell wird für alle von CX_EXPANDABLE abgeleiteten Klassen folgendes Verhalten geerbt:
- Alle Dynamischen Datenfelder (Slots) - die nicht vom Typ RELxx sind - werden übernommen (siehe Copy Konstruktor von CX_FRAME)
- Referenz validity wird übernommen, das die Gültigkeit steuernde Objekt selbst wird jedoch nicht kopiert ( siehe Copy Konstruktor von CX_TERMED)
- Das Datenfeld "uniqueID" wird kopiert
- Das Datenfeld "classID" wird kopiert (wichtig für Pseudo-Klassen)
- Das Datenfeld "domain" wird nicht kopiert, sondern auf den aktuellen Wert gesetzt - siehe SetDomain(..., WRITE)
Von der Klasse CX_STRUCTURED abgeleitete Objekte (alle Business Objekte) kopieren nicht die "structures" collection.
Folgende Objekte sind bzgl. CopyPersObject und CopyTransObject überladen. (CK J, Klasse hat einen eigenen Copy Konstruktor; PC J, Klasse hat eine überladene PersistentCopy() Funktion)
Klasse | C K | P C | Datenfeld | Mode-Flag | ||
---|---|---|---|---|---|---|
0 | 1 | 2 | ||||
CX_SLOT_ATTRIBUTE | J | constraint | nur die Referenz wird übernommen | |||
CX_FORMULA_ATTRIBUTE | J | J | constraint | nur die Referenz wird übernommen | ||
formula | nur die Referenz wird übernommen | nur Referenz | ||||
CX_CONDITIONED_ATTRIBUTE | J | J | constraint | nur die Referenz wird übernommen | ||
attributeTable | wird nicht berücksichtigt | |||||
CX_ATTRIBUTE_SET | J | constraint | nur die Referenz wird übernommen | |||
attributes | referenzierte Objekte werden mit CX_OVERWRITING_REF neu umhüllt | |||||
CX_SINGLE_CHARGE | charge | nur Referenz | referenziertes Objekt kopieren | |||
subCharge | ||||||
CX_SINGLE_ALLOCATION | amount | nur Referenz | referenziertes Objekt kopieren | |||
CX_LEGAL_PERSON | name | wird nicht kopiert | ||||
CX_SCHEDULE | term | wird nicht kopiert | ||||
CX_CALENDAR | term | wird nicht kopiert | ||||
mainPeriod | ||||||
subPeriods | wird nicht kopiert | |||||
CX_STRUCTURE | J | masterStructure | wird nicht kopiert (mit NULL initialisiert) | |||
cast | wird nicht kopiert (mit NULL initialisiert) | |||||
structureEnum | wird kopiert | |||||
attributeSet | nur Referenz wird kopiert | |||||
CX_STATE_STRUCTURE | J | transitions | wird mit mode=1 kopiert, die enthaltenen CX_FCONDITIONS werden mit mode=2 kopiert. | |||
CX_TRANSACTION | transactionStatusEnum | wird nicht kopiert (mit 0 initialisiert) | ||||
transaction | wird nicht kopiert (mit NULL initialisiert) | |||||
txnManagerID | wird nicht kopiert (mit 0 initialisiert) | |||||
monitors | wird nicht kopiert | |||||
CX_COMPOUND_TXN | transactionStatusEnum | wird nicht kopiert (mit 0 initialisiert) | ||||
transaction | wird nicht kopiert (mit NULL initialisiert) | |||||
txnManagerID | wird nicht kopiert (mit 0 initialisiert) | |||||
monitors | werden nicht kopiert | |||||
subTransactions | ||||||
CX_ALLOCATION_TXN | transactionStatusEnum | wird nicht kopiert (mit 0 initialisiert) | ||||
transaction | wird nicht kopiert (mit NULL initialisiert) | |||||
txnManagerID | wird nicht kopiert (mit 0 initialisiert) | |||||
monitors | wird nicht kopiert | |||||
allocation | wird nicht kopiert (mit NULL initialisiert) | |||||
object | ||||||
amount | ||||||
baseAmount | ||||||
attributeSet |
Eine weitere Möglichkeit, eine Objektkopie zu erzeugen, besteht in:
Var(originalObject, copiedObject)
CreatePersObject(Klasse des Original-Objekts) -> copiedObject, originalObject copiedObject Put
oder
CreateTransObject(Klasse des Original-Objekts) -> copiedObject, originalObject copiedObject Put