Entity
Uma entidade é uma instância de um Dataclass, como um registro da tabela que corresponde ao dataclass em seu datasture associado. Contém os mesmos atributos que o dataclass assim como os valores de dados e propriedades e funções específicas.
Resumo
.attributeName : DataClassAttribute armazena o valor de atributo para a entidade |
Parâmetros retorna True se a entidade a qual for aplicada foi recém criada e não foi ainda salva na datastore. |
Parâmetros compara os conteúdos das duas entidades e retorna suas diferenças |
.drop( {mode : Integer} ) : Object apaga os dados contidos na entidade da datastore |
Parâmetros retorna uma referência à entidade na primeira posição da seleção de entidade a qual a entidade pertence. |
.fromObject( filler : Object ) preenche uma entidade com o conteúdo filler |
.getDataClass() : 4D. DataClass retorna a classe de dados da entidade |
.getKey( { mode : Integer } ) : Text .getKey( { mode : Integer } ) : Integer retorna a chave primária da entidade |
.getSelection(): 4D. EntitySelection retorna a seleção entidade à qual pertence a entidade |
.getStamp() : Integer retorna o valor atual da estampa da entidade |
Parâmetros retorna a posição da entidade em uma seleção de entidade |
.isNew() : Boolean retorna True se a entidade a qual for aplicada foi recém criada e não foi ainda salva na datastore |
Parâmetros retorna uma referência à entidade na primeira posição da seleção de entidade a qual a entidade pertence. |
.lock( { mode : Integer } ) : Object põe uma fechadura pessimista no registro referenciado pela entidade |
Parâmetros retorna uma referência à entidade na primeira posição da seleção de entidade a qual a entidade pertence. |
Parâmetros retorna uma referência à entidade na primeira posição da seleção de entidade a qual a entidade pertence. |
.reload() : Object recarrega o conteúdo da entidade em memória |
.save( { mode : Integer } ) : Object salva as mudanças feitas na entidade |
.toObject() : Object .toObject( filterString : Text { ; options : Integer} ) : Object .toObject( filterCol : Collection { ; options : Integer } ) : Object retorna um objeto que foi feito a partir da entidade |
.touched() : Boolean comprova se um atributo da entidade tiver sido modificado ou não desde que se carregou a entidade na memória ou se salvou |
.touchedAttributes() : Collection retorna a posição da entidade em uma seleção de entidade |
.unlock() : Object remove a tranca pessimista no registro correspondente à entidade |
.attributeName
Histórico
Release | Mudanças |
---|---|
17 | Adicionado |
.attributeName : DataClassAttribute
Descrição
Qualquer atributo de dataclass está disponível como uma propriedade de entidade, que armazena o valor de atributo para a entidade.
Atributos de Dataclass também podem ser alcançados usando a sintaxe alternativa com [ ].
O tipo de valor do atributo depende do atributo kind (relação ou armazenamento):
- If attributeName kind is storage:
.attributeName
returns a value of the same type as attributeName. - If attributeName kind is relatedEntity:
.attributeName
returns the related entity. Valores da entidade relacionada estão diretamente disponíveis através de propriedades em cascata, por exemplo "myEntity.employer.employees[0].lastname". - If attributeName kind is relatedEntities:
.attributeName
returns a new entity selection of related entities. Se eliminam os duplicados (se devolve uma seleção de entidades desordenada).
Exemplo
var $myEntity : cs. EmployeeEntity
$myEntity:=ds. Employee.new() //Create a new entity
$myEntity.name:="Dupont" // assign 'Dupont' to the 'name' attribute
$myEntity.firstname:="John" //assign 'John' to the 'firstname' attribute
$myEntity.save() //save the entity
.clone()
Histórico
Release | Mudanças |
---|---|
17 | Adicionado |
Parâmetros
Parâmetro | Tipo | Descrição | |
---|---|---|---|
Resultados | 4D. Entity | <- | Nova entidade referenciando o registro |
| | | |
Descrição
A função .isNew()
retorna True se a entidade a qual for aplicada foi recém criada e não foi ainda salva na datastore..
This function allows you to update entities separately. Note however that, for performance reasons, the new entity shares the same reference of object attributes as the cloned entity.
Keep in mind that any modifications done to entities will be saved in the referenced record only when the
.save()
function is executed.
Esta função só pode ser usada com entidades já salvas no banco de dados. Ele não pode ser chamado em uma entidade recém-criada (para a qual .isNew()
retorna Verdadeiro).
Exemplo
var $emp; $empCloned : cs. EmployeeEntity
$emp:=ds. Employee.get(672)
$empCloned:=$emp.clone()
$emp.lastName:="Smith" //Updates done on $emp are not done on $empCloned
.diff()
Histórico
Release | Mudanças |
---|---|
17 | Adicionado |
Parâmetros
Parâmetro | Tipo | Descrição | |
---|---|---|---|
entityToCompare | 4D. Entity | -> | Entidade a ser comparada com a entidade original |
attributesToCompare | Collection | -> | Nome dos atributos a serem comparados |
Resultados | Collection | <- | Diferenças entre as entidades |
|
Descrição
A função .diff()
compara os conteúdos das duas entidades e retorna suas diferenças.
No entityToCompare, passe a entidade a ser comparada à entidade original.
Em attributesToCompare, pode designar atributos específicos para comparar. Se fornecida, a comparação é feita apenas nos atributos especificados. Se não for fornecida, todas as diferenças entre as entidades são devolvidas.
As diferenças são retornadas como uma coleção de objetos cujas propriedades são:
Nome da propriedade | Tipo | Descrição |
---|---|---|
attributeName | Text | Nome do atributo |
value | any - Depende do tipo de atributo | Valor do atributo na entidade |
otherValue | any - Depende do tipo de atributo | Valor do atributo em entityToCompare |
Apenas atributos com valores diferentes estão incluídos na coleção. Se nenhuma diferença for encontrada, .diff()
retorna uma coleção vazia.
A função se aplica para propriedades cujo tipo é de armazenamento ou relacionada a Entidade. No caso de uma entidade relacionada ter sido atualizada (ou seja, a chave estrangeira), o nome da entidade relacionada e seu nome de chave primária são retornados como propriedades attributeName ( value** e outroValue estão vazios para o nome da entidade relacionada).
Se uma das entidades comparadas for Null, um erro é gerado.
Exemplo 1
var $diff1; $diff2 : Collection
employee:=ds.Employee.query("ID=1001").first()
$clone:=employee.clone()
employee.firstName:="MARIE"
employee.lastName:="SOPHIE"
employee.salary:=500
$diff1:=$clone.diff(employee) // All differences are returned
$diff2:=$clone.diff(employee;New collection"firstName";"lastName"))
// Only differences on firstName and lastName are returned
$diff1:
[
{
"attributeName": "firstName",
"value": "Natasha",
"otherValue": "MARIE"
},
{
"attributeName": "lastName",
"value": "Locke",
"otherValue": "SOPHIE"
},
{
"attributeName": "salary",
"value": 66600,
"otherValue": 500
}
]
$diff2:
[
{
"attributeName": "firstName",
"value": "Natasha",
"otherValue": "MARIE"
},
{
"attributeName": "lastName",
"value": "Locke",
"otherValue": "SOPHIE"
}
]
Exemplo 2
var vCompareResult1; vCompareResult2; vCompareResult3; $attributesToInspect : Collection
vCompareResult1:=New collection
vCompareResult2:=New collection
vCompareResult3:=New collection
$attributesToInspect:=New collection
$e1:=ds. Employee.get(636)
$e2:=ds. Employee.get(636)
$e1.firstName:=$e1.firstName+" update"
$e1.lastName:=$e1.lastName+" update"
$c:=ds. Company.get(117)
$e1.employer:=$c
$e2.salary:=100
$attributesToInspect.push("firstName")
$attributesToInspect.push("lastName")
vCompareResult1:=$e1.diff($e2)
vCompareResult2:=$e1.diff($e2;$attributesToInspect)
vCompareResult3:=$e1.diff($e2;$e1.touchedAttributes())
vCompareResultado1 (todas as diferenças são devolvidas):
[
{
"attributeName": "firstName",
"value": "Karla update",
"otherValue": "Karla"
},
{
"attributeName": "lastName",
"value": "Marrero update",
"otherValue": "Marrero"
},
{
"attributeName": "salary",
"value": 33500,
"otherValue": 100
},
{
"attributeName": "employerID",
"value": 117,
"otherValue": 118
},
{
"attributeName": "employer",
"value": "[object Entity]",// Entity 117 from Company
"otherValue": "[object Entity]"// Entity 118 from Company
}
]
vCompareResult2 (apenas diferenças em $attributesToInspect foram retornadas)
[
{
"attributeName": "firstName",
"value": "Karla update",
"otherValue": "Karla"
},
{
"attributeName": "lastName",
"value": "Marrero update",
"otherValue": "Marrero"
}
]
vCompareResult3 (apenas as diferenças em $e1 atributos tocados são retornadas)
[
{
"attributeName": "firstName",
"value": "Karla update",
"otherValue": "Karla"
},
{
"attributeName": "lastName",
"value": "Marrero update",
"otherValue": "Marrero"
},
{
"attributeName": "employerID",
"value": 117,
"otherValue": 118
},
{
"attributeName": "employer",
"value": "[object Entity]",// Entity 117 from Company
"otherValue": "[object Entity]"// Entity 118 from Company
}
]
.drop()
Histórico
Release | Mudanças |
---|---|
17 | Adicionado |
.drop( {mode : Integer} ) : Object
Parâmetro | Tipo | Descrição | |
---|---|---|---|
mode | Integer | -> | dk force drop if stamp changed : Força a queda mesmo se a estampa tiver mudado |
Resultados | Object | <- | Resultado da operação drop |
|
Descrição
A função .drop()
apaga os dados contidos na entidade da datastoreda tabela relacionada a dataclass. Note-se que a entidade permanece na memória.
Numa aplicação multiusuário ou multiprocesso, a função .drop()
é executada sob um mecanismo "optimistic lock" , no qual um selo de bloqueio interno é automaticamente incrementado cada vez que o registo for guardado.
Por padrão, se o parâmetro modo for omitido, a função retornará um erro (veja abaixo) se a mesma entidade tiver sido modificada (ou seja, O selo mudou) por outro processo ou usuário nesse meio tempo.
Caso contrário, pode passar a opção dk force drop if stamp changed
no parâmetro mode : nesse caso, a entidade é abandonada mesmo que a estampa tenha sido alterada (e a chave primária continua a ser a mesma).
Resultados
O objecto devolvido por .drop( )
contém as seguintes propriedades:
Propriedade | Tipo | Descrição | |
---|---|---|---|
success | boolean | verdadeiro se a ação de queda for bem-sucedida, falso caso contrário. | |
Disponível apenas em caso de erro: | |||
status(*) | number | Código de erro, ver abaixo | |
statusText(*) | text | Descrição do erro, ver abaixo | |
Disponível apenas em caso de erro de bloqueio pessimista: | |||
LockKindText | text | "Bloqueado pelo registro" | |
lockInfo | object | Informações sobre a origem do bloqueio | |
task_id | number | Parâmetros | |
user_name | text | Nome de usuário de sessão na máquina | |
user4d_alias | text | Pseudônimo do usuário se definido por SET USER ALIAS , caso contrário, nome de usuário no diretório 4D | |
host_name | text | Nome da máquina | |
task_name | text | Nome de processo | |
client_version | text | ||
Disponível apenas em caso de erro grave (erro grave pode ser tentar duplicar uma chave primária, disco cheio...): | |||
errors | uma coleção de objetos | ||
message | text | Mensagem de erro | |
assinatura de componentes | text | assinatura interna do componente (ex.: "dmbg" significa componente da base de dados) | |
errCode | number | Código de erro |
(*) Os seguintes valores podem ser devolvidos nas propriedades status e statusText do objecto Result em caso de erro:
Parâmetros | Valor | Comentário |
---|---|---|
dk status entity does not exist anymore | 5 | A entidade não existe mais nos dados. Este erro pode ocorrer nos seguintes casos: |
dk status locked | 3 | A entidade está bloqueada por um bloqueio pessimista. **statusText associado **: "Already locked" |
dk status serious error | 4 | Um erro grave é um erro de banco de dados de baixo nível (por exemplo, chave duplicada), um erro de hardware, etc. Associado statusText: "Outro erro" |
dk status stamp has changed | 2 | O valor de selo interno da entidade não corresponde a uma da entidade armazenada nos dados (bloqueio otimista)..save( ) : erro apenas se a opção dk auto merge' não for utilizada</li><li>com .drop( ): erro apenas se a opção dk force drop if stamp changed' não for utilizada.lock( ) : erro apenas se a opção dk reload if stamp changed não for usada |
Exemplo 1
Exemplo sem a opção dk force drop if stamp changed
:
var $employees : cs. EmployeeSelection
var $employee : cs. EmployeeEntity
var $status : Object
$employees:=ds. Employee.query("lastName=:1";"Smith")
$employee:=$employees.first()
$status:=$employee.drop()
Case of
:($status.success)
ALERT("You have dropped "+$employee.firstName+" "+$employee.lastName) //The dropped entity remains in memory
:($status.status=dk status stamp has changed)
ALERT($status.statusText)
End case
Exemplo 2
Exemplo com a opçãodk force drop if stamp changed
:
var $employees : cs. EmployeeSelection
var $employee : cs. EmployeeEntity
var $status : Object
$employees:=ds. Employee.query("lastName=:1";"Smith")
$employee:=$employees.first()
$status:=$employee.drop(dk force drop if stamp changed)
Case of
:($status.success)
ALERT("You have dropped "+$employee.firstName+" "+$employee.lastName) //The dropped entity remains in memory
:($status.status=dk status entity does not exist anymore)
ALERT($status.statusText)
End case
.first()
Histórico
Release | Mudanças |
---|---|
17 | Adicionado |
Parâmetros
Parâmetro | Tipo | Descrição | |
---|---|---|---|
Resultados | 4D. Entity | <- | Referencia à primeira entidade da entity selection (Null se a seleção estiver vazia) |
|
Descrição
A função .first()
retorna uma referência à entidade na primeira posição da seleção de entidade a qual a entidade pertence..
Se a entidade não pertence a nenhuma seleção de entidade existente (ex: .getSelection( ) retorna Null), a função retorna um valor nulo.
Exemplo
var $employees : cs. EmployeeSelection
var $employee; $firstEmployee : cs. EmployeeEntity
$employees:=ds. Employee.query("lastName = :1";"H@") //This entity selection contains 3 entities
$employee:=$employees[2]
$firstEmployee:=$employee.first() //$firstEmployee is the first entity of the $employees entity selection
.fromObject()
Histórico
Release | Mudanças |
---|---|
17 | Adicionado |
.fromObject( filler : Object )
Parâmetro | Tipo | Descrição | |
---|---|---|---|
filler | Object | -> | Objeto para o qual vai preencher a entidade |
|
Descrição
A função .fromObject()
preenche uma entidade com o conteúdo filler.
Essa função modifica a entidade original.
O mapeamento entre o objecto e a entidade é feito sobre os nomes dos atributos:
- Se uma propriedade do objeto não existe nos dados (dataclass), ela é ignorada.
- Os tipos de dados devem ser equivalentes. Se houver uma incompatibilidade de tipo entre o objeto e o dataclass, 4D tenta converter os dados sempre que possível (consulte
Conversão de tipos de dados
), caso contrário, o atributo fica intacto. - A chave primária pode ser dada como é ou com uma propriedade "__KEY" (preenchida com o valor da chave primária). Se ainda não existir no dataclass, a entidade é criada com o valor dado quando .save() é chamado. Se a chave primária não for dada, a entidade é criada e o valor da chave primária é atribuído de acordo com as regras da base de dados. O auto-incremento só é calculado se a chave primária for nula.
filler pode tratar de uma entidade relacionada sob as seguintes condições:
- filler contém a chave estrangeira em si, ou
- filler contém um objeto de propriedade com o mesmo nome da entidade relacionada, contendo uma propriedade única chamada "__KEY".
- se a entidade relacionada não existir, ela é ignorada.
Exemplo
Com o seguinte objeto $o:
{
"firstName": "Mary",
"lastName": "Smith",
"salary": 36500,
"birthDate": "1958-10-27T00:00:00.000Z",
"woman": true,
"managerID": 411,// relatedEntity dada com PK
"employerID": 20 // relatedEntity dada com PK
}
O código a seguir criará uma entidade com gerente e entidades relacionadas ao empregador.
var $o : Object
var $entity : cs. EmpEntity
$entity:=ds. Emp.new()
$entity.fromObject($o)
$entity.save()
Você também poderia usar uma entidade relacionada dada como um objeto:
{
"firstName": "Marie",
"lastName": "Lechat",
"salary": 68400,
"birthDate": "1971-09-03T00:00:00.000Z",
"woman": false,
"employer": {// relatedEntity dada como um objeto
"__KEY": "21"
},
"manager": {// relatedEntity dada como um objeto
"__KEY": "411"
}
}
.getDataClass()
Histórico
Release | Mudanças |
---|---|
17 R5 | Adicionado |
.getDataClass() : 4D. DataClass
Parâmetro | Tipo | Descrição | |
---|---|---|---|
Resultados | 4D. DataClass | <- | Objeto DataClass ao qual a entidade pertence |
|
Descrição
A função .getDataClass()
retorna a classe de dados da entidade. Esta função é útil para configurar o código genérico.
Exemplo
O seguinte código genérico duplica qualquer entidade:
//duplicate_entity method
//duplicate_entity($entity)
#DECLARE($entity : 4D. Entity)
var $entityNew : 4D. Entity
var $status : Object
$entityNew:=$entity.getDataClass().new() //create a new entity in the parent dataclass
$entityNew.fromObject($entity.toObject()) //get all attributes
$entityNew[$entity.getDataClass().getInfo().primaryKey]:=Null //reset the primary key
$status:=$entityNew.save() //save the duplicated entity
.getKey()
Histórico
Release | Mudanças |
---|---|
17 | Adicionado |
.getKey( { mode : Integer } ) : Text
.getKey( { mode : Integer } ) : Integer
Parâmetro | Tipo | Descrição | |
---|---|---|---|
mode | Integer | -> | dk key as string : a chave primária se devolve como uma string, sem importar o tipo de chave primária |
Resultados | Text | <- | Valor do texto chave primária da entidade |
Resultados | Integer | <- | Valor da chave primária numérica da entidade |
Descrição
A função .getKey()
retorna a chave primária da entidade.
As chaves primárias podem ser números (Inteiro) ou strings. Você pode "forçar" o valor da chave primária retornado para ser uma string, independentemente do tipo de chave primária real, passando a dk key como string
opção no parâmetro modo.
Exemplo
var $employees : cs. EmployeeSelection
var $employee : cs. EmployeeEntity
$employees:=ds. Employee.query("lastName=:1";"Smith")
$employee:=$employees[0]
ALERT("The primary key is "+$employee.getKey(dk key as string))
.getSelection()
Histórico
Release | Mudanças |
---|---|
17 | Adicionado |
.getSelection(): 4D. EntitySelection
Parâmetro | Tipo | Descrição | |
---|---|---|---|
Resultados | 4D. EntitySelection | <- | Seleção de entidade a que pertence a entidade (null se não for encontrado) |
|
Descrição
A função .getSelection()
retorna a seleção entidade à qual pertence a entidade.
Se a entidade não pertence à seleção de uma entidade, a função retorna Null.
Exemplo
var $emp : cs. EmployeeEntity
var $employees; $employees2 : cs. EmployeeSelection
$emp:=ds. Employee.get(672) // This entity does not belong to any entity selection
$employees:=$emp.getSelection() // $employees is Null
$employees2:=ds. Employee.query("lastName=:1";"Smith") //This entity selection contains 6 entities
$emp:=$employees2[0] // This entity belongs to an entity selection
ALERT("The entity selection contains "+String($emp.getSelection().length)+" entities")
.getStamp()
Histórico
Release | Mudanças |
---|---|
17 | Adicionado |
.getStamp() : Integer
Parâmetro | Tipo | Descrição | |
---|---|---|---|
Resultados | Integer | <- | Estampa da entidade (0 se a entidade foi criada) |
|
Descrição
A função .getStamp()
retorna o valor atual da estampa da entidade.
O selo interno é automaticamente incrementado por 4D cada vez que a entidade é gravada. Gere o acesso de usuários simultâneos e modificações às mesmas entidades (ver bloqueio de entidades).
Para uma nova entidade (nunca salva), a função retorna 0. Para saber se uma entidade acabou de ser criada, recomenda-se a utilização de .isNew().
Exemplo
var $entity : cs. EmployeeEntity
var $stamp : Integer
$entity:=ds. Employee.new()
$entity.lastname:="Smith"
$entity.save()
$stamp:=$entity.getStamp() //$stamp=1
$entity.lastname:="Wesson"
$entity.save()
$stamp:=$entity.getStamp() //$stamp=2
.indexOf()
Histórico
Release | Mudanças |
---|---|
17 | Adicionado |
Parâmetros
Parâmetro | Tipo | Descrição | |
---|---|---|---|
entitySelection | 4D. EntitySelection | -> | A posição da entidade é dada de acordo com a selecção desta entidade |
Resultados | Integer | <- | Posição da entidade numa selecção de entidade |
|
Descrição
A função .find()
retorna a posição da entidade em uma seleção de entidade.
Por padrão, se o parâmetro entitySelection for omitido, a função retorna a posição da entidade dentro de sua própria seleção de entidade. Caso contrário, ele retorna a posição da entidade dentro da entitySelection.
O valor resultante é incluído entre 0 e o comprimento da selecção da entidade -1.
- Se a entidade não tiver uma selecção de entidade ou não pertencer a entitySelection, a função retorna -1.
- Se entitySelection for Null ou não pertencer ao mesmo dataclass que a entidade, é apresentado um erro.
Exemplo
var $employees : cs. EmployeeSelection
var $employee : cs. EmployeeEntity
$employees:=ds. Employee.query("lastName = :1";"H@") //This entity selection contains 3 entities
$employee:=$employees[1] //This entity belongs to an entity selection
ALERT("The index of the entity in its own entity selection is "+String($employee.indexOf())) //1
$employee:=ds. Employee.get(725) //This entity does not belong to an entity selection
ALERT("The index of the entity is "+String($employee.indexOf())) // -1
.isNew()
Histórico
Release | Mudanças |
---|---|
17 | Adicionado |
.isNew() : Boolean
Parâmetro | Tipo | Descrição | |
---|---|---|---|
Resultados | Parâmetros | <- | É verdade se a entidade acabou de ser criada e ainda não foi salva. Caso contrário, Falso. |
|
Descrição
A função .isNew()
retorna True se a entidade a qual for aplicada foi recém criada e não foi ainda salva na datastore. Caso contrário, devolve False.
Exemplo
var $emp : cs. EmployeeEntity
$emp:=ds. Employee.new()
If($emp.isNew())
ALERT("This is a new entity")
End if
.last()
Histórico
Release | Mudanças |
---|---|
17 | Adicionado |
Parâmetros
Parâmetro | Tipo | Descrição | |
---|---|---|---|
Resultados | 4D. Entity | <- | Referência para a última entidade de uma seleção de entidade (Null se não for encontrado) |
|
Descrição
A função .last()
retorna uma referência à entidade na primeira posição da seleção de entidade a qual a entidade pertence..
Se a entidade não pertence a nenhuma seleção de entidade existente (ex: .getSelection( ) retorna Null), a função retorna um valor nulo.
Exemplo
var $employees : cs. EmployeeSelection
var $employee; $lastEmployee : cs. EmployeeEntity
$employees:=ds. Employee.query("lastName = :1";"H@") //This entity selection contains 3 entities
$employee:=$employees[0]
$lastEmployee:=$employee.last() //$lastEmployee is the last entity of the $employees entity selection
.lock()
Histórico
Release | Mudanças |
---|---|
17 | Adicionado |
.lock( { mode : Integer } ) : Object
Parâmetro | Tipo | Descrição | |
---|---|---|---|
mode | Integer | -> | dk reload if stamp changed : Recarregar antes de bloquear se o carimbo for alterado |
Resultados | Object | <- | Resultado da operação de bloqueio |
|
Descrição
A função .lock()
põe uma fechadura pessimista no registro referenciado pela entidade. O bloqueio de é definido para um registro e todas as referências da entidade no processo atual.
Outros processos verão este registro como bloqueado (o resultado. a propriedade
uccess conterá Falso se eles tentarem bloquear a mesma entidade usando esta função). Só as funções executadas na sessão de "bloqueio" são permitidas para editar e guardar os atributos da entidade. A entidade pode ser carregada como apenas leitura por outras sessões, mas não serão capazes de introduzir e guardar valores.
Um registo bloqueado é desbloqueado:
- quando a função
desbloqueia()
é chamada a uma entidade correspondente no mesmo processo - automaticamente, quando já não é referenciado por nenhuma entidade em memória. Por exemplo, se a fechadura for colocada apenas numa referência local de uma entidade, a entidade é desbloqueada quando a função termina. Enquanto houver referências à entidade em memória, o registo permanece bloqueado.
Por padrão, se o parâmetro modo for omitido, a função retornará um erro (veja abaixo) se a mesma entidade tiver sido modificada (ou seja, O selo mudou) por outro processo ou usuário nesse meio tempo.
Caso contrário, você pode passar o parâmetrodk reload if stamp changed
no parâmetro mode : neste caso, nenhum erro é retornado e a entidade é recarregada quando o selo mudou (se a entidade ainda existir e a chave primária ainda for a mesma).
Resultados
O objeto retornado por .lock( )
contém as seguintes propriedades:
Propriedade | Tipo | Descrição | |
---|---|---|---|
success | boolean | true se a ação de bloqueio for bem sucedida (ou se a entidade já estiver bloqueada no processo atual), falso caso contrário. | |
Disponível apenas se a opçãodk reload if stamp changed for usada: | |||
wasReloaded | boolean | verdadeiro se a entidade foi recarregada com sucesso, falso caso contrário. | |
Disponível apenas em caso de erro: | |||
status(*) | number | Código de erro, ver abaixo | |
statusText(*) | text | Descrição do erro, ver abaixo | |
Disponível apenas em caso de erro de bloqueio pessimista: | |||
lockKindText | text | "Bloqueado pelo registro" | |
lockInfo | object | Informações sobre a origem do bloqueio | |
task_id | number | Process ID | |
user_name | text | Nome de usuário de sessão na máquina | |
user4d_alias | text | Nome ou apelido do usuário 4D | |
user4d_id | number | Id do usuário no diretório do banco de dados 4D | |
host_name | text | Nome da máquina | |
task_name | text | Nome de processo | |
client_version | text | ||
Disponível apenas em caso de erro grave (a chave primária já existir, o disco estar cheio...): | |||
errors | uma coleção de objetos | ||
message | text | Mensagem de erro | |
assinatura de componentes | text | assinatura interna do componente (ex.: "dmbg" significa componente da base de dados) | |
errCode | number | Código de erro |
(*) Os seguintes valores podem ser devolvidos nas propriedades status e statusText do objecto Result em caso de erro:
Parâmetros | Valor | Comentário |
---|---|---|
dk status entity does not exist anymore | 5 | A entidade não existe mais nos dados. Este erro pode ocorrer nos seguintes casos:.drop( ) , este erro pode ser retornado quando a opção "dk force drop if stamp changed" for usada. Ao usar .lock( ) , este erro pode ser retornado quando a opção `dk reload if stamp changed" for usadostatusText asociado: "A entidade já não existe" |
dk status locked | 3 | Informações sobre a origem do bloqueio |
dk status serious error | 4 | Um erro grave é um erro de banco de dados de baixo nível (por exemplo, chave duplicada), um erro de hardware, etc.****Texto status associado: "Outro erro" |
dk status stamp has changed | 2 | O valor de selo interno da entidade não corresponde a uma da entidade armazenada nos dados (bloqueio otimista)..save( ) : erro apenas se a opção dk auto merge' não for utilizada</li><li>com .drop( ): erro apenas se a opção dk force drop if stamp changed' não for utilizada.lock( ) : erro apenas se a opção dk reload if stamp changed não for usadaStatusText associado: "O carimbo foi alterado" |
Exemplo 1
Exemplo com erro:
var $employee : cs. EmployeeEntity
var $status : Object
$employee:=ds. Employee.get(716)
$status:=$employee.lock()
Case of
:($status.success)
ALERT("You have locked "+$employee.firstName+" "+$employee.lastName)
:($status.status=dk status stamp has changed)
ALERT($status.statusText)
End case
Exemplo 2
Exemplo com dk reload se o selo mudou a opção
:
var $employee : cs. EmployeeEntity
var $status : Object
$employee:=ds. Employee.get(717)
$status:=$employee.lock(dk reload if stamp changed)
Case of
:($status.success)
ALERT("You have locked "+$employee.firstName+" "+$employee.lastName)
:($status.status=dk status entity does not exist anymore)
ALERT($status.statusText)
End case
.next()
Histórico
Release | Mudanças |
---|---|
17 | Adicionado |
Parâmetros
Parâmetro | Tipo | Descrição | |
---|---|---|---|
Resultados | 4D. Entity | <- | Referência a entidade anterior na seleção da entidade (Null se não for encontrado) |
|
Descrição
A função .next()
retorna uma referência à entidade na primeira posição da seleção de entidade a qual a entidade pertence..
Se a entidade não pertencer a nenhuma seleção de entidade existente (ex: .getSelection() retorna Null), a função retorna um valor nulo.
Se não houver entidade seguinte válida na selecção da entidade (ou seja, se estiver na última entidade da selecção), a função devolve Null. Se a entidade seguinte tiver sido abandonada, a função devolve a entidade válida seguinte (e eventualmente Nula).
Exemplo
var $employees : cs. EmployeeSelection
var $employee; $nextEmployee : cs. EmployeeEntity
$employees:=ds. Employee.query("lastName = :1";"H@") //This entity selection contains 3 entities
$employee:=$employees[0]
$nextEmployee:=$employee.next() //$nextEmployee is the second entity of the $employees entity selection
.previous()
Histórico
Release | Mudanças |
---|---|
17 | Adicionado |
Parâmetros
Parâmetro | Tipo | Descrição | |
---|---|---|---|
Resultados | 4D. Entity | <- | Referência para a próxima entidade de uma seleção de entidade (Null se não for encontrado) |
|
Descrição
A função .previous()
retorna uma referência à entidade na primeira posição da seleção de entidade a qual a entidade pertence..
Se a entidade não pertencer a nenhuma seleção de entidade existente (ex: .getSelection() retorna Null), a função retorna um valor nulo.
Se não houver nenhuma entidade anterior válida na seleção da entidade (ou seja, você está na primeira entidade da seleção), a função retorna Null. Se a entidade anterior foi abandonada, a função retorna a entidade válida anterior (e eventualmente Null).
Exemplo
var $employees : cs. EmployeeSelection
var $employee; $previousEmployee : cs. EmployeeEntity
$employees:=ds. Employee.query("lastName = :1";"H@") //This entity selection contains 3 entities
$employee:=$employees[1]
$previousEmployee:=$employee.previous() //$previousEmployee is the first entity of the $employees entity selection
.reload()
Histórico
Release | Mudanças |
---|---|
17 | Adicionado |
.reload() : Object
Parâmetro | Tipo | Descrição | |
---|---|---|---|
Resultados | Object | <- | Objeto de estado |
|
Descrição
A função .reload()
recarrega o conteúdo da entidade em memóriade acordo com a informação armazenada na tabela relacionada a dataclass da datastore. A recarga só é feita se a entidade ainda existir com a mesma chave primária.
Resultados
O objeto retornado por .reload( )
contém as seguintes propriedades:
Propriedade | Tipo | Descrição |
---|---|---|
success | boolean | True se a ação de recarregar tiver sucesso, senão False.Disponível só no caso de erro: |
status(*) | number | Código de erro, ver abaixo |
statusText(*) | text | Descrição do erro, ver abaixo |
(*) Os seguintes valores podem ser devolvidos nas propriedades status e statusText do objecto Result em caso de erro:
Parâmetros | Valor | Comentário |
---|---|---|
dk status entity does not exist anymore | 5 | A entidade não existe mais nos dados. Este erro pode ocorrer nos seguintes casos:.lock( ) , este erro pode ser retornado quando a opção `dk reload if stamp changed" for usadostatusText associado: "a entidade já não existe" |
dk status serious error | 4 | Um erro grave é um erro de banco de dados de baixo nível (por exemplo, chave duplicada), um erro de hardware, etc. Texto status associado: "Outro erro" |
Exemplo
var $employee : cs. EmployeeEntity
var $employees : cs. EmployeeSelection
var $result : Object
$employees:=ds. Employee.query("lastName=:1";"Hollis")
$employee:=$employees[0]
$employee.firstName:="Mary"
$result:=$employee.reload()
Case of
:($result.success)
ALERT("Reload has been done")
:($result.status=dk status entity does not exist anymore)
ALERT("The entity has been dropped")
End case
.save()
Histórico
Release | Mudanças |
---|---|
17 | Adicionado |
.save( { mode : Integer } ) : Object
Parâmetro | Tipo | Descrição | |
---|---|---|---|
mode | Integer | -> | dk auto merge : Permite o modo de fusão automática |
Resultados | Object | <- | Resultado da operação de salvamento |
|
Descrição
A função .save()
salva as mudanças feitas na entidade na tabela relacionada para a dataClass. na tabela relacionada para a dataClass Deve salvar este método depois de criar ou modificar uma entidade se quiser salvar as mudanças feitas nela.
A operação de salvar é realizada só se ao menos um atributo de entidade foi "tocado" (ver .touched()
e funções .touchedAttributes()
). Senão a função não faz nada (o trigger não é ativado)
Em uma aplicação multiusuário ou multiprocesso, a função .save()
é executada com um mecanismo "optimistic lock" onde uma estampa interna de tranca é automaticamente incrementada cada vez que o registro é salvado
Como padrão, se o parâmetro mode for omitido, o método retorna um erro (ver abaixo) sempre que a mesma entidade for modificada por outro processo ou u suário , sem importar os atributos modificados.
Senão, pode passar a opção dk auto merge
no parâmetro mode: quando o modo automatico fusionado estiver ativado, uma modificação feita ao mesmo tempo que outro processo ou usuário na mesma entidade, mas em um diferente atributo, não vai resultar em um erro. Os dados resultantes salvos na entidade serão a combinação ("merge"/fusão) de todas as modificações não simultâneas (se modificações forem aplicadas ao mesmo atributo, a operação de salvar falha e um erro é retornado, mesmo com o modo auto fusão)
O modo automático merge não está disponível para atributos de tipo Imagem, Objeto e Texto quando armazenado fora do registro. Mudanças simultâneas nesses atributos vão resultar em um erro
dk status stamp has changed
.
Resultados
O objeto retornado por .save()
contém as propriedades a seguir:
Propriedade | Tipo | Descrição | |
---|---|---|---|
success | boolean | True se a ação salvar tiver sucesso, senão False | |
Disponível só se utilizar a opção dk auto merge : | |||
autoMerged | boolean | True se fizer uma auto merge, senão False | |
Disponível apenas em caso de erro: | |||
status | number | Código de erro, ver abaixo | |
statusText | text | Descrição do erro, ver abaixo | |
Disponível só no caso de erro de tranca pessimista: | |||
lockKindText | text | "Bloqueado pelo registro" | |
lockInfo | object | Informações sobre a origem do bloqueio | |
task_id | number | Parâmetros | |
user_name | text | Nome de usuário de sessão na máquina | |
user4d_alias | text | Pseudônimo do usuário se definido por SET USER ALIAS , caso contrário, nome de usuário no diretório 4D | |
host_name | text | Nome da máquina | |
task_name | text | Nome de processo | |
client_version | text | ||
Disponível só em caso de erro grave (erro sério - por exemplo tentar duplicar uma chave primária, disco cheio...): | |||
errors | uma coleção de objetos | ||
message | text | Mensagem de erro | |
componentSignature | text | Assinatura interna do componente (ex.: "dmbg" significa componente da base de dados) | |
errCode | number | Código de erro |
status e statusText
Os valores abaixo podem ser retornado nas propriedades status
e statusText
do objeto Result no caso de um erro:
Parâmetros | Valor | Comentário |
---|---|---|
dk status automerge failed | 6 | Parâmetros |
dk status entity does not exist anymore | 5 | A entidade não existe mais nos dados. Este erro pode ocorrer nos seguintes casos:.lock( ) , este erro pode ser retornado quando a opção `dk reload if stamp changed" for usadostatusText asociado: "A entidade já não existe" |
dk status locked | 3 | Informações sobre a origem do bloqueio |
dk status serious error | 4 | Um erro grave é um erro de banco de dados de baixo nível (por exemplo, chave duplicada), um erro de hardware, etc.****Texto status associado: "Outro erro" |
dk status stamp has changed | 2 | O valor de selo interno da entidade não corresponde a uma da entidade armazenada nos dados (bloqueio otimista)..save( ) : erro apenas se a opção dk auto merge' não for utilizada</li><li>com .drop( ): erro apenas se a opção dk force drop if stamp changed' não for utilizada.lock( ) : erro apenas se a opção dk reload if stamp changed não for usadaStatusText associado: "O carimbo foi alterado" |
Exemplo 1
Criar uma nova entidade:
var $status : Object
var $employee : cs. EmployeeEntity
$employee:=ds. Employee.new()
$employee.firstName:="Mary"
$employee.lastName:="Smith"
$status:=$employee.save()
If($status.success)
ALERT("Employee created")
End if
Exemplo 2
Atualizar uma entidade sem a opção dk auto merge
:
var $status : Object
var $employee : cs. EmployeeEntity
var $employees : cs. EmployeeSelection
$employees:=ds. Employee.query("lastName=:1";"Smith")
$employee:=$employees.first()
$employee.lastName:="Mac Arthur"
$status:=$employee.save()
Case of
:($status.success)
ALERT("Employee updated")
:($status.status=dk status stamp has changed)
ALERT($status.statusText)
End case
Exemplo 3
Atualizar uma entidade com a opção dk auto merge
:
var $status : Object
var $employee : cs. EmployeeEntity
var $employees : cs. EmployeeSelection
$employees:=ds. Employee.query("lastName=:1";"Smith")
$employee:=$employees.first()
$employee.lastName:="Mac Arthur"
$status:=$employee.save(dk auto merge)
Case of
:($status.success)
ALERT("Employee updated")
:($status.status=dk status automerge failed)
ALERT($status.statusText)
End case
.toObject()
Histórico
Release | Mudanças |
---|---|
17 | Adicionado |
.toObject() : Object
.toObject( filterString : Text { ; options : Integer} ) : Object
.toObject( filterCol : Collection { ; options : Integer } ) : Object
Parâmetro | Tipo | Descrição | |
---|---|---|---|
filterString | Text | -> | Atributos a extrair (string separada por vírgulas) |
filterCol | Collection | -> | Coleção de atributos a extrair |
options | Integer | -> | dk with primary key : adds the _KEY property;dk with stamp : adds the _STAMP property |
Resultados | Object | <- | Objeto criado a partir da entidade |
|
Descrição
A função .toObject()
retorna um objeto que foi feito a partir da entidade. Os nomes das propriedades no objecto correspondem aos nomes dos atributos da entidade.
Se nenhum filtro for especificado ou se o parâmetro filterString conter uma string vazia ou "*", o objeto retornado vai conter:
- todos os atributos de entidade de armazenagem
- atributos
relatedEntity
kind: obtém uma propriedade com o mesmo nome que a entidade relacionada (nome do link muitos para um). Atributo é extraido com um formulário simples. - atributos
relatedEntities
kind: atributo não é retornado.
No primeiro par|âmetro, passa os atributos entidade a extrair. Pode passar:
- filterString: uma string com rotas de propriedades separadas por vírgulas: "propertyPath1, propertyPath2, ...", ou
- filterCol: uma coleção de strings: ["propertyPath1","propertyPath2";...]
Se um filtro for especificado para atributos de relatedEntity kind:
- propertyPath = "relatedEntity" -> se extrai de forma simples: um objeto com a propriedade __KEY (chave primária).
- propertyPath = "relatedEntity.*" -> todas as propriedades foram extraídas
- propertyPath = "relatedEntity.propertyName1; relatedEntity.propertyName2; ..." -> só se extraem essas propriedades
Se um filtro for especificado para atributos de relatedEntities kind:
- propertyPath = "relatedEntities.*" -> se extraem todas as propriedades
- propertyPath = "relatedEntities.propertyName1; relatedEntities.propertyName2; ..." -> só se extraem essas propriedades
No parâmetro options pode passar o selector ddk with primary key
oudk with stamp
para adicionar as chaves primárias da entidade ou os selos nos objetos extraídos.
Exemplo 1
A estrutura abaixo será usada nos exemplos desta seção:
Sem parâmetros de filtro:
employeeObject:=employeeSelected.toObject()
Retorna:
{
"ID": 413,
"firstName": "Greg",
"lastName": "Wahl",
"salary": 0,
"birthDate": "1963-02-01T00:00:00.000Z",
"woman": false,
"managerID": 412,
"employerID": 20,
"photo": "[object Picture]",
"extra": null,
"employer": { // relatedEntity extraída com forma simples
"__KEY": 20
},
"manager": {
"__KEY": 412
}
}
Exemplo 2
Extrair a chave primária e a estampa:
employeeObject:=employeeSelected.toObject("";dk with primary key+dk with stamp)
Retorna:
{
"__KEY": 413,
"__STAMP": 1,
"ID": 413,
"firstName": "Greg",
"lastName": "Wahl",
"salary": 0,
"birthDate": "1963-02-01T00:00:00.000Z",
"woman": false,
"managerID": 412,
"employerID": 20,
"photo": "[object Picture]",
"extra": null,
"employer": {
"__KEY": 20
},
"manager": {
"__KEY": 412
}
}
Exemplo 3
Expande todas as propriedades de relatedEntities
:
employeeObject:=employeeSelected.toObject("directReports.*")
{
"directReports": [
{
"ID": 418,
"firstName": "Lorena",
"lastName": "Boothe",
"salary": 44800,
"birthDate": "1970-10-02T00:00:00.000Z",
"woman": true,
"managerID": 413,
"employerID": 20,
"photo": "[object Picture]",
"extra": null,
"employer": {
"__KEY": 20
},
"manager": {
"__KEY": 413
}
},
{
"ID": 419,
"firstName": "Drew",
"lastName": "Caudill",
"salary": 41000,
"birthDate": "2030-01-12T00:00:00.000Z",
"woman": false,
"managerID": 413,
"employerID": 20,
"photo": "[object Picture]",
"extra": null,
"employer": {
"__KEY": 20
},
"manager": {
"__KEY": 413
}
},
{
"ID": 420,
"firstName": "Nathan",
"lastName": "Gomes",
"salary": 46300,
"birthDate": "2010-05-29T00:00:00.000Z",
"woman": false,
"managerID": 413,
"employerID": 20,
"photo": "[object Picture]",
"extra": null,
"employer": {
"__KEY": 20
},
"manager": {
"__KEY": 413
}
}
]
}
Exemplo
Extração de algumas propriedades de relatedEntities
:
employeeObject:=employeeSelected.toObject("firstName, directReports.lastName")
Retorna:
{
"firstName": "Greg",
"directReports": [
{
"lastName": "Boothe"
},
{
"lastName": "Caudill"
},
{
"lastName": "Gomes"
}
]
}
Exemplo 2
Extrair relatedEntity
com formulário simples:
$coll:=New collection("firstName";"employer")
employeeObject:=employeeSelected.toObject($coll)
Retorna:
{
"firstName": "Greg",
"employer": {
"__KEY": 20
}
}
Exemplo 6
Expande todas as propriedades de relatedEntity
:
employeeObject:=employeeSelected.toObject("employer.*")
Retorna:
{
"employer": {
"ID": 20,
"name": "India Astral Secretary",
"creationDate": "1984-08-25T00:00:00.000Z",
"revenues": 12000000,
"extra": null
}
}
Exemplo 3
Extração de algumas propriedades de relatedEntity
:
$col:=New collection
$col.push("employer.name")
$col.push("employer.revenues")
employeeObject:=employeeSelected.toObject($col)
Retorna:
{
"employer": {
"name": "India Astral Secretary",
"revenues": 12000000
}
}
.touched( )
Histórico
Release | Mudanças |
---|---|
17 | Adicionado |
.touched() : Boolean
Parâmetro | Tipo | Descrição | |
---|---|---|---|
Resultados | Parâmetros | <- | True se tiver modificado ao menos um atributo da entidade e ainda não for salvo, se não, False |
|
Descrição
A função .touched()
comprova se um atributo da entidade tiver sido modificado ou não desde que se carregou a entidade na memória ou se salvou.
Se um atributo for modificado ou calculado, a função retorna True, senão retorna False. Pode usar essa função para determinar se precisar salvar a entidade.
Esta função retorna False para uma nova entidade que foi criada (com .new( )
). Note entretanto que se usar uma função que calcule um atributo da entidade, a função .touched()
vai retornar True. Por exemplo se chamar .getKey()
para calcular a chave primária, .touched()
retorna True.
Exemplo
Neste exemplo, vemos se é necessário salvar a entidade:
var $emp : cs. EmployeeEntity
$emp:=ds. Employee.get(672)
$emp.firstName:=$emp.firstName //Even if updated with the same value, the attribute is marked as touched
If($emp.touched()) //if at least one of the attributes has been changed
$emp.save()
End if // otherwise, no need to save the entity
.touchedAttributes( )
Histórico
Release | Mudanças |
---|---|
17 | Adicionado |
.touchedAttributes() : Collection
Parâmetro | Tipo | Descrição | |
---|---|---|---|
Resultados | Collection | <- | Nomes de atributos touched ou coleção vazia |
|
Descrição
A função .indexOf()
retorna a posição da entidade em uma seleção de entidade.
Isso aplica para atributos do tipo storage
ou relatedEntity
.
No caso de uma entidade relacionada que foi tocada (touched) *ou seja, a chave primária) o nome da entidade relacionada e sua chave primária são retornados.
Se nenhum atributo de entidade for tocado, o método retorna uma coleção vazia.
Exemplo 1
var $touchedAttributes : Collection
var $emp : cs. EmployeeEntity
$touchedAttributes:=New collection
$emp:=ds. Employee.get(725)
$emp.firstName:=$emp.firstName //Even if updated with the same value, the attribute is marked as touched
$emp.lastName:="Martin"
$touchedAttributes:=$emp.touchedAttributes()
//$touchedAttributes: ["firstName","lastName"]
Exemplo 2
var $touchedAttributes : Collection
var $emp : cs. EmployeeEntity
var $company : cs. CompanyEntity
$touchedAttributes:=New collection
$emp:=ds. Employee.get(672)
$emp.firstName:=$emp.firstName
$emp.lastName:="Martin"
$company:=ds. Company.get(121)
$emp.employer:=$company
$touchedAttributes:=$emp.touchedAttributes()
//collection $touchedAttributes: ["firstName","lastName","employer","employerID"]
Nesse modo:
- firstName and lastName tem um tipo
storage
- employer tem um tipo
relatedEntity
- employerID é a chave estrangeira da entidade relacionada employer
.unlock()
Histórico
Release | Mudanças |
---|---|
17 | Adicionado |
.unlock() : Object
Parâmetro | Tipo | Descrição | |
---|---|---|---|
Resultados | Object | <- | Objeto de estado |
|
Descrição
A função .unlock()
remove a tranca pessimista no registro correspondente à entidade na datastore e tabela relacionada a dataclasse.
Para saber mais veja Entity locking.
Um registro é destrancado automaticamente quando não for mais referenciado por nenhuma entidade no processo de trancamento (por exemplo, se uma tranca for posta apenas na referência local da entidade, a entidade e o registro é destrancado quando o processo terminar).
Quando um registro for trancado, deve ser destrancado do processo de trancamento e na referência de entidade que colocou a tranca. Por exemplo:
$e1:=ds. Emp.all()[0]
$e2:=ds. Emp.all()[0]
$res:=$e1.lock() //$res.success=true
$res:=$e2.unlock() //$res.success=false
$res:=$e1.unlock() //$res.success=true
Resultados
O objeto retornado por .unlock()
contém a propriedade abaixo:
Propriedade | Tipo | Descrição |
---|---|---|
success | Parâmetros | Verdadeiro se a ação de destrancar for bem-sucedida, Falso caso contrário. Se o desbloqueio for feito em uma entidade abandonada, em um registro não bloqueado ou em um registro bloqueado por outro processo ou entidade, o sucesso é False. |
Exemplo
var $employee : cs. EmployeeEntity
var $status : Object
$employee:=ds. Employee.get(725)
$status:=$employee.lock()
... //processing
$status:=$employee.unlock()
If($status.success)
ALERT("The entity is now unlocked")
End if