Saltar al contenido principal
Versión: Siguiente

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
devuelve una referencia a la entidad en la última posición de la selección de entidades a la que pertenece la entidad
.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
LanzamientoModificaciones
17Añ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
LanzamientoModificaciones
17Añadidos

.clone() : 4D.Entity

ParámetrosTipoDescripción
Result4D.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
LanzamientoModificaciones
17Añadidos

.diff( entityToCompare : 4D.Entity { ; attributesToCompare : Collection } ) : Collection

ParámetrosTipoDescripción
entityToCompare4D.Entity->Entidad a comparar con la entidad original
attributesToCompareCollection->Nombre de los atributos a comparar
ResultCollection<-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 propiedadTipoDescripción
attributeNameTextNombre del atributo
valuecualquiera - Depende del tipo de atributoValor del atributo en la entidad
otherValuecualquiera - Depende del tipo de atributoValor 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
LanzamientoModificaciones
17Añadidos

.drop( {mode : Integer} ) : Object

ParámetrosTipoDescripción
modeInteger->dk force drop if stamp changed: activa el soltar incluso si el sello ha cambiado
ResultObject<-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:

PropiedadTipoDescripción
successbooleantrue si la acción de soltar tiene éxito, false en caso contrario.
Disponible sólo en caso de error:
status(*)numberCódigo de error, ver abajo
statusText(*)textDescripción del error, ver abajo
Disponible sólo en caso de error de bloqueo pesimista:
LockKindTexttext"Locked by record"
lockInfoobjectInformación sobre el origen del bloqueo
task_idnumberId del proceso
user_nametextNombre de usuario de la sesión en la máquina
user4d_aliastextAlias usuario si está definido por SET USER ALIAS, si no, nombre de usuario en el directorio 4D
host_nametextNombre de la máquina
task_nametextNombre del proceso
client_versiontext
Disponible sólo en caso de error grave (un error grave puede ser intentar duplicar una llave primaria, disco lleno...):
errorscollection of objects
messagetextMensaje de error
component signaturetextfirma del componente interno (por ejemplo, "dmbg" significa el componente de la base)
errCodenumberCódigo de error

(*) Los siguientes valores pueden ser devueltos en las propiedades status y statusText del objeto Result en caso de error:

