Uso avanzado de objetos de base de datos
Uso avanzado de la búsqueda
Las búsquedas son los objetos que se utilizan para realizar consultas en las tablas de datos.
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 tutorial 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 basarnos en una aplicación de incidencias, que contendrá un proyecto de datos y un proyecto de aplicación que herede del anterior.
El proyecto de datos contendrá las tablas siguientes:

Las tablas tienen la siguiente estructura:


En la tabla de INCIDENCIAS los índices PALABRAS y TROZOS indexan tanto el campo NAME como el campo OBSERVACIONES.
En este tutorial aprenderemos a crear una búsqueda en la tabla de INCIDENCIAS, por los criterios siguientes:
Por PALABRAS.
o
Por TROZOS de palabras.
y
Entre límites de FECHA.
Y
de una ENTIDAD concreta.
Y
Con un ID concreto.
Dado que podemos buscar o por PALABRAS o por TROZOS de palabras, crearemos una variable de tipo booleano y con persistencia en memoria. Si su contenido es 1 la búsqueda alfabética se hará por PALABRAS, si es 0, por TROZOS de palabras:

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 proyecto de datos dos variables de tipo fecha y con persistencia en memoria. Las llamaremos FCH-LIM-INI y FCH-LIM-FIN, respectivamente:

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

Si en dicho formulario el usuario deja algún dato en blanco, no se realizará la búsqueda por el componente correspondiente al mismo.
Creación del formulario de búsqueda
En este tutorial no vamos a explicar detalladamente la creción y edición de un formulario, ya que existe un tutorial específico sobre formularios, sino que explicaremos solamente aquellos aspectos necesarios y de interés para este tutorial sobre búsquedas.

Para crear el formulario, editaremos el proyecto de aplicación con Velneo vDevelop V7, pulsaremos la tecla Insert para abrir la galería de objetos y haremos doble clic sobre el sigiuente icono:

De las propiedades del objeto formulario modificaremos las siguientes:
Identificador: INCIDENCIAS_BUS.
Nombre: Incidencias.
Tabla asociada: INCIDENCIAS.
Siempre cuadro de diálogo: Verdadero.
Especial para búsquedas: Verdadero.
Los sub-objetos del proyecto de datos heredado que editaremos en el formulario son:
Junto a la etiqueta Código, se ha añadido un control de tipo Edición cuyo contenido es el campo ID de la tabla de INCIDENCIAS: #ID
Junto a la etiqueta Texto, se ha añadido un control de tipo Edición cuyo contenido es el campo NAME de la tabla de INCIDENCIAS: #NAME.
Hemos incluido bajo este control dos Botones de radio para editar la variable PALABRAS. El que tiene el Nombre Por palabras tiene como Contenido la variable global PALABRAS y como Valor 1. El que tiene el Nombre Por trozos de palabras tiene como Contenido la variable global PALABRAS y como Valor 0.
Junto a la etiqueta Fecha inicio, se ha añadido un control de tipo Edición Fecha cuyo contenido es la variable FCH_LIM_INI: $id_proyecto_datos.vcd@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 FCH_LIM_FIN: $id_proyecto_datos.vcd@FCH_LIM_FIN.
Junto a la etiqueta Entidad, se ha añadido un control de tipo Edición cuyo contenido es el campo NAME del enlace a la tabla de ENTIDADES: #ENTIDADES.NAME.
El botón cuyo Nombre es Buscar, dispara el Comando Aceptar.
El botón cuyo Nombre es Cancelar, dispara el Comando Cancelar.
Para crear la búsqueda haremos doble clic sobre el icono
de la galería de objetos (Tecla Insert) y estabeceremos las siguientes propiedades:
Identificador: INCIDENCIAS.
Nombre: Incidencias.
Tabla asociada: INCIDENCIAS.
Formulairo: INCIDENCIAS.
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. É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.
Y
de una ENTIDAD concreta.
Y
Con un ID concreto.
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
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:

