ここは旧式の4DドキュメントWebサイトです。最新のアップデートされたドキュメントを読むには新サイトをご利用下さい→ developer.4d.com |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v20.6
OB Copy
|
OB Copy ( object {; resolvePtrs | {; option {; groupWith}}} ) -> 戻り値 | ||||||||
引数 | 型 | 説明 | ||||||
object | オブジェクト, Object Field |
![]() |
構造化されたオブジェクト | |||||
resolvePtrs | ブール |
![]() |
True = ポインターを解決 False または省略時 = ポインターを解決しない | |||||
option | 倍長整数 |
![]() |
ck shared: 共有オブジェクトを返す ck resolve pointers: コピーの前にポインターを解決する |
|||||
groupWith | コレクション, オブジェクト |
![]() |
返されるオブジェクトが所属することになる共有コレクションまたは共有オブジェクト | |||||
戻り値 | オブジェクト |
![]() |
複製されたオブジェクト | |||||
OB Copyコマンドは、 objectのプロパティ、オブジェクト内オブジェクト、値を内包した完全なコピー(ディープコピー)のオブジェクトを返します。
注: object 引数のオブジェクトのプロパティが共有オブジェクトあるいは共有コレクションであった場合、それらのプロパティは返されたコピーの中では標準の(共有でない)オブジェクトになります。共有オブジェクトを返したい場合には第二シンタックスを使用してください(以下参照)
指定時、option 引数には以下のどちらか一方(あるいは両方)の定数を渡すことができます:
オプション | 詳細 |
ck resolve pointers | オリジナルのオブジェクトがポインター型の値を格納している場合、デフォルトではコピー先のオブジェクトもポインターを格納します。しかしながら、ck resolve pointers 定数を渡すことで、コピー時にポインターを解決することごとができます。この場合、オブジェクト内のそれぞれのポインターはコピー時に解決され、解決済みの値が使用されます。 |
ck shared | デフォルトでは、たとえ共有オブジェクトに対して適用された場合でも、OB Copy は通常の(共有でない)オブジェクトを返します。共有オブジェクトを返すためには、ck shared 定数を渡してください。この場合、groupWith 引数を使用して他の共有オブジェクト/共有コレクションに割り当てることもできます(以下参照) |
groupWith 引数を使用すると、返されるオブジェクトを関連づけたいコレクションまたはオブジェクトを指定することができます。
注:
単純な値を格納しているオブジェクトを複製する場合を考えます:
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) //直接複製
APPEND TO ARRAY($arraySel;$ref_value)
//$ref_value の中身は $Object の中身と完全に同じ
NEXT RECORD([Product])
End while
//$ref_value の中身
$JsonString:=JSON Stringify array($arraySel)
ポインターを格納しているオブジェクトを複製する場合を考えます(第一シンタックス):
C_OBJECT($ref)
OB SET($ref;"name";->[Company]name) //ポインターを含むオブジェクト
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) // copy without evaluating pointers
// $ref_comp={"name":"->[Company]name","country":"->[Company]Country"}
$ref_comp2:=OB Copy($ref;True) //解決済みのポインターを含んだコピー
// $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"}...]
通常の(非共有の)$person オブジェクトを、$sharedObject 共有オブジェクトへとコピーしたい場合を考えます。これのためには、まず($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 は通常のオブジェクト
$sharedObject:=New shared object()
$copy:=OB Copy($person;ck shared) //$copy は共有オブジェクト
// 共有オブジェクトになったので$sharedObject に入れることが可能
Use($sharedObject)
$sharedObject.person:=$copy
End use
$obj オブジェクトは("name" プロパティ内に)カレンレコードの"name" フィールドへのポインターを格納しているとします。
C_OBJECT($obj;$objWithPtr;$sharedObjWithPtr)
$obj:=New object()
//$obj はポインターを格納したオブジェクト
OB SET($obj;"name";->[Persons]name)
ALL RECORDS([Persons])
// [Persons] テーブルのカレントレコードがロードされたので、[Persons]name に値がある
//
// $obj オブジェクトを、ポインターを解決した状態の通常のオブジェクトとしてコピーしたい場合
// 以下のように書きます:
$objWithPtr:=OB Copy($obj;True)
//
// $obj オブジェクトを、ポインターを解決した状態の共有オブジェクトとしてコピーしたい場合
// 以下のように書きます:
$sharedObjWithPtr:=OB Copy($obj;ck resolve pointers+ck shared)
$sharedObj オブジェクトを$sharedColl コレクションへとコピーしたい場合を考えます。それぞれ異なる共有グループに所属しているため、直接コピーするとエラーを生成することになります。まず$sharedObj のコピーを作成し、そのコピーを$sharedColl の共有グループとして指定する必要があります。
C_OBJECT($sharedObj;$objCopy)
C_COLLECTION($sharedColl)
//$sharedObj はある共有グループに所属している
$sharedObj:=New shared object("lastname";"Smith";"address";New shared object("city";"New York"))
//$sharedColl は別の共有グループに所属している
$sharedColl:=New shared collection(New shared object("lastname";"Brown"))
$objCopy:=OB Copy($sharedObj;ck shared;$sharedColl)
//$objCopy は$sharedColl と同じ共有グループに属した
//そのため $objCopy は$sharedColl 同じグループに含めてもエラーは起きない
Use($sharedColl)
$sharedColl.push($objCopy)
End use
プロダクト: 4D
テーマ: オブジェクト(ランゲージ)
番号:
1225
初出: 4D v14
変更: 4D v15
変更: 4D v18 R3
変更: 4D v18 R5
ランゲージリファレンス ( 4D v20)
ランゲージリファレンス ( 4D v20.1)
ランゲージリファレンス ( 4D v20.2)
ランゲージリファレンス ( 4D v20.3)
ランゲージリファレンス ( 4D v20.4)
ランゲージリファレンス ( 4D v20.5)
ランゲージリファレンス ( 4D v20.6)