Maldivas Interfaces 1 – Sistemas de Búsqueda

Una de las funcionalidades mas importantes en la mayoría de los programas de gestión son las interfaces de búsqueda, un interface de búsqueda debe ser rápido y usarse con facilidad, de el depende en gran medida la versatilidad del programa. En Maldivas utilizamos varias formas diferentes de realizar búsquedas, el primero lo conocí en una Entidad Bancaria hace varios años y desde entonces siempre lo implemento en mis aplicaciones. La mayor parte de los interfaces de búsqueda que he visto, suelen partir de una lista de campos que permiten que el usuario seleccione uno de ellos, introduzca un valor y realice la búsqueda.

El sistema que presento aquí, es relativamente sencillo de implementar y aporta varias ventajas.

El primer paso cuando pulsamos sobre el botón de búsqueda, es situar el formulario en blanco. Quedaría mas o menos así:

image

Si el usuario introduce el valor en el campo identificativo, la búsqueda se realiza de forma automática, ya que este campo es único. En este caso, cuando introduzco el valor 23 en el código, el registro es buscado y mostrado de forma automática.

image

Cuando realizamos una búsqueda por otros campos podemos introducir información en varios de ellos, en el ejemplo siguiente introducimos varios valores. Utilizamos para activar el proceso dos teclas de función, F11 que realiza la búsqueda del primer registro coincidente y F12 que realiza la búsqueda de todos los registros que cumplan las condiciones determinadas por los valores introducidos. En este último caso, si el proceso encuentra un solo registro, este se muestra directamente en el formulario.

image

En este caso la búsqueda solo encuentra un registro que cumple las condiciones especificadas y lo muestra.

image

Si realizamos una búsqueda de las zonas que tengan el valor “Nacional” el sistema encuentra varios registros y los muestra en un formulario diferente.

image

En el, podemos seleccionar el registro que nos interese visualizar o realizar otras funciones como filtrar mas los resultados o imprimir el conjunto de registros seleccionados, para realizar este tipo de operaciones el sistema permite limitar los campos que se quieren imprimir, puesto que en un informe A4, seria difícil poder visualizar todos los campos, en el ejemplo limitaremos los campos al código, nombre y la zona_iva.

image

Después de esto, el formulario muestra las columnas seleccionadas.

image

A continuación podríamos exportarlos a PDF quedando el informe así:

image

Ventajas:

Este sistema permite realizar búsquedas complejas utilizando varios campos, con la ventaja de aprovechar posteriormente los resultados para realizar informes sencillos en varios formatos.

Al usuario le resulta muy cómodo de utilizar ya que habitualmente conoce la ubicación de los campos y no tiene que perder tiempo en buscarlos a través de una lista de campos.

Evitaremos tener que introducir los códigos que muchas veces desconocemos, en el siguiente ejemplo, vemos que será mas sencillo realizar la búsqueda a partir de la selección del valor de un combo que acordarnos del código de la forma de pago, en este caso “Compensación” que corresponde con el valor “0002”, que es el utilizaríamos para realizar la búsqueda en otros sistemas.

image

 

¿ Como funciona ?

Si utilizamos una entidad, dataset o cualquier objeto enlazado al formulario debemos crear un nuevo objeto vacío y mostrarlo en el formulario. Una vez introducidos los datos el sistema, este debe comparar los valores del objeto con uno vacío para obtener aquellos campos y valores que han cambiado. Esta información conjuntamente a la información de los metadatos del objeto, permiten generar en tiempo de ejecución una sentencia Sql para realizar la búsqueda.

Si utilizáis un modelo basado en DataSet necesitareis la información de la clase para obtener los metadatos y el estado de las filas para realizar la comparación. Podéis encontrar mas información en:

http://msdn.microsoft.com/es-es/library/system.data.datarowstate(VS.80).aspx

Si vuestra intención es utilizar Entity FrameWork deberéis utilizar de los metadatos de la entidad y comparar los valores anteriores con los actuales. Podéis encontrar mas información en:

http://msdn.microsoft.com/en-us/library/system.data.objects.objectstateentry.aspx

En Maldivas utilizamos la técnica de reflexión para obtener la información de los metadatos y los valores de la clase para realizar la consulta. De esta forma podemos generar una sentencia sql en tiempo de ejecución en base a los campos que han cambiado similar a esta:

“SELECT * FROM Gestion.Interlocutores_zonas WHERE Nombre LIKE ‘%’ + @nombre+ ‘%’ AND Zona_iva LIKE ‘%’ + @zonaIva + ‘%’)”

Si os fijáis introducimos la cláusula like en los campos de tipo string, para buscar valores que se encuentren en cualquier parte del campo.

 

Busqueda Rápida

Otro de los sistemas de búsqueda que hemos incorporado es el que se observa en la barra de herramientas situada en la parte superior del formulario.

image

Este proceso nos permite realizar búsquedas de una forma mucho mas “rápida”, en cuanto al trabajo por parte del usuario se refiere y funciona de la siguiente manera:

