Seite 1 von 1

DataObjects clonen

Verfasst: Di, 27. Apr 2021 11:32
von Klaus Schuster
Moin Leute,

besteht die Möglichkeit ein aus einem Datensatz mittels

Code: Alles auswählen

USqlStatement():New():Select( {{ 1 }} ):From( {{cAlias, "cAlias"}} ):Build():Query( USQL_RESULT_OBJECTS, @aDaten )
erstelltes DataObject (aDaten[1...n]) zu clonen? :copy erstellt eine Referenz auf das Original. Anders als in der Hife angegeben
The values contained in the member variables may be different, however.
werden Änderungen in der Kopie im Original vorgenommen. Ich behelfe mir mit

Code: Alles auswählen

FUNCTION DaoClone( oDaten )

   LOCAL aMembers := oDaten:classDescribe( CLASS_DESCR_MEMBERS )
   LOCAL oRetwert := DataObject():new()

   AEval( aMembers, {| aX | oRetwert:setNoIVar( aX[ CLASS_MEMBER_NAME ], oDaten:getNoIVar( aX[ CLASS_MEMBER_NAME ]))})

RETURN( oRetwert )
Dieser Code würde bei komplexeren Inhalten (Array, Objecte) scheitern. Geht es besser?

Re: DataObjects clonen

Verfasst: Di, 27. Apr 2021 12:10
von Jan
Klaus,

ein DataObject kannst Du in eine unabhängige Kopie klonen durch

Code: Alles auswählen

oNeuevariable := oDo:copy()
Jan

Re: DataObjects clonen

Verfasst: Di, 27. Apr 2021 12:14
von Klaus Schuster
Danke Jan,

leider nein. Die Kopie ist nicht unabhängig. Änderungen in der Kopie werden im Original vorgenommen.

Re: DataObjects clonen

Verfasst: Di, 27. Apr 2021 12:26
von Jan
Klaus,

OK, wenn Du in der Richtung arbeitest ist das tatsächlich so. Die Hilfe sagt da ja auch
The object instances created using :copy() are so-called shallow copies. Therefore, member variables referencing values such as arrays and objects are shared between all the instances.
Sorry, hatte das in Deinem Ausgangsposting mißverstanden.

Ich nutze das, um voneinander unabhängige Kopien zu erstellen. Und das klappt sauber.

Jan

Re: DataObjects clonen

Verfasst: Di, 27. Apr 2021 13:52
von Martin Altmann
Klaus,
gehe den Umweg über Var2Bin() und wieder Bin2Var()
Damit sollte das gehen.

Code: Alles auswählen

oNeuevariable := Bin2Var( Var2Bin( oDo:copy() ) )
Ggf. in Einzelschritten

Viele Grüße,
Martin

Re: DataObjects clonen

Verfasst: Di, 27. Apr 2021 15:21
von brandelh
Das scheint mir das Gleiche Problem zu sein, wie bei Arrays mit Referenzen auf andere komplexe Datentypen:

AClone() - Creates a complete copy of a single or multi-dimensional array(). Das bräuchte man auch bei DataObjects.
ACopy() - Copies elements of an array into another array