Lade...
 

Kopie eines CyberEnterprise®-Objects

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