Verständnisfrage "New object" und "New collection"

Hallo,

wie bereits erwähnt, habe ich nur eine Verständnisfrage.
Sorry, ich glaube ich stehe auf dem Schlauch und sehe die Lösung einfach nicht.

In der Doku ist folgendes erklärt:

Die Funktion New object erstellt ein neues leeres oder vorab gefülltes Objekt und gibt seine Referenz zurück.
Die Funktion New collection erstellt eine neue leere oder vorgefüllte Collection und gibt ihre Referenz zurück.

  1. Wo wird das Object bzw. die Collection speichertechnisch erstellt ?
  2. Was wird in einem Object-Feld eigentlich gespeichert ?

Ich hänge gedanklich gerade an folgendem Beispiel.
a.) Wenn ich oXXX ändere, ändert sich auch das Feld. Wird die Referenz im Feld gespeichert ?
b.) Wenn ich den Befehl beende (lokale Variable wird gelöscht) bleibt der Inhalt im Feld. Wird der Inhalt im Feld gespeichert ?

C_Object($oXXX)
$oXXX := New object
[Datei]Feld := $oXXX

Vielen Dank für eine Antwort.

Hallo,

Objekte und Collections werden im Heap erstellt und geben nur eine
Referenz zurück. Eine Zuweisung kopiert nie das Objekt, sondern nur
die Referenz. Es kommt hier Ref-Counting zum Einsatz.

Bei Feldern gibt es einen Sonderfall: ein Objekt in einem Objektfeld
muss immer explizit zugewiesen und ausgelesen werden.

: Werner CHMIEL

a.) Wenn ich oXXX ändere, ändert sich auch das Feld. Wird die
Referenz im Feld gespeichert ?

Nein, es wird im Grunde eine Kopie erstellt. Sie müssen das Objekt (auch nach Änderung) immer zuweisen, um eine Änderung im Objektfeld zu erzwingen.

: Werner CHMIEL

b.) Wenn ich den Befehl beende (lokale Variable wird gelöscht)
bleibt der Inhalt im Feld. Wird der Inhalt im Feld gespeichert ?

Ja, da ja praktisch eine Kopie erstellt wurde.

Beispiel:

[Datei]Feld := $oXXX
$oXXX.meinNeuesAttribut:=“Hallo”

[Datei]Feld und $oXXX.meinNeuesAttribut sind unterschiedlich. Nur $oXXX hat das neue Attribut.

Hallo,

[Datei]Feld := $oXXX
$oXXX.meinNeuesAttribut:=“Hallo”
[Datei]Feld und $oXXX.meinNeuesAttribut sind unterschiedlich. Nur $oXXX hat das neue Attribut.

Genau über diesen Fall bin ich gestolpert.
Das Feld hat bei mir nun auch “meinNeuesAttribut”.
Kann es sein, dass erst mit “Save Record” eine “Kopie” dauerhaft in dem Feld gespeichert wird.
Das Feld in einem Prozess aber mit der Referenz “verbunden” ist.

Hallo,

Kommando zurück. Zu meiner Schand muss ich gestehen, dass ich das nicht getestet hatte.

Wenn Sie ein C_OBJECT einem Objektfeld zuordnen, dann verhält es sich, als wäre es eine Variable. Dies gilt natürlich nur für den aktuellen Datensatz.

Wenn Sie das Feld direkt beschreiben:

Code :
ALL RECORDS([Tabelle_1])
[Tabelle_1]Objektfeld.neuesAttribut:=“test”
SAVE RECORD([Tabelle_1])
LOAD RECORD([Tabelle_1])

dann wird das Objektfeld bzw. der Datensatz korrekt gesichert (war mit v16R5 nicht so).

Hallo,

OK. Das kann ich mir jetzt vorstellen :slight_smile:

Vielen Dank !