Dies ist die alte 4D Dokumentations-Website. Die neue und aktualisierte Dokumentation finden Sie unter developer.4d.com

Home

 
4D v20 R7
OB Copy

OB Copy 


 

OB Copy ( Objekt {; ZeigerAuflösen | {; Option {; GruppierenMit}}} ) -> Funktionsergebnis 
Parameter Typ   Beschreibung
Objekt  Objekt, Objektfeld in Strukturiertes Objekt
ZeigerAuflösen  Boolean in Wahr = Zeiger auflösen
Falsch oder weggelassen = Zeiger nicht auflösen
Option  Lange Ganzzahl in ck shared: als shared object zurückgeben,
ck resolve pointers: Zeiger vor dem Kopieren auflösen
GruppierenMit  Collection, Objekt in Shared collection oder object mit dem Ergebnisobjekt gruppieren
Funktionsergebnis  Objekt in Kopie von Objekt

Die Funktion OB Copy gibt ein Objekt zurück, das die vollständige (tiefe) Kopie der Eigenschaften, Unterobjekte und Werte für Objekt enthält.

  • Erste Syntax:  OB Copy(object{; resolvePtrs})

Enthält Objekt Werte vom Typ Zeiger, enthält die Kopie standardmäßig auch die Zeiger. Sie können jedoch Zeiger beim Kopieren auflösen, wenn Sie im Parameter ZeigerAuflösen Wahr übergeben. In diesem Fall wird jeder in Objekt verfügbare Zeiger beim Kopieren bewertet und sein aufgelöster Wert verwendet.

Hinweis: Sind Eigenschaften von Objekt shared objects oder collections, werden sie in der zurückgegebenen Kopie zu regulären Objekten oder Collections (not shared). Zur Rückgabe von shared objects/collections verwenden Sie die zweite Syntax:

  • Zweite Syntax:  OB Copy(object{; option{; groupWith}})

Der optionale Parameter Option kann eine oder beide der nachfolgenden Konstanten enthalten:

optionBeschreibung
ck resolve pointersEnthält das ursprüngliche Objekt Werte vom Typ Zeiger, enthält die Kopie standardmäßig ebenfalls Zeiger. Sie können jedoch die Konstante ck resolve pointers übergeben, um Zeiger beim Kopieren aufzulösen. In diesem Fall wird jeder im Objekt verfügbare Zeiger beim Kopieren bewertet und sein aufgelöster Wert verwendet.
ck shared OB Copy gibt standardmäßig ein reguläres Objekt (not shared) zurück, selbst bei Anwendung auf ein shared object. Übergeben Sie die Konstante ck shared, um ein shared object zu erstellen. Dann können Sie es über den Parameter mit einer anderen Collection bzw. Objekt gruppieren (siehe unten).

Mit dem Parameter GruppierenMit können Sie eine Collection oder ein Objekt bestimmen, denen das zurückgegebene Objekt zugeordnet werden soll.

Hinweise: 

  • OB Copy ist mit einem Objekt Entity-Selection verwendbar. Standardmäßig, wenn ck shared weggelassen wird, wird eine non-shareable Entity-Selection zurückgegeben. Ist ck shared übergeben, wird eine gemeinsam nutzbare Entity-Selection zurückgegeben. In diesem Kontext ist GruppierenMit ohne Bedeutung, da eine Entity-Selection keinen locking identifier hat.
  • Das gleiche Prinzip gilt für Entity-Selections, die in Eigenschaften von Objekt gespeichert werden. Der Befehl wird jedoch optimiert, wenn ck shared übergeben ist und eine eingebundene Entity-Selection wird gemeinsam nutzbar: im Ergebnisobjekt wird dieselbe Referenz der Entity-Selection zurückgegeben. 
  • Die Objekte Datastore, Dataclass und Entity sind nicht kopierbar. Ruft der Befehl OB Copy eines dieser Elemente auf, wird ein Nullwert zurückgegeben.

