# Tutor de búsquedas

## Tutor de búsquedas

Las búsquedas hacen uso de los sub-objetos de tabla llamados **índices**.

Una búsqueda podrá estar compuesta por un único componente (por un único índice) o por varios componentes (por varios índices).

A través de este tutor vamos a conocer cómo podemos construir una búsqueda que nos permita buscar por diferentes criterios, es decir, por varios componentes.

Para ello vamos a usar la tabla de Clientes (CLT\_M) declarada en el proyecto de datos de vTutor.

En la tabla los índices WORDS (de tipo Palabras) y PARTS (de tipo Trozos de palabras) indexan tanto el campo NAME como el campo OBS (observaciones).

Un índice de tipo palabras indexa un registro por cada palabra encontrada en las partes que forman la clave.

Un índice de tipo trozos de palabras indexa un registro por cada grupo de 3 ó más caracteres de cada una de las partes que forman la clave.

En este tutor aprenderemos a crear una búsqueda en la tabla de Clientes por los criterios siguientes:

Por PALABRAS o por TROZOS de palabras y entre límites de FECHA.

Tendremos que crear, además de la búsqueda, un formulario para pedir los datos de la búsqueda:

![](https://35066417-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7D2zitZhY9szSsa5EK%2Fsync%2Fb85220984545791f3d196dbb60fa39e54b181d99.jpg?generation=1589374148659730\&alt=media)

Si en dicho formulario el usuario deja algún dato en blanco, no se realizará la búsqueda por el componente correspondiente al mismo.

Tanto el formulario como la búsqueda los encontraremos en la carpeta **tablas tutores y buenas prácticas/clientes** del proyecto de aplicación de vTutor.

## Creación del formulario de búsqueda

En este tutor no vamos a explicar detalladamente la creación y edición de un formulario, ya que existe un tutor específico sobre formularios, sino que explicaremos solamente aquellos aspectos necesarios y de interés para este tutor sobre búsquedas.

Para crear el formulario, editaremos el proyecto de aplicación con Velneo vDevelop, pulsaremos la tecla Insert para abrir la galería de objetos y haremos doble clic sobre el siguiente icono:![](https://35066417-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7D2zitZhY9szSsa5EK%2Fsync%2Fcf0fb4a545dc12fbcf1c67dc62fcbc091eb0f3a8.jpg?generation=1589374143975087\&alt=media).

De las propiedades del objeto formulario modificaremos las siguientes:

**Identificador**: CLT\_M\_BUS.

**Nombre**: búsqueda avanzada de clientes.

**Tabla asociada**: CLT\_M.

Junto a la etiqueta **texto a buscar**, se ha añadido un control de tipo Edición cuyo contenido es el campo NAME de la tabla de Clientes: #NAME.

Dado que podemos buscar o por PALABRAS o por TROZOS de palabras, crearemos una variable local de tipo booleano. Si su contenido es 1 la búsqueda alfabética se hará por PALABRAS, si es 0, por TROZOS de palabras:

![](https://35066417-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7D2zitZhY9szSsa5EK%2Fsync%2F8f5f4a568be289be6de6d9e1f24b10ecc996c7c5.png?generation=1589374148583519\&alt=media)

Hemos incluido dos botones de radio para editar la variable local PLB. El que tiene el nombre **por palabras** tiene como contenido la variable local PLB y como valor1. El que tiene el nombre **por trozos de palabras** tiene como contenido la variable local PLB y como valor0.

Dado que la búsqueda por el componente fecha va a ser entre límites de fecha (entre una fecha inicial y una fecha final), tendremos que crear en el formulario dos variables locales de tipo fecha. Las llamaremos FCH\_LIM\_INI y FCH\_LIM\_FIN, respectivamente:

![](https://35066417-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7D2zitZhY9szSsa5EK%2Fsync%2Fcf03016685d464aa5cc87345c0c8df9a94e716a7.png?generation=1589374148607669\&alt=media)

Junto a la etiqueta **fecha inicio**, se ha añadido un control de tipo **edición fecha** cuyo contenido es la variable local FCH\_LIM\_INI.

Junto a la etiqueta **fecha fin**, se ha añadido un control de tipo **edición fecha** cuyo contenido es la variable local FCH\_LIM\_FIN.

El botón cuyo nombre es buscar, dispara el comando **aceptar**.

El botón cuyo nombre es cancelar, dispara el comando **cancelar**.

## Creación de la búsqueda

Para crear la búsqueda haremos doble clic sobre el icono ![](https://35066417-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7D2zitZhY9szSsa5EK%2Fsync%2Fb1bacbf0803ccafd510b6be1a13ee232f3858477.jpg?generation=1589374148641563\&alt=media) de la galería de objetos (Tecla Insert) y estableceremos las siguientes propiedades:

**Identificador**: CLT\_M\_AVA.

**Nombre**: clientes (avanzada).

**Tabla asociada**: CLT\_M.

**Formulario**: CLT\_M\_AVA.

**Invertir lista**: falso. Dejaremos que la lista se presente en orden ascendente según el índice usado.

**Fórmula filtro**: lo dejaremos vacío; en este caso, no es necesario aplicar un filtro secuencial al resultado de la búsqueda.

Una vez creada la búsqueda, tendremos que definir los **componentes** de la misma pero antes de hacerlo, recordemos que en el formulario de petición de datos habíamos creado unas **variables locales** para recoger una serie de datos, que recordemos eran:

**PLB**: de tipo booleano, para que el usuario pueda indicar si quiere realizar la búsqueda por palabras o por trozos de palabras.

**FCH\_LIN\_INI** y **FCH\_LIM\_FIN** para la petición de los límites inicial y final para el componente de la búsqueda por el índice fecha.

Pues bien, para recoger en la búsqueda los datos introducidos por el usuario en esas variables del formulario de petición de datos, lo que haremos será crear en la búsqueda también tres variables locales con los mismos identificadores y tipos que las del formulario.

Si las variables se llaman igual, Velneo pasa el valor de las variables del formulario a las de la búsqueda de forma automática.

![](https://35066417-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7D2zitZhY9szSsa5EK%2Fsync%2F43e58f1b54b603bd6839ce1fcc011a008de179df.png?generation=1589374149522485\&alt=media)

Una vez creadas las variables locales ya podremos comenzar a crear los **componentes** de la búsqueda. Éstos permiten definir tanto el índice o índices por los que se realizará la búsqueda como el modo en el que ésta será realizada.

Recordemos que la búsqueda que vamos a crear lo hará por los criterios siguientes:

Por PALABRAS.\
o\
Por TROZOS de palabras.\
y\
Entre límites de FECHA.

Para conseguir esto crearemos un primer componente que cargue todos los registros de la tabla y luego crearemos tantos componentes como distintos criterios de búsqueda indicados que vayan reduciendo la lista obtenida hasta llegar al resultado deseado.

Para crear un componente de búsqueda pulsaremos el botón ![](https://35066417-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7D2zitZhY9szSsa5EK%2Fsync%2F4da36e371264fb731bc93f8e93cedd74ce03378c.png?generation=1589374033636246\&alt=media) de la barra de herramientas del panel de subobjetos y seleccionaremos la opción componente búsqueda. El nuevo componente aparecerá en el panel de subobjetos:

![](https://35066417-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7D2zitZhY9szSsa5EK%2Fsync%2F2abbb1fb8afb161798e67b846054190c4f570ec8.png?generation=1589374148718129\&alt=media)

A este componente le estableceremos las siguientes propiedades:

**Identificador**: TLT.

**Índice**: ID.

**Modo**: todo el fichero.

### Componente: PALABRAS

Añadiremos un nuevo componente de búsqueda, y le estableceremos las propiedades siguientes:

**Identificador**: PAL.

**Mezcla**: en este parámetro especificaremos la forma de combinar la lista resultante de la ejecución del componente en curso con la del anterior. En este caso, seleccionaremos el valor _cruzar_ ya que éste hace que la lista resultante esté compuesta por los registros que se repitan en la lista resultante de ejecutar este componente y la del anterior.

**Condición activo**: recordemos que todos los componentes se ejecutarán si el campo o variable correspondiente, editado en el formulario de petición de datos, no está vacío. En este caso, además, tendrá que estar condicionado también a que la variable local PALABRAS sea igual a 1. Para especificar esta condición podremos usar el asistente para edición de fórmulas. Para ello pulsar el botón ![](https://35066417-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7D2zitZhY9szSsa5EK%2Fsync%2F0ec8afb1e644620169958dd35048b680077e1743.jpg?generation=1589374148652350\&alt=media) que aparece al editar esta propiedad y estableceremos la siguiente:

`( isEmpty(#NAME) = 0 ) & PLB`

**Índice**: seleccionaremos el índice WORDS.

**Todas las palabras**: en este parámetro indicaremos una fórmula que devuelva true si queremos que se busquen solamente aquellos registros que contengan todas las palabras que el usuario haya escrito en el formulario para la petición de datos de la búsqueda, o que devuelva False si queremos que se busquen los registros que contengan cualquiera de las palabras que el usuario haya escrito en el formulario para la petición de datos de la búsqueda. En este caso estableceremos el valor 1, es decir, todas las palabras.

**Límite inicial**: en esta propiedad indicaremos, mediante fórmulas, qué campos o variables editados en el formulario de petición de datos de la búsqueda van a usarse para resolver el componente o los componentes del índice en cuestión. En este caso, recordemos que aunque el índice WORDS de la tabla de Incidencias, indexaba tanto el campo NAME como el campo OBS (observaciones), en este caso tendremos que resolver el componente primero. Para ello pulsaremos el botón ![](https://35066417-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7D2zitZhY9szSsa5EK%2Fsync%2F0ec8afb1e644620169958dd35048b680077e1743.jpg?generation=1589374148652350\&alt=media) que aparece al editar esta propiedad, y se abrirá la ventana siguiente:

![](https://35066417-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7D2zitZhY9szSsa5EK%2Fsync%2Fcd83874978d70d38ef495de3cc746fc8d07cce38.jpg?generation=1589374148746284\&alt=media)

Para resolver la parte de índice correspondiente al campo NAME pulsaremos el botón que aparece al editarlo y seleccionaremos, de la lista de campos de la tabla, el campo NAME. #NAME:

![](https://35066417-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7D2zitZhY9szSsa5EK%2Fsync%2Fd77c5c61c37ef7992d1ce53edd378b3cc708c954.jpg?generation=1589374148986682\&alt=media)

De esta forma, el texto escrito en el control de edición del campo NAME del formulario de búsqueda será buscado en ambos campos.

### Componente: TROZOS

Añadiremos un nuevo componente de búsqueda, y le estableceremos las propiedades siguientes:

**Identificador**: TRZ.

**Mezcla**: en este parámetro especificaremos la forma de combinar la lista resultante de la ejecución del componente en curso con la del anterior. En este caso, seleccionaremos el valor _cruzar_ ya que éste hace que la lista resultante esté compuesta por los registros que se repitan en la lista resultante de ejecutar este componente y la del anterior.

**Condición activo**: recordemos que todos los componentes se ejecutarán si el campo o variable correspondiente, editado en el formulario de petición de datos, no está vacío. En este caso, además, tendrá que estar condicionado también a que la variable PALABRAS sea igual a 0. Para especificar esta condición podremos usar el asistente para edición de fórmulas. Para ello pulsar el botón ![](https://35066417-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7D2zitZhY9szSsa5EK%2Fsync%2F0ec8afb1e644620169958dd35048b680077e1743.jpg?generation=1589374148652350\&alt=media) que aparece al editar esta propiedad y estableceremos la siguiente:

`( isEmpty(#NAME) = 0 ) & ( ! PLB )`

**Índice**: seleccionaremos el índice PARTS.

**Límite inicial**: en esta propiedad indicaremos, mediante fórmulas, qué campos o variables editados en el formulario de petición de datos de la búsqueda van a usarse para resolver el componente o los componentes del índice en cuestión. En este caso, recordemos que aunque el índice PARTS de la tabla de Incidencias, indexaba tanto el campo NAME como el campo OBSERVACIONES, en este caso tendremos que resolver el componente primero. Para ello pulsaremos el botón ![](https://35066417-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7D2zitZhY9szSsa5EK%2Fsync%2F0ec8afb1e644620169958dd35048b680077e1743.jpg?generation=1589374148652350\&alt=media) que aparece al editar esta propiedad, y se abrirá la ventana siguiente:

![](https://35066417-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7D2zitZhY9szSsa5EK%2Fsync%2Fcd83874978d70d38ef495de3cc746fc8d07cce38.jpg?generation=1589374148746284\&alt=media)

Para resolver la parte de índice correspondiente al campo NAME pulsaremos el botón que aparece al editarlo y seleccionaremos, de la lista de campos de la tabla, el campo NAME. #NAME:

![](https://35066417-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7D2zitZhY9szSsa5EK%2Fsync%2Fd77c5c61c37ef7992d1ce53edd378b3cc708c954.jpg?generation=1589374148986682\&alt=media)

De esta forma, el texto escrito en el control de edición del campo NAME del formulario de búsqueda será buscado en ambos campos.

### Componente: FECHA

Añadiremos un nuevo componente de búsqueda, y le estableceremos las propiedades siguientes:

**Identificador**: FCH.

**Mezcla**: en este parámetro especificaremos la forma de combinar la lista resultante de la ejecución del componente en curso con la del anterior. En este caso, seleccionaremos el valor Cruzar ya que éste hace que la lista resultante esté compuesta por los registros que se repitan en la lista resultante de ejecutar este componente y la del anterior.

**Condición activo**: recordemos que todos los componentes se ejecutarán si el campo o variable correspondiente, editado en el formulario de petición de datos, no está vacío. Para especificar esta condición podremos usar el asistente para edición de fórmulas. Para ello pulsar el botón ![](https://35066417-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7D2zitZhY9szSsa5EK%2Fsync%2F0ec8afb1e644620169958dd35048b680077e1743.jpg?generation=1589374148652350\&alt=media) que aparece al editar esta propiedad y estableceremos la siguiente:

`isEmpty(FCH_LIM_INI) = 0`

Para añadir las variables locales a la fórmula hacerlo a través de la lista de variables locales del asistente, haciendo doble clic sobre la variable deseada para añadirla a la fórmula.

**Índice**: seleccionaremos el índice FECHA.

**Modo**: en este caso seleccionaremos el valor Entre límites, dado que nos interesa buscar entre dos rangos de fechas.

**Límite inicial**: en esta propiedad indicaremos, mediante una fórmula, qué campos o variables editados en el formulario de petición de datos de la búsqueda van a usarse para resolver el componente o los componentes del índice en cuestión. Para ello pulsaremos el botón ![](https://35066417-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7D2zitZhY9szSsa5EK%2Fsync%2F0ec8afb1e644620169958dd35048b680077e1743.jpg?generation=1589374148652350\&alt=media) que aparece al editar esta propiedad, y se abrirá la ventana siguiente:

![](https://35066417-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7D2zitZhY9szSsa5EK%2Fsync%2Ff62cf2d1cfb3d4eaecfbb3a4d0f225a23532d0dd.png?generation=1589374149191742\&alt=media)

Para resolver la parte de índice correspondiente al campo FECHA pulsaremos el botón que aparece al editarlo y seleccionaremos, de la lista de variables locales la variable FCH\_LIM\_INI.

**Límite final**: en esta propiedad indicaremos, mediante una fórmula, qué campos o variables editados en el formulario de petición de datos de la búsqueda van a usarse para resolver el componente o los componentes del índice en cuestión. Para ello pulsaremos el botón ![](https://35066417-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7D2zitZhY9szSsa5EK%2Fsync%2F0ec8afb1e644620169958dd35048b680077e1743.jpg?generation=1589374148652350\&alt=media) que aparece al editar esta propiedad, y se abrirá la ventana siguiente:

![](https://35066417-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7D2zitZhY9szSsa5EK%2Fsync%2F767bfd053c3cf6a183dfc8ba9dec900b72e44378.png?generation=1589374149792387\&alt=media)

Para resolver la parte de índice correspondiente al campo FECHA pulsaremos el botón ![](https://35066417-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7D2zitZhY9szSsa5EK%2Fsync%2F0ec8afb1e644620169958dd35048b680077e1743.jpg?generation=1589374148652350\&alt=media) que aparece al editarlo y especificaremos la fórmula siguiente:

`Choose(IsEmpty(FCH_LIM_FIN), FCH_LIM_INI, FCH_LIM_FIN)`

Es decir, si el usuario no ha cumplimentado el dato de la fecha final, se asumirá el dato especificado en la fecha inicial, en caso contrario, se tomará el dato indicado en la fecha final. Para añadir las variables locales a la fórmula hacerlo a través de la lista de variables locales del asistente de fórmulas, haciendo doble clic sobre la variable deseada para añadirla a la fórmula.

La búsqueda que acabamos de crear podremos dispararla, por ejemplo, desde una acción, usando como objeto de salida cualquier objeto de listas (rejilla, casillero, etc.).