Haremos doble clic sobre él para editar sus propiedades y estableceremos las siguientes:
Identificador: TODA_LA_TABLA.
Índice: ID.
Modo: Todo el fichero.
Componente: PALABRAS
Añadiremos un nuevo componente de búsqueda, y le estableceremos las propiedades siguientes:
Identificador: PALABRAS.
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 formlario 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 1. Para especificar esta condición podremos usar el asistente para edición de fórmulas. Para ello pulsar el botón
que aparece al editar esta propiedad y estableceremos la siguiente: ( IsEmpty(#NAME) = 0 ) & $1qq8bwwv.vcd@PALABRAS.
Índice: Seleccionaremos el índice PALABRAS.
Todas las palabras: En este parámetro indicaremos una fórmula que devuelva True si queremos que se busquen solamente aquellos registos 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 el índice PALABRAS de la tabla de Incidencias, indexaba tanto el campo NAME como el campo OBSERVACIONES, por lo que en este caso tendremos que resolver ambos componentes. Pa ello pulsaremos el botón
que aparece al editar esta propiedad, y se abrirá la ventana siguiente:

Para resolver la parte de índice correspondiente al campo NAME pulsaremos el botón
que aparece al editalo y seleccionaremos, de la lista de campos de la tabla, el campo NAME. #NAME. Haremos lo mismo para resolver el campo OBSERVACIONES:

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: TROZOS.
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 formlario 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
que aparece al editar esta propiedad y estableceremos la siguiente: ( IsEmpty(#NAME) = 0 ) & (! $1qq8bwwv.vcd@PALABRAS).
Índice: Seleccionaremos el índice TROZOS.
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 el índice TROZOS de la tabla de Incidencias, indexaba tanto el campo NAME como el campo OBSERVACIONES, por lo que en este caso tendremos que resolver ambos componentes. Pa ello pulsaremos el botón
que aparece al editar esta propiedad, y se abrirá la ventana siguiente:

Para resolver la parte de índice correspondiente al campo NAME pulsaremos el botón
que aparece al editalo y seleccionaremos, de la lista de campos de la tabla, el campo NAME. #NAME. Haremos lo mismo para resolver el campo OBSERVACIONES:

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: FECHA.
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 formlario 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
que aparece al editar esta propiedad y estableceremos la siguiente: (IsEmpty($id_proyecto.vcd@FCH_LIM_INI) = 0 . Para añadir las variables a la fórmula hacerlo a través de la lista de variables 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
que aparece al editar esta propiedad, y se abrirá la ventana siguiente:

Para resolver la parte de índice correspondiente al campo FECHA pulsaremos el botón
que aparece al editalo y seleccionaremos, de la lista de variables globales la variable FCH_LIM_INI. $id_proyecto.vcd@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
que aparece al editar esta propiedad, y se abrirá la ventana siguiente:

Para resolver la parte de índice correspondiente al campo FECHA pulsaremos el botón
que aparece al editalo y especificaremos la fórmula siguiente: Choose(IsEmpty($id_proyecto.vcd@FCH_LIM_FIN), $id_proyecto.vcd@FCH_LIM_INI, $id_proyecto.vcd@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 a la fórmula hacerlo a través de la lista de variables del asistente, haciendo doble clic sobre la variable deseada para añadirla a la fórmula.
Componente: ENTIDAD
Añadiremos un nuevo componente de búsqueda, y le estableceremos las propiedades siguientes:
Identificador: ENTIDAD.
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 formlario 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
que aparece al editar esta propiedad y estableceremos la siguiente: #ENTIDADES ! 0, es decir, que la entidad sea distinta de 0.
Índice: Seleccionaremos el índice ENTIDADES.
Modo: Seleccionaremos el valorParte izquierda de la clave. Esto realiza la búsqueda de los registros cuya clave coincida con la introducida por el usuario en el formulario para pedir datos, es decir, la entidad introducida en dicho formulario.
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, tendremos que resolver con la entidad seleccioanda en el formulario de petición de datos. Para ello pulsaremos el botón
que aparece al editar esta propiedad, y se abrirá la ventana siguiente:

Para resolver la parte de índice correspondiente al campo ENTIDADES pulsaremos el botón
que aparece al editalo y seleccionaremos, de la lista de campos de la tabla, el campo NAME. #ENTIDADES.ID.
Componente: ID
Añadiremos un nuevo componente de búsqueda, y le estableceremos las propiedades siguientes:
Identificador: ID.
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 formlario 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
que aparece al editar esta propiedad y estableceremos la siguiente: #ID ! 0, es decir, que el ID sea distinto de 0.
Índice: Seleccionaremos el índice ID.
Modo: Seleccionaremos el valorParte izquierda de la clave. Esto realiza la búsqueda de los registros cuya clave coincida con la introducida por el usuario en el formulario para pedir datos, es decir, con el ID introducido en dicho formulario.
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, tendremos que resolver con el id establecido en el formulario de petición de datos. Para ello pulsaremos el botón
que aparece al editar esta propiedad, y se abrirá la ventana siguiente:

Para resolver la parte de índice correspondiente al campo ID pulsaremos el botón
que aparece al editalo y seleccionaremos, de la lista de campos de la tabla, el campo ID: #ID.
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.).