Ein Objekt mit einfachen Werten duplizieren:

 C_OBJECT($Object)
 C_TEXT($JsonString)
 
 ARRAY OBJECT($arraySel;0)
 ALL RECORDS([Product])
 While(Not(End selection([Product])))
    OB SET($Object;"id";[Product]ID_Product)
    OB SET($Object;"Product Name";[Product]Product_Name)
    OB SET($Object;"Price";[Product]Price)
    OB SET($Object;"Tax rate";[Product]Tax_rate)
    $ref_value:=OB Copy($Object//direkt kopieren
    APPEND TO ARRAY($arraySel;$ref_value)
  //der Inhalt von $ref_value ist identisch mit dem Inhalt von $Object
    NEXT RECORD([Product])
 End while
  //Inhalt von $ref_value
 $JsonString:=JSON Stringify array($arraySel)

Ein Objekt mit Zeigern duplizieren (erste Syntax):

 C_OBJECT($ref)
 
 OB SET($ref;"name";->[Company]name) //Objekt mit Zeigern
 OB SET($ref;"country";->[Company]country)
 ARRAY OBJECT($sel;0)
 ARRAY OBJECT($sel2;0)
 
 ALL RECORDS([Company])
 
 While(Not(End selection([Company])))
    $ref_comp:=OB Copy($ref//ohne Bewertung der Zeiger kopieren
  // $ref_comp={"name":"->[Company]name","country":"->[Company]Country"}
    $ref_comp2:=OB Copy($ref;True//mit Bewertung der Zeiger kopieren
  // $ref_comp={"name":"4D SAS","country":"France"}
    APPEND TO ARRAY($sel;$ref_comp)
    APPEND TO ARRAY($sel2;$ref_comp2)
    NEXT RECORD([Company])
 End while
 
 $Object:=JSON Stringify array($sel)
 $Object2:=JSON Stringify array($sel2)
 
  // $Object = [{"name":"","country":""},{"name":"","country":""},...]
  // $Object2 = [{"name":"4D SAS","country":"France"},{"name":"4D, Inc","country":"USA"},{"name":"Catalan","country":"France"}...]

Ein reguläres Objekt (non shared) $person in das shared object $sharedObject kopieren. Dazu müssen wir eine Kopie von shared object erstellen ($sharedObject).

 C_OBJECT($person;$copy;$sharedObject)
 C_TEXT($text)
 
 $text:=Document to text(Get 4D folder(Current resources folder)+"person.txt")
 $person:=JSON Parse($text//$person ist ein reguläres Objekt
 $sharedObject:=New shared object()
 $copy:=OB Copy($person;ck shared) //$copy ist ein shared object
 
  //Es lässt sich in $sharedObject einsetzen
 Use($sharedObject)
    $sharedObject.person:=$copy
 End use

$obj enthält einen Zeiger (Eigenschaft "name") auf das Datenfeld "name" des aktuellen Datensatzes.

 C_OBJECT($obj;$objWithPtr;$sharedObjWithPtr)
 $obj:=New object()
 
  //$obj ist ein Objekt mit einem Zeiger
 OB SET($obj;"name";->[Persons]name)
 
 ALL RECORDS([Persons])
  //Jetzt gibt es einen aktuellen Datensatz in der Tabelle [Persons], so dass [Persons]name gefüllt wird
  //
  // Um das Objekt $obj als Standardobjekt mit Bewertung der Zeiger zu kopieren
  // schreiben wir:
 $objWithPtr:=OB Copy($obj;True)
  //
  // Um das Objekt $obj als shared object mit Bewertung der Zeiger zu kopieren
  // schreiben wir:
 $sharedObjWithPtr:=OB Copy($obj;ck resolve pointers+ck shared)

Wir wollen $sharedObj in $sharedColl kopieren. Da sie aber zu unterschiedlichen Gruppen gehören, führt direktes Kopieren zu einem Fehler. Deshalb machen wir eine Kopie von $sharedObj und weisen $sharedColl der Kopie als shared group zu. 

 C_OBJECT($sharedObj;$objCopy)
 C_COLLECTION($sharedColl)
 
  //$sharedObj gehört zu einer shared group
 $sharedObj:=New shared object("lastname";"Smith";"address";New shared object("city";"New York"))
  //$sharedColl gehört zu einer anderen shared group
 $sharedColl:=New shared collection(New shared object("lastname";"Brown"))
 
 $objCopy:=OB Copy($sharedObj;ck shared;$sharedColl)
  //$objCopy ist jetzt dieselbe shared group wie $sharedColl
 
  //So lässt sich $objCopy ohne Fehler in $sharedColl setzen
 Use($sharedColl)
    $sharedColl.push($objCopy)
 End use



Siehe auch 

OB Get
Shared Objects und Shared Collections

 
EIGENSCHAFTEN 

Produkt: 4D
Thema: Objekte (Sprache)
Nummer: 1225

Dieser Befehl kann in preemptive Prozessen laufen

 
SEITENINHALT 
 
GESCHICHTE 

Erstellt: 4D v14
Geändert: 4D v15
Geändert: 4D v18 R3
Geändert: 4D v18 R5

 
ARTIKELVERWENDUNG

4D Programmiersprache ( 4D v20 R7)