Saltar al contenido principal
Versión: 20 R7 BETA

EntitySelection

Una entity selection es un objeto que contiene una o más referencias a entidades pertenecientes a la misma Dataclass. Una entity selection puede contener 0, 1 o X entidades de la dataclass -- donde X puede representar el número total de entidades contenidas en la dataclass.

Las entity selections pueden crearse a partir de selecciones existentes utilizando varias funciones de la clase DataClass como .all() o .query(), o funciones de la propia clase EntityClass, como .and() u orderBy(). También puede crear entity selections vacías utilizando la función dataClass.newSelection() o el comando Create entity selection.

Resumen

[index] : 4D.Entity
permite acceder a las entidades dentro de la entity selection utilizando la sintaxis estándar de colecciones
.attributeName : Collection
.attributeName : 4D.EntitySelection

una "proyección" de los valores del atributo en la entity selection
.add( entity : 4D.Entity ) : 4D.EntitySelection
.add( entitySelection : 4D.EntitySelection ) : 4D.EntitySelection

añade la entity o entitySelection especificada a la selección de entidades original y devuelve la selección de entidades modificada
.and( entity : 4D.Entity ) : 4D.EntitySelection
.and( entitySelection : 4D.EntitySelection ) : 4D.EntitySelection

combina la entity selection con un parámetro entity o entitySelection utilizando el operador lógico AND
.at( index : Integer ) : 4D.Entity
devuelve la entidad en la posición index, permitiendo enteros positivos y negativos
.average( attributePath : Text ) : Real
devuelve la media aritmética (promedio) de todos los valores no nulos de attributePath en la entity selection
.clean() : 4D.EntitySelection
devuelve una nueva selección de entidades basada en la selección de entidades original pero sin las entidades eliminadas, si las hubiera
.contains( entity : 4D.Entity ) : Boolean
devuelve true si la referencia de entidad pertenece a la entity selection
.copy( { option : Integer } ) : 4D.EntitySelection
devuelve una copia de la entity selection original
.count( attributePath : Text ) : Real
devuelve el número de entidades en la entity selection con un valor no null en attributePath
.distinct( attributePath : Text { ; options : Integer } ) : Collection
devuelve una colección que contiene sólo valores distintos (diferentes) del attributePath en la entity selection
.distinctPaths( attribute : Text ) : Collection
devuelve una colección de rutas distintas encontradas en el objeto indexado attribute para la entity selection
.drop( { mode : Integer } ) : 4D.EntitySelection
elimina las entidades pertenecientes a la selección de entidades de la tabla relacionada con su dataclass en el datastore
.extract( attributePath : Text { ; option : Integer } ) : Collection
.extract( attributePath { ; targetPath } { ; ...attributePathN : Text ; targetPathN : Text } ) : Collection

retorna una colección que contiene los valores de attributePath extraídos de la entity selection
.first() : 4D.Entity
devuelve una referencia a la entidad en la primera posición de la entity selection
.getDataClass() : 4D.DataClass
devuelve la dataclass de la entity selection
.getRemoteContextAttributes() : Text
devuelve información sobre el contexto de optimización utilizado por la entidad
.isAlterable() : Boolean
devuelve True si la entity selection es modificable
.isOrdered() : Boolean
devuelve True si la entity selection está ordenada
.last() : 4D.Entity
devuelve una referencia a la entidad en última posición de la entity selection
.length : Integer
devuelve el número de entidades en la entity selection
.max( attributePath : Text ) : any
devuelve el valor más alto (o máximo) entre todos los valores de attributePath en la entity selection
.min( attributePath : Text ) : any
devuelve el valor más bajo (o mínimo) entre todos los valores de attributePath en la entity selection
.minus( entity : 4D.Entity { ; keepOrder : Integer } ) : 4D.EntitySelection
.minus( entitySelection : 4D.EntitySelection { ; keepOrder : Integer } ) : 4D.EntitySelection

excluye la entity selection a la que se aplica la entity o las entidades de entitySelection y devuelve la entity selection resultante
.or( entity : 4D.Entity ) : 4D.EntitySelection
.or( entitySelection : 4D.EntitySelection ) : 4D.EntitySelection

combina la entity selection con el parámetro entity o entitySelection utilizando el operador lógico OR (no exclusivo)
.orderBy( pathString : Text ) : 4D.EntitySelection
.orderBy( pathObjects : Collection ) : 4D.EntitySelection

devuelve una nueva selección ordenada de entidades que contiene todas las entidades de la entity selection en el orden especificado por los criterios pathString o pathObjects
.orderByFormula( formulaString : Text { ; sortOrder : Integer } { ; settings : Object} ) : 4D.EntitySelection
.orderByFormula( formulaObj : Object { ; sortOrder : Integer } { ; settings : Object} ) : 4D.EntitySelection

devuelve una nueva entity selection ordenada
.query( queryString : Text { ; ...value : any } { ; querySettings : Object } ) : 4D.EntitySelection
.query( formula : Object { ; querySettings : Object } ) : 4D.EntitySelection

