Este es el sitio web histórico de la documentación de 4D. La documentación se está trasladando progresivamente a developer.4d.com

Inicio

 
4D v19.8
dataClass.query( )

dataClass.query( ) 


 

dataClass.query ( cadenaBusq | formula {; valor}{; valor2 ; ... ; valorN}{; params}) -> Resultado 
Parámetro Tipo   Descripción
cadenaBusq | formula   Texto, Objeto in Criterio de búsqueda como objeto cadena o fórmula
valor  Mixed in Valor(es) a comparar al utilizar separadores
params  Objeto in Opciones de búsqueda: parámetros, atributos, args, permitirFormulas, contexto, queryPath, queryPlan
Resultado  EntitySelection in 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:

  • rutaAtributo: ruta del atributo en el que desea ejecutar la búsqueda. Este parámetro puede contener un nombre simple (por ejemplo "país"). En el caso de una ruta de atributo tipo Collection, la notación [] se utiliza para manejar todas las ocurrencias (por ejemplo "children[ ].age"). También puede utilizar un texto de ejemplo (placeholder) (ver abajo).

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).

  • formula: una fórmula válida (ver Fórmulas) pasada como Texto u Objeto. La fórmula se evaluará para cada entidad procesada (*) y debe devolver un valor booleano. Dentro de la fórmula, la entidad está disponible vía el objeto This .  
    • Texto: la cadena de fórmula debe ir precedida por la declaración eval(), de modo 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 un marcador de posición (ver abajo). La fórmula debe haberse creado con el comando Formula o Formula from string

(*) 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.

  • comparador: símbolo que compara rutaAtributo y valor. Los siguientes símbolos son soportados:

