DataObjects clonen

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
Benutzeravatar
Klaus Schuster
Foren-Administrator
Foren-Administrator
Beiträge: 366
Registriert: Do, 24. Jan 2008 10:01
Wohnort: 90762 Fürth
Hat sich bedankt: 9 Mal
Danksagung erhalten: 9 Mal

DataObjects clonen

Beitrag 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?
Gruß Klaus
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: DataObjects clonen

Beitrag von Jan »

Klaus,

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

Code: Alles auswählen

oNeuevariable := oDo:copy()
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Klaus Schuster
Foren-Administrator
Foren-Administrator
Beiträge: 366
Registriert: Do, 24. Jan 2008 10:01
Wohnort: 90762 Fürth
Hat sich bedankt: 9 Mal
Danksagung erhalten: 9 Mal

Re: DataObjects clonen

Beitrag von Klaus Schuster »

Danke Jan,

leider nein. Die Kopie ist nicht unabhängig. Änderungen in der Kopie werden im Original vorgenommen.
Gruß Klaus
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: DataObjects clonen

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: DataObjects clonen

Beitrag 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
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: DataObjects clonen

Beitrag 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
Gruß
Hubert
Antworten