ConstanteValorComentario
dk status entity does not exist anymore5La entidad ya no existe en los datos. Este error puede ocurrir en los siguientes casos:
  • la entidad ha sido eliminada (el marcador ha cambiado y ahora el espacio de memoria está libre)
  • la entidad ha sido eliminada y reemplazada por otra con otra clave primaria (el marcador ha cambiado y una nueva entidad ahora utiliza el espacio memoria). Cuando se utiliza entity.drop( ), este error puede ser devuelto cuando se utiliza la opción dk force drop if stamp changed. Cuando se utiliza entity.lock(), se puede devolver este error cuando la opción dk reload if stamp changed es utilizada
  • statusText asociado: "Entity does not exist anymore"
    dk status locked3La entidad está bloqueada por un bloqueo pesimista.
    statusText asociado: "Already locked"
    dk status serious error4Un 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 changed2El valor del marcador interno de la entidad no coincide con el de la entidad almacenada en los datos (bloqueo optimista).
  • con .save(): error solo si no se utiliza la opción dk auto merge
  • con .drop(): error solo si no se utiliza la opción dk force drop if stamp changed
  • con .lock(): error solo si no se utiliza la opción dk reload if stamp changed
  • Estado asociado: "Stamp has changed"
  • dk status wrong permission1Los 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
    LanzamientoModificaciones
    17Añadidos

    .first(): 4D.Entity

    ParámetrosTipoDescripción
    Result4D.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
    LanzamientoModificaciones
    17Añadidos

    .fromObject( filler : Object )

    ParámetrosTipoDescripción
    fillerObject->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
    LanzamientoModificaciones
    17 R5Añadidos

    .getDataClass() : 4D.DataClass

    ParámetrosTipoDescripción
    Result4D.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
    LanzamientoModificaciones
    17Añadidos

    .getKey( { mode : Integer } ) : Text
    .getKey( { mode : Integer } ) : Integer

    ParámetrosTipoDescripción
    modeInteger->dk key as string: la llave primaria se devuelve como una cadena, sin importar el tipo de llave primaria
    ResultText<-Valor de la llave primaria de texto de la entidad
    ResultInteger<-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
    LanzamientoModificaciones
    19R5Añadidos

    .getRemoteContextAttributes() : Text

    ParámetrosTipoDescripción
    resultadoText<-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
    LanzamientoModificaciones
    17Añadidos

    .getSelection(): 4D.EntitySelection

    ParámetrosTipoDescripción
    Result4D.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
    LanzamientoModificaciones
    17Añadidos

    .getStamp() : Integer

    ParámetrosTipoDescripción
    ResultInteger<-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 marcador 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
    LanzamientoModificaciones
    17Añadidos

    .indexOf( { entitySelection : 4D.EntitySelection } ) : Integer

    ParámetrosTipoDescripción
    entitySelection4D.EntitySelection->La posición de la entidad se da en función de esta selección de entidades
    ResultInteger<-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
    LanzamientoModificaciones
    17Añadidos

    .isNew() : Boolean

    ParámetrosTipoDescripción
    ResultBoolean<-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. En caso contrario, devuelve False.

    Ejemplo

     var $emp : cs.EmployeeEntity

    $emp:=ds.Employee.new()

    If($emp.isNew())
    ALERT("This is a new entity")
    End if

    .last()

    Historia
    LanzamientoModificaciones
    17Añadidos

    .last() : 4D.Entity

    ParámetrosTipoDescripción
    Result4D.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
    LanzamientoModificaciones
    17Añadidos

    .lock( { mode : Integer } ) : Object

    ParámetrosTipoDescripción
    modeInteger->dk reload if stamp changed: recargar antes de bloquear si el marcador ha cambiado
    ResultObject<-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:

    PropiedadTipoDescripción
    successbooleantrue 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:
    wasReloadedbooleantrue si la entidad fue recargada con éxito, false en caso contrario.
    Disponible sólo en caso de error:
    status(*)numberCódigo de error, ver abajo
    statusText(*)textDescripción del error, ver abajo
    Disponible sólo en caso de error de bloqueo pesimista:
    lockKindTexttext"Locked by record" si está bloqueado por un proceso 4D, "Locked by session" si está bloqueado por una sesión REST
    lockInfoobjectInformació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_idnumberID del Proceso
    user_nametextNombre de usuario de la sesión en la máquina
    user4d_aliastextNombre o alias del usuario 4D
    user4d_idnumberID del usuario en el directorio de la base de datos 4D
    host_nametextNombre de la máquina
    task_nametextNombre del proceso
    client_versiontextVersión del cliente
    Disponible sólo para un bloqueo por sesión REST:
    hosttextURL que bloqueó la entidad (por ejemplo, "www.myserver.com")
    IPAddrtextDirección IP del bloqueo (por ejemplo: "127.0.0.1")
    userAgenttextuserAgent 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...):
    errorscollection of objects
    messagetextMensaje de error
    component signaturetextfirma del componente interno (por ejemplo, "dmbg" significa el componente de la base)
    errCodenumberCódigo de error

    (*) Los siguientes valores pueden ser devueltos en las propiedades status y statusText del objeto Result en caso de error:

    ConstanteValorComentario
    dk status entity does not exist anymore5La entidad ya no existe en los datos. Este error puede ocurrir en los siguientes casos:
  • la entidad ha sido eliminada (el marcador ha cambiado y ahora el espacio de memoria está libre)
  • la entidad ha sido eliminada y reemplazada por otra con otra clave primaria (el marcador ha cambiado y una nueva entidad ahora utiliza el espacio memoria). Cuando se utiliza .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 locked3La entidad está bloqueada por un bloqueo pesimista. statusText asociado: "Already locked"
    dk status serious error4Un 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 changed2El valor del marcador interno de la entidad no coincide con el de la entidad almacenada en los datos (bloqueo optimista).
  • con .save(): error solo si no se utiliza la opción dk auto merge
  • con .drop(): error solo si no se utiliza la opción dk force drop if stamp changed
  • con .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
    LanzamientoModificaciones
    17Añadidos

    .next() : 4D.Entity

    ParámetrosTipoDescripción
    Result4D.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
    LanzamientoModificaciones
    17Añadidos

    .previous() : 4D.Entity

    ParámetrosTipoDescripción
    Result4D.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
    LanzamientoModificaciones
    17Añadidos

    .reload() : Object

    ParámetrosTipoDescripción
    ResultObject<-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:

    PropiedadTipoDescripción
    successbooleanTrue si la acción de recarga tiene éxito, False en caso contrario. Disponible sólo en caso de error:
    status(*)numberCódigo de error, ver abajo
    statusText(*)textDescripción del error, ver abajo

    (*) Los siguientes valores pueden ser devueltos en las propiedades status y statusText del objeto Result en caso de error:

    ConstanteValorComentario
    dk status entity does not exist anymore5La entidad ya no existe en los datos. Este error puede ocurrir en los siguientes casos:
  • la entidad ha sido eliminada (el marcador ha cambiado y ahora el espacio de memoria está libre)
  • la entidad ha sido eliminada y reemplazada por otra con otra clave primaria (el marcador ha cambiado y una nueva entidad ahora utiliza el espacio memoria). the entity has been dropped and replaced by another one with another primary key (the stamp has changed and a new entity now uses the memory space). 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 serious error4Un 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
    LanzamientoModificaciones
    17Añadidos

    .save( { mode : Integer } ) : Object

    ParámetrosTipoDescripción
    modeInteger->dk auto merge: activa el modo "automatic merge"
    ResultObject<-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 trigger).

    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:

    PropiedadTipoDescripción
    successbooleanTrue si la acción guardar tiene éxito, false en caso contrario.
    Disponible sólo si se utiliza la opción dk auto merge:
    autoMergedbooleanTrue si se ha realizado una fusión automática, False en caso contrario.
    Disponible sólo en caso de error:
    statusnumberCódigo de error, ver abajo
    statusTexttextDescripción del error, ver abajo
    Disponible sólo en caso de error de bloqueo pesimista:
    lockKindTexttext"Locked by record"
    lockInfoobjectInformación sobre el origen del bloqueo
    task_idnumberId del proceso
    user_nametextNombre de usuario de la sesión en la máquina
    user4d_aliastextAlias usuario si está definido por SET USER ALIAS, si no, nombre de usuario en el directorio 4D
    host_nametextNombre de la máquina
    task_nametextNombre del proceso
    client_versiontext
    Disponible sólo en caso de error crítico (error crítico - puede ser intentar duplicar una llave primaria, disco lleno...):
    errorscollection of objects
    messagetextMensaje de error
    componentSignaturetextFirma del componente interno (por ejemplo, "dmbg" significa el componente de la base)
    errCodenumberCódigo de error
    status y statusText

    Los siguientes valores pueden ser devueltos en las propiedades statusy statusText del objeto Result en caso de error:

    ConstanteValorComentario
    dk status automerge failed6(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 anymore5La entidad ya no existe en los datos. Este error puede ocurrir en los siguientes casos:
  • la entidad ha sido eliminada (el marcador ha cambiado y ahora el espacio de memoria está libre)
  • la entidad ha sido eliminada y reemplazada por otra con otra clave primaria (el marcador ha cambiado y una nueva entidad ahora utiliza el espacio memoria). the entity has been dropped and replaced by another one with another primary key (the stamp has changed and a new entity now uses the memory space). 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 locked3La entidad está bloqueada por un bloqueo pesimista. statusText asociado: "Already locked"
    dk status serious error4Un 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 changed2El valor del marcador interno de la entidad no coincide con el de la entidad almacenada en los datos (bloqueo optimista).
  • con .save(): error solo si no se utiliza la opción dk auto merge
  • con .drop(): error solo si no se utiliza la opción dk force drop if stamp changed
  • con .lock(): error solo si no se utiliza la opción dk reload if stamp changed

  • statusText asociado: "Stamp has changed"
    dk status wrong permission1Los privilegios actuales no permiten guardar la entidad. StatusText asociado: "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
    LanzamientoModificaciones
    17Añadidos

    .toObject() : Object
    .toObject( filterString : Text { ; options : Integer} ) : Object
    .toObject( filterCol : Collection { ; options : Integer } ) : Object

    ParámetrosTipoDescripción
    filterStringText->Atributo(s) a extraer (cadena separada por comas)
    filterColCollection->Colección de atributos a extraer
    optionsInteger->dk with primary key: adds the __KEY property;
    dk with stamp: adds the _STAMP property
    ResultObject<-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.

    Atención

    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
    LanzamientoModificaciones
    17Añadidos

    .touched() : Boolean

    ParámetrosTipoDescripción
    ResultBoolean<-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
    LanzamientoModificaciones
    17Añadidos

    .touchedAttributes() : Collection

    ParámetrosTipoDescripción
    ResultCollection<-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
    LanzamientoModificaciones
    17Añadidos

    .unlock() : Object

    ParámetrosTipoDescripción
    ResultObject<-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:

    PropiedadTipoDescripción
    successBooleanTrue 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