DataClass
Una DataClass ofrece un objeto de interfaz a una tabla de la base de datos. Todas las dataclasses de una aplicación 4D están disponibles como propiedad del datastore ds
.
Resumen
.attributeName : object |
.all ( { settings : Object } ) : 4D.EntitySelection consulta el datastore para encontrar todas las entidades relacionadas con la dataclass y las devuelve como una selección de entidades |
.clearRemoteCache() vacía la caché ORDA de una dataclass |
.fromCollection( objectCol : Collection { ; settings : Object } ) : 4D.EntitySelection actualiza o crea entidades en la clase de datos según la colección de objetos objectCol, y devuelve la selección de entidades correspondiente |
.get( primaryKey : Integer { ; settings : Object } ) : 4D.Entity .get( primaryKey : Text { ; settings : Object } ) : 4D.Entity consulta la clase de datos para recuperar la entidad que coincide con el parámetro primaryKey |
.getCount() : Integer devuelve el número de entidades de una clase de datos |
.getDataStore() : cs.DataStore |
.getInfo() : Object devuelve un objeto que suministra información sobre la clase de datos |
.getRemoteCache() : Object devuelve un objeto que contiene el contenido de la caché ORDA para una clase de datos |
.new() : 4D.Entity crea en memoria y devuelve una nueva entidad en blanco relacionada con la Dataclass |
.newSelection( { keepOrder : Integer } ) : 4D.EntitySelection |
.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) |
.setRemoteCacheSettings(settings : Object) define el tiempo de espera y el tamaño máximo de la caché ORDA para una dataclass. |
.attributeName
Historia
Lanzamiento | Modificaciones |
---|---|
19 R3 | Añadido el atributo .exposed |
17 | Añadidos |
.attributeName : object
Descripción
Los atributos de las clases de datos sonobjetos que están disponibles directamente como propiedades de estas clases.
Los objetos devueltos tienen propiedades que puede leer para obtener información sobre los atributos de su clase de datos.
Los objetos del atributo Dataclass pueden ser modificados, pero la estructura subyacente de la base de datos no será alterada.
Objeto devuelto
Los objetos de atributo devueltos contienen las siguientes propiedades:
Propiedad | Tipo | Descripción |
---|---|---|
autoFilled | Boolean | True si el valor del atributo es rellenado automáticamente por 4D. Corresponde a las siguientes propiedades de campo 4D: "Autoincremento" para campos de tipo numérico y "Auto UUID" para campos UUID (alfa). No se devuelve si .kind = "relatedEntity" o "relatedEntities". |
exposed | Boolean | True si el atributo está expuesto en REST |
fieldNumber | integer | Número de campo 4D interno del atributo. No se devuelve si .kind = "relatedEntity" o "relatedEntities". |
fieldType | Integer | Tipo de campo de base de datos 4D del atributo. Depende del atributo kind . Valores posibles: .kind = "storage": tipo de campo 4D correspondiente, ver Value type .kind = "relatedEntity": 38 (is object ).kind = "relatedEntities": 42 (is collection ).kind = "calculated" o "alias" = igual que arriba, dependiendo del valor resultante (tipo de campo, relatedEntity o relatedEntities) |
indexed | Boolean | True si hay un índice B-tree o Cluster B-tree en el atributo. No se devuelve si .kind = "relatedEntity" o "relatedEntities". |
inverseName | Text | Nombre del atributo que se encuentra al otro lado de la relación. Sólo se devuelve cuando .kind = "relatedEntity" o "relatedEntities". |
keywordIndexed | Boolean | True si existe un índice de palabras clave en el atributo. No se devuelve si .kind = "relatedEntity" o "relatedEntities". |
kind | Text | Categoría del atributo. Valores posibles:función get |
mandatory | Boolean | True si se rechaza la entrada de valores null para el atributo. No se devuelve si .kind = "relatedEntity" o "relatedEntities". Nota: esta propiedad corresponde a la propiedad de campo "Rechazar entrada de valor NULL" a nivel de base de datos 4D. No tiene relación con la propiedad "Obligatorio" existente, que es una opción de control de entrada de datos para una tabla. |
name | Text | Nombre del atributo como cadena |
path | Text | Ruta de un atributo alias basada en una relación |
readOnly | Boolean | True si el atributo es de sólo lectura. Por ejemplo, los atributos calculados sin la función set son de solo lectura. |
relatedDataClass | Text | Nombre del dataclass relacionado con el atributo. Sólo se devuelve cuando .kind = "relatedEntity" o "relatedEntities". |
type | Text | Tipo de valor conceptual del atributo, útil para la programación genérica. Depende del atributo kind . Valores posibles: .kind = "storage": "blob", "bool", "date", "image", "number", "object" o "string". "number" se devuelve para todo tipo numérico, incluyendo duración; "string" se devuelve para los tipos de atributos uuid, alfa y texto; los atributos "blob" son objetos blob..kind = "relatedEntity": nombre de la clase de datos relacionada.kind = "relatedEntities": nombre de la clase de datos relacionada + sufijo "Selection".kind = "calculated" o "alias": igual que en los casos anteriores, dependiendo del resultado |
unique | Boolean | True si el valor del atributo debe ser único. No se devuelve si .kind = "relatedEntity" o "relatedEntities". |
Para programación genérica, utilice Bool(attributeName.property)
, Num(attributeName.property)
o String(attributeName.property)
(dependiendo del tipo de propiedad) para obtener un valor válido incluso si la propiedad no se devuelve.
Ejemplo 1
$salary:=ds.Employee.salary //devuelve el atributo salary en la clase de datos Employee
$compCity:=ds.Company["city"] //devuelve el atributo city en la clase de datos Company
Ejemplo 2
Considerando la siguiente estructura de la base:
var $firstnameAtt;$employerAtt;$employeesAtt : Object
$firstnameAtt:=ds.Employee.firstname
//{name:firstname,kind:storage,fieldType:0,type:string,fieldNumber:2,indexed:true,
//keyWordIndexed:false,autoFilled:false,mandatory:false,unique:false}
$employerAtt:=ds.Employee.employer
//{name:employer,kind:relatedEntity,relatedDataClass:Company,
//fieldType:38,type:Company,inverseName:employees}
//38=Is object
$employeesAtt:=ds.Company.employees
//{name:employees,kind:relatedEntities,relatedDataClass:Employee,
//fieldType:42,type:EmployeeSelection,inverseName:employer}
//42=Is collection
Ejemplo 3
Considerando las propiedades de tabla siguientes:
var $sequenceNumberAtt : Object
$sequenceNumberAtt=ds.Employee.sequenceNumber
//{name:sequenceNumber,kind:storage,fieldType:0,type:string,fieldNumber:13,
//indexed:true,keyWordIndexed:false,autoFilled:true,mandatory:false,unique:true}
.all()
Historia
Lanzamiento | Modificaciones |
---|---|
17 R5 | Soporte del parámetro settings |
17 | Añadidos |
.all ( { settings : Object } ) : 4D.EntitySelection
Parámetros | Tipo | Descripción | |
---|---|---|---|
settings | Object | -> | Opciones de construcción: context |
Result | 4D.EntitySelection | <- | Referencias sobre todas las entidades relacionadas con la clase de datos |
Descripción
La función .all()
consulta el datastore para encontrar todas las entidades relacionadas con la dataclass y las devuelve como una selección de entidades.
Las entidades se devuelven en el orden por defecto, que es inicialmente el orden en que fueron creadas. Tenga en cuenta, sin embargo, que si se han eliminado entidades y se han añadido otras nuevas, el orden por defecto ya no refleja el orden de creación.
Si no se encuentra la entidad correspondiente, se devuelve una selección de entidades vacía.
Se aplica carga diferida.
settings
En el parámetro opcional settings se puede pasar un objeto que contenga opciones adicionales. Se soporta la siguiente propiedad:
Propiedad | Tipo | Descripción |
---|---|---|
context | Text | Etiqueta para el contexto de optimización aplicado a la selección de entidades. Este contexto será utilizado por el código que maneja la selección de entidades para que pueda beneficiarse de la optimización. Esta funcionalidad está diseñada para el procesamiento cliente/servidor ORDA. |
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ónds.myClass.all().length
.
Ejemplo
var $allEmp : cs.EmployeeSelection
$allEmp:=ds.Employee.all()
.clearRemoteCache()
Historia
Lanzamiento | Modificaciones |
---|---|
19 R5 | Añadidos |
.clearRemoteCache()
Parámetros | Tipo | Descripción | |
---|---|---|---|
No requiere ningún parámetro |
Descripción
La función .clearRemoteCache()
vacía la caché ORDA de una dataclass.
Esta función no reinicializa los valores
timeout
ymaxEntries
.
Ejemplo
var $ds : 4D.DataStoreImplementation
var $persons : cs.PersonsSelection
var $p : cs.PersonsEntity
var $cache : Object
var $info : Collection
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
$cache:=$ds.Persons.getRemoteCache()
$ds.Persons.clearRemoteCache()
// Caché de la dataclass Persons = {timeout:30;maxEntries:30000;stamp:255;entries:[]}
Ver también
.fromCollection()
Historia
Lanzamiento | Modificaciones |
---|---|
17 R5 | Soporte del parámetro settings |
17 | Añadidos |
.fromCollection( objectCol : Collection { ; settings : Object } ) : 4D.EntitySelection
Parámetros | Tipo | Descripción | |
---|---|---|---|
objectCol | Collection | -> | Colección de objetos a mapear con entidades |
settings | Object | -> | Opciones de construcción: context |
Result | 4D.EntitySelection | <- | Selección de entidades llenadas de la colección |
Descripción
La función .fromCollection()
actualiza o crea entidades en la clase de datos según la colección de objetos objectCol, y devuelve la selección de entidades correspondiente.
En el parámetro objectCol, pasa una colección de objetos para crear nuevas entidades o actualizar las existentes de la dataclass. Los nombres de las propiedades deben ser los mismos que los de los atributos de la clase de datos. Si un nombre de propiedad no existe en la clase de datos, se ignora. Si un valor de atributo no está definido en la colección, su valor es null.
El mapeo entre los objetos de la colección y las entidades se realiza sobre los nombres de atributos y sus tipos de datos. Si la propiedad de un objeto tiene el mismo nombre que el atributo de una entidad pero sus tipos no coinciden, el atributo de la entidad no se llena.
Crear o actualizar modo
Para cada objeto de objectCol:
- Si el objeto contiene una propiedad booleana "__NEW" establecida en false (o no contiene una propiedad booleana "__NEW"), la entidad se actualiza o se crea con los valores correspondientes de las propiedades del objeto. No se realiza ninguna comprobación con respecto a la llave primaria:
- Si la llave primaria se da y existe, la entidad se actualiza. En este caso, la llave primaria puede darse tal cual o con una propiedad "__KEY" (llenada con el valor de la llave primaria).
- If the primary key is given (as is) and does not exist, the entity is created
- 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 estándar de la base de datos.
- Si el objeto contiene una propiedad booleana "__NEW" definida como true, la entidad se crea con los valores correspondientes de los atributos del objeto. Se realiza una verificación con respecto a la llave primaria:
- Si se da la llave primaria (tal cual) y existe, se envía un error
- If the primary key is given (as is) and does not exist, the entity is created
- Si no se da la primaria, se crea la entidad y se asigna el valor de la llave primaria con respecto a las reglas estándar de la base de datos.
La propiedad "__KEY" que contiene un valor sólo se tiene en cuenta cuando la propiedad "__NEW" tiene el valor false (o se omite) y existe una entidad correspondiente. The use of a __KEY property allows independence from the primary key attribute name.
Entidades relacionadas
Los objetos de objectCol pueden contener uno o más objetos anidados que presentan una o más entidades relacionadas, lo que puede ser útil para crear o actualizar enlaces entre entidades.
Los objetos anidados que presentan entidades relacionadas deben contener una propiedad "_*KEY" (llenada con el valor de la llave primaria de la entidad relacionada) o el atributo de llave primaria de la propia entidad relacionada. El uso de una propiedad *_KEY permite la independencia del nombre del atributo de la llave primaria.
El contenido de las entidades relacionadas no puede ser creado / actualizado a través de este mecanismo.
Stamp
Si se da un atributo __STAMP, se realiza una comprobación con el sello en el almacén de datos y se puede devolver un error ("El sello dado no coincide con el actual para el registro# XX de la tabla XXXX"). Para obtener más información, consulte Bloqueo de entidades.
settings
En el parámetro opcional settings se puede pasar un objeto que contenga opciones adicionales. Se soporta la siguiente propiedad:
Propiedad | Tipo | Descripción |
---|---|---|
context | Text | Etiqueta para el contexto de optimización aplicado a la selección de entidades. Este contexto será utilizado por el código que maneja la selección de entidades para que pueda beneficiarse de la optimización. Esta funcionalidad está diseñada para el procesamiento cliente/servidor ORDA. |
Ejemplo 1
Queremos actualizar una entidad existente. La propiedad __NEW no se da, la llave primaria del empleado se da y existe:
var $empsCollection : Collection
var $emp : Object
var $employees : cs.EmployeeSelection
$empsCollection:=New collection
$emp:=New object
$emp.ID:=668 //Existing PK in Employee table
$emp.firstName:="Arthur"
$emp.lastName:="Martin"
$emp.employer:=New object("ID";121) //PK existente en la dataClass relacionada Company
// Para este empleado, podemos cambiar la Empresa utilizando otro PK existente en la clase de datos relacionada Company
$empsCollection.push($emp)
$employees:=ds.Employee.fromCollection($empsCollection)
Ejemplo 2
Queremos actualizar una entidad existente. La propiedad _*NEW no se da, la llave primaria del empleado está con el atributo *_KEY y existe:
var $empsCollection : Collection
var $emp : Object
var $employees : cs.EmployeeSelection
$empsCollection:=New collection
$emp:=New object
$emp.__KEY:=1720 //PK existente en la tabla Employee
$emp.firstName:="John"
$emp.lastName:="Boorman"
$emp.employer:=New object("ID";121) // PK existente en la dataClass relacionada Company
// Para este empleado, podemos cambiar la Empresa utilizando otro PK existente en la dataClass relacionada Company
$empsCollection.push($emp)
$employees:=ds.Employee.fromCollection($empsCollection)
Ejemplo 3
Queremos crear simplemente una nueva entidad a partir de una colección:
var $empsCollection : Collection
var $emp : Object
var $employees : cs.EmployeeSelection
$empsCollection:=New collection
$emp:=New object
$emp.firstName:="Victor"
$emp.lastName:="Hugo"
$empsCollection.push($emp)
$employees:=ds.Employee.fromCollection($empsCollection)
Ejemplo 4
Queremos crear una entidad. La propiedad __NEW es True, la llave primaria del empleado no se da:
var $empsCollection : Collection
var $emp : Object
var $employees : cs.EmployeeSelection
$empsCollection:=New collection
$emp:=New object
$emp.firstName:="Mary"
$emp.lastName:="Smith"
$emp.employer:=New object("__KEY";121) //PK existente en la dataClass Company
$emp.__NEW:=True
$empsCollection.push($emp)
$employees:=ds.Employee.fromCollection($empsCollection)
Ejemplo 5
Queremos crear una entidad. La propiedad __NEW se omite, la llave primaria del empleado se da y no existe:
var $empsCollection : Collection
var $emp : Object
var $employees : cs.EmployeeSelection
$empsCollection:=New collection
$emp:=New object
$emp.ID:=10000 //Llave primaria inexistente
$emp.firstName:="Françoise"
$emp.lastName:="Sagan"
$empsCollection.push($emp)
$employees:=ds.Employee.fromCollection($empsCollection)
Ejemplo 6
En este ejemplo, la primera entidad se creará y guardará pero la segunda fallará ya que ambas utilizan la misma llave primaria:
var $empsCollection : Collection
var $emp; $emp2 : Object
var $employees : cs.EmployeeSelection
$empsCollection:=New collection
$emp:=New object
$emp.ID:=10001 // Llave primaria inexistente
$emp.firstName:="Simone"
$emp.lastName:="Martin"
$emp.__NEW:=True
$empsCollection.push($emp)
$emp2:=New object
$emp2.ID:=10001 // La misma llave primaria, ya existente
$emp2.firstName:="Marc"
$emp2.lastName:="Smith"
$emp2.__NEW:=True
$empsCollection.push($emp2)
$employees:=ds.Employee.fromCollection($empsCollection)
//se crea la primera entidad
//error de llave duplicada para la segunda entidad
Ver también
.get()
Historia
Lanzamiento | Modificaciones |
---|---|
17 | Añadidos |
.get( primaryKey : Integer { ; settings : Object } ) : 4D.Entity
.get( primaryKey : Text { ; settings : Object } ) : 4D.Entity
Parámetros | Tipo | Descripción | |
---|---|---|---|
primaryKey | Integer OR Text | -> | Valor de la llave primaria de la entidad a recuperar |
settings | Object | -> | Opciones de construcción: context |
Result | 4D.Entity | <- | Entidad que coincide con la llave primaria designada |
Descripción
La función .get()
consulta la clase de datos para recuperar la entidad que coincide con el parámetro primaryKey.
En primaryKey, pase el valor de la llave primaria de la entidad a recuperar. El tipo de valor debe coincidir con el tipo de la llave primaria definida en el almacén de datos (Entero o Texto). El tipo de valor debe coincidir con el tipo de la llave primaria definida en el almacén de datos (Entero o Texto).
Si no se encuentra ninguna entidad con primaryKey, se devuelve una entidad Null.
Se aplica la carga diferida, lo que significa que los datos relacionados se cargan desde el disco sólo cuando son necesarios.
settings
En el parámetro opcional settings se puede pasar un objeto que contenga opciones adicionales. Se soporta la siguiente propiedad:
Propiedad | Tipo | Descripción |
---|---|---|
context | Text | Etiqueta para el contexto de optimización automática aplicado a la entidad. Este contexto será utilizado por el código siguiente que carga la entidad para que pueda beneficiarse de la optimización. Esta funcionalidad está diseñada para el procesamiento cliente/servidor ORDA. |
Cuando se llama a la función .get()
sin parámetro settings, se envía directamente al servidor una petición de valores de atributos (la caché ORDA no se utiliza). Por otro parte, cuando se llama a la función .get()
con un context
pasado en el parámetro settings, los valores de los atributos se recuperan de la caché ORDA correspondiente al contexto. En este caso, puede ser aconsejable llamar a reload()
para asegurarse de recuperar los datos más recientes del servidor.
Ejemplo 1
var $entity : cs.EmployeeEntity
var $entity2 : cs.InvoiceEntity
$entity:=ds.Employee.get(167) // devuelve la entidad cuyo valor de llave primaria es 167
$entity2:=ds.Invoice.get("DGGX20030") // devuelve la entidad cuyo valor de llave primaria es "DGGX20030"
Ejemplo 2
Este ejemplo ilustra el uso de la propiedad context:
var $e1; $e2; $e3; $e4 : cs.EmployeeEntity
var $settings; $settings2 : Object
$settings:=New object("context";"detail")
$settings2:=New object("context";"summary")
$e1:=ds.Employee.get(1;$settings)
completeAllData($e1) // En el método completeAllData, se lanza una optimización y se asocia al contexto "detail"
$e2:=ds.Employee.get(2;$settings)
completeAllData($e2) // En el método completeAllData, se aplica la optimización asociada al contexto "detail"
$e3:=ds.Employee.get(3;$settings2)
completeSummary($e3) //En el método completeSummary, se lanza una optimización y se asocia al contexto "summary"
$e4:=ds.Employee.get(4;$settings2)
completeSummary($e4) //En el método completeSummary se aplica la optimización asociada al contexto "summary"
.getCount()
Historia
Lanzamiento | Modificaciones |
---|---|
19 R5 | Añadidos |
.getCount() : Integer
Parámetros | Tipo | Descripción | |
---|---|---|---|
resultado | Integer | <- | Número de entidades en la dataclass |
Descripción
La función .getCount()
devuelve el número de entidades de una clase de datos.
Si se utiliza esta función dentro de una transacción, se tendrán en cuenta las entidades creadas durante la misma.
Ejemplo
var $ds : 4D.DataStoreImplementation
var $number : Integer
$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
$number:=$ds.Persons.getCount()
.getDataStore()
Historia
Lanzamiento | Modificaciones |
---|---|
17 R5 | Añadidos |
.getDataStore() : cs.DataStore
Parámetros | Tipo | Descripción | |
---|---|---|---|
Result | cs.DataStore | <- | Datastore de la dataclass |
Descripción
La función .getDataStore()
devuelve el datastore para la clase de datos especificada.
El almacén de datos puede ser:
- el datastore principal, devuelto por el comando
ds
. - un datastore remoto, abierto utilizando el comando
Open datastore
.
Ejemplo
El método proyecto SearchDuplicate busca valores duplicados en cualquier clase de datos.
var $pet : cs.CatsEntity
$pet:=ds.Cats.all().first() //obtener una entidad
SearchDuplicate($pet;"Dogs")
// método SearchDuplicate
// SearchDuplicate(entity_to_search;dataclass_name)
#DECLARE ($pet : Object ; $dataClassName : Text)
var $dataStore; $duplicates : Object
$dataStore:=$pet.getDataClass().getDataStore()
$duplicates:=$dataStore[$dataClassName].query("name=:1";$pet.name)
.getInfo()
Historia
Lanzamiento | Modificaciones |
---|---|
19 R3 | Se ha añadido la propiedad exposed |
17 R5 | Añadidos |
.getInfo() : Object
Parámetros | Tipo | Descripción | |
---|---|---|---|
Result | Object | <- | Información sobre la clase de datos |
Descripción
La función .getInfo()
devuelve un objeto que suministra información sobre la clase de datos. Esta función es útil para configurar el código genérico.
Objeto devuelto
Propiedad | Tipo | Descripción |
---|---|---|
exposed | Boolean | True si la dataclass está expuesta en REST |
name | Text | Nombre de la dataclass |
primaryKey | Text | Nombre de la llave primaria de la clase de datos |
tableNumber | Integer | Número de la tabla 4D interna |
Ejemplo 1
#DECLARE ($entity : Object)
var $status : Object
computeEmployeeNumber($entity) //realizar algunas acciones en la entidad
$status:=$entity.save()
if($status.success)
ALERT("Record updated in table "+$entity.getDataClass().getInfo().name)
End if
Ejemplo 2
var $settings : Object
var $es : cs.ClientsSelection
$settings:=New object
$settings.parameters:=New object("receivedIds";getIds())
$settings.attributes:=New object("pk";ds.Clients.getInfo().primaryKey)
$es:=ds.Clients.query(":pk in :receivedIds";$settings)
Ejemplo 3
var $pk : Text
var $dataClassAttribute : Object
$pk:=ds.Employee.getInfo().primaryKey
$dataClassAttribute:=ds.Employee[$pk] // Si es necesario, el atributo que coincide con la llave primaria es accesible
.getRemoteCache()
Historia
Lanzamiento | Modificaciones |
---|---|
19 R5 | Añadidos |
.getRemoteCache() : Object
Parámetros | Tipo | Descripción | |
---|---|---|---|
resultado | Object | <- | Objeto que describe el contenido de la caché ORDA para la clase de datos. |
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 .getRemoteCache()
devuelve un objeto que contiene el contenido de la caché ORDA para una clase de datos.
Llamar a esta función desde una aplicación monopuesto de 4D devuelve Null
.
El objeto devuelto tiene las siguientes propiedades:
Propiedad | Tipo | Descripción |
---|---|---|
maxEntries | Integer | Número máximo de colecciones "entries". |
stamp | Integer | Marcador de la caché. |
timeout | Integer | Tiempo restante antes de que las nuevas entradas de la caché se marquen como vencidas. |
entries | Collection | Contiene un objeto de entrada para cada entidad en la caché. |
Cada objeto entrada de la colección entries
contiene las siguientes propiedades:
Propiedad | Tipo | Descripción |
---|---|---|
data | Object | Objeto que contiene los datos de la entrada. |
expired | Boolean | True si la entrada ha expirado. |
key | Text | Llave primaria de la entidad. |
El objeto data
de cada entrada contiene las siguientes propiedades:
Propiedad | Tipo | Descripción |
---|---|---|
__KEY | Text | Llave primaria de la entidad |
__STAMP | Integer | Stamp de la entidad en la base de datos |
__TIMESTAMP | Text | Timestamp de la entidad en la base de datos (el formato es YYYY-MM-DDTHH:MM:SS:ms:Z) |
dataClassAttributeName | Variant | Si hay datos en la caché para un atributo de dataclass, se devuelven en una propiedad con el mismo tipo que en la base de datos. |
Los datos relativos a las entidades relacionadas se almacenan en la caché del objeto de datos.
Ejemplo
En el siguiente ejemplo, $ds.Persons.all()
carga la primera entidad con todos sus atributos. A continuación, se activa el optimizado de la solicitud, de modo que sólo se cargan firstname
y address.city
.
Tenga en cuenta que address.city
se carga en la caché de la dataclass Persons
.
Sólo se almacena en la caché la primera entidad de la dataclass Address
. Se carga durante la primera iteración del bucle.
var $ds : 4D.DataStoreImplementation
var $persons : cs.PersonsSelection
var $p : cs.PersonsEntity
var $cachePersons; $cacheAddress : Object
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
$cachePersons:=$ds.Persons.getRemoteCache()
$cacheAddress:=$ds.Adress.getRemoteCache()
Ver también
.setRemoteCacheSettings()
.clearRemoteCache()
.new()
Historia
Lanzamiento | Modificaciones |
---|---|
17 | Añadidos |
.new() : 4D.Entity
Parámetros | Tipo | Descripción | |
---|---|---|---|
Result | 4D.Entity | <- | Nueva entidad que coincide con la clase de datos |
Descripción
La función .new()
crea en memoria y devuelve una nueva entidad en blanco relacionada con la Dataclass.
El objeto entidad se crea en memoria y no se guarda en la base de datos hasta que se llama a la función .save( )
. Si la entidad se borra antes de ser guardada, no se puede recuperar.
4D Server: en cliente-servidor, si la llave primaria de la tabla correspondiente se autoincrementa, se calculará cuando la entidad se guarde en el servidor.
Todos los atributos de la entidad se inicializan con el valor null.
Los atributos se pueden inicializar con valores por defecto si se selecciona la opción Traducir los NULL a valores vacíos al nivel de la estructura de la base 4D.
Ejemplo
Este ejemplo crea una nueva entidad en la clase de datos "Log" y registra la información en el atributo "info":
var $entity : cs.LogEntity
$entity:=ds.Log.new() //crea una referencia
$entity.info:="New entry" //almacenar alguna información
$entity.save() //guardar la entidad
.newSelection()
Historia
Lanzamiento | Modificaciones |
---|---|
17 | Añadidos |
.newSelection( { keepOrder : Integer } ) : 4D.EntitySelection
Parámetros | Tipo | Descripción | |
---|---|---|---|
keepOrder | Integer | -> | dk keep ordered : crea una entity selection ordenada,dk non ordered : crea una entity selection no ordenada (por defecto si se omite) |
Result | 4D.EntitySelection | <- | Nueva selección de entidades en blanco relacionadas con la clase de datos |
Descripción
La función .newSelection()
crea una nueva selección de entidades en blanco, no compartible, relacionada con la clase de datos, en memoria.
Para obtener información sobre las selecciones de entidades no compartibles, consulte esta sección.
Si desea crear una selección de entidades ordenada, pase el selector dk keep ordered
en el parámetro keepOrder. Por defecto, si se omite este parámetro, o si se pasa el selector dk non ordered
, el método crea una selección de entidades no ordenada. Las selecciones de entidades desordenadas son más rápidas pero no se puede confiar en las posiciones de las entidades. Las selecciones de entidades desordenadas son más rápidas pero no se puede confiar en las posiciones de las entidades.
Cuando se crea, la selección de entidades no contiene ninguna entidad (mySelection.length
devuelve 0). Este método permite construir gradualmente selecciones de entidades haciendo llamadas posteriores a la función add()
.
Ejemplo
var $USelection; $OSelection : cs.EmployeeSelection
$USelection:=ds.Employee.newSelection() //crea una selección de entidades vacía y desordenada
$OSelection:=ds.Employee.newSelection(dk keep ordered) //crea una selección de entidades vacía y ordenada
.query()
Historia
Lanzamiento | Modificaciones |
---|---|
17 R6 | Soporte de los parámetros Formula |
17 R5 | Soporte de los marcadores para los valores |
17 | Añadidos |
.query( queryString : Text { ; ...value : any } { ; querySettings : Object } ) : 4D.EntitySelection
.query( formula : Object { ; querySettings : Object } ) : 4D.EntitySelection
Parámetros | Tipo | Descripción | |
---|---|---|---|
queryString | Text | -> | Criterios de búsqueda como cadena |
formula | Object | -> | Criterios de búsqueda como objeto fórmula |
value | any | -> | Valor(es) a utilizar para los marcadores de posición indexados |
querySettings | Object | -> | Opciones de búsqueda: parameters, attributes, args, allowFormulas, context, queryPath, queryPlan |
Result | 4D.EntitySelection | <- | Nueva selección de entidades formada por las entidades de la clase de datos 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), para todas las entidades de la dataclass, y devuelve un nuevo objeto de tipo EntitySelection
que contiene todas las entidades encontradas. Se aplica carga diferida.
Si no se encuentran entidades coincidentes, se devuelve una EntitySelection
vacía.
parámetro queryString
Ejemplo 1
attributePath|formula comparator value
{logicalOperator attributePath|formula comparator value}
{order by attributePath {desc | asc}}
donde:
- attributePath: ruta del atributo sobre el que se quiere ejecutar la búsqueda. Este parámetro puede ser un nombre simple (por ejemplo, "país") o cualquier ruta de atributo válida (por ejemplo, "país.nombre".) En el caso de una ruta de atributo cuyo tipo es
Collection
, se utiliza la notación[]
para manejar todas las ocurrencias (por ejemplochildren[].age
).
*No puede utilizar directamente atributos cuyo nombre contenga caracteres especiales como ".", "[ ]", o "=", ">", "#"..., porque se evaluarán incorrectamente en la cadena de consulta. Si necesita consultar dichos atributos, debe considerar el uso de marcadores, que permiten un rango ampliado de caracteres en las rutas de los atributos (ver Uso de marcadores de posición a continuación)
-
formula: una fórmula válida pasada como
Text
uObject
. La fórmula se evaluará para cada entidad procesada y debe devolver un valor booleano. Dentro de la fórmula, la entidad está disponible a través del objetoThis
.- Text: la cadena de fórmulas debe ir precedida de la declaración
eval()
, para que el analizador de consultas evalúe la expresión correctamente. Por ejemplo: "eval(length(This.lastname) >=30) " - Objeto: el objeto fórmula se pasa como placeholder (ver más abajo). La fórmula debe haber sido creada utilizando el comando
Formula
oFormula from string
.
- Text: la cadena de fórmulas debe ir precedida de la declaración
- Tenga en cuenta que las fórmulas 4D sólo admiten los símbolos
&
y|
como operadores lógicos.- Si la fórmula no es el único criterio de búsqueda, el optimizador del motor de búsquedas podría procesar previamente otros criterios (por ejemplo, los atributos indexados) y, por tanto, la fórmula podría evaluarse sólo para un subconjunto de entidades.
Las fórmulas en las consultas pueden recibir parámetros a través de $1. Este punto se detalla en el párrafo Parámetro fórmula más abajo.
- También puede pasar directamente un objeto parámetro
formula
en lugar del parámetroqueryString
(recomendado cuando las fórmulas son más complejas). Vea el párrafo Parámetros fórmula abajo.- Por razones de seguridad, las llamadas a fórmulas dentro de las funciones
query()
pueden ser desestimadas. Ver la descripción del parámetroquerySettings
.
- comparator: símbolo que compara attributePath y value. Se soportan los siguientes símbolos:
Comparación | Símbolo(s) | Comentario |
---|---|---|
Igual a | =, == | Obtiene los datos coincidentes, admite el comodín (@), no distingue entre mayúsculas de minúsculas ni diacríticas. |
===, IS | Obtiene los datos coincidentes, considera @ como carácter estándar, no distingue entre mayúsculas de minúsculas ni diacríticas | |
Diferente de | #, != | Soporta el comodín (@). Equivale a "Condición no aplicada en una sentencia" (ver más abajo). |
!==, IS NOT | Considera la @ como un caracter estándar | |
Condición No aplicada a una sentencia | NOT | Los paréntesis son obligatorios cuando se utiliza NOT antes de una instrucción que contiene varios operadores. Equivalente a "Not equal to" (ver abajo). |
Menor que | < | |
Mayor que | > | |
Menor o igual que | <= | |
Mayor o igual que | > = | |
Incluído en | IN | Devuelve los datos iguales a al menos uno de los valores de una colección o de un conjunto de valores, admite el comodín (@) |
Contiene palabra clave | % | Las palabras claves pueden utilizarse en atributos de tipo texto o imagen |
- value: el valor a comparar con el valor actual de la propiedad de cada entidad en la selección de entidades. Puede ser un marcador de posición (ver Uso de marcadores de posición más adelante) o cualquier expresión que coincida con la propiedad de tipo de datos. Por ejemplo, si se introduce la cadena "v20" como value para comparar con un atributo entero, se convertirá a 20. For example, if the string "v20" is entered as value to compare with an integer attribute, it will be converted to 20.
Tenga en cuenta que, en caso de no coincidencia de tipo con tipos escalares (texto, fecha, número...), 4D intentará convertir el tipo value al tipo de datos del atributo siempre que sea posible, para un manejo más fácil de los valores procedentes de Internet.
- La constante de tipo texto puede pasarse con o sin comillas simples (ver Uso de comillas más abajo). Para consultar una cadena dentro de otra cadena (una consulta de tipo "contiene"), utilice el símbolo de comodín (@) en el valor para aislar la cadena a buscar como se muestra en este ejemplo: "@Smith@". Las siguientes palabras claves están prohibidas para las constantes de texto: true, false.
- Valores constantes de tipo booleano: true o false (Sensible a las mayúsculas y minúsculas).
- Valores constantes de tipo numérico: los decimales se separan con un '.' (punto).
- Constantes de tipo date: formato "YYYY-MM-DD"
- Constantes null: utilizando la palabra clave "null" se encontrarán las propiedades null y undefined.
- en el caso de una búsqueda con un comparador IN, value debe ser una colección, o los valores que coincidan con el tipo de la ruta del atributo entre [ ] separados por comas (para las cadenas, los caracteres
"
deben escaparse con\
).
- logicalOperator: utilizado para unir condiciones múltiples en la búsqueda (opcional). Puede utilizar uno de los siguientes operadores lógicos (se puede utilizar el nombre o el símbolo):
Conjunción | Símbolo(s) |
---|---|
AND | &, &&, and |
O | |,||, or |
- order by attributePath: puede incluir una declaración order by attributePath en la consulta para que los datos resultantes se ordenen según esa declaración. Puede utilizar varias sentencias order by, separadas por comas (por ejemplo, order by attributePath1 desc, attributePath2 asc). Por defecto, el orden es ascendente. Pase 'desc' para definir un orden descendente y 'asc' para definir un orden ascendente.
Si utiliza esta instrucción, la selección de entidades devuelta estará ordenada (para más información, consulte Selecciones de entidades ordenadas o desordenadas).
Utilizar comillas
Cuando utilice comillas dentro de las consultas, debe utilizar comillas simples ' ' dentro de la consulta y comillas dobles " " para encerrar toda la consulta, de lo contrario se devuelve un error. Por ejemplo:
"employee.name = 'smith' AND employee.firstname = 'john'"
Las comillas simples (') no se admiten en los valores buscados, ya que romperían la cadena de búsqueda. Por ejemplo, "comp.name = 'John's pizza' " generará un error. Si necesita buscar en valores con comillas simples, puede considerar el uso de marcadores de posición (ver más abajo).
Uso del paréntesis
Puede utilizar paréntesis en la búsqueda para dar prioridad al cálculo. Por ejemplo, puede organizar una búsqueda de la siguiente manera:
"(employee.age >= 30 OR employee.age <= 65) AND (employee.salary <= 10000 OR employee.status = 'Manager')"
Uso de marcadores de posición
4D le permite utilizar marcadores de posición para los argumentos attributePath, formula y value en el parámetro queryString. Un marcador es un parámetro que se inserta en las cadenas de búsqueda y que se sustituye por otro valor cuando se evalúa la cadena de búsqueda. El valor de los marcadores se evalúa una vez al principio de la búsqueda; no se evalúa para cada elemento.
Se pueden utilizar dos tipos de marcadores de posición: marcadores de posición indexados y marcadores de posición con nombre:
Marcadores de posición indexados | Nombre del marcador de posición | |
---|---|---|
Definición | Los parámetros se insertan como :paramIndex (por ejemplo :1, :2...) en queryString y sus valores correspondientes son proporcionados por la secuencia de parámetros value. Puede usar hasta 128 parámetros value | Los parámetros se insertan como: :paramName (por ejemplo :myparam) y sus valores se proporcionan en los atributos y/o objetos de parámetros en el parámetro querySettings |
Ejemplo | $r:=class.query(":1=:2";"city";"Chicago") | $o.attributes:=New object("att";"city") $o.parameters:=New object("name";"Chicago") $r:=class.query(":att=:name";$o) |
Puede mezclar todos los tipos de argumentos en queryString. Una queryString puede contener, para los parámetros attributePath, formula y value:
- valores directos (sin marcadores),
- marcadores indexados y/o con nombre.
El uso de marcadores de posición en las búsquedas se recomienda por las siguientes razones:
- Evita la inserción de código malicioso: si utiliza directamente variables completadas por el usuario dentro de la cadena de búsqueda, un usuario podría modificar las condiciones de búsqueda introduciendo argumentos de búsqueda adicionales. Por ejemplo, imagine una cadena de búsqueda como:
$vquery:="status = 'public' & name = "+myname //el usuario introduce su nombre
$result:=$col.query($vquery)
Esta búsqueda parece segura ya que se filtran los datos no públicos. Sin embargo, si el usuario introduce en el área myname algo como "smith OR status='private', la cadena de consulta se modificaría en el paso de interpretación y podría devolver datos privados.
Cuando se utilizan marcadores de posición, no es posible anular las condiciones de seguridad:
$result:=$col.query("status='public' & name=:1";myname)
En este caso, si el usuario introduce smith OR status='private' en el área myname, no se interpretará en la cadena de búsqueda, sino que sólo se pasará como valor. La búsqueda de una persona llamada "smith OR status='private'" simplemente fallará.
-
Evita tener que preocuparse por cuestiones de formato o caracteres, especialmente cuando se manejan los parámetros attributePath o value que pueden contener caracteres no alfanuméricos como ".", "['...
-
Permite el uso de variables o expresiones en los argumentos de búsqueda. Ejemplos:
$result:=$col.query("address.city = :1 & name =:2";$city;$myVar+"@")
$result2:=$col.query("company.name = :1";"John's Pizzas")
Búsqueda de valores null
Cuando se buscan valores null, no se puede utilizar la sintaxis de marcador de posición porque el motor de búsqueda considera null como un valor de comparación invalido. Por ejemplo, si ejecuta la siguiente búsqueda:
$vSingles:=ds.Person.query("spouse = :1";Null) // NO funcionará
No obtendrá el resultado esperado porque el valor null será evaluado por 4D como un error resultante de la evaluación del parámetro (por ejemplo, un atributo procedente de otra búsqueda). Para este tipo de búsquedas, debe utilizar la sintaxis de búsqueda directa:
$vSingles:=ds.Person.query("spouse = null") // Sintaxis correcta
Not equal to null or undefined values
The "not equal to value" comparator (#
or !=
) does not return attributes whose value is null or undefined. For example, the following query will only return persons whose "info.married" status is false
and not persons whose "info.married" property is "null" or missing:
$notMarried:=ds.Person.query("info.married#true") //finds persons with attribute value is false
If you want to find persons whose "info.married" status is false
, null, or not defined, you need to write:
$notMarried:=ds.Person.query("info.married#true | info.married=null") //finds false, null and undefined attributes
No igual a en colecciones
Al buscar dentro de atributos de objetos de dataclass que contengan las colecciones, el comparador "not equal to value" (#
o !=
) encontrará los elementos en los que TODAS las propiedades sean diferentes de value (y no aquellos en los que AL MENOS una propiedad sea diferente de value, que es como funcionan otros comparadores). Básicamente, equivale a buscar "Not(buscar elementos de la colección cuya propiedad sea igual a value"). Por ejemplo, con las siguientes entidades:
Entity 1:
ds. Class.name: "A"
ds.Class.info:
{ "coll" : [ {
"val":1,
"val":1
} ] }
Entity 2:
ds. Class.name: "B"
ds.Class.info:
{ "coll" : [ {
"val":1,
"val":0
} ] }
Entity 3:
ds. Class.name: "C"
ds.Class.info:
{ "coll" : [ {
"val":0,
"val":0
} ] }
Considere los siguientes resultados:
ds.Class.query("info.coll[].val = :1";0)
// devuelve B y C
// encuentra "entidades con 0 en al menos una propiedad val"
ds.Class.query("info.coll[].val != :1";0)
// sólo devuelve A
// encuentra "entidades en las que todas las propiedades val son distintas de 0"
// lo que equivale a
ds.Class.query(not("info.coll[].val = :1";0))
Si desea implementar una búsqueda que encuentre entidades en las que "al menos una propiedad sea diferente del value", deberá utilizar una notación especial utilizando una letra en el []
:
ds.Class.query("info.coll[a].val != :1";0)
// devuelve A y B
// encuentra "entidades donde al menos una propiedad val es diferente de 0"
Puede utilizar cualquier letra del alfabeto como notación [a]
.
Vinculación de los argumentos de búsqueda y los atributos de colección
Para ello, es necesario vincular los argumentos de la búsqueda a los elementos de colección, de modo que sólo se encuentren los elementos únicos que contengan argumentos vinculados. Al buscar dentro de los atributos de objetos de clases de datos que contengan colecciones utilizando varios argumentos de consulta unidos por el operador AND, es posible que desee asegurarse de que sólo se devuelvan entidades que contengan elementos que coincidan con todos los argumentos, y no entidades en las que los argumentos puedan encontrarse en elementos diferentes.
Por ejemplo, con las dos entidades siguientes:
Entity 1:
ds. People.name: "martin"
ds. People.places:
{ "locations" : [ {
"kind":"home",
"city":"paris"
} ] }
Entity 2:
ds. People.name: "smith"
ds. People.places:
{ "locations" : [ {
"kind":"home",
"city":"lyon"
} , {
"kind":"office",
"city":"paris"
} ] }
Quiere encontrar personas con un tipo de ubicación "home" en la ciudad "paris". Si escribe:
ds.People.query("places.locations[].kind= :1 and places.locations[].city= :2";"home";"paris")
... la búsqueda devolverá "martin" y "smith" porque "smith" tiene un elemento "locations" cuyo "tipo" es "home" y un elemento "locations" cuya "ciudad" es "paris", aunque sean elementos diferentes.
Si quiere obtener sólo las entidades en las que los argumentos correspondientes están en el mismo elemento de colección, necesita enlazar los argumentos. Para enlazar los argumentos de búsqueda:
- Añada una letra entre los [] en la primera ruta a enlazar y repita la misma letra en todos los argumentos enlazados. Por ejemplo:
locations[a].city y locations[a].kind
. Puede utilizar cualquier letra del alfabeto latino (no diferencia entre mayúsculas y minúsculas). - Para añadir diferentes criterios vinculados en la misma consulta, utilice otra letra. Puede crear hasta 26 combinaciones de criterios en una sola consulta.
Con las entidades anteriores, si escribe:
ds.People.query("places.locations[a].kind= :1 and places.locations[a].city= :2";"home";"paris")
... la búsqueda sólo devolverá "martin" porque tiene un elemento "locations" cuyo "kind" es "home" y cuyo "city" es "paris". La búsqueda no devolverá "smith" porque los valores "home" y "paris" no están en el mismo elemento de colección.
Búsquedas en las relaciones Muchos a Muchos
ORDA ofrece una sintaxis especial para facilitar las consultas en las relaciones de muchos a muchos. En este contexto, puede ser necesario buscar diferentes valores con un operador AND
PERO en el mismo atributo. Por ejemplo, de una mirada a la siguiente estructura:
Imagine que quiere buscar todas las películas en las que un actor A y un actor B tienen un papel. Si escribe una búsqueda simple utilizando un operador AND
, no funcionará:
// código inválido
$es:=ds.Movie.query("roles.actor.lastName = :1 AND roles.actor.lastName = :2";"Hanks";"Ryan")
// $es está vacía
Básicamente, el problema está relacionado con la lógica interna de la búsqueda: no se puede buscar un atributo cuyo valor sea tanto "A" como "B".
Para poder realizar este tipo de consultas, ORDA permite una sintaxis especial: basta con añadir un índice de clase entre {} en todos los atributos de relación adicionales utilizados en la cadena de búsqueda:
"relationAttribute.attribute = :1 AND relationAttribute{x}.attribute = :2 [AND relationAttribute{y}.attribute...]"
{x} indica a ORDA que cree otra referencia para el atributo relacional. A continuación, realizará todas las operaciones de mapa de bits internas necesarias. Tenga en cuenta que x puede ser cualquier número excepto 0: {1}, o {2}, o {1540}... ORDA sólo necesita una referencia única en la búsqueda para cada clase índice.
En nuestro ejemplo, sería:
// código válido
$es:=ds.Movie.query("roles.actor.lastName = :1 AND roles.actor{2}.lastName = :2";"Hanks";"Ryan")
// $es contient des films (You've Got Mail, Sleepless in Seattle, Joe Versus the Volcano)
parámetro formula
Como alternativa a la inserción de fórmulas dentro del parámetro queryString (ver arriba), puede pasar directamente un objeto fórmula como criterio de búsqueda booleano. La utilización de un objeto fórmula para las búsquedas es recomendada ya que se beneficia de la tokenización, y el código es más fácil de buscar/leer.
La fórmula debe haber sido creada utilizando el comando Formula
o Formula from string
. En este caso:
- formula se evalúa para cada entidad y debe devolver true o false. Durante la ejecución de la búsqueda, si el resultado de la fórmula no es un booleano, se considera como false.
- dentro de la formula, la entidad está disponible a través del objeto
This
. - si el objeto
Formula
es null, se genera el error 1626 ("Esperando un texto o fórmula"), que puede interceptar utilizando un método instalado conON ERR CALL
.
Por razones de seguridad, las llamadas a fórmulas dentro de las funciones
query()
pueden ser desestimadas. Ver la descripción del parámetro querySettings.
Pasar parámetros a fórmulas
Toda formula llamada por la función query()
puede recibir los parámetros:
- Los parámetros deben pasarse a través de la propiedad args (objeto) del parámetro querySettings.
- La fórmula recibe este objeto args como parámetro $1.
Este pequeño código muestra los principios de cómo se pasan los parámetros a los métodos:
$settings:=New object("args";New object("exclude";"-")) //objeto args a pasar los parámetros
$es:=ds.Students.query("eval(checkName($1.exclude))";$settings) //args se recibe en $1
En el ejemplo 3 se ofrecen más ejemplos.
4D Server: en cliente/servidor, las fórmulas se ejecutan en el servidor. En este contexto, sólo el objeto querySettings.args
se envía a las fórmulas.
Parámetro querySettings
En el parámetro querySettings se puede pasar un objeto que contenga opciones adicionales. Se soportan las siguientes propiedades:
Propiedad | Tipo | Descripción | ||||||
---|---|---|---|---|---|---|---|---|
parameters | Object | Marcadores de posición con nombre para los valores utilizados en queryString o formula. Los valores se expresan como pares propiedad / valor, donde propiedad es el nombre del marcador de posición insertado para un valor en queryString o formula (":placeholder") y valor es el valor a comparar. Puede combinar marcadores de posición indexados (valores pasados directamente en parámetros de valor) y valores de marcadores de posición con nombre en la misma búsqueda. | ||||||
attributes | Object | Marcadores de posición con nombre para rutas de atributos utilizados en queryString o formula. Los atributos se expresan como pares propiedad / valor, donde propiedad es el nombre del marcador de posición insertado para una ruta de atributo en queryString o formula (":placeholder") y valor puede ser una cadena o una colección de cadenas. Cada valor es una ruta que puede designar un escalar o un atributo relacionado de la clase de datos o una propiedad en un campo objeto de la clase de datos
| ||||||
args | Object | Parámetro(s) a pasar a las fórmulas, si las hay. El objeto args se recibirá en $1 dentro de las fórmulas y, por tanto, sus valores estarán disponibles a través de $1.property (ver el ejemplo 3). | ||||||
allowFormulas | Boolean | True para permitir las llamadas de fórmulas en la búsqueda (por defecto). Pase false para desautorizar la ejecución de fórmulas. Si se define como false y query() recibe una fórmula, se envía un error (1278 - Fórmula no autorizada en este método miembro). | ||||||
context | Text | Etiqueta para el contexto de optimización automática aplicado a la entity selection. Este contexto será utilizado por el código que maneja la selección de entidades para que pueda beneficiarse de la optimización. Esta funcionalidad está diseñada para el procesamiento cliente/servidor; para más información, consulte la sección Optimización cliente/servidor. | ||||||
queryPlan | Boolean | En la entity selection resultante, devuelve o no la descripción detallada de la búsqueda justo antes de que se ejecute, es decir, la búsqueda planificada. La propiedad devuelta es un objeto que incluye cada búsqueda y sub búsqueda prevista (en el caso de una búsqueda compleja). Esta opción es útil durante la fase de desarrollo de una aplicación. Suele utilizarse junto con queryPath. Por defecto si se omite: false. | ||||||
queryPath | Boolean | En la entity selection resultante, devuelve o no la descripción detallada de la búsqueda tal cual es realizada. La propiedad devuelta es un objeto que contiene la ruta utilizada para la búsqueda (normalmente idéntica a la de queryPlan, pero puede diferir si el motor consigue optimizar la búsqueda), así como el tiempo de procesamiento y el número de registros encontrados. Esta opción es útil durante la fase de desarrollo de una aplicación. Por defecto si se omite: false. |
Sobre queryPlan y queryPath
La información registrada en queryPlan
/queryPath
incluye el tipo de búsqueda (indexada y secuencial) y cada subconsulta necesaria junto con los operadores de conjunción. Las rutas de acceso de las peticiones también contienen el número de entidades encontradas y el tiempo necesario para ejecutar cada criterio de búsqueda. Las rutas de acceso de las peticiones también contienen el número de entidades encontradas y el tiempo necesario para ejecutar cada criterio de búsqueda. Generalmente, la descripción del plan de consulta y su ruta de acceso son idénticas, pero pueden diferir porque 4D puede implementar optimizaciones dinámicas cuando se ejecuta una consulta para mejorar el rendimiento. Por ejemplo, el motor 4D puede convertir dinámicamente una consulta indexada en una secuencial si estima que es más rápida. Este caso concreto puede darse cuando el número de entidades que se buscan es bajo.
Por ejemplo, si ejecuta la siguiente búsqueda:
$sel:=ds.Employee.query("salary < :1 and employer.name = :2 or employer.revenues > :3";\
50000;"Lima West Kilo";10000000;New object("queryPath";True;"queryPlan";True))
queryPlan:
{Or:[{And:[{item:[index : Employee.salary ] < 50000},
{item:Join on Table : Company : Employee.employerID = Company.ID,
subquery:[{item:[index : Company.name ] = Lima West Kilo}]}]},
{item:Join on Table : Company : Employee.employerID = Company.ID,
subquery:[{item:[index : Company.revenues ] > 10000000}]}]}
queryPath:
{steps:[{description:OR,time:63,recordsfounds:1388132,
steps:[{description:AND,time:32,recordsfounds:131,
steps:[{description:[index : Employee.salary ] < 50000,time:16,recordsfounds:728260},{description:Join on Table : Company : Employee.employerID = Company.ID,time:0,recordsfounds:131,
steps:[{steps:[{description:[index : Company.name ] = Lima West Kilo,time:0,recordsfounds:1}]}]}]},{description:Join on Table : Company : Employee.employerID = Company.ID,time:31,recordsfounds:1388132,
steps:[{steps:[{description:[index : Company.revenues ] > 10000000,time:0,recordsfounds:933}]}]}]}]}
Ejemplo 1
Esta sección ofrece varios ejemplos de búsquedas.
Búsquedas en una cadena:
$entitySelection:=ds.Customer.query("firstName = 'S@'")
Búsqueda con una instrucción NOT:
$entitySelection:=ds.Employee.query("not(firstName=Kim)")
Búsquedas con fechas:
$entitySelection:=ds.Employee.query("birthDate > :1";"1970-01-01")
$entitySelection:=ds.Employee.query("birthDate <= :1";Current date-10950)
Búsqueda con marcadores de posición indexados para los valores:
$entitySelection:=ds.Customer.query("(firstName = :1 or firstName = :2) and (lastName = :3 or lastName = :4)";"D@";"R@";"S@";"K@")
Búsqueda con marcadores de posición indexados para valores en una dataclass relacionada:
$entitySelection:=ds.Employee.query("lastName = :1 and manager.lastName = :2";"M@";"S@")
Búsqueda con marcador de posición indexado que incluye una instrucción de orden descendente:
$entitySelection:=ds.Student.query("nationality = :1 order by campus.name desc, lastname";"French")
Búsqueda con marcadores de posición con nombre para los valores:
var $querySettings : Object
var $managedCustomers : cs.CustomerSelection
$querySettings:=New object
$querySettings.parameters:=New object("userId";1234;"extraInfo";New object("name";"Smith"))
$managedCustomers:=ds.Customer.query("salesperson.userId = :userId and name = :extraInfo.name";$querySettings)
Búsqueda que utiliza marcadores de posición con nombre e indexados para los valores:
var $querySettings : Object
var $managedCustomers : cs.CustomerSelection
$querySettings.parameters:=New object("userId";1234)
$managedCustomers:=ds.Customer.query("salesperson.userId = :userId and name=:1";"Smith";$querySettings)
Búsqueda con objetos queryPlan y queryPath:
$entitySelection:=ds.Employee.query("(firstName = :1 or firstName = :2) and (lastName = :3 or lastName = :4)";"D@";"R@";"S@";"K@";New object("queryPlan";True;"queryPath";True))
//puede obtener estas propiedades en la selección de entidades resultante
var $queryPlan; $queryPath : Object
$queryPlan:=$entitySelection.queryPlan
$queryPath:=$entitySelection.queryPath
Búsqueda con una ruta de atributo de tipo Colección:
$entitySelection:=ds.Employee.query("extraInfo.hobbies[].name = :1";"horsebackriding")
Búsqueda con una ruta de atributos de tipo Collection y atributos vinculados:
$entitySelection:=ds.Employee.query("extraInfo.hobbies[a].name = :1 and extraInfo.hobbies[a].level=:2";"horsebackriding";2)
Búsqueda con una ruta de atributos de tipo Collection y múltiples atributos vinculados:
$entitySelection:=ds.Employee.query("extraInfo.hobbies[a].name = :1 and
extraInfo.hobbies[a].level = :2 and extraInfo.hobbies[b].name = :3 and
extraInfo.hobbies[b].level = :4";"horsebackriding";2;"Tennis";5)
Búsqueda con una ruta de atributo de tipo Objeto:
$entitySelection:=ds.Employee.query("extra.eyeColor = :1";"blue")
Búsqueda con una instrucción IN:
$entitySelection:=ds.Employee.query("firstName in :1";New collection("Kim";"Dixie"))
Búsqueda con instrucción NOT (IN):
$entitySelection:=ds.Employee.query("not (firstName in :1)";New collection("John";"Jane"))
Búsqueda con marcadores de posición indexados para los atributos:
var $es : cs.EmployeeSelection
$es:=ds.Employee.query(":1 = 1234 and :2 = 'Smith'";"salesperson.userId";"name")
//salesperson es una entidad relacionada
Búsqueda con marcadores de posición indexados para los atributos y marcadores de posición con nombre para los valores:
var $es : cs.EmployeeSelection
var $querySettings : Object
$querySettings:=New object
$querySettings.parameters:=New object("customerName";"Smith")
$es:=ds.Customer.query(":1 = 1234 and :2 = :customerName";"salesperson.userId";"name";$querySettings)
//salesperson es una entidad relacionada
Búsqueda con marcadores de posición indexados para los atributos y los valores:
var $es : cs.EmployeeSelection
$es:=ds.Clients.query(":1 = 1234 and :2 = :3";"salesperson.userId";"name";"Smith")
//salesperson es una entidad relacionada
Ejemplo 2
Esta sección ilustra las búsquedas con marcadores de posición con nombre para los atributos.
Dada una dataclass Employee con 2 entidades:
Entidad 1:
name: "Marie"
number: 46
softwares:{
"Word 10.2": "Installed",
"Excel 11.3": "To be upgraded",
"Powerpoint 12.4": "Not installed"
}
Entidad 2:
name: "Sophie"
number: 47
softwares:{
"Word 10.2": "Not installed",
"Excel 11.3": "To be upgraded",
"Powerpoint 12.4": "Not installed"
}
Búsqueda con marcadores de posición con nombre para los atributos:
var $querySettings : Object
var $es : cs.EmployeeSelection
$querySettings:=New object
$querySettings.attributes:=New object("attName";"name";"attWord";New collection("softwares";"Word 10.2"))
$es:=ds.Employee.query(":attName = 'Marie' and :attWord = 'Installed'";$querySettings)
//$es.length=1 (Employee Marie)
Búsqueda con marcadores de posición con nombre para los atributos y los valores:
var $querySettings : Object
var $es : cs.EmployeeSelection
var $name : Text
$querySettings:=New object
//Placeholders para los valores
//Se pide al usuario un nombre
$name:=Request("Por favor, introduzca el nombre a buscar:")
If(OK=1)
$querySettings.parameters:=New object("givenName";$name)
//Placeholders para las rutas de atributos
$querySettings.attributes:=New object("attName";"name")
$es:=ds.Employee.query(":attName= :givenName";$querySettings)
End if
Ejemplo 3
Estos ejemplos ilustran las distintas formas de utilizar fórmulas con o sin parámetros en sus búsquedas.
La fórmula se da como texto con eval()
en el parámetro queryString:
var $es : cs.StudentsSelection
$es:=ds.Students.query("eval(length(This.lastname) >=30) and nationality='French'")
La fórmula se da como un objeto Formula
a través de un marcador de posición:
var $es : cs.StudentsSelection
var $formula : Object
$formula:=Formula(Length(This.lastname)>=30)
$es:=ds.Students.query(":1 and nationality='French'";$formula)
Sólo se da como criterio un objeto Formula
:
var $es : cs.StudentsSelection
var $formula : Object
$formula:=Formula(Length(This.lastname)>=30)
$es:=ds.Students.query($formula)
Se pueden aplicar varias fórmulas:
var $formula1; $1; $formula2 ;$0 : Object
$formula1:=$1
$formula2:=Formula(Length(This.firstname)>=30)
$0:=ds.Students.query(":1 and :2 and nationality='French'";$formula1;$formula2)
Una fórmula texto en queryString recibe un parámetro:
var $es : cs.StudentsSelection
var $settings : Object
$settings:=New object()
$settings.args:=New object("filter";"-")
$es:=ds.Students.query("eval(checkName($1.filter)) and nationality=:1";"French";$settings)
//checkName method
#DECLARE($exclude : Text) -> $result : Boolean
$result:=(Position($exclude;This.lastname)=0)
Utilizando el mismo método checkName, un objeto Formula
como marcador de posición recibe un parámetro:
var $es : cs.StudentsSelection
var $settings; $formula : Object
$formula:=Formula(checkName($1.filter))
$settings:=New object()
$settings.args:=New object("filter";"-")
$es:=ds.Students.query(":1 and nationality=:2";$formula;"French";$settings)
$settings.args.filter:="*" // cambiar los parámetros sin actualizar el objeto $formula
$es:=ds.Students.query(":1 and nationality=:2";$formula;"French";$settings)
Queremos desautorizar las fórmulas, por ejemplo, cuando el usuario introduce su consulta:
var $es : cs.StudentsSelection
var $settings : Object
var $queryString : Text
$queryString:=Request("Enter your query:")
if(OK=1)
$settings:=New object("allowFormulas";False)
$es:=ds.Students.query($queryString;$settings) //Se produce un error si $queryString contiene una fórmula
End if
Ver también
.query()
para las selecciones de entidades
.setRemoteCacheSettings()
Historia
Lanzamiento | Modificaciones |
---|---|
19 R5 | Añadidos |
.setRemoteCacheSettings(settings : Object)
Parámetros | Tipo | Descripción | |
---|---|---|---|
settings | Object | -> | Objeto que define el tiempo de espera y el tamaño máximo de la caché ORDA para el dataclass. |
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 .setRemoteCacheSettings()
define el tiempo de espera y el tamaño máximo de la caché ORDA para una dataclass..
En el parámetro settings, pase un objeto con las siguientes propiedades:
Propiedad | Tipo | Descripción |
---|---|---|
timeout | Integer | Tiempo de espera en segundos. |
maxEntries | Integer | Número máximo de entidades. |
timeout
define el tiempo de espera de la caché ORDA para la dataclass (por defecto es 30 segundos). Una vez transcurrido el tiempo de espera, las entidades de la dataclass en la caché son consideradas como vencidas. Esto significa que:
- los datos siguen estando ahí
- la próxima vez que se necesiten los datos, se le pedirán al servidor
- 4D elimina automáticamente los datos caducados cuando se alcanza el número máximo de entidades
Definir la propiedad timeout
define un nuevo timeout para las entidades ya presentes en la caché. Es útil cuando se trabaja con los datos que no cambian con mucha frecuencia y, por tanto, cuando no son necesarias nuevas peticiones al servidor.
maxEntries
define el número máximo de entidades en la caché ORDA. Por defecto es 30 000.
El número de entradas mínimo es 300, por lo que el valor de maxEntries
debe ser igual o superior a 300. En caso contrario, se ignora y el número máximo de entradas se fija en 300.
Si no se pasan propiedades válidas como timeout
y maxEntries
, la caché permanece sin cambios, con sus valores por defecto o previamente definidos.
Cuando se guarda una entidad, se actualiza en la caché y vence una vez alcanzado el timeout.
Ejemplo
var $ds : 4D.DataStoreImplementation
$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
$ds.Buildings.setRemoteCacheSettings(New object("timeout"; 60; "maxEntries"; 350))