busca las entidades que cumplan con los criterios de búsqueda especificados en queryString o formula y (opcionalmente) value(s) entre todas las entidades de la entity selection
.queryPath : Text
contiene una descripción detallada de la búsqueda tal y como fue realizada por 4D
.queryPlan : Text
contiene una descripción detallada de la búsqueda justo antes de su ejecución (es decir, la búsqueda planeada)
.refresh()
invalida inmediatamente los datos de la entidad seleccionada en la caché local de ORDA
.selected( selectedEntities : 4D.EntitySelection ) : Object
devuelve un objeto que describe la(s) posición(es) de selectedEntities en la entity selection de origen
.slice( startFrom : Integer { ; end : Integer } ) : 4D.EntitySelection
devuelve una parte de una entity selection en una nueva entity selection
.sum( attributePath : Text ) : Real
devuelve la suma de todos los valores de attributePath en la entity selection
.toCollection( { options : Integer { ; begin : Integer { ; howMany : Integer } } ) : Collection
.toCollection( filterString : Text {; options : Integer { ; begin : Integer { ; howMany : Integer }}} ) : Collection
.toCollection( filterCol : Collection {; options : Integer { ; begin : Integer { ; howMany : Integer }}} ) : Collection

crea y devuelve una colección donde cada elemento es un objeto que contiene un conjunto de propiedades y valores

Ver también

USE ENTITY SELECTION

&#91index&#93

Historia
LanzamientoModificaciones
17Añadidos

[index] : 4D.Entity

Descripción

La notación EntitySelection[index] permite acceder a las entidades dentro de la entity selection utilizando la sintaxis estándar de colecciones: pase la posición de la entidad que desea obtener en el parámetro index.

Tenga en cuenta que la entidad correspondiente se vuelve a cargar desde el almacén de datos.

index puede ser cualquier número entre 0 y .length-1.

  • Si index está fuera de rango, se devuelve un error.
  • Si index corresponde a una entidad eliminada, se devuelve un valor Null.
caution

EntitySelection[index] es una expresión no asignable, lo que significa que no se puede utilizar como referencia de entidad editable con métodos como .lock() o .save(). Para trabajar con la entidad correspondiente, es necesario asignar la expresión devuelta a una expresión asignable, como una variable. Ejemplos:

 $sel:=ds.Employee.all() //creación de la entity selection
//declaraciones no válidas:
$result:=$sel[0].lock() //NO funcionará
$sel[0].lastName:="Smith" //NO funcionará
$result:=$sel[0].save() //NO funcionará
//valid code:
$entity:=$sel[0] //OK
$entity.lastName:="Smith" //OK
$entity.save() //OK

Ejemplo

 var $employees : cs.EmployeeSelection
var $employee : cs.EmployeeEntity
$employees:=ds.Employee.query("lastName = :1";"H@")
$employee:=$employees[2] // La tercera entidad de la selección de entidades $employees se recarga de la base de datos

.attributeName

Historia
LanzamientoModificaciones
17Añadidos

.attributeName : Collection
.attributeName : 4D.EntitySelection

Descripción

Todo atributo de dataclass puede ser utilizado como una propiedad de una entity selection para devolver una "proyección" de los valores del atributo en la entity selection. Los valores proyectados pueden ser una colección o una nueva entity selection, dependiendo del kind (storage o relation) del atributo.

  • Si el tipo de attributeName es storage: .attributeName devuelve una colección de valores del mismo tipo que attributeName.
  • Si el tipo de attributeName es relatedEntity: .attributeName devuelve una nueva entity selection de valores relacionados del mismo tipo que attributeName. Se eliminan los duplicados (se devuelve una entity selection desordenada).
  • Si el tipo de attributeName es relatedEntities: .attributeName devuelve una nueva entity selection de valores relacionados del mismo tipo que attributeName. Se eliminan los duplicados (se devuelve una entity selection desordenada).

Cuando se utiliza un atributo de relación como propiedad de una selección de entidades, el resultado es siempre otra selección de entidades, aunque sólo se devuelva una entidad. Cuando se utiliza un atributo de relación como propiedad de una selección de entidades, el resultado es siempre otra selección de entidades, aunque sólo se devuelva una entidad.

Si el atributo no existe en la selección de entidades, se devuelve un error.

Ejemplo 1

Proyección de valores de almacenamiento:

 var $firstNames : Collection
$entitySelection:=ds.Employee.all()
$firstNames:=$entitySelection.firstName // firstName es un string

La colección resultante es una colección de cadenas, por ejemplo:

[
"Joanna",
"Alexandra",
"Rick"
]

Ejemplo 2

Proyección de la entidad relacionada:

 var $es; $entitySelection : cs.EmployeeSelection
$entitySelection:=ds.Employee.all()
$es:=$entitySelection.employer // employer está relacionado a la dataClass Company

El objeto resultante es una selección de entidades de la empresa con los duplicados eliminados (si los hay).

Ejemplo 3

Proyección de entidades relacionadas:

 var $es : cs.EmployeeSelection
$es:=ds.Employee.all().directReports // directReports está relacionado a la dataclass Employee

El objeto resultante es una entity selection de la dataclass Employee sin duplicados (si los hay).

.add()

Historia
LanzamientoModificaciones
19 R7Soporte del parámetro entitySelection
18 R5Sólo soporta las entity selections alterables
17Añadidos

.add( entity : 4D.Entity ) : 4D.EntitySelection
.add( entitySelection : 4D.EntitySelection ) : 4D.EntitySelection

ParámetrosTipoDescripción
entity4D.Entity->Entidad que debe añadirse a la entity selection
entitySelection4D.EntitySelection->Selección de entidades que se añade a la selección de entidades original
Result4D.EntitySelection<-Entity selection incluyendo la entity o entitySelection añadida

Descripción

La función .add() añade la entity o entitySelection especificada a la selección de entidades original y devuelve la selección de entidades modificada.

Los valores de tipo Date se convierten en valores numéricos (segundos) y se utilizan para calcular la media.

atención

La entity selection debe ser modificable, es decir, ha sido creada, por ejemplo, por .newSelection() o Create entity selection, de lo contrario .add() devolverá un error. Las entity selections compartibles no aceptan la adición de entidades. Las entity selections compartibles no aceptan la adición de entidades.

Añadir una entidad

  • Si la entity selection está ordenada, entity se añade al final de la selección. Si una referencia a la misma entidad ya pertenece a la selección de entidades, se duplica y se añade una nueva referencia.
  • Si la entity selection no está ordenada, entity se añade en cualquier lugar de la selección, sin un orden específico.

Añadir una selección de entidades

  • Si la selección de entidades está ordenada, se mantiene su orden y se añade entitySelection al final de la selección. Si las referencias a las mismas entidades de entitySelection ya pertenecen a la selección de entidades, se duplican y se añaden nuevas referencias.
  • Si la selección de entidades está desordenada, se convierte en ordenada.

Para más información, consulte la sección Selección de entidades ordenadas o no ordenadas.

La entity selection modificada es devuelta por la función, de modo que las llamadas a la función pueden encadenarse.

Se produce un error si entity y la entity selection no están relacionadas con la misma dataclass. Si entity es Null, no se produce ningún error.

Ejemplo 1

 var $employees : cs.EmployeeSelection
var $employee : cs.EmployeeEntity
$employees:=ds.Employee.newSelection()
$employee:=ds.Employee.new()
$employee.lastName:="Smith"
$employee.save()
$employees.add($employee) //La entidad $employee se añade a la selección de entidades $employees

Ejemplo 2

Las llamadas a la función se pueden encadenar:

 var $sel : cs.ProductSelection
var $p1;$p2;$p3 : cs.ProductEntity

$p1:=ds.Product.get(10)
$p2:=ds.Product.get(11)
$p3:=ds.Product.get(12)
$sel:=ds.Product.newSelection()
$sel:=$sel.add($p1).add($p2).add($p3)

Ejemplo 3

En una interfaz de usuario, tenemos dos listas. El usuario selecciona elementos de la lista1 para añadirlos a la lista2.

$sellist2:=$sellist2.add($sellist1)

.and()

Historia
LanzamientoModificaciones
17Añadidos

.and( entity : 4D.Entity ) : 4D.EntitySelection
.and( entitySelection : 4D.EntitySelection ) : 4D.EntitySelection

ParámetrosTipoDescripción
entity4D.Entity->Entidad a intersectar
entitySelection4D.EntitySelection->Entity selection a intersectar
Result4D.EntitySelection<-Entity selection resultante de la intersección con el operador lógico AND

Descripción

La función .and() combina la entity selection con un parámetro entity o entitySelection utilizando el operador lógico AND; devuelve una nueva entity selection desordenada que contiene sólo las entidades a las que se hace referencia tanto en la entity selection como en el parámetro.

  • Si pasa entity como parámetro, se combina esta entidad con la entity selection. Si la entidad pertenece a la entity selection, se devuelve una nueva entity selection que sólo contiene la entidad. En caso contrario, se devuelve una selección de entidades vacía.
  • Si se pasa entitySelection como parámetro, se combinan ambas selecciones de entidades. If the entity belongs to the entity selection, a new reference to the entity selection is returned. Otherwise, a new entity selection containing the original entity selection and the entity is returned.

Puede comparar las entity selections ordenadas y/o desordenadas. La selección resultante es siempre desordenada.

Si la entity selection inicial o el parámetro entitySelection están vacíos, o si entity es Null, se devuelve una entity selection vacía.

Si la entity selection inicial y el parámetro no están relacionados con la misma dataclass, se produce un error.

Ejemplo 1

 var $employees; $result : cs.EmployeeSelection
var $employee : cs.EmployeeEntity
$employees:=ds.Employee.query("lastName = :1"; "H@")
//La selección de entidades $employees contiene la entidad
//con llave primaria 710 y otras entidades
//por ej. "Colin Hetrick" / "Grady Harness" / "Sherlock Holmes" (llave primaria 710)
$employee:=ds.Employee.get(710) // Devuelve "Sherlock Holmes"

$result:=$employees.and($employee) //$result es una selección de entidades que contiene
//sólo la entidad con llave primaria 710 ("Sherlock Holmes")

Ejemplo 2

Queremos tener una selección de empleados llamados "Jones" que vivan en Nueva York:

 var $sel1; $sel2; $sel3 : cs.EmployeeSelection
$sel1:=ds.Employee.query("name =:1";"Jones")
$sel2:=ds.Employee.query("city=:1";"New York")
$sel3:=$sel1.and($sel2)

.at()

Historia
LanzamientoModificaciones
20Añadidos

.at( index : Integer ) : 4D.Entity

ParámetrosTipoDescripción
indexInteger->Índice de la entidad a devolver
Result4D.Entity<-La entidad en ese índice

Descripción

La función .at() devuelve la entidad en la posición index, permitiendo enteros positivos y negativos.

Si index es negativo (de -1 a -n con n: longitud de la selección de entidades), la entidad devuelta se basará en el orden inverso de la selección de entidades.

La función devuelve Null si index está más allá de los límites de la entity selection.

Ejemplo

var $employees : cs.EmployeeSelection
var $emp1; $emp2 : cs.EmployeeEntity
$employees:=ds.Employee.query("lastName = :1"; "H@")
$emp1:=$employees.at(2) /3ª entidad de la selección de entidades $employees
$emp2:=$employees.at(-3) //empezando por el final, 3ª entidad
//de la selección de entidades $employees

.average()

Historia
LanzamientoModificaciones
18 R6Devuelve undefined si la entity selection está vacía
17Añadidos

.average( attributePath : Text ) : Real

ParámetrosTipoDescripción
attributePathText->Ruta del atributo a utilizar para el cálculo
ResultReal<-Media aritmética (promedio) de los valores de las entidades para el atributo (No se define para una entity selection vacía)

Descripción

La función .average() devuelve la media aritmética (promedio) de todos los valores no nulos de attributePath en la entity selection.

Pase en el parámetro attributePath la ruta del atributo a evaluar.

Sólo se tienen en cuenta los valores numéricos para el cálculo. Tenga en cuenta, sin embargo, que si el attributePath de la selección de entidades contiene tipos de valores mixtos, .average() tiene en cuenta todos los elementos escalares para calcular el valor medio.

Para más información sobre propiedad compartible de entity selections, consulte la sección Entity selections compartibles o modificables.

.average() devuelve undefined si la entity selection está vacía o attributePath no contiene valores numéricos.

Se devuelve un error si:

  • attributePath es un atributo relacionado,
  • attributePath designa un atributo que no existe en la dataclass de la entity selection.

Ejemplo

Queremos obtener una lista de empleados cuyo salario es superior al salario medio:

 var $averageSalary : Real
var $moreThanAv : cs.EmployeeSelection
$averageSalary:=ds.Employee.all().average("salary")
$moreThanAv:=ds.Employee.query("salary > :1";$averageSalary)

.clean()

Historia
LanzamientoModificaciones
20 R6Añadidos

.clean() : 4D.EntitySelection

ParámetrosTipoDescripción
Result4D.EntitySelection<-Nueva selección de entidades sin entidades eliminadas

Descripción

La función .clean() devuelve una nueva selección de entidades basada en la selección de entidades original pero sin las entidades eliminadas, si las hubiera.

Por defecto, cuando una entidad es eliminada, su(s) referencia(s) en la(s) selección(es) de entidades existente(s) se vuelve(n) undefined pero no se elimina(n) del objeto(s) de selección de entidades. Las entidades eliminadas se siguen incluyendo en la propiedad .length y se muestran como líneas en blanco si la selección de entidades está vinculada a un objeto de interfaz como una lista. En este caso, llamar a la función .clean() en la selección de entidades permite obtener una nueva selección de entidades actualizada, que no contiene referencias de entidades undefined.

La selección de entidad resultante mantiene los mismos criterios de orden y la misma propiedad modificable/compartible que la selección de entidad original.

Ejemplo

var $sel; $sel2 : cs.SpecialitySelection
var $status : Object

$sel:=ds.Speciality.query("ID <= 4")
$status:=ds.Speciality.get(2).drop() //eliminar la entidad de la clase de datos
//$sel.length = 4

$sel2:=$sel.clean()
//$sel2.length = 3

Ver también

.refresh()

.contains()

Historia
LanzamientoModificaciones
17Añadidos

.contains( entity : 4D.Entity ) : Boolean

ParámetrosTipoDescripción
entity4D.Entity->Entidad a evaluar
ResultBoolean<-True si la entidad pertenece a la entity selection, de lo contrario False

Descripción

La función .contains() devuelve true si la referencia de entidad pertenece a la entity selection, y false en caso contrario.

En entity, especifique la entidad a buscar en la entity selection. Si la entidad es Null, la función devolverá false.

Si entity y la entity selection no pertenecen a la misma dataclass, se produce un error.

Ejemplo

 var $employees : cs.EmployeeSelection
var $employee : cs.EmployeeEntity

$employees:=ds.Employee.query("lastName=:1";"H@")
$employee:=ds.Employee.get(610)

If($employees.contains($employee))
ALERT("La entidad con llave primaria 610 tiene un apellido que empieza por H")
Else
ALERT("La entidad con llave primaria 610 no tiene un apellido que empiece por H")
End if

.count()

Historia
LanzamientoModificaciones
17Añadidos

.count( attributePath : Text ) : Real

ParámetrosTipoDescripción
attributePathText->Ruta del atributo que se utilizará para el cálculo
ResultReal<-Número de valores de attributePath no null en la entity selection

Descripción

La función .count() devuelve el número de entidades en la entity selection con un valor no null en attributePath.

Sólo se tienen en cuenta los valores escalares. Los valores de tipo objeto o colección se consideran valores nulos.

Se devuelve un error si:

  • attributePath es un atributo relacionado,
  • attributePath no se encuentra en la dataclass de la entity selection.

Ejemplo

Queremos averiguar el número total de empleados de una empresa sin contar a los que no se les ha especificado el cargo:

 var $sel : cs.EmployeeSelection
var $count : Real

$sel:=ds.Employee.query("employer = :1";"Acme, Inc")
$count:=$sel.count("jobtitle")

.copy()

Historia
LanzamientoModificaciones
18 R5Añadidos

.copy( { option : Integer } ) : 4D.EntitySelection

ParámetrosTipoDescripción
optionInteger->ck shared: devuelve una entity selection compartible
Result4D.EntitySelection<-Copia de la entity selection

Descripción

La función .copy() devuelve una copia de la entity selection original.

Las entidades de una colección de entidades a las que se accede por medio de [ ] no se recargan desde la base de datos.

Por defecto, si se omite el parámetro option, la función devuelve una nueva entity selection alterable (incluso si la función se aplica a una entity selection compartible). Pase la constante ck shared en el parámetro option si desea crear una entity selection compartible.

Para obtener información sobre la propiedad compartible de las selecciones de entidades, consulte la sección Selecciones de entidades compartibles o alterables.

Ejemplo

Se crea una nueva entidad vacía de selección de productos cuando se carga el formulario:

 Case of
:(Form event code=On Load)
Form.products:=ds.Products.newSelection()
End case

A continuación, esta selección de entidades se actualiza con productos y se desea compartir los productos entre varios procesos. Se copia la selección de la entidad Form.products como compartible:

 ...
// La selección de entidades de Form.products se actualiza
Form.products.add(Form.selectedProduct)

Use(Storage)
If(Storage.products=Null)
Storage.products:=New shared object()
End if

Use(Storage.products)
Storage.products:=Form.products.copy(ck shared)
End use
End use

.distinct()

Historia
LanzamientoModificaciones
20Soporte de dk count values
17Añadidos

.distinct( attributePath : Text { ; options : Integer } ) : Collection

ParámetrosTipoDescripción
attributePathText->Ruta del atributo cuyos valores distintos desea obtener
optionsInteger->dk diacritical, dk count values
ResultCollection<-Colección con sólo valores distintos

Descripción

La función .distinct() devuelve una colección que contiene sólo valores distintos (diferentes) del attributePath en la entity selection.

La colección devuelta se clasifica automáticamente. Los valores Null no son devueltos.

En el parámetro attributePath, pase el atributo de entidad cuyos valores distintos quiere obtener. Sólo se pueden manejar valores escalares (texto, número, booleano o fecha). Si el attributePath conduce a una propiedad de objeto que contiene valores de distintos tipos, primero se agrupan por tipo y después se ordenan. Si attributePath lleva a una propiedad de objeto que contiene valores de diferentes tipos, primero se agrupan por tipo y se ordenan después.

  1. booleans
  2. cadenas
  3. numbers
  4. dates

Puede utilizar la notación [] para designar una colección cuando attributePath es una ruta en un objeto (ver los ejemplos).

Ejemplos

ConstanteValorComentario
dk diacritical8La evaluación distingue entre mayúsculas y minúsculas y diferencia los caracteres acentuados. Por defecto si se omite, se realiza una evaluación no diacrítica
dk count values32Devuelve el conteo de entidades para cada valor distinto. Cuando se pasa esta opción, .distinct() devuelve una colección de objetos que contienen un par de propiedades {"value":*value*; "count":*count*}.
nota

La opción dk count values sólo está disponible con atributos de almacenamiento de tipo booleano, cadena, número y fecha.

Se devuelve un error si:

  • attributePath es un atributo relacionado,
  • attributePath no se encuentra en la dataclass de la entity selection.

Ejemplos

Quiere obtener una colección que contenga un solo elemento por nombre de país:

var $countries : Collection
$countries:=ds.Employee.all().distinct("address.country")
//$countries[0]={"Argentina"}
//$countries[1]={"Australia"}
//$countries[2]={"Belgium"}
///...

nicknames es una colección y extra es un atributo de objeto:

$values:=ds.Employee.all().distinct("extra.nicknames[].first")

Desea obtener el número de nombres de posiciones diferentes en la empresa:

var $jobs : Collection
$jobs:=ds.Employee.all().distinct("jobName";dk count values)
//$jobs[0]={"value":"Developer";"count":17}
//$jobs[1]={"value":"Office manager";"count":5}
//$jobs[2]={"value":"Accountant";"count":2}
//...

.distinctPaths()

Historia
LanzamientoModificaciones
20Añadidos

.distinctPaths( attribute : Text ) : Collection

ParámetrosTipoDescripción
atributoText->Nombre del atributo del objeto cuyas rutas desea obtener
ResultCollection<-Nueva colección con rutas distintas

Descripción

La función .distinctPaths() devuelve una colección de rutas distintas encontradas en el objeto indexado attribute para la entity selection.

Si attribute no es un atributo de objeto indexado, se genera un error.

Tras la llamada, el tamaño de la colección devuelta es igual al número de rutas distintas encontradas en attribute para la selección de entidades. Las rutas se devuelven como cadenas que incluyen atributos anidados y colecciones, por ejemplo "info.address.number" o "children[].birthdate". Las entidades con un valor null en el attribute no se tienen en cuenta.

Ejemplo

Desea obtener todas las rutas almacenadas en un atributo objeto fullData:

var $paths : Collection
$paths:=ds.Employee.all().distinctPaths("fullData")
//$paths[0]="age"
//$paths[1]="Children"
//$paths[2]="Children[].age"
//$paths[3]="Children[].name"
//$paths[4]="Children.length"
///...
nota

length se añade automáticamente como ruta para las propiedades de colección anidadas.

.drop()

Historia
LanzamientoModificaciones
17Añadidos

.drop( { mode : Integer } ) : 4D.EntitySelection

ParámetrosTipoDescripción
modeInteger->dk stop dropping on first error: detiene la ejecución del método en la primera entidad no suprimible
Result4D.EntitySelection<-Entity selection vacía si se ejecuta con éxito, si no entity selection que contengan las entidades no eliminables

Descripción

La función .drop() elimina las entidades pertenecientes a la selección de entidades de la tabla relacionada con su dataclass en el datastore. La entity selection permanece en la memoria.

La eliminación de entidades es permanente y no se puede deshacer. Se recomienda llamar a esta acción en una transacción para tener una opción de recuperación.

Si se encuentra una entidad bloqueada durante la ejecución de .drop(), no se elimina. Por defecto, el método procesa todas las entidades de la selección de entidades y devuelve las entidades no eliminables en la selección de entidades. Si desea que el método detenga la ejecución en la primera entidad no suprimible encontrada, pase la constante dk stop dropping on first error en el parámetro mode.

Ejemplo

Ejemplo sin la opción dk stop dropping on first error:

 var $employees; $notDropped : cs.EmployeeSelection
$employees:=ds.Employee.query("firstName=:1";"S@")
$notDropped:=$employees.drop() // $notDropped es una entity selection que contiene todas las entidades que no suprimidas
If($notDropped.length=0) //La acción de eliminación es exitosa, todas las entidades han sido eliminadas
ALERT("You have dropped "+String($employees.length)+" employees") //La selección de entidades eliminada permanece en la memoria
Else
ALERT("Problem during drop, try later")
End if

Ejemplo con la opción dk stop dropping on first error:

 var $employees; $notDropped : cs.EmployeeSelection
$employees:=ds.Employee.query("firstName=:1";"S@")
$notDropped:=$employees.drop(dk stop dropping on first error) //$notDropped es una entity selection que contiene la primera entidad no suprimida
If($notDropped.length=0) //La acción de eliminación es exitosa, todas las entidades han sido eliminadas
ALERT("You have dropped "+String($employees.length)+" employees") //La selección de entidades eliminada permanece en la memoria
Else
ALERT("Problem during drop, try later")
End if

.extract()

Historia
LanzamientoModificaciones
18 R3Añadidos

.extract( attributePath : Text { ; option : Integer } ) : Collection
.extract( attributePath { ; targetPath } { ; ...attributePathN : Text ; targetPathN : Text } ) : Collection

ParámetrosTipoDescripción
attributePathText->Ruta del atributo cuyos valores deben ser extraídos en la nueva colección
targetPathText->Ruta o nombre del atributo objetivo
optionInteger->ck keep null: incluye los atributos null en la colección devuelta (ignorados por defecto)
ResultCollection<-Colección que contiene los valores extraídos

Descripción

La función .extract() retorna una colección que contiene los valores de attributePath extraídos de la entity selection.

attributePath puede referirse a:

  • un atributo escalar de dataclass,
  • entidad relacionada,
  • entidades relacionadas.

Si attributePath es inválido, se devuelve una colección vacía.

Esta función acepta dos sintaxis.

.extract( attributePath : Text { ; option : Integer } ) : Collection

Con esta sintaxis, .extract() llena la colección devuelta con los valores attributePath de la entity selection.

Por defecto, las entidades para las que attributePath es null o indefinida se ignoran en la colección resultante. Puede pasar la constante ck keep null en el parámetro option para incluir estos valores como elementos null en la colección devuelta.

  • Los atributos dataclass con .kind = "relatedEntity" se extraen como una colección de entidades (se mantienen las duplicaciones).
  • Los atributos dataclass con .kind = "relatedEntities" se extraen como una colección de entity selections.

.extract ( attributePath ; targetPath { ; ...attributePathN ; ... targetPathN}) : Collection

Con esta sintaxis, .extract() llena la colección devuelta con las propiedades attributePath. Cada elemento de la colección devuelta es un objeto con las propiedades targetPath llenadas con las propiedades attributePath correspondientes. Se conservan los valores null (el parámetro opción se ignora con esta sintaxis).

Si se indican varios attributePath, debe indicarse un targetPath para cada uno de ellos. Sólo los pares [attributePath, targetPath] válidos se extraen.

  • Los atributos dataclass con .kind = "relatedEntity" se extraen como una entidad.
  • Los atributos dataclass con .kind = "relatedEntities" se extraen como una selección de entidades.

Los valores Null se evalúan como inferiores a los otros valores.

Ejemplo

Dada la siguiente tabla y relación:

 var $firstnames; $addresses; $mailing; $teachers : Collection
//
//
//$firstnames es una colección de cadenas


$firstnames:=ds.Teachers.all().extract("firstname")
//
//$addresses es una colección de entidades relacionadas con la dataclass Address
//Se extraen los valores null de Address
$addresses:=ds.Teachers.all().extract("address";ck keep null)
//
//
//$mailing es una colección de objetos con las propiedades "who" y "to"
//El contenido de la propiedad "who" es de tipo Cadena
//El contenido de la propiedad "to" es de tipo entity (dataclass Address)
$mailing:=ds.Teachers.all().extract("lastname";"who";"address";"to")
//
//
//$mailing es una colección de objetos con las propiedades "who" y "city"
//El contenido de la propiedad "who" es de tipo Cadena
//El contenido de la propiedad "city" es de tipo Cadena
$mailing:=ds.Teachers.all().extract("lastname";"who";"address.city";"city")
//
//$teachers es una colección de objetos con las propiedades "where" y "who"
//El contenido de la propiedad "where" es de tipo Cadena
//El contenido de la propiedad "who" es una entity selection (dataclass Teachers)
$teachers:=ds.Address.all().extract("city";"where";"teachers";"who")
//
//$teachers es una colección de entity selections
$teachers:=ds.Address.all().extract("teachers")

.first()

Historia
LanzamientoModificaciones
17Añadidos

.first() : 4D.Entity

ParámetrosTipoDescripción
Result4D.Entity<-Referencia a la primera entidad de la entity selection (Null si la selección está vacía)

Descripción

La función .first() devuelve una referencia a la entidad en la primera posición de la entity selection.

El resultado de esta función es similar a:

 $entity:=$entitySel[0]

Sin embargo, hay una diferencia entre ambas afirmaciones cuando la selección está vacía:

 var $entitySel : cs.EmpSelection
var $entity : cs.EmpEntity
$entitySel:=ds.Emp.query("lastName = :1";"Nonexistentname") //ninguna entidad correspondiente
//entity selection is then empty
$entity:=$entitySel.first() //devuelve Null
$entity:=$entitySel[0] //genera un error

Ejemplo

 var $entitySelection : cs.EmpSelection
var $entity : cs.EmpEntity
$entitySelection:=ds.Emp.query("salary > :1";100000)
If($entitySelection.length#0)
$entity:=$entitySelection.first()
End if

.getDataClass()

Historia
LanzamientoModificaciones
17 R5Añadidos

.getDataClass() : 4D.DataClass

ParámetrosTipoDescripción
Result4D.DataClass<-DataClass a la que pertenece la entity selection

Descripción

La función .getDataClass() devuelve la dataclass de la entity selection.

Esta función es principalmente útil en el contexto del código genérico.

Ejemplo

El siguiente código genérico duplica todas las entidades de la entity selection:

  //método duplicate_entities 
//duplicate_entities($entity_selection)

#DECLARE ( $entitySelection : 4D.EntitySelection )
var $dataClass : 4D.DataClass
var $entity; $duplicate : 4D.Entity
var $status : Object
$dataClass:=$entitySelection.getDataClass()
For each($entity;$entitySelection)
$duplicate:=$dataClass.new()
$duplicate.fromObject($entity.toObject())
$duplicate[$dataClass.getInfo().primaryKey]:=Null //restablecer la llave primaria
$status:=$duplicate.save()
End for each

.getRemoteContextAttributes()

Historia
LanzamientoModificaciones
19R5Añadidos

.getRemoteContextAttributes() : Text

ParámetrosTipoDescripción
resultadoText<-Atributos de contexto vinculados a la entity selection, 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 entity selection.

Si no hay un contexto de optimización para la entity selection, la función devuelve un texto vacío.

Ejemplo

var $ds : 4D.DataStoreImplementation
var $persons : cs.PersonsSelection
var $p : cs.PersonsEntity

var $info : Text
var $text : Text

$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")

$persons:=$ds.Persons.all()
$text:=""
For each ($p; $persons)
$text:=$p.firstname+" lives in "+$p.address.city+" / "
End for each

$info:=$persons.getRemoteContextAttributes()
//$info = "firstname,address,address.city"

Ver también

Entity.getRemoteContextAttributes()
.clearAllRemoteContexts()
.getRemoteContextInfo()
.getAllRemoteContexts()
.setRemoteContextInfo()

.isAlterable()

Historia
LanzamientoModificaciones
18 R5Añadidos

.isAlterable() : Boolean

ParámetrosTipoDescripción
ResultBoolean<-True si la entity selection es modificable, de lo contrario False

Descripción

La función .isAlterable() devuelve True si la entity selection es modificable, y False si no lo es.

Para más información, consulte Selecciones de entidades compartibles o modificables.

Ejemplo

Está a punto de mostrar Form.products en un list box para permitir al usuario añadir nuevos productos. Quiere asegurarse de que es modificable para que el usuario pueda añadir nuevos productos sin error:

If (Not(Form.products.isAlterable()))
Form.products:=Form.products.copy()
End if
...
Form.products.add(Form.product)

.isOrdered()

Historia
LanzamientoModificaciones
17Añadidos

.isOrdered() : Boolean

ParámetrosTipoDescripción
ResultBoolean<-True si la entity selection es ordenada, de lo contrario False

Descripción

La función .isOrdered() devuelve True si la entity selection está ordenada, y False si está desordenada.

Esta función no modifica la selección de entidades original.

Para más información, consulte Selección de entidades ordenadas o no ordenadas.

Ejemplo

 var $employees : cs.EmployeeSelection
var $employee : cs.EmployeeEntity
var $isOrdered : Boolean
$employees:=ds.Employee.newSelection(dk keep ordered)
$employee:=ds.Employee.get(714) // Obtiene la entidad con llave primaria 714

//En una entity selection ordenada, podemos añadir la misma entidad varias veces (los duplicados se mantienen)
$employees.add($employee)
$employees.add($employee)
$employees.add($employee)

$isOrdered:=$employees.isOrdered()
If($isOrdered)
ALERT("The entity selection is ordered and contains "+String($employees.length)+" employees")
End if

.last()

Historia
LanzamientoModificaciones
17Añadidos

.last() : 4D.Entity

ParámetrosTipoDescripción
Result4D.Entity<-Referencia a la última entidad de la entity selection (Null si la entity selection está vacía)

Descripción

La función .last() devuelve una referencia a la entidad en última posición de la entity selection.

El resultado de esta función es similar a:

 $entity:=$entitySel[length-1]

Si la entity selection está vacía, la función devuelve Null.

Ejemplo

 var $entitySelection : cs.EmpSelection
var $entity : cs.EmpEntity
$entitySelection:=ds.Emp.query("salary < :1";50000)
If($entitySelection.length#0)
$entity:=$entitySelection.last()
End if

.length

Historia
LanzamientoModificaciones
17Añadidos

.length : Integer

Descripción

La propiedad .length devuelve el número de entidades en la entity selection. Si la entity selection está vacía, devuelve 0.

Las entity selections siempre tienen una propiedad .length.

Para conocer el número total de entidades de una dataclass, se recomienda utilizar la función getCount() que está más optimizada que la expresión ds.myClass.all().length.

Ejemplo

 var $vSize : Integer
$vSize:=ds.Employee.query("gender = :1";"male").length
ALERT(String(vSize)+" male employees found.")

.max()

Historia
LanzamientoModificaciones
17Añadidos
18 R6Devuelve undefined si la entity selection está vacía

.max( attributePath : Text ) : any

ParámetrosTipoDescripción
attributePathText->Ruta del atributo que se utilizará para el cálculo
Resultany<-Valor más alto del atributo

Descripción

La función .max() devuelve el valor más alto (o máximo) entre todos los valores de attributePath en la entity selection. En realidad devuelve el valor de la última entidad de la selección de entidades tal y como se ordenaría de forma ascendente utilizando la función .orderBy().

Si se pasa en attributePath una ruta a una propiedad objeto que contenga diferentes tipos de valores, la función .max() devolverá el valor máximo dentro del primer tipo escalar en el orden predeterminado de la lista de tipos 4D (ver la descripción de .sort()).

.max() devuelve undefined si la entity selection está vacía o no se encuentra attributePath en el atributo objeto.

Se devuelve un error si:

  • attributePath es un atributo relacionado,
  • attributePath designa un atributo que no existe en la dataclass de la entity selection.

Ejemplo

Queremos encontrar el salario más alto entre todas las empleadas:

 var $sel : cs.EmpSelection
var $maxSalary : Real
$sel:=ds.Employee.query("gender = :1";"female")
$maxSalary:=$sel.max("salary")

.min()

Historia
LanzamientoModificaciones
17Añadidos
18 R6Devuelve undefined si la entity selection está vacía

.min( attributePath : Text ) : any

ParámetrosTipoDescripción
attributePathText->Ruta del atributo que se utilizará para el cálculo
Resultany<-Valor más bajo del atributo

Descripción

La función .min() devuelve el valor más bajo (o mínimo) entre todos los valores de attributePath en la entity selection. En realidad devuelve la primera entidad de la entity selection tal y como se ordenaría de forma ascendente utilizando la función .orderBy() (excluyendo los valores null).

Si se pasa en attributePath una ruta a una propiedad objeto que contiene diferentes tipos de valores, la función .min() devolverá el valor mínimo dentro del primer tipo de valor escalar en el orden de la lista de tipos (ver la descripción de .sort()).

.min() devuelve undefined si la entity selection está vacía o attributePath no se encuentra en el atributo objeto.

Se devuelve un error si:

  • attributePath es un atributo relacionado,
  • attributePath designa un atributo que no existe en la dataclass de la entity selection.

Ejemplo

En este ejemplo, queremos encontrar el salario más bajo entre todas las empleadas:

 var $sel : cs.EmpSelection
var $minSalary : Real
$sel:=ds.Employee.query("gender = :1";"female")
$minSalary:=$sel.min("salary")

.minus()

Historia
LanzamientoModificaciones
19 R7Soporte del parámetro keepOrder
17Añadidos

.minus( entity : 4D.Entity { ; keepOrder : Integer } ) : 4D.EntitySelection
.minus( entitySelection : 4D.EntitySelection { ; keepOrder : Integer } ) : 4D.EntitySelection

ParámetrosTipoDescripción
entity4D.Entity->Entidad a sustraer
entitySelection4D.EntitySelection->Entity selection a sustraer
keepOrderInteger->dk keep ordered (integer) para mantener el orden inicial en la selección de entidades resultante
Result4D.EntitySelection<-Nueva entity selection o una nueva referencia en la entity selection existente

Descripción

La función .minus() excluye la entity selection a la que se aplica la entity o las entidades de entitySelection y devuelve la entity selection resultante.

  • Si se pasa entity como parámetro, la función crea una nueva selección de entidades sin entity (si entity pertenece a la entity selection). Si entity no estaba incluida en la entity selection original, se devuelve una nueva referencia a la entity selection.
  • Si se pasa entitySelection como parámetro, la función devuelve una entity selection que contiene las entidades pertenecientes a la entity selection original sin las entidades pertenecientes a entitySelection. Puede comparar las entity selections ordenadas y/o desordenadas.

Por defecto, si se omite el parámetro keepOrder, la selección de entidades resultante es desordenada. Si desea mantener el orden de la selección de entidades original (por ejemplo, si desea reutilizar la selección de entidades en una interfaz de usuario), pase la constante dk keep ordered en keepOrder. En este caso, el resultado es una selección de entidades ordenada y se mantiene el orden de la selección de entidades inicial.

nota

Si pasa dk keep ordered en keepOrder y la entitySelection eliminada contiene entidades duplicadas en la entity selection original, se eliminan todas las apariciones de los duplicados.

Si la entity selection inicial o la entity selection inicial y la del parámetro entitySelection están vacías, se devuelve una entity selection vacía.

Si entitySelection está vacía o si entity es Null, se devuelve una nueva referencia a la entity selection original.

Si la entity selection inicial y el parámetro no están relacionados con la misma dataclass, se produce un error.

Ejemplo 1

 var $employees; $result : cs.EmployeeSelection
var $employee : cs.EmployeeEntity

$employees:=ds.Employee.query("lastName = :1";"H@")
// La selección de entidades $employees contiene la entidad con llave primaria 710 y otras entidades
// para por ej. "Colin Hetrick", "Grady Harness", "Sherlock Holmes" (llave primaria 710)

$employee:=ds.Employee.get(710) // Devuelve "Sherlock Holmes"

$result:=$employees.minus($employee) //$result contiene "Colin Hetrick", "Grady Harness"

Ejemplo 2

Queremos tener una selección de empleadas llamadas "Jones" que vivan en Nueva York :

 var $sel1; $sel2; $sel3 : cs.EmployeeSelection
$sel1:=ds.Employee.query("name =:1";"Jones")
$sel2:=ds.Employee.query("city=:1";"New York")
$sel3:=$sel1.and($sel2).minus(ds.Employee.query("gender='male'"))

Ejemplo 3

En una interfaz de usuario, tenemos una lista que muestra los elementos en un orden específico. Si el usuario selecciona elementos de la lista para eliminarlos, el orden debe mantenerse al refrescar la lista:

$listsel:=$listsel.minus($selectedItems; dk keep ordered)

.or()

Historia
LanzamientoModificaciones
17Añadidos

.or( entity : 4D.Entity ) : 4D.EntitySelection
.or( entitySelection : 4D.EntitySelection ) : 4D.EntitySelection

ParámetrosTipoDescripción
entity4D.Entity->Entidad a intersectar
entitySelection4D.EntitySelection->Entity selection a intersectar
Result4D.EntitySelection<-Nueva entity selection o una nueva referencia a la entity selection de origen

Descripción

La función .or() combina la entity selection con el parámetro entity o entitySelection utilizando el operador lógico OR (no exclusivo); devuelve una nueva entity selection desordenada que contiene todas las entidades de la entity selection y el parámetro.

  • Si se pasa como parámetro entity, se compara esta entidad con la selección de entidades. Se devuelve una nueva selección de entidades que contiene sólo las entidades a las que se hace referencia en ambas selecciones. A new entity selection that contains only the entities that are referenced in both selections is returned.
  • Si se pasa entitySelection como parámetro, se comparan las entity selections. Una nueva entity selection que contiene las entidades pertenecientes a la selección de entidades original o entitySelection es devuelta (o no es exclusiva, las entidades referenciadas en ambas selecciones no se duplican en la selección resultante).

Puede comparar las entity selections ordenadas y/o desordenadas. La selección resultante es siempre desordenada.

Si la entity selection inicial y la del parámetro entitySelection están vacías, se devuelve una entity selection vacía. Si la entity selection original está vacía, se devuelve una referencia a entitySelection o una entity selection que sólo contiene entity.

Si entitySelection está vacía o si entity es Null, se devuelve una nueva referencia a la entity selection original.

Si la entity selection inicial y el parámetro no están relacionados con la misma dataclass, se produce un error.

Ejemplo 1

 var $employees1; $employees2; $result : cs.EmployeeSelection
$employees1:=ds.Employee.query("lastName = :1";"H@") //Devuelve "Colin Hetrick","Grady Harness"
$employees2:=ds.Employee.query("firstName = :1";"C@") //Devuelve "Colin Hetrick", "Cath Kidston"
$result:=$employees1.or($employees2) //$result contiene "Colin Hetrick", "Grady Harness","Cath Kidston"

Ejemplo 2

 var $employees; $result : cs.EmployeeSelection
var $employee : cs.EmployeeEntity
$employees:=ds.Employee.query("lastName = :1";"H@") // Devuelve "Colin Hetrick","Grady Harness", "Sherlock Holmes"
$employee:=ds.Employee.get(686) //la entidad con llave primaria 686 no pertenece a la entity selection $employees
//Coincide con la empleada "Mary Smith"

$result:=$employees.or($employee) //$result contiene "Colin Hetrick", "Grady Harness", "Sherlock Holmes", "Mary Smith"

.orderBy()

Historia
LanzamientoModificaciones
17Añadidos

.orderBy( pathString : Text ) : 4D.EntitySelection
.orderBy( pathObjects : Collection ) : 4D.EntitySelection

ParámetrosTipoDescripción
pathStringText->Ruta(s) de atributos e instrucciones de clasificación para la entity selection
pathObjectsCollection->Colección de objetos criterio
Result4D.EntitySelection<-Nueva entity selection en el orden especificado

Descripción

La función .orderBy() devuelve una nueva selección ordenada de entidades que contiene todas las entidades de la entity selection en el orden especificado por los criterios pathString o pathObjects.

Debe utilizar un parámetro de criterio para definir cómo deben ordenarse las entidades. Se soportan dos parámetros diferentes:

  • pathString (Texto): este parámetro contiene una fórmula compuesta de rutas de atributo de 1 a x y (opcionalmente) órdenes de clasificación, separados por comas. La sintaxis es:
"attributePath1 {desc or asc}, attributePath2 {desc or asc},..."

El orden en que se pasan los atributos determina la prioridad de ordenación de las entidades. Por defecto, los atributos se clasifican en orden ascendente. Puede definir el orden de clasificación de una propiedad en la cadena de criterios, separado de la ruta de la propiedad por un solo espacio: pase "asc" para ordenar en orden ascendente o "desc" en orden descendente.

  • pathObjects (collection): cada elemento de la colección contiene un objeto estructurado de la siguiente manera:
{
"propertyPath": string,
"descending": boolean
}

Por defecto, los atributos se clasifican en orden ascendente ("descending" es false).

Puede añadir tantos objetos en la colección de criterios como sea necesario.

Esta función sólo funciona con un datastore remoto (cliente/servidor o conexión Open datastore).

Si pasa una ruta de atributo inválida en pathString o pathObject, la función devuelve una entity selection vacía.

Ejemplo

// ordenar por fórmula
$sortedEntitySelection:=$entitySelection.orderBy("firstName asc, salary desc")
$sortedEntitySelection:=$entitySelection.orderBy("firstName")

// ordenar por colección con o sin órdenes de clasificación
$orderColl:=New collection
$orderColl.push(New object("propertyPath";"firstName";"descending";False))
$orderColl.push(New object("propertyPath";"salary";"descending";True))
$sortedEntitySelection:=$entitySelection.orderBy($orderColl)

$orderColl:=New collection
$orderColl.push(New object("propertyPath";"manager.lastName"))

$orderColl.push(New object("propertyPath";"salary"))
$sortedEntitySelection:=$entitySelection.orderBy($orderColl)

.orderByFormula()

Historia
LanzamientoModificaciones
17 R6Añadidos

.orderByFormula( formulaString : Text { ; sortOrder : Integer } { ; settings : Object} ) : 4D.EntitySelection
.orderByFormula( formulaObj : Object { ; sortOrder : Integer } { ; settings : Object} ) : 4D.EntitySelection

ParámetrosTipoDescripción
formulaStringText->Cadena formula
formulaObjObject->Objeto fórmula
sortOrderInteger->dk ascending (por defecto) o dk descending
settingsObject->Parámetros de la fórmula
Result4D.EntitySelection<-Nueva entity selection ordenada

Descripción

La función .orderByFormula() devuelve una nueva entity selection ordenada que contiene todas las entidades de la entity selection en el orden definido a través de los parámetros formulaString o formulaObj y, opcionalmente, sortOrder y settings.

Las entidades de una colección de entidades a las que se accede por medio de [ ] no se recargan desde la base de datos.

Puede utilizar un parámetro formulaString o formulaObj:

  • formulaString: se pasa una expresión 4D como "Year of(this.birthDate)".
  • formulaObj: pasa un objeto fórmula válido creado utilizando los comandos Formula o Formula from string.

La fórmula de formulaString o formulaObj se ejecuta para cada entidad de la entity selection y su resultado se utiliza para definir la posición de la entidad en la entity selection devuelta. El resultado debe ser de un tipo ordenable (booleano, fecha, número, texto, hora, null).

Un resultado null es siempre el valor más pequeño.

Por defecto, si se omite el parámetro sortOrder, la selección de entidades resultante se clasifica en orden ascendente. Opcionalmente, puede pasar uno de los siguientes valores en el parámetro sortOrder:

ConstanteValorComentario
dk ascending0Orden ascendente (por defecto)
dk descending1Orden descendente

En formulaString o formulaObj, la entidad procesada y, por tanto, sus atributos están disponibles a través del comando This (por ejemplo, This.lastName).

Puede pasar parámetro(s) a la fórmula utilizando la propiedad args (objeto) del parámetro settings: la fórmula recibe el objeto settings.args en $1.

Ejemplo 1

Clasificar a los alumnos mediante una fórmula dada como texto:

 var $es1; $es2 : cs.StudentsSelection
$es1:=ds.Students.query("nationality=:1";"French")
$es2:=$es1.orderByFormula("length(this.lastname)") //ascendente por defecto
$es2:=$es1.orderByFormula("length(this.lastname)";dk descending)

El mismo orden de clasificación pero utilizando un objeto fórmula:

 var $es1; $es2 : cs.StudentsSelection
var $formula : Object
$es1:=ds.Students.query("nationality=:1";"French")
$formula:=Formula(Length(This.lastname))
$es2:=$es1.orderByFormula($formula) // ascendente por defecto
$es2:=$es1.orderByFormula($formula;dk descending)

Ejemplo 2

Una fórmula se da como un objeto fórmula con parámetros; el objeto settings.args se recibe como $1 en el método computeAverage.

En este ejemplo, el campo objeto "marks" de la dataClass Students contiene las notas de los estudiantes para cada asignatura. Se utiliza un solo objeto fórmula para calcular la nota media de un alumno con diferentes coeficientes para schoolA y schoolB.

 var $es1; $es2 : cs.StudentsSelection
var $formula; $schoolA; $schoolB : Object
$es1:=ds.Students.query("nationality=:1";"French")
$formula:=Formula(computeAverage($1))

$schoolA:=New object() //settings object
$schoolA.args:=New object("english";1;"math";1;"history";1) // Coeficientes para calcular una media

//Ordenar a los estudiantes según los criterios de la escuela A
$es2:=$es1.entitySelection.orderByFormula($formula;$schoolA)

$schoolB:=New object() //object settings
$schoolB.args:=New object("english";1;"math";2;"history";3) // Coeficientes para calcular un promedio

//Ordenar a los estudiantes según los criterios de la escuela B
$es2:=$es1.entitySelection.orderByFormula($formula;dk descending;$schoolB)
  //
// método computeAverage
// -----------------------------
#DECLARE ($coefList : Object) -> $result : Integer
var $subject : Text
var $average; $sum : Integer

$average:=0
$sum:=0

For each($subject;$coefList)
$sum:=$sum+$coefList[$subject]
End for each

For each($subject;This.marks)
$average:=$average+(This.marks[$subject]*$coefList[$subject])
End for each

$result:=$average/$sum

.query()

Historia
LanzamientoModificaciones
17 R6Soporte de los parámetros Formula
17 R5Soporte de los marcadores para los valores
17Añadidos

.query( queryString : Text { ; ...value : any } { ; querySettings : Object } ) : 4D.EntitySelection
.query( formula : Object { ; querySettings : Object } ) : 4D.EntitySelection

ParámetrosTipoDescripción
queryStringText->Criterios de búsqueda como cadena
formulaObject->Criterios de búsqueda como objeto fórmula
valueany->Valor(es) a utilizar para los marcadores de posición indexados
querySettingsObject->Opciones de búsqueda: parameters, attributes, args, allowFormulas, context, queryPath, queryPlan
Result4D.EntitySelection<-Nueva entity selection formada por las entidades de la entity selection que cumplen los criterios de búsqueda especificados en queryString o formula

Descripción

La función .query() busca las entidades que cumplan con los criterios de búsqueda especificados en queryString o formula y (opcionalmente) value(s) entre todas las entidades de la entity selection, y devuelve un nuevo objeto de tipo EntitySelection que contiene todas las entidades encontradas. Se aplica carga diferida.

Las entidades de una colección de entidades a las que se accede por medio de [ ] no se recargan desde la base de datos.

Si no se encuentran entidades coincidentes, se devuelve una EntitySelection vacía.

Para obtener información detallada sobre cómo generar una consulta utilizando los parámetros queryString, value y querySettings, consulte la descripción de la función DataClass .query().

Por defecto, si se omite la declaración order by en queryString, la entity selection devuelta es no ordenada. Sin embargo, tenga en cuenta que, en modo Cliente/Servidor, se comporta como una selección de entidades ordenada (las entidades se añaden al final de la selección).

Ejemplo 1

 var $entitySelectionTemp : cs.EmployeeSelection
$entitySelectionTemp:=ds.Employee.query("lastName = :1";"M@")
Form.emps:=$entitySelectionTemp.query("manager.lastName = :1";"S@")

Ejemplo 2

Se pueden encontrar más ejemplos de búsquedas en la página DataClass .query().

Ver también

.query() para dataclass

.queryPath

Historia
LanzamientoModificaciones
17Añadidos

.queryPath : Text

Descripción

La propiedad .queryPath contiene una descripción detallada de la búsqueda tal y como fue realizada por 4D. Esta propiedad está disponible para los objetos EntitySelection generados a través de consultas si se ha pasado la propiedad "queryPath":true en el parámetro querySettings de la función .query().

Para más información, consulte el párrafo del parámetro querySettings en la página de la función Dataclass.query().

.queryPlan

Historia
LanzamientoModificaciones
17Añadidos

.queryPlan : Text

Descripción

La propiedad .queryPlan contiene una descripción detallada de la búsqueda justo antes de su ejecución (es decir, la búsqueda planeada). Esta propiedad está disponible para los objetos EntitySelection generados a través de consultas si se ha pasado la propiedad "queryPlan":true en el parámetro querySettings de la función .query().

Para más información, consulte el párrafo del parámetro querySettings en la página de la función Dataclass.query().

.refresh()

Historia
LanzamientoModificaciones
18 R3Añadidos

.refresh()

ParámetrosTipoDescripción
No requiere ningún parámetro

Descripción

Esta función sólo funciona con un datastore remoto (cliente/servidor o conexión Open datastore).

La función .refresh() invalida inmediatamente los datos de la entidad seleccionada en la caché local de ORDA para que la próxima vez que 4D requiera la entidad seleccionada, esta sea recargada desde la base de datos.

Por defecto, la caché local de ORDA se invalida después de 30 segundos. En el contexto de las aplicaciones cliente/servidor que utilizan tanto ORDA como el lenguaje clásico, este método le permite asegurarse de que una aplicación remota siempre funcionará con los datos más recientes.

Ejemplo 1

En este ejemplo, el código clásico y el código ORDA modifican los mismos datos simultáneamente:

 //En un 4D remoto

var $selection : cs.StudentsSelection
var $student : cs.StudentsEntity

$selection:=ds.Students.query("lastname=:1";"Collins")
//La primera entidad se carga en la caché de ORDA
$student:=$selection.first()

//Actualización con un 4D clásico, la caché ORDA no es consciente de si
QUERY([Students];[Students]lastname="Collins")
[Students]lastname:="Colin"
SAVE RECORD([Students])

//para obtener la última versión, hay que invalidar la caché de ORDA
$selection.refresh()
// Aunque la caché no haya caducado, la primera entidad se recarga desde el disco
$student:=$selection.first()

//$student.lastname contains "Colin"

Ejemplo 2

En este ejemplo, el código clásico y el código ORDA modifican los mismos datos simultáneamente:

// Form method: Case of
:(Form event code=On Load)
Form.students:=ds.Students.all()
End case
//
//
// On client #1, the user loads, updates, and saves the first entity
// On client #2, the user loads, updates, and saves the same entity
//
//
// On client #1:
Form.students.refresh() // Invalidates the ORDA cache for the Form.students entity selection
// The list box content is refreshed from the database with update made by client #2

Ver también

.clean()
dataClass.clearRemoteCache()

.selected()

Historia
LanzamientoModificaciones
19 R3Añadidos

.selected( selectedEntities : 4D.EntitySelection ) : Object

ParámetrosTipoDescripción
selectedEntities4D.EntitySelection->Selección de entidades con entidades para las cuales conocer el rango en la selección de entidades
ResultObject<-Rango(s) de entidades seleccionadas en la selección de entidades

Descripción

La función .selected() devuelve un objeto que describe la(s) posición(es) de selectedEntities en la entity selection de origen.

Las entidades de una colección de entidades a las que se accede por medio de [ ] no se recargan desde la base de datos.

Pase en el parámetro selectedEntities una selección de entidades que contenga entidades de las que desee conocer la posición en la entity selection de origen. selectedEntities debe ser una selección de entidades que pertenezca a la misma clase de datos que la selección de entidades original, de lo contrario se produce un error 1587 - "La selección de entidades procede de una clase de datos incompatible".

Result

El objeto devuelto contiene las siguientes propiedades:

PropiedadTipoDescripción
rangesCollectionColección de objetos rango
ranges[].startIntegerÍndice de la primera entidad en el rango
ranges[].endIntegerÍndice de la última entidad en el rango

Si una propiedad ranges contiene una única entidad, start = end. El índice comienza en 0.

La función devuelve una colección vacía en la propiedad ranges si la selección de entidades original o la selección de entidades selectedEntities está vacía.

Ejemplo

var $invoices; $cashSel; $creditSel : cs.Invoices
var $result1; $result2 : Object

$invoices:=ds.Invoices.all()

$cashSelection:=ds.Invoices.query("payment = :1"; "Cash")
$creditSel:=ds.Invoices.query("payment IN :1"; New collection("Cash"; "Credit Card"))

$result1:=$invoices.selected($cashSelection)
$result2:=$invoices.selected($creditSel)

//$result1 = {ranges:[{start:0;end:0},{start:3;end:3},{start:6;end:6}]}
//$result2 = {ranges:[{start:0;end:1},{start:3;end:4},{start:6;end:7}]}

.slice()

Historia
LanzamientoModificaciones
17Añadidos

.slice( startFrom : Integer { ; end : Integer } ) : 4D.EntitySelection

ParámetrosTipoDescripción
startFromInteger->Índice para iniciar la operación (incluído)
endInteger->Índice final (no incluido)
Result4D.EntitySelection<-Nueva entity selection que contiene la entidades extraídas (shallow copy)

Descripción

La función .slice() devuelve una parte de una entity selection en una nueva entity selection, seleccionada desde el índice startFrom hasta el índice end (end no se incluye) o hasta la última entidad de la entity selection. Este método devuelve una shallow copy (copia superficial) de la entity selection (utiliza las mismas referencias de entidades).

Las entidades de una colección de entidades a las que se accede por medio de [ ] no se recargan desde la base de datos.

La entity selection devuelta contiene las entidades especificadas por startFrom y todas las entidades subsiguientes hasta, pero sin incluir, la entidad especificada por end. Si sólo se especifica el parámetro startFrom, la entity selection devuelta contiene todas las entidades entre startFrom y la última entidad de la entity selection original.

  • Si startFrom < 0, se recalcula como startFrom:=startFrom+length (se considera el desplazamiento desde el final de la entity selection). Descripción
  • Si startFrom >= length, la función devuelve una entity selection vacía.
  • Si end < 0, se recalcula como end:=end+length.
  • Este ejemplo permite reducir varios elementos de la colección a uno solo:

.sum() devuelve 0 si la entity selection está vacía.

Ejemplo 1

Si la entity selection contiene entidades que se han eliminado mientras tanto, también se devuelven.

var $sel; $sliced : cs.EmployeeSelection
$sel:=ds.Employee.query("salary > :1";50000)
$sliced:=$sel.slice(0;9) //

Ejemplo 2

Assuming we have ds. Employee.all().length = 10

var $slice : cs.EmployeeSelection


$slice:=ds.Employee.all().slice(-1;-2) //intenta devolver entidades del índice 9 al 8, pero como 9 > 8, devuelve una entity selection vacía

.sum()

Historia
LanzamientoModificaciones
17Añadidos

.sum( attributePath : Text ) : Real

ParámetrosTipoDescripción
attributePathText->Ruta del atributo que se utilizará para el cálculo
ResultReal<-Suma de los valores de la entity selection

Descripción

La función .sum() devuelve la suma de todos los valores de attributePath en la entity selection.

.sum() devuelve 0 si la entity selection está vacía.

La suma sólo puede hacerse en valores de tipo numérico. Si attributePath es una propiedad objeto, sólo se tienen en cuenta los valores numéricos para el cálculo (se ignoran otros tipos de valores). En este caso, si attributePath designa una propiedad que no existe en el objeto o que no contiene ningún valor numérico, .sum() devuelve 0.

Se devuelve un error si:

  • attributePath no es un atributo de tipo numérico ni de tipo objeto,
  • attributePath es un atributo relacionado,
  • attributePath no se encuentra en la dataclass de la entity selection.

Ejemplo

var $sel : cs.EmployeeSelection
var $sum : Real

$sel:=ds.Employee.query("salary < :1";20000)
$sum:=$sel.sum("salary")

.toCollection()

Historia
LanzamientoModificaciones
17Añadidos

.toCollection( { options : Integer { ; begin : Integer { ; howMany : Integer } } ) : Collection
.toCollection( filterString : Text {; options : Integer { ; begin : Integer { ; howMany : Integer }}} ) : Collection
.toCollection( filterCol : Collection {; options : Integer { ; begin : Integer { ; howMany : Integer }}} ) : Collection

ParámetrosTipoDescripción
filterStringText->Cadena con la(s) ruta(s) de atributos de la entidad a extraer
filterColCollection->Colección de rutas de atributos de entidad a extraer
optionsInteger->dk with primary key: añade la llave primaria
dk with stamp: añade el marcador
beginInteger->Designa el índice inicial
howManyInteger->Número de entidades a extraer
ResultCollection<-Colección de objetos que contienen atributos y valores de la selección de entidades

Descripción

La función .toCollection() crea y devuelve una colección donde cada elemento es un objeto que contiene un conjunto de propiedades y valores correspondientes a los nombres y valores de los atributos de la entity selection.

Si no se pasa ningún parámetro de filtro o si el primer parámetro contiene una cadena vacía o "*", se extraen todos los atributos. Los atributos con la propiedad kind como "relatedEntity" se extraen con la forma simple: un objeto con la propiedad __KEY (llave primaria). Los atributos con la propiedad kind como "relatedEntities" no se extraen.

O bien, puede designar los atributos de la entidad a extraer utilizando un parámetro de filtro. Puede utilizar uno de estos dos filtros:

  • filterString --una cadena con rutas de propiedades separadas por comas: "propertyPath1, propertyPath2, ...".
  • filterCol: --una colección de cadenas que contiene la rutas de propiedades: ["propertyPath1","propertyPath2",...]

Si se especifica un filtro para un atributo del tipo relatedEntity:

  • propertyPath = "relatedEntity" -> se extrae de forma simple
  • propertyPath = "relatedEntity.*" -> se extraen todas las propiedades
  • propertyPath = "relatedEntity.propertyName1, relatedEntity.propertyName2, ..." -> sólo se extraen esas propiedades

Si se especifica un filtro para un atributo del tipo relatedEntities:

  • propertyPath = "relatedEntities.*" -> se extraen todas las propiedades
  • propertyPath = "relatedEntities.propertyName1, relatedEntities.propertyName2, ..." -> sólo se extraen esas propiedades

En el parámetro options, puede 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 .toCollection() y .fromCollection().

El parámetro begin permite indicar la posición de inicio de las entidades a extraer. Puede pasar cualquier valor entre 0 y la longitud de la entity selection -1.

El parámetro howMany permite especificar el número de entidades a extraer, empezando por la especificada en* begin*. Las entidades descartadas no se devuelven pero se tienen en cuenta en howMany. Por ejemplo, si howMany= 3 y hay 1 entidad descartada, sólo se extraen 2 entidades.

Si howMany longitud de la entity selection, el método devuelve (length - begin) objetos.

Si howMany > longitud de la entity selection, el método devuelve (length - begin) objetos.

  • la entity selection está vacía, o
  • begin es mayor que la longitud de la entity selection.

Ejemplo 1

En todos los ejemplos de esta sección se utilizará la siguiente estructura:

Ejemplo sin parámetros de filtro ni de opciones:

 var $employeesCollection : Collection
var $employees : cs.EmployeeSelection

$employeesCollection:=New collection
$employees:=ds.Employee.all()
$employeesCollection:=$employees.toCollection()

Ejemplo con el tipo relatedEntity con una forma simple:

[
{
"ID": 416,
"firstName": "Gregg",
"lastName": "Wahl",
"salary": 79100,
"birthDate": "1963-02-01T00:00:00.000Z",
"woman": false,
"managerID": 412,
"employerID": 20,
"photo": "[object Picture]",
"extra": null,
"employer": {
"__KEY": 20
},
"manager": {
"__KEY": 412

}
},
{
"ID": 417,
"firstName": "Irma",
"lastName": "Durham",
"salary": 47000,
"birthDate": "1992-06-16T00:00:00.000Z",
"woman": true,
"managerID": 412,
"employerID": 20,
"photo": "[object Picture]",
"extra": null,
"employer": {
"__KEY": 20
},
"manager": {
"__KEY": 412
}
}
]

Ejemplo 2

Devuelve:

var $employeesCollection : Collection
var $employees : cs.EmployeeSelection

$employeesCollection:=New collection
$employees:=ds.Employee.all()
$employeesCollection:=$employees.toCollection("";dk with primary key+dk with stamp)

Ejemplo con el tipo relatedEntity con una forma simple:

[
{
"__KEY": 416,
"__STAMP": 1,
"ID": 416,
"firstName": "Gregg",
"lastName": "Wahl",
"salary": 79100,
"birthDate": "1963-02-01T00:00:00.000Z",
"woman": false,
"managerID": 412,
"employerID": 20,
"photo": "[object Picture]",
"extra": null,
"employer": {
"__KEY": 20
},
"manager": {
"__KEY": 412
}
},
{
"__KEY": 417,
"__STAMP": 1,
"ID": 417,
"firstName": "Irma",
"lastName": "Durham",
"salary": 47000,
"birthDate": "1992-06-16T00:00:00.000Z",
"woman": true,
"managerID": 412,
"employerID": 20,
"photo": "[object Picture]",
"extra": null,
"employer": {
"__KEY": 20
},
"manager": {
"__KEY": 412
}
}]

Ejemplo 3

Devuelve:

var $employeesCollection; $filter : Collection
var $employees : cs.EmployeeSelection


$employeesCollection:=New collection
$filter:=New collection


$filter.push("firstName")
$filter.push("lastName")

$employees:=ds.Employee.all()
$employeesCollection:=$employees.toCollection($filter;0;0;2)

Ejemplo con el tipo relatedEntity con una forma simple:

[
{
"firstName": "Gregg",
"lastName": "Wahl"
},
{
"firstName": "Irma",
"lastName": "Durham"
}
]

Ejemplo 4

Ejemplo con el tipo relatedEntity con una forma simple:

var $employeesCollection : Collection
$employeesCollection:=New collection
$employeesCollection:=$employees.toCollection("firstName,lastName,employer")

Ejemplo con el tipo relatedEntity con una forma simple:

[
{
"firstName": "Gregg",
"lastName": "Wahl",
"employer": {
"__KEY": 20
}
},
{
"firstName": "Irma",
"lastName": "Durham",
"employer": {
"__KEY": 20
}
},
{
"firstName": "Lorena",
"lastName": "Boothe",
"employer": {
"__KEY": 20
}
}
]

Ejemplo 5

Ejemplo con el parámetro filterCol:

var $employeesCollection; $coll : Collection
$employeesCollection:=New collection
$coll:=New collection("firstName";"lastName")
$employeesCollection:=$employees.toCollection($coll)

Ejemplo con el tipo relatedEntity con una forma simple:

[
{
"firstName": "Joanna",
"lastName": "Cabrera"
},
{
"firstName": "Alexandra",
"lastName": "Coleman"
}
]

Ejemplo 6

Devuelve:

var $employeesCollection; $coll : Collection
$employeesCollection:=New collection
$coll:=New collection
$coll.push("firstName")
$coll.push("lastName")
$coll.push("employer.*")
$employeesCollection:=$employees.toCollection($coll)

Ejemplo con el tipo relatedEntity con una forma simple:

[
{
"firstName": "Gregg",
"lastName": "Wahl",
"employer": {
"ID": 20,
"name": "India Astral Secretary",
"creationDate": "1984-08-25T00:00:00.000Z",
"revenues": 12000000,
"extra": null
}
},
{
"firstName": "Irma",
"lastName": "Durham",
"employer": {
"ID": 20,
"name": "India Astral Secretary",
"creationDate": "1984-08-25T00:00:00.000Z",
"revenues": 12000000,
"extra": null
}
},
{
"firstName": "Lorena",
"lastName": "Boothe",
"employer": {
"ID": 20,
"name": "India Astral Secretary",
"creationDate": "1984-08-25T00:00:00.000Z",
"revenues": 12000000,
"extra": null
}
}
]

Ejemplo 7

Devuelve:

var $employeesCollection : Collection
$employeesCollection:=New collection
$employeesCollection:=$employees.toCollection("firstName, lastName, employer.name")
[
{
"firstName": "Gregg",
"lastName": "Wahl",

"employer": {
"name": "India Astral Secretary"
}
},
{
"firstName": "Irma",
"lastName": "Durham",
"employer": {
"name": "India Astral Secretary"
}
},
{
"firstName": "Lorena",
"lastName": "Boothe",
"employer": {
"name": "India Astral Secretary"
}
}]

Ejemplo 8

Ejemplo con la extracción de algunas las propiedades de relatedEntities:

 var $employeesCollection : Collection
$employeesCollection:=New collection
$employeesCollection:=$employees.toCollection("firstName, lastName, directReports.firstName")

Ejemplo con el tipo relatedEntity con una forma simple:

[
{
"firstName": "Gregg",
"lastName": "Wahl",
"directReports": []
},
{
"firstName": "Mike",
"lastName": "Phan",
"directReports": [
{
"firstName": "Gary"
},
{
"firstName": "Sadie"
},
{
"firstName": "Christie"
}
]
},
{
"firstName": "Gary",

"lastName": "Reichert",
"directReports": [
{
"firstName": "Rex"
},
{
"firstName": "Jenny"
},
{
"firstName": "Lowell"
}
]
}]

Ejemplo 9

Ejemplo con la extracción de todas las propiedades de relatedEntities:

var $employeesCollection : Collection
$employeesCollection:=New collection
$employeesCollection:=$employees.toCollection("firstName, lastName, directReports.*")

[
{
"firstName": "Gregg",
"lastName": "Wahl",
"directReports": []
},
{
"firstName": "Mike",
"lastName": "Phan",
"directReports": [
{
"ID": 425,
"firstName": "Gary",
"lastName": "Reichert",
"salary": 65800,
"birthDate": "1957-12-23T00:00:00.000Z",
"woman": false,
"managerID": 424,
"employerID": 21,
"photo": "[object Picture]",
"extra": null,
"employer": {
"__KEY": 21
},
"manager": {
"__KEY": 424
}
},
{
"ID": 426,
"firstName": "Sadie",
"lastName": "Gallant",
"salary": 35200,
"birthDate": "2022-01-03T00:00:00.000Z",
"woman": true,
"managerID": 424,
"employerID": 21,
"photo": "[object Picture]",
"extra": null,
"employer": {
"__KEY": 21
},
"manager": {
"__KEY": 424
}
}
]
},
{
"firstName": "Gary",
"lastName": "Reichert",
"directReports": [
{
"ID": 428,
"firstName": "Rex",
"lastName": "Chance",
"salary": 71600,
"birthDate": "1968-08-09T00:00:00.000Z",
"woman": false,

"managerID": 425,
"employerID": 21,
"photo": "[object Picture]",
"extra": null,
"employer": {
"__KEY": 21
},
"manager": {
"__KEY": 425
}
},
{
"ID": 429,
"firstName": "Jenny",
"lastName": "Parks",
"salary": 51300,
"birthDate": "1984-05-25T00:00:00.000Z",
"woman": true,
"managerID": 425,
"employerID": 21,
"photo": "[object Picture]",
"extra": null,
"employer": {
"__KEY": 21
},
"manager": {
"__KEY": 425
}
}
]
}
]