Este é o site histórico da documentação 4D. As documentações estão sendo movidas progressivamente para developer.4d.com

Página Inicial

 
4D v20 R7
OB Copy

OB Copy 


 

OB Copy ( objeto {; resolvePont | {; opção {; groupWith}}} ) -> Resultado 
Parâmetro Tipo   Descrição
objeto  Objeto, Campo Objeto in Objeto estruturado
resolvePont  Booleano in True = resolve os ponteiros, False ou se omitido = não resolve ponteiros
opção  Inteiro longo in ck shared: retorna um objeto partilhado,
ck resolve pointers: resolve os ponteiros antes de copiar
groupWith  Collection, Objeto in Coleção partilhada ou objeto para ser agrupado com o objeto retornado
Resultado  Objeto in Cópia de objeto

O comando OB Copy devolve um objeto que contém uma cópia completa das propriedades, sub objetos e valores de objeto.

  • Primeira sintaxe:  OB Copy(object{; resolvePtrs})


Se o objeto conter valores de tipo de ponteiro, por padrão a cópia também contém os ponteiros. No entanto, pode resolver os ponteiros ao momento da cópia passando True no parâmetro resolvePont. Neste caso, cada ponteiro presente como valor em objeto se avalia ao momento da cópia e utiliza seu valor não referenciado.

Nota: se propriedades de objeto são objetos compartilhados ou coleções compartilhadas, eles se tornam objetos ou coleções padrão (não compartilhados) na cópia retornada. Use a segunda sintaxe se quiser retornar elementos partilhados (ver abaixo)

  • Segunda sintaxe:  OB Copy(object{; option{; groupWith}})

Se passado, o parâmetro opção pode conter uma das constantes abaixo (ou ambas):

opçãoDescrição
ck resolve pointersse o objeto original conter valores de tipo ponteiro, como padrão a cópia também contém os ponteiros. Entretanto, pode resolver os ponteiros quando copiar (passando  ck resolve pointers. Neste caso, cada ponteiro presente no objeto é avaliado quando copiar e  seu valor sem referência for usado.
ck sharedcomo padrão OB Copy retorna um objeto normal (não partilhado), mesmo se o comando for aplicado para um objeto partiilhado. Passe a constante ck shared para criar um objeto partilhado. Nesse caso, pode usar o parâmetro groupWith para associar o objeto partilhado com outra coleção ou objeto (ver abaixo).

O parâmetro groupWith permite que determine uma coleção ou um objeto com o qual o objteo resultante deveria ser associado.

Notas: 

  • OB Copy pode ser usado com um objeto de seleção de entidades. De forma predeterminada, se omitir ck shared, se devolve uma selección de entidades não compartida. Se passar ck shared, se devolve uma seleção de entidades compartida. Neste contexto, a opção agruparCom é inútil já que uma seleção de entidades não tem um identificador de bloqueio.
  • O mesmo principio se aplica às seleções de entidades armazenadas dentro das propriedades de objeto. Entretanto, o comando se otimiza quando se passa ck shared e uma seleção de entidades aninhada é compaível: a mesma referência de seleção de entidades se devolve no objeto resultante.
  • Os objetos almazém de dados, a classe de dados e  entidade não podem ser copiados. Se chamar ao comando OB Copy com eles, se devolve um valor Null.

 

 

 

Você quer duplicar um objeto que contém valores simples:

 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//direct copy
    APPEND TO ARRAY($arraySel;$ref_value)
  //o conteúdo de $ref_value é idêntico ao do $Object
    NEXT RECORD([Product])
 End while
  //o conteúdo de $ref_value
 $JsonString:=JSON Stringify array($arraySel)

Duplique um objeto que contenha ponteiros:

 C_OBJECT($ref)
 
 OB SET($ref;"name";->[Company]name) //object with pointers
 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//copy with evaluation of pointers
  // $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"}...]

Para copiar o objeto normal (não compartilhado) $person no objeto partilhado $sharedObject, precisamos criar uma cópia partilhada do objeto ($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 é um objeto padrão
 $sharedObject:=New shared object()
 $copy:=OB Copy($person;ck shared) //$copy é um objeto padrão
 
  //assim pode ser copiado em  $sharedObject
 Use($sharedObject)
    $sharedObject.person:=$copy
 End use

$obj contém um ponteiro (propriedade "name") no registro atual do campo "name".

 C_OBJECT($obj;$objWithPtr;$sharedObjWithPtr)
 $obj:=New object()
 
  //$obj é um objeto com um ponteiro
 OB SET($obj;"name";->[Persons]name)
 
 ALL RECORDS([Persons])
  //Agora há um registro atual na tabela [Persons] de forma que [Persons]name é preenchido
  //
  // Se quisermos copiar $obj como um objeto padrão com avaliação de ponteiros
  // fazemos isto:
 $objWithPtr:=OB Copy($obj;True)
  //
  // Se quisermos copiar $obj como um objeto compartilhado com avaliação de ponteiros
  // fazemos isto:
 $sharedObjWithPtr:=OB Copy($obj;ck resolve pointers+ck shared)

Imagine que queira copiar $sharedObj em $sharedCol mas como eles pertencem a grupos compartilhados diferentes, uma cópia direta resultaria em um erro. Primeiro deve copiar $sharedObj e designar $sharedColl como um grupo compartilhado para a cópia

 C_OBJECT($sharedObj;$objCopy)
 C_COLLECTION($sharedColl)
 
  //$sharedObj pertence a um grupo compartilhado
 $sharedObj:=New shared object("lastname";"Smith";"address";New shared object("city";"New York"))
  //$sharedColl pertence a outro grupo partilhado
 $sharedColl:=New shared collection(New shared object("lastname";"Brown"))
 
 $objCopy:=OB Copy($sharedObj;ck shared;$sharedColl)
  //$objCopy agora está no mesmo grupo partilhado que  $sharedColl
 
  //assim $objCopy pode ser copiado em  $sharedColl sem erros
 Use($sharedColl)
    $sharedColl.push($objCopy)
 End use



Ver também 

OB Get
Objetos compartidos e Coleções compartidas

 
PROPRIEDADES 

Produto: 4D
Tema: Objetos (Linguagem)
Número 1225

This command can be run in preemptive processes

 
CONTEÚDO DA PÁGINA 
 
HISTÓRIA 

Criado por: 4D v14
Modificado: 4D v15
Modificado: 4D v18 R3
Modificado: 4D v18 R5

 
ARTICLE USAGE

Manual de linguagem 4D ( 4D v20 R7)