4D v16.3

QUERY BY ATTRIBUTE

Inicio

 
4D v16.3
QUERY BY ATTRIBUTE

QUERY BY ATTRIBUTE 


 

QUERY BY ATTRIBUTE ( {tabla}{;}{opConj ;} campoObjeto ; rutaAtributo ; opBusq ; valor {; *} ) 
Parámetro Tipo   Descripción
tabla  Tabla in Tabla para la cual devolver una selección de registros o Tabla por defecto si se omite
opConj  Operador in Operador de conjunción ausar para combinar varias búsquedas (si las hay)
campoObjeto  Campo in Campo objeto cuyos atributos utilizar para la búsqueda
rutaAtributo  Cadena in Nombre o ruta de atributo
opBusq  Operador, Cadena in Operador de búsqueda (comparador)
valor  Texto, Número, Fecha, Hora in Valor a comparar
Operador in Espera de ejecución de la búsqueda

QUERY BY ATTRIBUTE busca los registros que coincidan con la cadena de consulta definida utilizando los parámetros campoObjeto, rutaAtributo, opBusq y valor, y devuelve una selección de registros para tabla.

Nota: para más información sobre los campos Objeto (nuevo en 4D v15), por favor, consulte la sección Tipo de campo Objeto.

QUERY BY ATTRIBUTE cambia la selección actual de tabla para el proceso actual y vuelve el primer registro de la nueva selección el registro actual. Si se omite el parámetro tabla, el comando se aplica a la tabla por defecto. Si no se ha definido ninguna tabla por defecto, se produce un error.

El parámetro opcional opConj se utilizar para combinar varias llamadas a QUERY BY ATTRIBUTE en caso de búsquedas múltiples. Los operadores de conjunción disponibles son los mismos que los del comando QUERY:

ConjunciónSímbolo a utilizar con QUERY BY ATTRIBUTE
AND&
OR|
Except#

El parámetro opConj no se utiliza para la primera llamada a QUERY BY ATTRIBUTE de una búsqueda múltiple, o si la búsqueda es una búsqueda simple. Si lo omite dentro de una búsqueda múltiple, el operador AND (&) se utiliza por defecto.

En campoObjeto, pase el campo objeto cuyos atributos desea buscar. Si pertenece a una tabla Uno relacionada a tabla con una relación automática o manual, el campoObjeto pueden pertenecer a otra tabla.
QUERY BY ATTRIBUTE soporta los atributos personalizados 4D Write Pro cuando los documentos son almacenados en campos Objeto. Para mayor información, consulte la sección Almacenar los documentos 4D Write Pro en los campos objeto 4D.

En rutaAtributo, pase la ruta del atributo cuyos valores desea comparar para cada registro, por ejemplo "niños.niñas.edad". Si pasa un simple nombres, por ejemplo "lugar", designa el atributo correspondiente ubicado en el primer nivel del campo objeto.
Si un atributo "x" es un  array, QUERY BY ATTRIBUTE buscará registros que contengan un atributo "x" en el cual al menos un elemento coincida con los criterios. Para buscar entre los atributos de array, es necesario indicar al comando QUERY BY ATTRIBUTE que el atributo "x" es un array añadiendo ".[]" a su nombre en el parámetro rutaAtributo (ver ejemplo 3).

Notas:

  • Tenga en cuenta que los nombres de atributos tienen en cuenta las mayúsculas y minúsculas: puede tener diferentes nombres de atributos "MyAtt" y "myAtt" en el mismo registro.
  • Los nombres de atributos se recortan para eliminar espacios adicionales. Por ejemplo, "mi primer atributo .mi segundo atributo" se interpreta como "mi primer atributo.mi segundo atributo".

El parámetro opBusq es el operador de comparación que se aplica entre campoObjeto y valor. Puede pasar uno de los símbolos que se muestran aquí:

ComparaciónSímbolo a utilizar con QUERY BY ATTRIBUTE
Igual a =
Diferente de #
Menor que <
Mayor que >
Menor o igual a <=
Mayor o igual a >=

Nota: se puede especificar el operador de comparación como una expresión texto en lugar de un símbolo. Consulte la descripción del comando QUERY  para más información.

valor valor es el dato contra el que se va a comparar rutaAtributo. El valor que puede ser cualquier expresión del mismo tipo que rutaAtributo. El valor se evalúa una vez, al inicio de la búsqueda. El valor no se evalúa para cada registro. Para buscar una cadena dentro de una cadena (una búsqueda "contains"), utilice el símbolo arroba (@) en valor para aislar la cadena a buscar, como se muestra en este ejemplo: "@Smith@". Note que en este caso, la búsqueda sólo se beneficia parcialmente desde el índice (compacidad de almacenamiento de datos).

Esta es la estructura de una consulta por atributos:

 QUERY BY ATTRIBUTE([Table] ;[Table]ObjectField ;"attribute1.attribute2";=;value)

Nota: un criterio implícito para todos los operadores (excepto #) es que el campo Objeto contiene un atributo. Sin embargo, para el operador #, puede definirse (ver más adelante).

Por ejemplo, la siguiente búsqueda devuelve los registros de las personas que tienen un perro cuyo nombre no es Rex (y no los registros de las personas que no tienen un perro, o que tienen un perro sin nombre):

Las búsquedas por atributo que utilizan el operador "#" pueden tener resultados diferentes dependiendo de si la propiedad está seleccionada para el campo objeto:

  • Propiedad Traducir los NULL en valores vacíos seleccionada (valor por defecto, recomendado en la mayoría de los casos).
    En este caso, el operador "#" debe ser visto como seleccionando los registros donde "ningún atributo" del campo contiene el valor buscado. En este contexto, 4D considera de manera similar:
    • los campos para las cuales el valor del atributo es diferente al valor de la búsqueda,
    • los campos donde el atributo no está presente (o contiene un valor Null).

    Por ejemplo: la siguiente búsqueda devuelve los registros de personas que tienen un perro cuyo nombre no es Rex, así como también los registros de personas que no tienen perro, o que tienen perro si nombre:

     QUERY BY ATTRIBUTE([People];[People]Animals;"dog.name";#;"Rex")

    Otro ejemplo: esta búsqueda devolverá todos los registros para los que [Table]ObjectField contiene un objeto que contiene un atributo attribute1 que es en sí un objeto que contiene un atributo attribute2 cuyo valor no es el valor (no va a devolver los objetos que no contienen attribute1 o attribute2):
     QUERY BY ATTRIBUTE([Table];[Table]ObjectField;"attribute1.attribute2";#;value)

    Este principio también aplica a los atributos array. Por ejemplo:

     QUERY BY ATTRIBUTE([People];[People]OB_Field;"locations[].city";#;"paris")

    Esta búsqueda devolverá los registros de las personas que no tienen una dirección en París.

    Para obtener específicamente los registros donde el atributo no está definido, puede utilizar un objeto vacío (ver ejemplo 2). Note sin embargo que la búsqueda de valores NULL en elementos array no es soportada.

  • Propiedad Traducir los NULL a valores vacíos no seleccionada (modo "SQL").
    En este caso, los atributos no definidos (atributos no presentes en el campo o cuyo valor es Null) no se consideran como equivalentes a los valores vacíos por defecto. Como resultado, las búsquedas del tipo "atributo A es diferente del atributo B" no devolverán registros en los que el atributo A no está definido.
    Para utilizar el mismo ejemplo anterior, cuando la opción Traducir los NULL en valores vacíos no se selecciona para el campo [People]Animals, la siguiente búsqueda sólo devolverá registros para las personas que tienen un perro cuyo atributo "name" no contiene " Rex ". Los registros de las personas que no tienen perro, o que tienen un perro sin nombre no se devolverán en este caso.
     QUERY BY ATTRIBUTE([People];[People]Animals;"dog.name";#;"Rex")

    Esta operación, más cerca de la lógica SQL, se reserva para necesidades específicas.

Aquí están las reglas a seguir para la construcción de varias búsquedas por atributo:

  • La primera línea no debe contener una conjunción.
  • Cada argumento de búsqueda sucesivo puede comenzar con una conjunción. Si lo omite, el operador AND (&) se utiliza por defecto.
  • Todas las líneas, excepto la última, deben utilizar el parámetro *.
  • QUERY BY ATTRIBUTE se puede combinar con los comandos QUERY (ver ejemplo).
  • Para realizar la búsqueda, no especifique el parámetro * en el último comando QUERY BY ATTRIBUTE. Alternativamente, puede ejecutar el comando QUERY sin parámetros distintos a la tabla.

Nota: cada tabla mantiene su propia construcción de búsqueda actual. Esto significa que puede crear varias búsquedas simultáneamente, una para cada tabla.

No importa la forma en que una búsqueda se haya definido:

  • Si la operación de búsqueda va a tomar algún tiempo para llevarse a cabo, 4D muestra automáticamente un mensaje que contiene un termómetro de progreso. Estos mensajes se pueden activar y desactivar mediante el uso de los comandos MESSAGES ON y MESSAGES OFF. Si se muestra un termómetro de progreso, el usuario puede hacer clic en el botón Detener para interrumpir la búsqueda. Si se completa la consulta, OK toma el valor 1. De lo contrario, si la consulta se interrumpe, OK toma el valor 0 (cero).
  • Si no se especifica ningún campo objeto indexado, la búsqueda se optimiza cada vez que es posible (los campos indexados se buscan primero), resultando en una búsqueda que toma la menor cantidad de tiempo posible.

Las fechas se almacenan en los objetos en función de los parámetros de la base; por defecto, se tiene en cuenta la zona horaria  (ver el selector JSON use local time en el comando SET DATABASE PARAMETER).

!1973-05-22! -> "1973-05-21T23:00:00.000Z"

Este ajuste también se tiene en cuenta durante las búsquedas, por lo que no tiene que preocuparse por ello si siempre utiliza su base en el mismo lugar y si los parámetros son los mismos en todos los equipos que acceden a los datos. En este caso, la siguiente búsqueda devolverá correctamente los registros cuyo atributo Birthday sea igual a !1973-05-22! (guardada como "1973-05-21T23:00:00.00Z"):

 QUERY BY ATTRIBUTE([Persons];[Persons]OB_Info;"Birthday";=;!1973-05-22!)

Si no desea utilizar el parámetro GMT, puede modificar estos parámetros utilizando la siguiente instrucción:

 SET DATABASE PARAMETER(JSON use local time;0)

Tenga en cuenta que el alcance de este parámetro está limitado al process.  Si ejecuta esta instrucción, el 1 de octubre de 1965 se almacenará "1965-10-01T00: 00: 00.000Z" pero usted deberá ajustar el mismo parámetro antes de lanzar sus búsquedas:

 SET DATABASE PARAMETER(JSON use local time;0)
 QUERY BY ATTRIBUTE([Persons];[Persons]OB_Info;"Birthday";=;!1976-11-27!)

Puede utilizar la propiedad virtual "longitud" con este comando. Esta propiedad está disponible automáticamente para todos los atributos de tipo array y devuelve el tamaño del array, es decir, el número de elementos que contiene. Se puede utilizar en el contexto de la ejecución del comando QUERY BY ATTRIBUTE (ver ejemplo 4).

En este ejemplo, el atributo "age" es una cadena o un entero y queremos encontrar personas cuyas edades estén entre 20 y 29. Las primeras dos líneas buscan el atributo como un entero (>=20 y <30) y las últimas consultan el campo como una cadena (comienza por "2" pero es diferente de "2".)

 QUERY BY ATTRIBUTE([Persons];[Persons]OB_Info;"age";>=;20;*)
 QUERY BY ATTRIBUTE([Persons]; & ;[Persons]OB_Info;"age";<;30;*)
 QUERY BY ATTRIBUTE([Persons];|;[Persons]OB_Info;"age";=;"2@";*)
 QUERY BY ATTRIBUTE([Persons]; & ;[Persons]OB_Info;"age";#;"2") //sin * para lanzar la ejecución

El comando QUERY BY ATTRIBUTE se puede utilizar para encontrar registros en los que algunos atributos se definen (o no). Para ello, debe utilizar un objeto vacío.

  //Buscar los registros donde el correo electrónico se define en el campo objeto
 C_OBJECT($undefined)
 QUERY BY ATTRIBUTE([Persons];[Persons]Info;"email";#;$undefined)

  //Buscar los registros donde el código postal no está definido en el campo objeto
 C_OBJECT($undefined)
 QUERY BY ATTRIBUTE([Persons];[Persons]Info;"zip code";=;$undefined)

Usted quiere buscar un campo que contiene los atributos array. Con los dos registros siguientes:

{
    "name":"martin",
    "locations" : [ {
                "kind":"office",
                "city":"paris" 
            } ]
} , {
    "name":"smith",
    "locations" : [ {
                "kind":"home",
                "city":"lyon" 
            } , {
                "kind":"office",
                "city":"paris" 
            } ]
}

... QUERY BY ATTRIBUTE encontrará personas con una ubicación en "paris" utilizando esta instrucción:

  //indica el atributo array con la sintaxis "[]"
 QUERY BY ATTRIBUTE([People];[People]OB_Field;"locations[].city";=;"paris")
  //Selecciona "martin" y "smith"

Nota: si ha definido varios criterios en el mismo atributo array, los criterios coincidentes no se aplicarán necesariamente al mismo elemento de array. En el siguiente ejemplo, la búsqueda devolverá "smith" porque tiene un elemento "locations" cuyo "kind" es "home" y un elemento "locations" cuya "city" es "paris", Incluso si no es el mismo elemento:

 QUERY BY ATTRIBUTE([People];[People]OB_Field;"locations[].kind";=;"home";*)
 QUERY BY ATTRIBUTE([People]; & ;[People]OB_Field;"locations[].city";=;"paris")
  //Selecciona "smith"

Este ejemplo ilustra el uso de la propiedad "longitud" virtual. Su base tiene un campo objeto [Customer]full_Data con los siguientes datos:

Usted quiere obtener los registros de los clientes que tienen dos o más hijos. Para ello, se puede escribir:

 QUERY BY ATTRIBUTE([Customer];[Customer]full_Data;"Children.length";>=;2)

Si la búsqueda se lleva a cabo correctamente, la variable sistema OK toma el valor 1.
La variable OK toma el valor 0 si: - el usuario hace clic en Cancelar en la caja de diálogo de búsqueda,
- en modo 'búsqueda y bloqueo' (ver el comando SET QUERY AND LOCK), la búsqueda encuentra al menos un registro bloqueado. En este caso igualmente, el conjunto sistema LockedSet se actualiza.



Ver también 

Estructura de los objetos de lenguaje 4D
QUERY SELECTION BY ATTRIBUTE

 
PROPIEDADES 

Producto: 4D
Tema: Búsquedas
Número 1331

Este comando modifica la variable sistema OKEl comando cambia el registro actualEl comando cambia la selección actualThis command can be run in preemptive processes

 
HISTORIA 

Creado por: 4D v15

 
ARTICLE USAGE

Manual de lenguaje 4D ( 4D v16)
Manual de lenguaje 4D ( 4D v16.1)
Manual de lenguaje 4D ( 4D v16.2)
Manual de lenguaje 4D ( 4D v16.3)