El usuario introduce cualquier valor, un número, una fecha, una cadena, etc, el sistema analiza los campos de la entidad que tienen el mismo tipo del valor buscado, en el caso por ejemplo de una fecha el sistema solo preguntara por aquellos campos que sean de tipo datetime, en este ejemplo vamos a introducir una cadena, “Interior“, vemos como el sistema realiza una búsqueda y obtiene un conjunto de registrosque tienen esta cadena en cualquiera de sus campos de tipo string.

image

La gran ventaja de este sistema es la facilidad de uso por parte del usuario, y la gran desventaja es que la velocidad de búsqueda es mas baja ya que la sentencia Sql que se genera tiene que evaluar todos los campos de tipos similares, para ver esto la consulta del ejemplo anterior seria algo como:

“SELECT * FROM Gestion.Interlocutores_zonas WHERE Codigo LIKE ‘%’ + @valor + ‘%’ OR Zona_iva LIKE ‘%’ + @valor + ‘%’ OR Zona_politica LIKE ‘%’ + @valor + ‘%’ OR Zona_tipo LIKE ‘%’ + @valor + ‘%’ OR Zona_cc LIKE ‘%’ + @valor + ‘%’ OR Nombre LIKE ‘%’ + @valor + ‘%’ )”

Por supuesto si la tabla tiene 100 campos, la sentencia que se puede generar es inmensa, aunque las pruebas que hemos realizados sobre tablas de unos 10000 registros con 200 campos se realiza en menos de tres segundos. Lógicamente esto dependerá de diferentes factores como Hardware del Servidor, Índices y otros factores.

Busqueda Sincronizada

Por último el sistema de búsqueda que nos proporciona el uso de los controles que utilizamos, de la marca Devexpress, en este caso el grid situado a la izquierda nos permite cambiar el orden y buscar sobre cualquier campo.

image

Al igual que en la cláusula like de Sql si eliminamos el símbolo % filtraría todos los registros que comiencen por el valor introducido

image

El control esta sincronizado con el formulario, de manera que si nos situamos en cualquiera de los registros del grid, el formulario muestra sus datos.

image

Otra de las ventajas de estos controles es que permiten visualizar y modificar las condiciones de filtrado en tiempo de ejecución:

image

Además de estas opciones de búsqueda, hemos implementado el sistema de desplazamiento de registros, ordenación y filtrado que permite al usuario trabajar con un conjunto de registros, hablare de ellos, en el próximo post sobre Interfaces.

