Este es el sitio web histórico de la documentación de 4D. La documentación se está trasladando progresivamente a developer.4d.com |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v19.8
dataClass.query( )
|
dataClass.query ( cadenaBusq | formula {; valor}{; valor2 ; ... ; valorN}{; params}) -> Resultado | ||||||||
Parámetro | Tipo | Descripción | ||||||
cadenaBusq | formula | Texto, Objeto |
![]() |
Criterio de búsqueda como objeto cadena o fórmula | |||||
valor | Mixed |
![]() |
Valor(es) a comparar al utilizar separadores | |||||
params | Objeto |
![]() |
Opciones de búsqueda: parámetros, atributos, args, permitirFormulas, contexto, queryPath, queryPlan | |||||
Resultado | EntitySelection |
![]() |
Nueva selección de entidad formada por entidades de dataClass que cumplen los criterios de búsqueda especificados en cadenaBusq | |||||
El método dataClass.query( ) busca entidades que cumplan los criterios de búsqueda especificados en cadenaBusq o formula y (opcionalmente) valor, para todas las entidades de la clase de datos o de la selección de entidades y devuelve un nuevo objeto de tipo EntitySelection que contiene todas las entidades de la clase de datos que fueron encontradas. Se aplica carga diferida.
Si no se encuentran entidades coincidentes, se devuelve una EntitySelection vacía.
El parámetro cadenaBusq utiliza la siguiente sintaxis:
rutaAtributo|formula comparador valor {operadorLogico rutaAtributo|formula comparador valor} {orden por rutaAtributo {desc | asc}}
donde:
Nota: no puede utilizar directamente los atributos cuyo nombre contenga caracteres especiales como ".", "[ ]", o "=", ">", "#"..., porque se evaluarán incorrectamente en la cadena de búsqueda. Si necesita buscar dichos atributos, debe considerar el uso de marcadores de posición, que permiten un rango extendido de caracteres en las rutas de atributos (ver Parámetro valor (y placeholders) a continuación).
"eval(length(This.lastname) >=30)"
(*) Si la fórmula no es el único criterio de búsqueda, el sistema de optimización de búsquedas podría priorizar otros criterios (por ejemplo, atributos indexados) y, por lo tanto, la fórmula podría evaluarse solo para un subconjunto de entidades.
Las fórmulas en las consultas pueden recibir parámetros vía $1. Este punto se detalla en el párrafo Parámetro fórmula abajo.
Notas:
- También puede pasar directamente un parámetro formula en lugar del parámetro cadenaBusq (recomendado cuando las fórmulas son más complejas). Ver el párrafo Parámetro fórmula abajo.
- Por razones de seguridad, es posible desactivar las llamadas de fórmulas dentro de los métodos miembros query(). Ver la descripción del parámetro cadenaBusq.
Comparación | Símbolo(s) | Comentario |
===, IS | Obtiene datos que coinciden, considera el comodín (@) como un carácter estándar, no distingue entre mayúsculas y minúsculas ni es diacrítico | |
No igual a | #, != | Soporta el comodín (@) |
!==, IS NOT | Considera el comodín (@) como un carácter estándar, | |
Menor que | < | |
Mayor que | > | |
Menor o igual a | <= | |
Mayor que o igual a | >= | |
Incluido en | IN | Obtiene datos iguales para al menos uno de los valores en una colección o en un conjunto de valores, soporta el comodín (@) |
Condición No aplicada a una instrucción | NOT | Los paréntesis son obligatorios cuando se usa NOT antes de una instrucción que contiene varios operadores |
Contiene palabra clave | % | Las palabras claves se pueden definir en los atributos de tipo texto o imagen |
Conjunción | Símbolo(s) |
AND | &, &&, and |
OR | |, ||, or |
Utilizando comillas
Cuando utiliza comillas dentro de búsquedas, debe usar comillas simples ' ' dentro de la búsqueda y comillas dobles " " para abarcar toda la búsqueda, de lo contrario, se devuelve un error. Por ejemplo:
"employee.name = 'smith' AND employee.firstname = 'john'"
Nota: las comillas simples (') no se soportan en los valores buscados, ya que romperían la cadena de consulta. Por ejemplo, "comp.name = 'John's pizza' " generará un error. Si necesita buscar valores con comillas simples, puede considerar el uso de marcadores de posición (ver abajo).
Utilizando paréntesis
Puede utilizar paréntesis en búsquedas 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')"
Como alternativa a la inserción de fórmulas dentro del parámetro cadenaBusq (ver arriba), puede pasar directamente un objeto formula como un criterio de búsqueda booleano. Se recomienda utilizar un objeto fórmula para consultas, ya que se beneficia de la tokenización y el código es más fácil de buscar/leer.
La fórmula debe haberse creado con el comando Formula o Formula from string. En este caso:
Nota: por razones de seguridad, las llamadas de fórmula dentro de los métodos query() pueden ser rechazadas. Ver la descripción del parámetro cadenaBusq.
Pasando parámetros a fórmulas
Toda formula llamada por el método miembro query() puede recibir parámetros:
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 para pasar parámetros
$es:=ds.Students.query("eval(checkName($1.exclude))";$settings) //args se recibe en $1
Se presentan ejemplos adicionales en el ejemplo 3.
4D Server: en cliente/servidor, las fórmulas se ejecutan en el servidor. En este contexto, solo el objeto querySettings.args se envía a las fórmulas.
4D le permite utilizar marcadores de posición para los argumentos rutaAtributo, formula y valor dentro del parámetro params. Un marcador de posición es un parámetro que se inserta en las cadenas de búsqueda y que se reemplaza por otro valor cuando se evalúa la cadena de búsqueda. El valor de los marcadores de posición se evalúa una vez al comienzo de la consulta; 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 | Marcadores de posición con nombre |
Definición | Los parámetros se insertan como :paramIndex (por ejemplo :1, :2...) en cadenaBusq y sus valores correspondientes se proporcionan mediante la secuencia de los parámetros valor. Puede utilizar hasta 128 parámetros valor | Los parámetros se insertan como: paramName (por ejemplo: myparam) y sus valores se proporcionan en los objetos parámetros y/o atributos en el parámetro params. |
Ejemplo | $r:=class.query(":1=:2";"city";"Chicago") | $o.attributes:=New object("att";"city") |
Puede combinar todos los tipos de argumentos en cadenaBusq. Una cadenaBusq puede contener, en términos de parámetros rutaAtributo, formula y valor:
Se recomienda utilizar marcadores de posición en las búsquedas por los siguientes motivos:
$vquery:="status = 'public' & name = "+myname //el usuario introduce su nombre
$result:=$col.query($vquery)
$result:=$col.query("status='public' & name=:1";$myvar)
$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 busca valores null, no puede utilizar la sintaxis de marcador de posición porque el motor de consulta 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á
$vSingles:=ds.Person.query("spouse = null") //sintaxis correcta
Al realizar búsquedas en colecciones dentro de atributos de objetos utilizando múltiples 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 se puedan encontrar argumentos en diferentes elementos. Para ello, debe vincular los argumentos de consulta a los elementos de la colección, de forma que sólo se encuentren elementos individuales que contengan argumentos vinculados.
Por ejemplo, con las siguientes dos entidades:
Entidad 1:
ds.People.name: "martin"
ds.People.places:
{ "locations" : [ {
"kind":"home",
"city":"paris"
} ] }
Entidad 2:
ds.People.name: "smith"
ds.People.places:
{ "locations" : [ {
"kind":"home",
"city":"lyon"
} , {
"kind":"office",
"city":"paris"
} ] }
Quiere encontrar gente 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 consulta devolverá "martin" y "smith" porque "smith" tiene un elemento "locations" cuya "kind" es "home" y un elemento "locations" cuya "city" es "paris", aunque son elementos diferentes.
Si quiere obtener sólo entidades donde los argumentos coincidentes estén en el mismo elemento colección, necesita enlazar los argumentos. Para enlazar los argumentos de búsqueda:
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" cuya "kind" es "home" y cuya "city" es "paris". La consulta no devolverá "smith" porque los valores "home" y "paris" no están en el mismo elemento de colección.
En el parámetro params, puede pasar un objeto que contenga opciones adicionales. Las siguientes propiedades son soportadas:
Propiedad | Tipo | Descripción | ||||||
parameters | Objeto | Marcadores de posición nombrados para los valores utilizados en cadenaBusq 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 cadenaBusq (": placeholder") y el valor es el valor a comparar. Puede combinar marcadores de posición indexados (valores directamente pasados en parámetros valor) y valores de marcador de posición con nombre en la misma consulta. | ||||||
attributes | Objeto | Marcadores de posición nombrados para las rutas de atributo utilizadas en cadenaBusq 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 cadenaBusq (":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 de objeto de la clase de datos
| ||||||
args | Objeto | Parámetro(s) a pasar a fórmulas, si las hay. El objeto args será recibido en $1 dentro de fórmulas y estos valores estarán disponibles vía $1.property (ver ejemplo 3). | ||||||
allowFormulas | Booleano | True para permitir a la fórmula llamadas en la búsqueda (por defecto). Pase false para no permitir la ejecución de la fórmula. Si se define como false y query() es dada una formula, se envía un error (1278 - Fórmula no permitida en este método). | ||||||
context | Texto | Etiqueta para el contexto de optimización automática 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; Para más información, consulte la sección Optimización Cliente/servidor. | ||||||
queryPlan | Booleano | En la selección de entidades resultante, devuelve o no devuelve la descripción detallada de la búsqueda justo antes de que se ejecute, es decir, la consulta programada. La propiedad devuelta es un objeto que incluye cada consulta planificada y subconsulta (en el caso de una consulta compleja). Esta opción es útil durante la fase de desarrollo de una aplicación. Por lo general, se utiliza junto con queryPath. Por defecto si se omite: false. Nota: esta propiedad solo es compatible con los métodos entitySelection.query( ) y dataClass.query( ). | ||||||
queryPath | Booleano | En la selección de entidades resultante, devuelve o no devuelve la descripción detallada de la consulta, ya que realmente se realiza. La propiedad devuelta es un objeto que contiene la ruta real utilizada para la consulta (generalmente idéntica a la de queryPlan, pero puede diferir si el motor logra optimizar la consulta), 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. Nota: esta propiedad solo es compatible con los métodos entitySelection.query( ) y dataClass.query( ). |
Acerca de queryPlan y queryPath
La información registrada en queryPlan/queryPath incluye el tipo de consulta (indexada y secuencial) y cada subconsulta necesaria junto con los operadores de conjunción. Las rutas de búsqueda también contienen la cantidad de entidades encontradas y el tiempo requerido para ejecutar cada criterio de búsqueda. Puede resultarle útil analizar esta información mientras desarrolla sus aplicaciones. En general, la descripción del plan de búsqueda y su ruta son idénticos, pero pueden diferir porque 4D puede implementar optimizaciones dinámicas cuando se ejecuta una búsqueda para mejorar el rendimiento. Por ejemplo, el motor 4D puede convertir dinámicamente una búsqueda indexada en una secuencial si estima que es más rápida. Este caso particular puede ocurrir 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}]}]}]}]}
Aquí hay varios ejemplos de consultas válidas.
Consulta estándar con marcadores de posición:
$entitySelection:=dataClass.query("(firstName = :1 or firstName = :2) and (lastName = :3 or lastName = :4)";"D@";"R@";"S@";"K@")
Consulta estándar sin marcadores de posición:
$entitySelection :=dataClass.query("firstName = 'S@'")
Consulta con un dataClass relacionado:
$entitySelection:=dataClass.query("lastName = :1 and manager.lastName = :2";"M@";"S@")
Consulta con un marcador de posición indexado incluyendo un orden descendente por sentencia:
$entitySelection:=ds.Student.query("nationality = :1 order by campus.name desc, lastname";"French")
Consulta con marcadores de posición nombrados para valores:
C_OBJECT($querySettings;$managedCustomers)
$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)
Consulta que utiliza marcadores de posición nombrados e indexados para valores:
C_OBJECT($querySettings;$managedCustomers)
$querySettings:=New object
$querySettings.parameters:=New object("userId";1234)
$managedCustomers:=ds.Customer.query("salesperson.userId = :userId and name=:1";"Smith";$querySettings)
Consulta con objetos queryPlan y queryPath:
$entitySelection:=dataClass.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 entidad resultante
C_OBJECT($queryPlan;$queryPath)
$queryPlan:=$entitySelection.queryPlan
$queryPath:=$entitySelection.queryPath
Consulta con marcadores de posición y valores dados como una colección:
$params:=New object
$params.parameters:=New collection("D@";"R@";"S@";"K@")
$entitySelection:=dataClass.query("(firstName = :1 or firstName = :2) and (lastName = :3 or lastName = :4)";$params)
Consulta con una declaración NOT:
$entitySelection:=dataClass.query("not(firstName=Kim)")
Consulta con una ruta de atributo de tipo Collection:
$entitySelection:=dataClass.query("extraInfo.hobbies[].name = horsebackriding")
Consulta con una ruta de atributo de tipo Collection y atributos vinculados:
$entitySelection:=ds.Employee.query("extraInfo.hobbies[a].name = :1 and extraInfo.hobbies[a].level=:2";"horsebackriding";2)
Consulta con una ruta de atributo 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)
Consulta con una ruta de atributo de tipo Object:
$entitySelection:=ds.Employee.query("extra.eyeColor = :1";"blue")
Consulta con una declaración IN:
$entitySelection:=dataClass.query("firstName in :1";New collection("Kim";"Dixie"))
Consulta con una instrucción NOT (IN):
$entitySelection:=ds.Employee.query("not (firstName in :1)";New collection("John";"Jane"))
Consulta con marcadores indexados para los atributos:
C_OBJECT($es)
$es:=ds.Employee.query(":1 = 1234 and :2 = 'Smith'";"salesperson.userId";"name")
//salesperson es una entidad relacionada
Consulta con marcadores indexados para los atributos y con los placeholders nombrados para los valores:
C_OBJECT($es;$querySettings)
$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
Consulta con marcadores indexados para los atributos y los valores:
C_OBJECT($es)
$es:=ds.Clients.query(":1 = 1234 and :2 = :3";"salesperson.userId";"name";"Smith")
//salesperson es una entidad relacionada
Esta sección ilustra las búsquedas con los marcadores de posición con nombre para los atributos.
Dada una dataclass Employee con 2 entidades:
Búsqueda con los marcadores de posición con nombre para los atributos:
C_OBJECT($querySettings;$es)
$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 los marcadores de posición con nombre para los atributos y los valores:
C_OBJECT($es;$queySettings)
C_TEXT($name)
$querySettings:=New object
//Named placeholders for values
//The user is asked for a name
$name:=Request("Please enter the name to search:")
If(OK=1)
$querySettings.parameters:=New object("givenName";$name)
//Named placeholders for attribute paths
$querySettings.attributes:=New object("attName";"name")
$es:=ds.Employee.query(":attName= :givenName";$querySettings)
End if
Estos ejemplos ilustran las diferentes 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 cadenaBusq:
C_OBJECT($es)
$es:=ds.Students.query("eval(length(This.lastname) >=30) and nationality='French'")
La fórmula se da como un objeto Fórmula a través de un marcador de posición:
C_OBJECT($es;$formula)
$formula:=Formula(Length(This.lastname)>=30)
$es:=ds.Students.query(":1 and nationality='French'";$formula)
Sólo un objeto Fórmula se da como criterio:
C_OBJECT($es;$formula)
$formula:=Formula(Length(This.lastname)>=30)
$es:=ds.Students.query($formula)
Se pueden aplicar varias fórmulas:
C_OBJECT($formula1;$1;$formula2;$0)
$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 cadenaBusq recibe un parámetro:
C_OBJECT($es;$settings)
$settings:=New object()
$settings.args:=New object("filter";"-")
$es:=ds.Students.query("eval(checkName($1.filter)) and nationality=:1";"French";$settings)
//checkName method:
C_TEXT($1;$exclude)
$exclude:=$1
$0:=(Position($exclude;This.lastname)=0)
Utilizando el mismo método checkName, un objeto Fórmula como marcador de posición recibe un parámetro:
C_OBJECT($es;$settings;$formula)
$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:="*" // change the parameters without updating the $formula object
$es:=ds.Students.query(":1 and nationality=:2";$formula;"French";$settings)
Queremos no permitir fórmulas, por ejemplo, cuando el usuario introduce su búsqueda:
C_OBJECT($es;$settings)
C_TEXT($queryString)
$queryString:=Request("Enter your query:")
if(OK=1)
$settings:=New object("allowFormulas";False)
$es:=ds.Students.query($queryString;$settings) //Se genera un error si $queryString contiene una fórmula
End if
4D Blog - Add values to your generic orda queries
4D Blog - Placeholders for attribute paths in ORDA queries
collection.query( )
dataClass.all( )
dataClass.newSelection( )
DESCRIBE QUERY EXECUTION
entitySelection.query( )
entitySelection.queryPath
entitySelection.queryPlan
GET QUERY DESTINATION
QUERY
SET QUERY DESTINATION
Producto: 4D
Tema: ORDA - DataClass
Creado por: 4D v17
Modificado: 4D v17 R5
Modificado: 4D v17 R6
Manual de lenguaje 4D ( 4D v19)
Manual de lenguaje 4D ( 4D v19.1)
Manual de lenguaje 4D ( 4D v19.4)
Manual de lenguaje 4D ( 4D v19.5)
Manual de lenguaje 4D ( 4D v19.6)
Manual de lenguaje 4D ( 4D v19.7)
Manual de lenguaje 4D ( 4D v19.8)