ComparaciónSímbolo(s)Comentario
===, ISObtiene 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 NOTConsidera el comodín (@) como un carácter estándar,
Menor que <
Mayor que >
Menor o igual a <=
Mayor que o igual a >=
Incluido enINObtiene 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ónNOTLos 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
  • valor: el valor a comparar con el valor actual de la propiedad de cada elemento en la colección o selección de entidades. Puede ser cualquier expresión del mismo tipo de datos que la propiedad o un separador de posición (ver Parámetro valor (y placeholders) abajo) o toda expresión que corresponda con la propiedad del tipo de datos. 
    Cuando se utiliza un valor constante, se deben respetar las siguientes reglas:
    • las constantes de tipo texto pueden pasarse con o sin comillas sencillas (ver Uso de comillas abajo). Para buscar una cadena dentro de una cadena (una búsqueda "contiene"), utilice el símbolo comodín (@) en valor para aislar la cadena que se va a buscar como se muestra en este ejemplo: "@Smith@". Las siguientes palabras claves están prohibidas para las constantes: true, false.
    • constantes tipo booleano: true o false (sensible a mayúsculas y minúsculas).
    • constantes tipo numérico: los decimales son separados por un '.' (punto).
    • constantes tipo fecha: formato "AAAA-MM-DD"
    • constante null: utilizando la palabra clave "null" encontrará propiedades null y undefined.
    • En el caso de una búsqueda con un comparador IN, valor debe ser una colección, o valores que coincidan con el tipo de la ruta del atributo entre [ ] separados por comas (para cadenas, "los caracteres se deben escapar con "\").  
  • operadorLogico: utilizado para unir múltiples condiciones en la búsqueda (opcional). Puede usar uno de los siguientes operadores lógicos (puede pasar el nombre o el símbolo):
    Conjunción Símbolo(s)
    AND&, &&, and
    OR|, ||, or
  • orden por rutaAtributo: puede incluir una declaración ordenar por rutaAtributo en la búsqueda para que los datos resultantes se ordenen de acuerdo con esa declaración. Por defecto, el orden es ascendente. Pase 'desc' para definir un orden descendente y 'asc' para definir un orden ascendente. Puede utilizar múltiples órdenes por declaraciones, separados por comas (por ejemplo, ordenar por rutaAtributo1 desc, rutaAtributo2 asc). Por defecto, el orden es ascendente. Pase 'desc' para definir un orden descendente y 'asc' para definir un orden ascendente.
    P
    Nota: si utiliza esta declaración, la selección de entidades devuelta se ordenará (para más información, consulte Ordenadas vs No ordenadas).

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:

  • formula se evalúa para cada entidad y debe devolver verdadero o falso. Durante la ejecución de la consulta, si el resultado de la fórmula no es booleano, se considera falso.
  • dentro de 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 una fórmula"), que llama intercepción utilizando un método instalado con ON ERR CALL.

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:

  • Los parámetros se deben pasar a través de la propiedad args (objeto) del parámetro cadenaBusq.
  • La fórmula recibe este objeto args como un 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 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 indexadosMarcadores de posición con nombre
DefiniciónLos 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 valorLos 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")
 $o.parameters:=New object("name";"Chicago")
 $r:=class.query(":att=:name";$o)

Puede combinar todos los tipos de argumentos en cadenaBusq. Una cadenaBusq puede contener, en términos de parámetros rutaAtributo, formula y valor:

  • valores directos (sin marcadores de posición),
  • marcadores de posición indexados y/o marcadores de posición nombrados.

Se recomienda utilizar marcadores de posición en las búsquedas por los siguientes motivos:

  1. Evita la inserción de código malicioso: si utiliza en la cadena de búsqueda variables llenadas directamente por usuarios, un usuario podría modificar las condiciones de consulta al ingresar argumentos de consulta adicionales. Por ejemplo, imagine una cadena de consulta como:
     $vquery:="status = 'public' & name = "+myname //el usuario introduce su nombre
     $result:=$col.query($vquery)

    Esta consulta parece segura ya que los datos no públicos se filtran. Sin embargo, si el usuario introduce en el área $myname algo así como smith OR status='private', la cadena de consulta se modificaría en el paso de interpretación y podría devolver datos privados.
    Al utilizar marcadores de posición, no es posible prevalecer sobre las condiciones de seguridad:
     $result:=$col.query("status='public' & name=:1";$myvar)

    En este caso, si el usuario introduce OR status='private' en el área $myvar, no se interpretará en la cadena de consulta, sino que solo se pasará como un valor. Buscar una persona llamada "OR status='private'" simplemente fallará.
  2. Evita tener que preocuparse por problemas de formato o caracteres, especialmente al manejar parámetros rutaAtributo o valor que podrían contener caracteres no alfa numéricos tales como ".", "['... 
  3. Permite el uso de variables o expresiones en argumentos de consulta. 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 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á

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 consulta). Para este tipo de búsquedas, debe usar la sintaxis de consulta directa:
 $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:

  • Añada una letra entre el [] 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 se distingue entre mayúsculas y minúsculas).
  • Para añadir diferentes criterios de enlace 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" 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:

PropiedadTipoDescripción
parametersObjetoMarcadores 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.
attributesObjetoMarcadores 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
TipoDescripción
StringrutaAtributo expresado utilizando la notación de puntos, por ejemplo "name" o "user.address.zipCode"
Colección de cadenasCada cadena de la colección representa un nivel de rutaAtributo, por ejemplo ["name"] o ["user","address","zipCode"]. El uso de una colección permite consultar atributos con nombres que no cumplen con la notación de puntos, por ejemplo ["4Dv17.1","en/fr"]
Puede combinar marcadores de posición indexados (valores pasados ​​directamente en valor) valores de marcador de posición con nombre en la misma consulta.
argsObjetoPará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). 
allowFormulasBooleanoTrue 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).
contextTextoEtiqueta 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.
queryPlanBooleanoEn 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( ).
queryPathBooleanoEn 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:

  • Entity 1:
    name: "Marie"
    number: 46
    softwares:{
    "Word 10.2": "Installed",
    "Excel 11.3": "To be upgraded",
    "Powerpoint 12.4": "Not installed"
    }
  • Entity 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 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



Ver también 

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

 
PROPIEDADES 

Producto: 4D
Tema: ORDA - DataClass

Este comando modifica la variable sistema Error

 
CONTENIDO DE LA PÁGINA 
 
HISTORIA 

Creado por: 4D v17
Modificado: 4D v17 R5
Modificado: 4D v17 R6

 
ARTICLE USAGE

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)