11 comentarios en “Maldivas Interfaces 1 – Sistemas de Búsqueda”

  1. Muy bueno Juan

    Los usuarios siempre nos solicitan que las busquedas se las puedan hacer ellos solitos (y no les falta razón, cada cual tiene sus propias necesidades)

    ¿Has pensado en mejorar con una busqueda natural de tipo internet?

    Imagínate un textbox en la cabecera donde pudiera el usuario teclear algo como esto:

    “+nombre:*construcciones*”

    y que el grid devuelva todos los clientes que en su campo “nombre” albergue la palabra “construcciones” el signo más indicaría que deben de contener al menos una ocurrencia de esa palabra en dicho campo, el signo “-” sería para excluir, etc…

  2. En principio no habíamos pensado añadir esa funcionalidad, ya que los filtros permiten resolver la mayoría de las operaciones de búsqueda, aunque vamos a ampliarla para datos relacionados utilizando cubos OLAP.

    Gracias y saludos.

  3. Hola Juan:
    Super interesante la forma como simplificas las opciones de busqueda, una luz en el camino, pero queria preguntarte si esa misma tratativa de busqueda la usan para procesos algo complicados, por ejemplo para la interfaz de emision de un comprobante de pago (en mi caso un punto de venta jeje), en la que dentro de los pasos a realizar para dicha emision tenemos que buscar a un cliente dentro de una ventana de busquedas, elegirlo e incorporarlo en nuestro comprobante. Lo mismo con los articulos a facturar que deberiamos hacer una busqueda de dichos articulo e incorporarlos, luego tambien las formas de pago… para al final recien hacer la grabacion. Como te preguntaba, para algun mantenimiento de una situacion similar… manejan ese mismo esquema? mmm Algun tip?

  4. Miguel, en algunos casos utilizamos otros métodos, por ejemplo en el formulario de Cartera de Clientes, tenemos que introducir el cliente, factura o recibo, en base a cualquiera de los datos se rellena un grid con los datos de esta primera consulta conformado por varios recibos, cuando pulsamos doble click sobre alguno de los recibos que aparecen en un grid, se muestran finalmente todos los datos del recibo. En otros casos introducimos controles dentro de los grid que permiten por ejemplo la búsqueda de un artículo, también desarrollamos funciones especificas para realizar búsquedas concretas. Es decir combinamos varias técnicas, entre ellas la que explico aquí, para realizar búsquedas más efectivas, que dependerán del proceso que queramos desarrollar y los requerimientos del usuario.

    En los sistemas TPV se suelen utilizar objetos gráficos, inclusión de teclados virtuales si tienen pantalla táctil y diferentes técnicas para delimitar la búsqueda de elementos.

    Espero haberte ayudado.

  5. Juan:
    Gracias por la atencion, efectivamente me parece que tiene otra tratativa los mantenimientos de procesos mas orientados a la parte comercial, como el dichoso punto de venta que mencione (o la generacion de ordenes de pedido, los ingresos de articulos a almacen) en los cuales hay busquedas a veces personalizadas para dicho proceso y ahi entra a tallar lo que mencionas en cuanto a objetos dentro los grid.
    Gracias por el ayuda.
    SAludos

  6. Novato, tenía pensado hacer un pequeño ejemplo cuando termine los post sobre la arquitectura, pero te diré que no tiene mucho sentido basarte en la arquitectura de “Maldivas”, ya que cuando se diseño no contábamos con las ventajas que existen hoy, como Entity FrameWork.

    Msdn Video es una aplicación excelente, sobre todo para aprender de arquitectura, en esta aplicación puedes mejorar algún aspecto, como la realización de consultas de forma genérica que tratare más adelante, y es un punto de partida excelente para comenzar, si quieres hacer algo similar de nuevo, te recomiendo el estudio de Entity Framework , en el podrás adaptar funcionalidad similar a la que presento aquí.

    Gracias y saludos.

  7. Hola Juan, me parece interesante el enfoque que le estáis dando a la Arquitectura y te quería dar una idea, es en el apartado de la exportación, veo que habéis puesto un botón para cada uno de los formatos soportados (PDF, Word, etc.), a mí personalmente me gusta poner para ese tipo de cosas un botón con el formato por defecto y un desplegable con el resto de opciones disponibles (puede ser un botón desplegable depende de lo que te permita la librería de controles utilizada), esta lista de formatos soportados se nutre de algún archivo de configuración (en el que también podría indicarse cuál de ellos es el por defecto), de manera que si en el futuro añadís un nuevo formato (por ejemplo OpenXML o cualquiera que surga/se os ocurra) basta tocar ese fichero, el sistema llamaría a un componente (el cual debiera cumplir una interfaz o similar… para gustos los patrones) que sería el que “sabe” como exportar a ese formato. De esta manera implementado el componente “exportador” y tocando el fichero de configuración, TODA tu aplicación tendría esa nueva funcionalidad.

    Un saludo.

  8. Hola yazquez, te agradezco tus comentarios, nosotros utilizamos ese tipo de controles en muchos de nuestros grid, en concreto utilizamos este

    http://www.devexpress.com/…/ImageComboBoxEdit.xml al que hemos aumentado la funcionalidad agregándole checkbox múltiple para permitir la selección de varios elementos al mismo tiempo, lo mostrare en otros post sobre Interfaces.

     

    De esta forma al estar basado en una clase, podemos alterarlo agregando o eliminando opciones en un solo lugar. También hemos creado uno basado en un grid en el que cada línea está compuesta por un ImageComboBox con gráficos que permiten realizar esta funcionalidad, con la ventaja que se puede expandir mostrando más opciones.

     

    En este caso optamos por no utilizarlos, ya que nos parecía más útil que los usuarios visualizaran todas las opciones, pues es un módulo muy utilizado y ciertos usuarios si no ven la opción ni siquiera se ponen a buscarla. Además la accesibilidad a las opciones es más rápida pues evitas tener que desplegarlo.

    Gracias y saludos.

  9. Hola Juan, espero te sirva lo siguiente:

    (Nombre collate Latin1_General_CI_AI LIKE ‘%” + Sanitizar(criterio) + “%’)

    donde “collate Latin1_General_CI_AI” le quita tildes y caracteres raros al campo guardado en la BD, criterio es lo buscado, y Sanatizar es quitarle tildes y acentos que aveces dificultan las busquedas

    protected string Sanitizar(string cadena) // quitar tildes y caracteres extraños
    {
    cadena = Regex.Replace(cadena, @”s+”, “”);
    string stFormD = cadena.Normalize(NormalizationForm.FormD);
    StringBuilder sb = new StringBuilder();

    for (int ich = 0; ich < stFormD.Length; ich++) { UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]); if (uc != UnicodeCategory.NonSpacingMark) { sb.Append(stFormD[ich]); } } return (sb.ToString()); }

  10. @Arturo, te agradezco muchos tus comentarios, si bien creo no van a hacer falta en nuestra aplicación, ya que el diccionario por defecto de la base de datos utilizados esta basada en el modelo CI_AI, no toma en cuenta los acentos ni las mayusculas y minúsculas, con lo que si realizas una busqueda de una cadena por ejemplo “%Camión%”, el sistema asume que estas buscando “%camion%’, en el caso de los caracteres raros, evitamos este error desde los propios controles, por ejemplo en un control de tipo moenda con un valor “1.000,00 €”, el control siempre devolvera 1000 como valor, con lo que no es necesario realizar esta validación.

    En el caso de no realizar esta validación seria muy util utilizar la función que espones.

    Muchas gracias por tus comentarios.

    Saludos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *