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 v19
Entidades

Entidades  


 

 

Uma entidade é um objeto que pode ser visto como uma instância de uma classe de dados, como um registro da tabela que corresponde à dataclass na datastore associada. Entretanto, uma entidade também contém dados correlacionados ao database relacionado à datastore. O propósito da entidade é gerenciar dados (criar, atualizar, deletar). Quando uma referência de entidade é obtida através de uma seleção de entidade, retém informação sobre a seleção de entidade que permite iteração através da seleção.

Há duas maneiras para criar uma nova entidade em uma classe de dados:

  • Já que entidades são referências aos registros de database, pode criar entidades criando registros usando a linguagem 4D "clássica" e então referenciar os registros com métodos ORDA como entity.next( ) ou entitySelection.first( ).
  • Também pode criar uma entidade usando o método dataClass.new( ).

Lembre que a entidade só é criada na memória. Se quiser adicioná-la ao datastore, deve chamar o método entity.save( ).

Atributos de entidade estão disponíveis diretamente como propriedades de um objeto entidade. Para saber mais, veja Usar atributos de entidade.

Por exemplo, se quiser criar uma nova entidade na classe de dados "Employee" na  datastore atual com "John" e "Dupont" atribuido ao primeiro nome e atributos de nome:

 C_OBJECT($myEntity)
 $myEntity:=ds.Employee.new() //Cria um novo objeto do tipo entidade
 $myEntity.name:="Dupont" // atribui 'Dupont' ao atributo 'sobrenome'
 $myEntity.firstname:="John" //atribui 'John' ao atributo 'primeiro nome'
 $myEntity.save() //salva a entidade

Nota: Uma entidade é definida só no processo onde foi criada. Não é possível, por exemplo, armazenar uma referência à uma entidade em uma variável interprocesso e usá-la em outro processo.

Uma entidade contém uma referência ao registro 4D. Entidades diferentes podem referenciar ao mesmo registro 4D. Já que uma entidade pode ser armazenada em uma variável de objeto 4D, variáveis diferentes podem conter uma referência à mesma entidade.

Se executar o código abaixo:

 C_OBJECT($e1;$e2)
 $e1:=ds.Employee.get(1) //acessa o empregado com  ID 1
 $e2:=$e1
 $e1.name:="Hammer"
  //ambas as variáveis $e1 and $e2 partilham a referência à mesma entidade
  //$e2.name contains "Hammer"

Isso é ilustrado pelo gráfico abaixo:

Se executar:

 C_OBJECT($e1;$e2)
 $e1:=ds.Employee.get(1)
 $e2:=ds.Employee.get(1)
 $e1.name:="Hammer"
  //variável $e1 contém uma referênce a uma entidade
  //variável $e2 contém outra referência a outra entidade
  //$e2.name contém "smith"

Isso é ilustrado pelo gráfico abaixo

Note entretanto que entidades referem ao mesmo registro. Se chamar o método entity.save( ), o registro será atualizado (exceto no caso de conflito, ver  Trancar Entidades).

Na verdade, $e1 e $e2 não é a entidade em si mesma, mas a referência à entidade. Significa que pode passá-la diretamente a qualquer função ou método, e vai agir como um ponteiro, mas mais rápido que um ponteiro 4D. Por exemplo:

 For each($entity;$selection)
    do_Capitalize($entity)
 End for each

E a função é:

 $entity:=$1
 $name:=$entity.lastname
 If(Not($name=Null))
    $name:=Uppercase(Substring($name;1;1))+Lowercase(Substring($name;2))
 End if
 $entity.lastname:=$name

Pode gerenciar uma entidade como qualquer objeto em 4D e passar sua referência diretamente como parâmetros

Nota: Não há conceito de "registro atual" como na linguagem 4D clássica com as entidades. Pode usar quantas entidades queiras ao mesmo tempo. Não há lock automático de uma entidade (ver Trancar Entidades). Quando uma entidade for carregada, usa o mecanismo  'Lazy loading', que significa que apenas a informação necessária é carregada. Mesmo assim, em cliente/servidor, a entidade pode ser carregada automaticamente se necessário.

Atributos de entidade armazenam dados e mapeiam campos coincidentes na tabela correspondente. Atributos de Entidade de tipo storage podem ser estabelecidos ou obtidos como propriedades simples como um objeto entidade, enquanto entidade de relatedEntity ou relatedEntities que vai retornar uma entidade ou uma seleção de entidade.

Nota: Para saber mais informação sobre o tipo atributo, veja  Storage attributes and Relation attributes.

Por exemplo, para estabelecer um atributo armazenamento:

 $entity:=ds.Employee.get(1) //obtém atributo employee com ID 1
 $name:=entity.lastname //obtém o nome de empregado, por exemplo. "Smith"
 entity.lastname:="Jones" //estabelece o nome de empregado

Nota: Atributos de imagem não podem ser atribuidos diretamente com que não podem ser atribuidos diretamente com uma dada rota em uma entidade.

Acessar um atributo relacionado depende do tipo de atributo. Por exemplo, com a estrutura abaixo:

Pode acessar dados através dos objetos relacionados:

 $entity:=ds.Project.all().first().theClient //obtém a entidade Company associada ao projeto
 $EntitySel:=ds.Company.all().first().companyProjects //obtém a seleção de projetos para a empresa

Note que tanto  Client e companyProjects no exemplo acima são atributos de relação primária e representam uma relação direta entre as duas classes de dados. Entretanto, atributos de relação também podem ser construidos sobre rotas através de relações em diferentes níveis, incluindo referências circulares. Por exemplo, considere a estrutura abaixo:

Cada empregado pode ser um gerente e pode ter um gerente. Para obter o gerente do gerente de um empregado, pode escrever:

 $myEmp:=ds.Employee.get(50)
 $manLev2:=$myEmp.manager.manager.lastname

Na arquitetura  ORDA, atributos de relação contém dados diretamente relacionados às entidades:

  • Um atributo de relação tipo N->1  (relatedEntity ) contém uma entidade
  • Um atributo de relação tipo 1->N  (relatedEntities ) contém uma seleção de entidade

Abaixo uma estrutura (simplificada):

Nesse exemplo, uma entidade na classe de dados "Employee" contém um objeto de tipo Entidade no atributo "employer" (ou um valor null). Uma entidade na classe de dados "Company" contém um objeto de tipo EntidadeSeleção no atributo "staff" (ou um valor null).

Para atribuir um valor diretamente ao atributo "employer", deve passar uma entidade existente da classe de dados "company", por exemplo:

 $emp:=ds.Employee.new() // cria um empregado
 $emp.lastname:="Smith" // assigna um valor a um atributo
 $emp.employer:=ds.Company.query("name =:1";"4D")[0]  //atribui uma entidade empresa
 $emp.save()

4D oferece uma possibilidade adicional para entrar um atributo de relação para uma entidade N relacionada a entidade  "1" : se passa a chave primária da entidade  "1" diretamente quando atribui um valor a um atributo de relação. Para que isso funcione, deve passar dados do tipo Número ou Texto (o valor da chave primária) para o atributo de relação. 4D então automaticamente cuida de pesquisar por entidades correspondentes na classe de dados. Por exemplo:

 $emp:=ds.Employee.new()
 $emp.lastname:="Wesson"
 $emp.employer:=2 // atribui uma chave primária ao atributo de relação
  //4D procura pela empresa cuja chave primária (nesse caso, sua ID) é 2
  //e a atribui ao empregado
 $emp.save()

Isso é particularmente útil quando estiver importando grandes quantidades de dados de um banco de dados relacional. Esse tipo de importação geralmente contém uma coluna "ID", que faz referência a uma chave primária que pode ser atribuida diretamente ao atributo de relação.
Isso também significa que pode atribuir chaves primárias nas N entidades sem entidades correspondentes já criadas na classe datastore 1. Se atribuir uma chave primária que não exista na classe de datastore relacionada, ela é armazenada do mesmo jeito e atribuida por 4D logo que a entidade '1" for criada.

Pode atribuir ou modificar o valor de um atributo de entidade relacionada "1" da classe de dados "N" diretamente através do atributo relacionado. Por exemplo, se quiser modificar o atributo de nome de uma entidade Empresa relacionada de uma entidade Employee, pode escrever

 $emp:=ds.Employee.get(2) // carrega a entidade Employee com a chave primária 2
 $emp.employer.name:="4D, Inc." //modifica o atributo de nome da Company relacionada
 $emp.employer.save() //salva o atributo relacionado
  //a entidade relacionada é atualiada

O objeto entidade em si não pode ser copiado como um objeto:

 $myentity:=OB Copy(ds.Employee.get(1)) //retorna null

As propriedades da entidade são, entretanto, enumeráveis:

 ARRAY TEXT($prop;0)
 OB GET PROPERTY NAMES(ds.Employee.get(1);$prop)
  //$prop contém os nomes de todos os atributos de entidade

Para necessidades de exportação, você pode no entanto converter uma entidade a um objeto regular usando o método entity.toObject( ). Pode depois exportar a entidade como JSON, por exemplo:

 C_OBJECT($entity_json)
 $entity_json:=JSON Stringify($myentity.toObject()) //retorna a entidade como JSON



Ver também 

Trancar Entidades

 
PROPRIEDADES 

Produto: 4D
Tema: ORDA

 
CONTEÚDO DA PÁGINA 
 
HISTÓRIA 

Criado por: 4D v17

 
ARTICLE USAGE

Manual de Desenho 4D ( 4D v19)