Entity
Una entidad es una instancia de una Dataclass, como un registro de la tabla que coincide con la dataclass en su datastore asociado. Contiene los mismos atributos que la clase de datos, así como los valores de los datos y las propiedades y funciones específicas.
Resumen
.attributeName : any almacena el valor del atributo para la entidad |
.clone() : 4D.Entity crea en la memoria una nueva entidad que hace referencia al mismo registro que la entidad original |
.diff( entityToCompare : 4D.Entity { ; attributesToCompare : Collection } ) : Collection compara el contenido de dos entidades y devuelve sus diferencias |
.drop( {mode : Integer} ) : Object elimina los datos contenidos en la entidad desde el almacén de datos |
.first(): 4D.Entity devuelve una referencia a la entidad en primera posición de la selección de entidades a la que pertenece la entidad |
.fromObject( filler : Object ) llena una entidad con el contenido de filler |
.getDataClass() : 4D.DataClass devuelve la dataclass de la entidad |
.getKey( { mode : Integer } ) : Text .getKey( { mode : Integer } ) : Integer devuelve el valor de la llave primaria |
.getRemoteContextAttributes() : Text devuelve información sobre el contexto de optimización utilizado por la entidad |
.getSelection(): 4D.EntitySelection devuelve la selección de entidades a la que pertenece la entidad |
.getStamp() : Integer devuelve el valor actual del sello de la entidad |
.indexOf( { entitySelection : 4D.EntitySelection } ) : Integer devuelve la posición de la entidad en una entity selection |
.isNew() : Boolean devuelve True si la entidad a la que se aplica acaba de ser creada y aún no ha sido guardada en el datastore |
.last() : 4D.Entity |
.lock( { mode : Integer } ) : Object pone un bloqueo pesimista en el registro referenciado por la entidad |
.next() : 4D.Entity devuelve una referencia a la siguiente entidad en la selección de entidades a la que pertenece la entidad |
.previous() : 4D.Entity devuelve una referencia a la entidad anterior en la selección de entidades a la que pertenece la entidad |
.reload() : Object recarga el contenido de la entidad en memoria |
.save( { mode : Integer } ) : Object guarda los cambios realizados en la entidad |
.toObject() : Object .toObject( filterString : Text { ; options : Integer} ) : Object .toObject( filterCol : Collection { ; options : Integer } ) : Object devuelve un objeto que ha sido construido a partir de la entidad |
.touched() : Boolean comprueba si un atributo de la entidad ha sido modificado o no desde que la entidad fue cargada en memoria o guardada |
.touchedAttributes() : Collection devuelve los nombres de los atributos que han sido modificados desde que la entidad fue cargada en memoria |
.unlock() : Object elimina el bloqueo pesimista del registro que coincide con la entidad |
.attributeName
Historia
Lanzamiento | Modificaciones |
---|---|
17 | Añadidos |
.attributeName : any
Descripción
Todo atributo de la dataclass está disponible como una propiedad de una entidad, que almacena el valor del atributo para la entidad.
Los atributos dataclass también se pueden alcanzar utilizando la sintaxis alternativa con [ ].
El tipo de valor del atributo depende del tipo kind (relation o storage):
- Si el tipo de attributeName es storage:
.attributeName
devuelve un valor del mismo tipo que attributeName. - Si el tipo de attributeName es relatedEntity:
.attributeName
devuelve la entidad relacionada. Los valores de la entidad relacionada están disponibles directamente a través de las propiedades en cascada, por ejemplo "myEntity.employer.employees[0].lastname". - Si el tipo attributeName es relatedEnties:
.attributeName
devuelve una nueva selección de entidades relacionadas. Se eliminan los duplicados (se devuelve una entity selection desordenada).
Ejemplo
var $myEntity : cs.EmployeeEntity
$myEntity:=ds.Employee.new() //Crear una nueva entidad
$myEntity.name:="Dupont" // asignar 'Dupont' al atributo 'name'
$myEntity.firstname:="John" //asignar 'John' al atributo 'firstname'
$myEntity.save() //guardar la entidad
.clone()
Historia
Lanzamiento | Modificaciones |
---|---|
17 | Añadidos |
.clone() : 4D.Entity
Parámetros | Tipo | Descripción | |
---|---|---|---|
Result | 4D.Entity | <- | Nueva entidad que hace referencia al registro |
Descripción
La función .clone()
crea en la memoria una nueva entidad que hace referencia al mismo registro que la entidad original. Esta función permite actualizar las entidades por separado.
Tenga en cuenta que toda modificación realizada a las entidades se guardará en el registro referenciado sólo cuando se ejecute la función
.save( )
.
Esta función sólo puede utilizarse con entidades ya guardadas en la base de datos. No se puede llamar a una entidad recién creada (para la que isNew()
devuelve True).
Ejemplo
var $emp; $empCloned : cs.EmployeeEntity
$emp:=ds.Employee.get(672)
$empCloned:=$emp.clone()
$emp.lastName:="Smith" //Las actualizaciones realizadas en $emp no se realizan en $empCloned
.diff()
Historia
Lanzamiento | Modificaciones |
---|---|
17 | Añadidos |
.diff( entityToCompare : 4D.Entity { ; attributesToCompare : Collection } ) : Collection
Parámetros | Tipo | Descripción | |
---|---|---|---|
entityToCompare | 4D.Entity | -> | Entidad a comparar con la entidad original |
attributesToCompare | Collection | -> | Nombre de los atributos a comparar |
Result | Collection | <- | Diferencias entre las entidades |
Descripción
La función .diff()
compara el contenido de dos entidades y devuelve sus diferencias.
En entityToCompare, pase la entidad que se va a comparar con la entidad original.
En attributesToCompare, puede designar atributos específicos a comparar. Si se suministra, la comparación se realiza sólo en los atributos especificados. Si no se suministra, se devuelven todas las diferencias entre las entidades.
Las diferencias se devuelven como una colección de objetos cuyas propiedades son:
Nombre de propiedad | Tipo | Descripción |
---|---|---|
attributeName | String | Nombre del atributo |
value | cualquiera - Depende del tipo de atributo | Valor del atributo en la entidad |
otherValue | cualquiera - Depende del tipo de atributo | Valor del atributo en entityToCompare |
Sólo se incluyen en la colección los atributos con valores diferentes. Si no se encuentran diferencias, .diff()
devuelve una colección vacía.
La función se aplica a las propiedades cuyo kind es storage o relatedEntity. En caso de que se haya actualizado una entidad relacionada (es decir, la llave foránea), el nombre de la entidad relacionada y su nombre de llave primaria se devuelven como propiedades attributeName (value y otherValue están vacíos para el nombre de la entidad relacionada).
Si una de las entidades comparadas es Null, se produce un error.
Ejemplo 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) // Se devuelven todas las diferencias
$diff2:=$clone.diff(employee;New collection("firstName"; "lastName"))
// Sólo se devuelven las diferencias en firstName y lastName
$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"
}
]
Ejemplo 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())
vCompareResult1 (se devuelven todas las diferencias):
[
{
"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 (sólo se devuelven las diferencias en $attributesToInspect)
[
{
"attributeName": "firstName",
"value": "Karla update",
"otherValue": "Karla"
},
{
"attributeName": "lastName",
"value": "Marrero update",
"otherValue": "Marrero"
}
]
vCompareResult3 (sólo se devuelven las diferencias en atributos tocados $e1)
[
{
"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()
Historia
Lanzamiento | Modificaciones |
---|---|
17 | Añadidos |
.drop( {mode : Integer} ) : Object
Parámetros | Tipo | Descripción | |
---|---|---|---|
mode | Integer | -> | dk force drop if stamp changed : activa el soltar incluso si el sello ha cambiado |
Result | Object | <- | Resultado de la operación soltar |
Descripción
La función .drop()
elimina los datos contenidos en la entidad desde el almacén de datos, desde la tabla relacionada con su Dataclass. Tenga en cuenta que la entidad permanece en la memoria.
En una aplicación multiusuario o multiproceso, la función .drop()
se ejecuta bajo un mecanismo "bloqueo optimista", en el que un sello de bloqueo interno se incrementa automáticamente cada vez que se guarda el registro.
Por defecto, si se omite el parámetro mode, la función devolverá un error (ver más abajo) si la misma entidad fue modificada (es decir, el sello ha cambiado) por otro proceso o usuario en el ínterin.
De lo contrario, puede pasar la opción dk force drop if stamp changed
en el parámetro mode: en este caso, la entidad se elimina incluso si el marcador ha cambiado (y la llave primaria sigue siendo la misma).
Resultado
El objeto devuelto por .drop()
contiene las siguientes propiedades:
Propiedad | Tipo | Descripción | |
---|---|---|---|
success | boolean | true si la acción de soltar tiene éxito, false en caso contrario. | |
Disponible sólo en caso de error: | |||
status(*) | number | Código de error, ver abajo | |
statusText(*) | text | Descripción del error, ver abajo | |
Disponible sólo en caso de error de bloqueo pesimista: | |||
LockKindText | text | "Locked by record" | |
lockInfo | object | Información sobre el origen del bloqueo | |
task_id | number | Id del proceso | |
user_name | text | Nombre de usuario de la sesión en la máquina | |
user4d_alias | text | Alias usuario si está definido por SET USER ALIAS , si no, nombre de usuario en el directorio 4D | |
host_name | text | Nombre de la máquina | |
task_name | text | Nombre del proceso | |
client_version | text | ||
Disponible sólo en caso de error grave (un error grave puede ser intentar duplicar una llave primaria, disco lleno...): | |||
errors | collection of objects | ||
message | text | Mensaje de error | |
component signature | text | firma del componente interno (por ejemplo, "dmbg" significa el componente de la base) | |
errCode | number | Código de error |
(*) Los siguientes valores pueden ser devueltos en las propiedades status y statusText del objeto Result en caso de error:
Constante | Valor | Comentario |
---|---|---|
dk status entity does not exist anymore | 5 | La entidad ya no existe en los datos. Este error puede ocurrir en los siguientes casos: |
dk status locked | 3 | La entidad está bloqueada por un bloqueo pesimista. statusText asociado: "Already locked" |
dk status serious error | 4 | Un error grave es un error de base de datos de bajo nivel (por ejemplo, una llave duplicada), un error de hardware, etc. statusText asociado: "Other error" |
dk status stamp has changed | 2 | El valor del marcador interno de la entidad no coincide con el de la entidad almacenada en los datos (bloqueo optimista)..save() : error solo si no se utiliza la opción dk auto merge .drop() : error solo si no se utiliza la opción dk force drop if stamp changed .lock( ) : error solo si no se utiliza la opción dk reload if stamp changed |
dk status wrong permission | 1 | Los privilegios actuales no permiten suprimir la entidad. Associated statusText: "Permission Error" |
Ejemplo 1
Ejemplo sin la opción 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) //La entidad soltada permanece en la memoria
:($status.status=dk status stamp has changed)
ALERT($status.statusText)
End case
Ejemplo 2
Ejemplo con la opción 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(dk force drop if stamp changed)
Case of
:($status.success)
ALERT("You have dropped "+$employee.firstName+" "+$employee.lastName) //La entidad soltada permanece en la memoria
:($status.status=dk status entity does not exist anymore)
ALERT($status.statusText)
End case
.first()
Historia
Lanzamiento | Modificaciones |
---|---|
17 | Añadidos |
.first(): 4D.Entity
Parámetros | Tipo | Descripción | |
---|---|---|---|
Result | 4D.Entity | <- | Referencia a la primera entidad de una selección de entidades (Null si no se encuentra) |
Descripción
La función .first()
devuelve una referencia a la entidad en primera posición de la selección de entidades a la que pertenece la entidad.
Si la entidad no pertenece a ninguna entity selection (es decir, .getSelection( ) devuelve Null), la función devuelve un valor Null.
Ejemplo
var $employees : cs.EmployeeSelection
var $employee; $firstEmployee : cs.EmployeeEntity
$employees:=ds.Employee.query("lastName = :1";"H@") //Esta selección de entidades contiene 3 entidades
$employee:=$employees[2]
$firstEmployee:=$employee.first() //$firstEmployee es la primera entidad de la selección de entidades $employees
.fromObject()
Historia
Lanzamiento | Modificaciones |
---|---|
17 | Añadidos |
.fromObject( filler : Object )
Parámetros | Tipo | Descripción | |
---|---|---|---|
filler | Object | -> | Objeto a partir del cual se llena la entidad |
Descripción
La función .fromObject()
llena una entidad con el contenido de filler.
Esta función modifica la entidad original.
El mapeo entre el objeto y la entidad se realiza sobre los nombres de los atributos:
- Si una propiedad del objeto no existe en la dataclass, se ignora.
- Los tipos de datos deben ser equivalentes. Si hay una diferencia de tipo entre el objeto y la dataclass, 4D intenta convertir los datos siempre que sea posible (ver
Convertir tipos de datos
), de lo contrario el atributo se deja sin tocar. - La llave primaria puede darse tal cual o con una propiedad "__KEY" (llenada con el valor de la llave primaria). Si no existe ya en la dataclass, la entidad se crea con el valor dado cuando .save() es llamado. Si no se da la llave primaria, se crea la entidad y se asigna el valor de la llave primaria con respecto a las reglas de la base de datos. El autoincremento sólo se calcula si la llave primaria es nula.
filler puede manejar una entidad relacionada bajo las siguientes condiciones:
- filler contiene la propia llave foránea, o
- filler contiene un objeto de propiedad con el mismo nombre que la entidad relacionada, que contiene una única propiedad denominada "__KEY".
- si la entidad relacionada no existe, se ignora.
Ejemplo
Con el siguiente objeto $o:
{
"firstName": "Mary",
"lastName": "Smith",
"salary": 36500,
"birthDate": "1958-10-27T00:00:00.000Z",
"woman": true,
"managerID": 411,// relatedEntity dada con PK
"employerID": 20 // relatedEntity dada con PK
}
El siguiente código creará una entidad con entidades relacionadas con el gerente y el empleador.
var $o : Object
var $entity : cs.EmpEntity
$entity:=ds.Emp.new()
$entity.fromObject($o)
$entity.save()
También puede utilizar una entidad relacionada dada como objeto:
{
"firstName": "Marie",
"lastName": "Lechat",
"salary": 68400,
"birthDate": "1971-09-03T00:00:00.000Z",
"woman": false,
"employer": {// relatedEntity dada como un objeto
"__KEY": "21"
},
"manager": {// relatedEntity dada como un objeto
"__KEY": "411"
}
}
.getDataClass()
Historia
Lanzamiento | Modificaciones |
---|---|
17 R5 | Añadidos |
.getDataClass() : 4D.DataClass
Parámetros | Tipo | Descripción | |
---|---|---|---|
Result | 4D.DataClass | <- | Objeto DataClass al que pertenece la entidad |
Descripción
La función .getDataClass()
devuelve la dataclass de la entidad. Esta función es útil al escribir código genérico.
Ejemplo
El siguiente código genérico duplica cualquier entidad:
//método duplicate_entity
//duplicate_entity($entity)
#DECLARE($entity : 4D.Entity)
var $entityNew : 4D.Entity
var $status : Object
$entityNew:=$entity.getDataClass().new() //crea una nueva entidad en la dataclass padre
$entityNew.fromObject($entity.toObject()) //obtiene todos los atributos
$entityNew[$entity.getDataClass().getInfo().primaryKey]:=Null //restablece la llave primaria
$status:=$entityNew.save() //guarda la entidad duplicada
.getKey()
Historia
Lanzamiento | Modificaciones |
---|---|
17 | Añadidos |
.getKey( { mode : Integer } ) : Text
.getKey( { mode : Integer } ) : Integer
Parámetros | Tipo | Descripción | |
---|---|---|---|
mode | Integer | -> | dk key as string : la llave primaria se devuelve como una cadena, sin importar el tipo de llave primaria |
Result | Text | <- | Valor de la llave primaria de texto de la entidad |
Result | Integer | <- | Valor de la llave primaria numérica de la entidad |
Descripción
La función .getKey()
devuelve el valor de la llave primaria.
Las llaves primarias pueden ser números (enteros) o cadenas. Puede "forzar" que el valor de la llave primaria devuelto sea una cadena, sin importar el tipo de llave primaria real, pasando la opción dk key as string
en el parámetro mode.
Ejemplo
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))
.getRemoteContextAttributes()
Historia
Lanzamiento | Modificaciones |
---|---|
19R5 | Añadidos |
.getRemoteContextAttributes() : Text
Parámetros | Tipo | Descripción | |
---|---|---|---|
resultado | Text | <- | Atributos de contexto vinculados a la entidad, separados por una coma |
Modo avanzado: esta función está pensada para los desarrolladores que necesitan personalizar las funcionalidades por defecto de ORDA para configuraciones específicas. En la mayoría de los casos, no será necesario utilizarla.
Descripción
La función .getRemoteContextAttributes()
devuelve información sobre el contexto de optimización utilizado por la entidad .
Si no hay un contexto de optimización para la entidad, la función devuelve un texto vacío.
Ejemplo
var $ds : 4D.DataStoreImplementation
var $address : cs.AddressEntity
var $p : cs.PersonsEntity
var $contextA : Object
var $info : Text
var $text : Text
$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
$contextA:=New object("context"; "contextA")
$address:=$ds.Address.get(1; $contextA)
$text:=""
For each ($p; $address.persons)
$text:=$p.firstname+" "+$p.lastname
End for each
$info:=$address.getRemoteContextAttributes()
//$info = "persons,persons.lastname,persons.firstname"
Ver también
EntitySelection.getRemoteContextAttributes()
.clearAllRemoteContexts()
.getRemoteContextInfo()
.getAllRemoteContexts()
.setRemoteContextInfo()
.getSelection()
Historia
Lanzamiento | Modificaciones |
---|---|
17 | Añadidos |
.getSelection(): 4D.EntitySelection
Parámetros | Tipo | Descripción | |
---|---|---|---|
Result | 4D.EntitySelection | <- | Entity selection a la que pertenece la entidad (nula si no se encuentra) |
Descripción
La función .getSelection()
devuelve la selección de entidades a la que pertenece la entidad.
Si la entidad no pertenece a una selección de entidades, la función devuelve Null.
Ejemplo
var $emp : cs.EmployeeEntity
var $employees; $employees2 : cs.EmployeeSelection
$emp:=ds.Employee.get(672) // Esta entidad no pertenece a ninguna selección de entidades
$employees:=$emp.getSelection() // $employees es Null
$employees2:=ds.Employee.query("lastName=:1";"Smith") //Esta selección de entidades contiene 6 entidades
$emp:=$employees2[0] // Esta entidad pertenece a una selección de entidades
ALERT("La entity selection contiene "+String($emp.getSelection().length)+" entidades")
.getStamp()
Historia
Lanzamiento | Modificaciones |
---|---|
17 | Añadidos |
.getStamp() : Integer
Parámetros | Tipo | Descripción | |
---|---|---|---|
Result | Integer | <- | Sello de la entidad (0 si la entidad acaba de ser creada) |
Descripción
La función .getStamp()
devuelve el valor actual del sello de la entidad.
El sello interno se incrementa automáticamente en 4D cada vez que se guarda la entidad. Gestiona los accesos y modificaciones concurrentes de los usuarios a las mismas entidades (ver Bloqueo de entidades).
Para una entidad nueva (nunca guardada), la función devuelve 0. Para saber si una entidad acaba de ser creada, se recomienda utilizar .isNew().
Ejemplo
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()
Historia
Lanzamiento | Modificaciones |
---|---|
17 | Añadidos |
.indexOf( { entitySelection : 4D.EntitySelection } ) : Integer
Parámetros | Tipo | Descripción | |
---|---|---|---|
entitySelection | 4D.EntitySelection | -> | La posición de la entidad se da en función de esta selección de entidades |
Result | Integer | <- | Posición de la entidad en una selección de entidades |
Descripción
La función .indexOf()
devuelve la posición de la entidad en una entity selection.
Por defecto, si se omite el parámetro entitySelection, la función devuelve la posición de la entidad dentro de su propia selección de entidades. En caso contrario, devuelve la posición de la entidad dentro de la entitySelection especificada.
El valor resultante se incluye entre 0 y la longitud de la selección de entidades -1.
- Si la entidad no tiene una selección de entidad o no pertenece a entitySelection, la función devuelve -1.
- Si entitySelection es Null o no pertenece a la misma clase de datos que la entidad, se produce un error.
Ejemplo
var $employees : cs.EmployeeSelection
var $employee : cs.EmployeeEntity
$employees:=ds.Employee.query("lastName = :1";"H@") //Esta entity selection contiene 3 entidades
$employee:=$employees[1] //Esta entidad pertenece a una entity selection
ALERT("El índice de la entidad en su propia selección de entidades es "+String($employee.indexOf())) //1
$employee:=ds.Employee.get(725) //Esta entidad no pertenece a una selección de entidades
ALERT("El índice de la entidad es "+String($employee.indexOf())) // -1
.isNew()
Historia
Lanzamiento | Modificaciones |
---|---|
17 | Añadidos |
.isNew() : Boolean
Parámetros | Tipo | Descripción | |
---|---|---|---|
Result | Boolean | <- | True si la entidad acaba de ser creada y aún no se ha guardado. En caso contrario, False. |
Descripción
La función .isNew()
devuelve True si la entidad a la que se aplica acaba de ser creada y aún no ha sido guardada en el datastore. .
Ejemplo
var $emp : cs.EmployeeEntity
$emp:=ds.Employee.new()
If($emp.isNew())
ALERT("This is a new entity")
End if
.last()
Historia
Lanzamiento | Modificaciones |
---|---|
17 | Añadidos |
.last() : 4D.Entity
Parámetros | Tipo | Descripción | |
---|---|---|---|
Result | 4D.Entity | <- | Referencia a la última entidad de una selección de entidades (Null si no se encuentra) |
Descripción
La función .last()
devuelve una referencia a la entidad en la última posición de la selección de entidades a la que pertenece la entidad.
Si la entidad no pertenece a ninguna entity selection (es decir, .getSelection( ) devuelve Null), la función devuelve un valor Null.
Ejemplo
var $employees : cs.EmployeeSelection
var $employee; $lastEmployee : cs.EmployeeEntity
$employees:=ds.Employee.query("lastName = :1";"H@") //Esta selección de entidades contiene 3 entidades
$employee:=$employees[0]
$lastEmployee:=$employee.last() //$lastEmployee es la última entidad de la selección de entidades $employees
.lock()
Historia
Lanzamiento | Modificaciones |
---|---|
17 | Añadidos |
.lock( { mode : Integer } ) : Object
Parámetros | Tipo | Descripción | |
---|---|---|---|
mode | Integer | -> | dk reload if stamp changed : recargar antes de bloquear si el marcador ha cambiado |
Result | Object | <- | Resultado de la operación de bloqueo |
Descripción
La función .lock()
pone un bloqueo pesimista en el registro referenciado por la entidad. El bloqueo se establece para un registro y todas las referencias de la entidad en el proceso actual.
Otros procesos verán este registro como bloqueado (la propiedad result.success
contendrá False si intentan bloquear la misma entidad usando esta función). Sólo las funciones ejecutadas en la sesión de "bloqueo" pueden editar y guardar los atributos de la entidad. La entidad puede ser cargada como de sólo lectura por otras sesiones, pero no podrán introducir y guardar valores.
Un registro bloqueado por .lock()
se desbloquea:
- cuando la función
unlock()
se llama en una entidad correspondiente en el mismo proceso - automáticamente, cuando ya no es referenciado por ninguna entidad en la memoria. Por ejemplo, si el bloqueo se pone sólo en una referencia local de una entidad, la entidad se desbloquea cuando la función termina. Mientras haya referencias a la entidad en la memoria, el registro permanece bloqueado.
Una entidad también puede ser bloqueada por una sesión REST, en cuyo caso solo puede ser desbloqueada por la sesión.
Por defecto, si se omite el parámetro mode, la función devolverá un error (ver más abajo) si la misma entidad fue modificada (es decir, el sello ha cambiado) por otro proceso o usuario en el ínterin.
De lo contrario, puede pasar la opción dk reload if stamp changed
en el parámetro mode: en este caso, no se devuelve error y la entidad se recarga cuando el sello cambia (si la entidad aún existe y la llave primaria sigue siendo la misma).
Resultado
El objeto devuelto por .lock( )
contiene las siguientes propiedades:
Propiedad | Tipo | Descripción | |
---|---|---|---|
success | boolean | true si la acción de bloqueo tiene éxito (o si la entidad ya está bloqueada en el proceso actual), false en caso contrario. | |
Disponible sólo si se utiliza la opción dk reload if stamp changed : | |||
wasReloaded | boolean | true si la entidad fue recargada con éxito, false en caso contrario. | |
Disponible sólo en caso de error: | |||
status(*) | number | Código de error, ver abajo | |
statusText(*) | text | Descripción del error, ver abajo | |
Disponible sólo en caso de error de bloqueo pesimista: | |||
lockKindText | text | "Locked by record" si está bloqueado por un proceso 4D, "Locked by session" si está bloqueado por una sesión REST | |
lockInfo | object | Información sobre el origen del bloqueo. Las propiedades devueltas dependen del origen del bloqueo (proceso 4D o sesión REST). | |
Disponible sólo para un bloqueo por proceso 4D: | |||
task_id | number | ID del Proceso | |
user_name | text | Nombre de usuario de la sesión en la máquina | |
user4d_alias | text | Nombre o alias del usuario 4D | |
user4d_id | number | ID del usuario en el directorio de la base de datos 4D | |
host_name | text | Nombre de la máquina | |
task_name | text | Nombre del proceso | |
client_version | text | Versión del cliente | |
Disponible sólo para un bloqueo por sesión REST: | |||
host | text | URL que bloqueó la entidad (por ejemplo, "www.myserver.com") | |
IPAddr | text | Dirección IP del bloqueo (por ejemplo: "127.0.0.1") | |
userAgent | text | userAgent del origin del bloqueo (ej: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36") | |
Disponible sólo en caso de error crítico (llave primaria duplicada, disco lleno...): | |||
errors | collection of objects | ||
message | text | Mensaje de error | |
component signature | text | firma del componente interno (por ejemplo, "dmbg" significa el componente de la base) | |
errCode | number | Código de error |
(*) Los siguientes valores pueden ser devueltos en las propiedades status y statusText del objeto Result en caso de error:
Constante | Valor | Comentario |
---|---|---|
dk status entity does not exist anymore | 5 | La entidad ya no existe en los datos. Este error puede ocurrir en los siguientes casos:.drop( ) , este error puede devolverse cuando se utiliza la opción dk force drop if stamp changed . Cuando se utiliza .lock( ) , este error puede ser devuelto cuando se utiliza la opción dk reload if stamp changed statusText asociado: "Entity does not exist anymore" |
dk status locked | 3 | La entidad está bloqueada por un bloqueo pesimista. statusText asociado: "Already locked" |
dk status serious error | 4 | Un error grave es un error de base de datos de bajo nivel (por ejemplo, una llave duplicada), un error de hardware, etc. statusText asociado: "Other error" |
dk status stamp has changed | 2 | El valor del marcador interno de la entidad no coincide con el de la entidad almacenada en los datos (bloqueo optimista)..save() : error solo si no se utiliza la opción dk auto merge .drop() : error solo si no se utiliza la opción dk force drop if stamp changed .lock( ) : error solo si no se utiliza la opción dk reload if stamp changed Estado asociado: "Stamp has changed" |
Ejemplo 1
Ejemplo con error:
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
Ejemplo 2
Ejemplo con la opción dk reload if stamp changed
:
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()
Historia
Lanzamiento | Modificaciones |
---|---|
17 | Añadidos |
.next() : 4D.Entity
Parámetros | Tipo | Descripción | |
---|---|---|---|
Result | 4D.Entity | <- | Referencia a la siguiente entidad en la selección de entidades (Null si no se encuentra) |
Descripción
La función .next()
devuelve una referencia a la siguiente entidad en la selección de entidades a la que pertenece la entidad.
Si la entidad no pertenece a ninguna entity selection (es decir, .getSelection() devuelve Null), la función devuelve un valor Null.
Si no hay una entidad siguiente válida en la selección de entidades (es decir, se encuentra en la última entidad de la selección), la función devuelve Null. Si la siguiente entidad ha sido descartada, la función devuelve la siguiente entidad válida (y eventualmente Null).
Ejemplo
var $employees : cs.EmployeeSelection
var $employee; $nextEmployee : cs.EmployeeEntity
$employees:=ds.Employee.query("lastName = :1";"H@") //Esta selección de entidades contiene 3 entidades
$employee:=$employees[0]
$nextEmployee:=$employee.next() //$nextEmployee es la segunda entidad de entidad
selection $employees
.previous()
Historia
Lanzamiento | Modificaciones |
---|---|
17 | Añadidos |
.previous() : 4D.Entity
Parámetros | Tipo | Descripción | |
---|---|---|---|
Result | 4D.Entity | <- | Referencia a la entidad anterior en la selección de entidades (Null si no se encuentra) |
Descripción
La función .previous()
devuelve una referencia a la entidad anterior en la selección de entidades a la que pertenece la entidad.
Si la entidad no pertenece a ninguna entity selection (es decir, .getSelection() devuelve Null), la función devuelve un valor Null.
Si no hay una entidad anterior válida en la selección de entidades (es decir, se encuentra en la primera entidad de la selección), la función devuelve Null. Si la entidad anterior ha sido soltada, la función devuelve la entidad válida anterior (y eventualmente Null).
Ejemplo
var $employees : cs.EmployeeSelection
var $employee; $previousEmployee : cs.EmployeeEntity
$employees:=ds.Employee.query("lastName = :1";"H@") //Esta selección de entidades contiene 3 entidades
$employee:=$employees[1]
$previousEmployee:=$employee.previous() //$previousEmployee es la primera entidad de la selección de entidades $employees
.reload()
Historia
Lanzamiento | Modificaciones |
---|---|
17 | Añadidos |
.reload() : Object
Parámetros | Tipo | Descripción | |
---|---|---|---|
Result | Object | <- | Objeto estado |
Descripción
La función .reload()
recarga el contenido de la entidad en memoria, según la información almacenada en la tabla relacionada con la dataclass en el datastore. La recarga se realiza sólo si la entidad sigue existiendo con la misma llave primaria.
Resultado
El objeto devuelto por .reload( )
contiene las siguientes propiedades:
Propiedad | Tipo | Descripción |
---|---|---|
success | boolean | True si la acción de recarga tiene éxito, False en caso contrario. Disponible sólo en caso de error: |
status(*) | number | Código de error, ver abajo |
statusText(*) | text | Descripción del error, ver abajo |
(*) Los siguientes valores pueden ser devueltos en las propiedades status y statusText del objeto Result en caso de error:
Constante | Valor | Comentario |
---|---|---|
dk status entity does not exist anymore | 5 | La entidad ya no existe en los datos. Este error puede ocurrir en los siguientes casos:.lock( ) , este error puede ser devuelto cuando se utiliza la opción dk reload if stamp changed statusText asociado: "Entity does not exist anymore" |
dk status serious error | 4 | Un error grave es un error de base de datos de bajo nivel (por ejemplo, una llave duplicada), un error de hardware, etc. statusText asociado: "Other error" |
Ejemplo
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()
Historia
Lanzamiento | Modificaciones |
---|---|
17 | Añadidos |
.save( { mode : Integer } ) : Object
Parámetros | Tipo | Descripción | |
---|---|---|---|
mode | Integer | -> | dk auto merge : activa el modo "automatic merge" |
Result | Object | <- | Resultado de la operación guardar |
Descripción
La función .save()
guarda los cambios realizados en la entidad en la tabla relacionada con su dataClass. Debe llamar a este método después de crear o modificar una entidad si quiere guardar los cambios realizados en ella.
La operación de guardar se ejecuta sólo si se ha "tocado" al menos un atributo de la entidad (ver las funciones .touched()
y .touchedAttributes()
). En caso contrario, la función no hace nada (no se llama al activador).
En una aplicación multiusuario o multiproceso, la función .save()
se ejecuta con el mecanismo del "bloqueo optimista", en el que un contador interno (stamp) se incrementa automáticamente cada vez que se guarda el registro.
Por defecto, si se omite el parámetro mode, el método devolverá un error (ver más abajo) siempre que la misma entidad haya sido modificada por otro proceso o usuario mientras tanto, sin importar el atributo o atributos modificados.
En caso contrario, se puede pasar la opción dk auto merge
en el parámetro mode: cuando el modo "automatic merge" está activado, una modificación realizada simultáneamente por otro proceso/usuario en la misma entidad pero en un atributo diferente no dará lugar a un error. Los datos resultantes guardados en la entidad serán la combinación (la "fusión") de todas las modificaciones no concurrentes (si se aplicaron modificaciones al mismo atributo, el guardado falla y se devuelve un error, incluso con el modo de fusión automática).
El modo de fusión automática no está disponible para los atributos de tipo Imagen, Objeto y Texto cuando se almacenan fuera del registro. Los cambios concurrentes en estos atributos darán lugar a un error
dk status stamp has changed
.
Resultado
El objeto devuelto por .save()
contiene las siguientes propiedades:
Propiedad | Tipo | Descripción | |
---|---|---|---|
success | boolean | True si la acción guardar tiene éxito, false en caso contrario. | |
Disponible sólo si se utiliza la opción dk auto merge : | |||
autoMerged | boolean | True si se ha realizado una fusión automática, False en caso contrario. | |
Disponible sólo en caso de error: | |||
status | number | Código de error, ver abajo | |
statusText | text | Descripción del error, ver abajo | |
Disponible sólo en caso de error de bloqueo pesimista: | |||
lockKindText | text | "Locked by record" | |
lockInfo | object | Información sobre el origen del bloqueo | |
task_id | number | Id del proceso | |
user_name | text | Nombre de usuario de la sesión en la máquina | |
user4d_alias | text | Alias usuario si está definido por SET USER ALIAS , si no, nombre de usuario en el directorio 4D | |
host_name | text | Nombre de la máquina | |
task_name | text | Nombre del proceso | |
client_version | text | ||
Disponible sólo en caso de error crítico (error crítico - puede ser intentar duplicar una llave primaria, disco lleno...): | |||
errors | collection of objects | ||
message | text | Mensaje de error | |
componentSignature | text | Firma del componente interno (por ejemplo, "dmbg" significa el componente de la base) | |
errCode | number | Código de error |
status y statusText
Los siguientes valores pueden ser devueltos en las propiedades status
y statusText
del objeto Result en caso de error:
Constante | Valor | Comentario |
---|---|---|
dk status automerge failed | 6 | (Sólo si se utiliza la opción dk auto merge ) La opción de fusión automática falló al guardar la entidad. statusText asociado: "Auto merge failed" |
dk status entity does not exist anymore | 5 | La entidad ya no existe en los datos. Este error puede ocurrir en los siguientes casos:.lock( ) , este error puede ser devuelto cuando se utiliza la opción dk reload if stamp changed statusText asociado: "Entity doesnot exist anymore" |
dk status locked | 3 | La entidad está bloqueada por un bloqueo pesimista. statusText asociado: "Already locked" |
dk status serious error | 4 | Un error grave es un error de base de datos de bajo nivel (por ejemplo, una llave duplicada), un error de hardware, etc. statusText asociado: "Other error" |
dk status stamp has changed | 2 | El valor del marcador interno de la entidad no coincide con el de la entidad almacenada en los datos (bloqueo optimista)..save() : error solo si no se utiliza la opción dk auto merge .drop() : error solo si no se utiliza la opción dk force drop if stamp changed .lock( ) : error solo si no se utiliza la opción dk reload if stamp changed statusText asociado: "Stamp has changed" |
dk status wrong permission | 1 | Los privilegios actuales no permiten guardar la entidad. Associated statusText: "Permission Error" |
Ejemplo 1
Crear una nueva entidad:
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
Ejemplo 2
Actualizando una entidad sin opción 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
Ejemplo 3
Actualización de una entidad con la opción 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()
Historia
Lanzamiento | Modificaciones |
---|---|
17 | Añadidos |
.toObject() : Object
.toObject( filterString : Text { ; options : Integer} ) : Object
.toObject( filterCol : Collection { ; options : Integer } ) : Object
Parámetros | Tipo | Descripción | |
---|---|---|---|
filterString | Text | -> | Atributo(s) a extraer (cadena separada por comas) |
filterCol | Collection | -> | Colección de atributos a extraer |
options | Integer | -> | dk with primary key : adds the __KEY property;dk with stamp : adds the _STAMP property |
Result | Object | <- | Objeto creado a partir de la entidad |
Descripción
La función .toObject()
devuelve un objeto que ha sido construido a partir de la entidad. Los nombres de las propiedades en el objeto coinciden con los nombres de los atributos de la entidad.
Si no se especifica ningún filtro, o si el parámetro filterString contiene una cadena vacía o "*", el objeto devuelto contendrá:
- todos los atributos de la entidad de almacenamiento
- atributos de kind
relatedEntity
: se obtiene una propiedad con el mismo nombre que la entidad relacionada (nombre del enlace muchos-a-uno). El atributo se extrae con la forma simple. - atributos de kind
relatedEntities
: no se devuelve el atributo.
En el primer parámetro, se pasa el atributo o atributos de la entidad a extraer. Puede pasar:
- filterString: una cadena con rutas de propiedades separadas por comas: "propertyPath1, propertyPath2, ...", o
- filterCol: una colección de cadenas: ["propertyPath1","propertyPath2";...]
Si se especifica un filtro para los atributos cuyo kind es relatedEntity:
- propertyPath = "relatedEntity" -> se extrae de forma sencilla: un objeto con la propiedad __KEY (llave primaria).
- propertyPath = "relatedEntity.*" -> se extraen todas las propiedades
- propertyPath = "relatedEntity.propertyName1; relatedEntity.propertyName2; ..." -> sólo se extraen esas propiedades
Si se especifica un filtro para los atributos cuyo kind es relatedEntities:
- propertyPath = "relatedEntities.*" -> se extraen todas las propiedades
- propertyPath = "relatedEntities.propertyName1; relatedEntities.propertyName2; ..." -> sólo se extraen esas propiedades
En el parámetro options, puedes pasar el selector dk with primary key
y/o dk with stamp
para agregar las llaves primarias y/o los stamps en los objetos extraídos.
Si utiliza otro atributo distinto de la llave primaria como atributo Uno en una relación, el valor de este atributo se escribirá en la propiedad "__KEY". Tenga en cuenta que se recomienda utilizar la llave primaria como atributo Uno en sus relaciones, especialmente cuando utilice las funciones .toObject()
y .fromObject()
.
Ejemplo 1
En todos los ejemplos de esta sección se utilizará la siguiente estructura:
Sin parámetro de filtro:
employeeObject:=employeeSelected.toObject()
Ejemplo con el tipo relatedEntity
con una forma simple:
{
"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 extracted with simple form
"__KEY": 20
},
"manager": {
"__KEY": 412
}
}
Ejemplo 2
Extraer la llave primaria y el sello:
employeeObject:=employeeSelected.toObject("";dk with primary key+dk with stamp)
Ejemplo con el tipo relatedEntity
con una forma simple:
{
"__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
}
}
Ejemplo 3
Extrayendo todas las propiedades 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
}
}
]
}
Ejemplo 4
Extracción de algunas propiedades de relatedEntities
:
employeeObject:=employeeSelected.toObject("firstName, directReports.lastName")
Ejemplo con el tipo relatedEntity
con una forma simple:
{
"firstName": "Greg",
"directReports": [
{
"lastName": "Boothe"
},
{
"lastName": "Caudill"
},
{
"lastName": "Gomes"
}
]
}
Ejemplo 5
Extrayendo un relatedEntity
con una forma simple:
$coll:=New collection("firstName";"employer")
employeeObject:=employeeSelected.toObject($coll)
Ejemplo con el tipo relatedEntity
con una forma simple:
{
"firstName": "Greg",
"employer": {
"__KEY": 20
}
}
Ejemplo 6
Extrayendo todas las propiedades de una relatedEntity
:
employeeObject:=employeeSelected.toObject("employer.*")
Ejemplo con el tipo relatedEntity
con una forma simple:
{
"employer": {
"ID": 20,
"name": "India Astral Secretary",
"creationDate": "1984-08-25T00:00:00.000Z",
"revenues": 12000000,
"extra": null
}
}
Ejemplo 7
Extracción de algunas propiedades de una relatedEntity
:
$col:=New collection
$col.push("employer.name")
$col.push("employer.revenues")
employeeObject:=employeeSelected.toObject($col)
Ejemplo con el tipo relatedEntity
con una forma simple:
{
"employer": {
"name": "India Astral Secretary",
"revenues": 12000000
}
}
.touched( )
Historia
Lanzamiento | Modificaciones |
---|---|
17 | Añadidos |
.touched() : Boolean
Parámetros | Tipo | Descripción | |
---|---|---|---|
Result | Boolean | <- | True si se ha modificado al menos un atributo de la entidad y aún no se ha guardado, si no, False |
Descripción
La función .touched()
comprueba si un atributo de la entidad ha sido modificado o no desde que la entidad fue cargada en memoria o guardada.
Si un atributo ha sido modificado o calculado, la función devuelve True, en caso contrario devuelve False. Puede utilizar esta función para determinar si necesita guardar la entidad.
Esta función devuelve False para una nueva entidad que acaba de ser creada (con .new( )
). Tenga en cuenta, sin embargo, que si utiliza una función que calcula un atributo de la entidad, la función .touched()
devolverá entonces True. Por ejemplo, si llama .getKey()
para calcular la llave primaria, .touched()
devuelve True.
Ejemplo
En este ejemplo, comprobamos si es necesario guardar la entidad:
var $emp : cs.EmployeeEntity
$emp:=ds.Employee.get(672)
$emp.firstName:=$emp.firstName //Aunque se actualice con el mismo valor, el atributo se marca como tocado
If($emp.touched()) //si se ha modificado al menos uno de los atributos
$emp.save()
End if // de lo contrario, no es necesario guardar la entidad
.touchedAttributes( )
Historia
Lanzamiento | Modificaciones |
---|---|
17 | Añadidos |
.touchedAttributes() : Collection
Parámetros | Tipo | Descripción | |
---|---|---|---|
Result | Collection | <- | Nombres de atributos tocados, o colección vacía |
Descripción
La función.touchedAttributes()
devuelve los nombres de los atributos que han sido modificados desde que la entidad fue cargada en memoria.
Esta función se aplica a los atributos cuyo kind es storage
o relatedEntity
.
En el caso de que se haya tocado una entidad relacionada (es decir, la llave externa), se devuelve el nombre de la entidad relacionada y el nombre de su llave primaria.
Si no se ha tocado ningún atributo de entidad, el método devuelve una colección vacía.
Ejemplo 1
var $touchedAttributes : Collection
var $emp : cs.EmployeeEntity
$touchedAttributes:=New collection
$emp:=ds.Employee.get(725)
$emp.firstName:=$emp.firstName //Aunque se actualice con el mismo valor, el atributo se marca como tocado
$emp.lastName:="Martin"
$touchedAttributes:=$emp.touchedAttributes()
//$touchedAttributes: ["firstName","lastName"]
Ejemplo 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"]
En este caso:
- firstName y lastName tienen un tipo
storage
- el empleador tiene un tipo
relatedEntity
- employerID es la llave extranjera de la entidad relacionada con el empleador
.unlock()
Historia
Lanzamiento | Modificaciones |
---|---|
17 | Añadidos |
.unlock() : Object
Parámetros | Tipo | Descripción | |
---|---|---|---|
Result | Object | <- | Objeto estado |
Descripción
La función .unlock()
elimina el bloqueo pesimista del registro que coincide con la entidad en el datastore y la tabla relacionada con su dataclass.
Para más información, por favor consulte la sección Bloqueo de entidades.
Un registro se desbloquea automáticamente cuando ya no es referenciado por ninguna entidad en el proceso de bloqueo (por ejemplo: si el bloqueo se pone sólo en una referencia local de una entidad, la entidad y, por tanto, el registro se desbloquea cuando el proceso termina).
Cuando un registro se bloquea, debe desbloquearse desde el proceso de bloqueo y en la referencia de la entidad que puso el bloqueo. Por ejemplo:
$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
Resultado
El objeto devuelto por .unlock()
contiene la siguiente propiedad:
Propiedad | Tipo | Descripción |
---|---|---|
success | Boolean | True si la acción de desbloquear tiene éxito, False en caso contrario. Si el desbloqueo se realiza en una entidad abandonada, en un registro no bloqueado o en un registro bloqueado por otro proceso o entidad, el éxito es False. |
Ejemplo
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