Os indicamos, paso a paso, con capturas de pantalla, explicaciones y código fuente, cómo crear e implementar una ventana de selección de registro. Útil para aquellas tablas / formularios que tengan enlaces a otras tablas (por ejemplo, en una ventana de alta de factura, cómo seleccionar el cliente).




Cómo crear una ventana de selección de registro en Delphi

COMO CREAR UNA VENTANA DE SELECCIÓN DE REGISTRO EN DELPHI

La teoría: a veces nos encontramos con aplicaciones que, cuando hay que seleccionar algún registro "foráneo" (en la ventana de facturas seleccionar el cliente, en la ventana de albaranes seleccionar el proveedor, en la ventana de detalle de factura seleccionar el artículo, etc.) nos muestran un simple desplegable, con el inconveniente de que sólo es posible buscar un elemento por el comienzo del nombre. Esto hace que la selección sea más rápida si se sabe cómo empieza el nombre, pero cuando hay muchos registros es imposible aprenderse los nombres, por lo que se hace inviable.

En nuestro caso, os explicararemos cómo hacer una ventana de selección de registros que sirva para todos los formularios / ventanas de la aplicación. Se trata de una ventana de selección donde el usuario podrá buscar por una o varias palabras (independientemente de la posición donde se encuentren), también podrá buscar por varios campos (nombre, código, población, etc). Todo ello configurable en tiempo de diseño, para poder utilizar la misma ventana.

Esta ventana tendrá el siguiente aspecto:

Se trata de una ventana con un grid que mostrará los campos que le indiquemos en el SELECT (consulta SQL que ejecutemos). Esta ventana tendrá un campo de edición para que el ususuario pueda escribir las palabras de búsqueda. También tendrá cuatro botones de opción para seleccionar por qué campo quiere buscar (son personalizables por código). A su vez, esta ventana incluye una barra de botones con las siguientes opciones:

  • Botón de selección de elemento actual: selecciona el registro actual y cierra la ventana.
  • Botón de inserción de nuevo elemento: muestra una ventana para añadir un nuevo registro.
  • Botón de refrescar: vuelve a ejecutar la consulta SQL, para actualizar los datos.
  • Botón de cerrar: cierra la ventana sin seleccionar ningún elemento.

La ventaja de esta ventana de selección es que permite realizar las búsquedas de forma automática. Es decir, conforme el usuario va escribiendo las palabras a buscar se van mostrando los registros que cumplan la condición de búsqueda.

Un ejemplo de utilización de esta ventana podría ser en el caso de una aplicación de gestión de cobros, la ventana de alta de nuevo cobro sería:

Como se puede observar, en el campo "Cliente" aparece un cuadro de edición (por si el usuario sabe el código, para que lo introduzca directamente) y un botón. Este botón muestra la ventana de selección de clientes:

Es suficiente con escribir un apellido, por ejemplo, y automáticamente aparecerán todos los clientes con ese apellido.

Al seleccionar el cliente, la ventana de cobro quedará de la siguiente forma:

Lo que hace la ventana de selección cuando se selecciona un elemento es guardar el código de dicho registro en una variable global. Luego en el código del botón seleccionar se obtiene dicho valor y se inserta en el campo correspondiente del registro actual.

 

A continuación explicaremos paso a paso cómo se crea y configura (en tiempo de diseño) la ventana de selección:

  • Utilizaremos un TForm con las siguientes características:
    • BorderIcons: [biSystemMenu,biMaximize].
    • AutoSize = False.
    • BorderStyle = bsSizeable.
    • Position = poScreenCenter.
    • WindowState = wsNormal
  • El TForm contendrá los siguientes componentes: TControlBar, TGroupBox, TRadioButton, TLabel, TMaskEdit, TDBGrid, TTimer, TActionList, TPopupMenu:

 

  • El código de las funciones y procedimientos que utilizaremos será:

En esta función, que será la encargada de mostrar adecuadamente los resultados (nombre del título de columna, tamaño, etc) hemos puesto un par de ejemplos, lógicamente tendréis que adaptarlos a vuestras necesidades. 

 

  • En el evento "FormShow" del TForm pondremos el siguiente código:

 

  • En el evento "FormClose" del TForm colocaremos el siguiente código:

  • El procedimiento "Click" del botón de refrescar tendrá el siguiente código:

 

Como ejemplo, en este procedimiento, hemos puesto dos tipos de registros (cliente y proveedor) . Tendréis que ajustarlo a vuestras necesidades. Como se puede observar hay dos consultas SQL, una para clientes y otra para proveedores, que muestran los campos que hemos considerado importantes (código, nombre, CIF). La constante "vtTablaTercero" ha sido declarada de forma pública y contiene el nombre de la tabla "Terceros" (clientes y proveedores). También hay que mencionar que en nuestro caso los clientes y proveedores se almacenan en la misma tabla, sólo se diferencian por el campo "Tipo", de ahí el WHERE tipo = «Cliente".

Las constantes vtNumCliente, vtNumProveedor son declaradas públicamente, son números  que identifican cada ventana.

 

 

 

  • En el evento OnChange del componente TEdit colocaremos el siguiente código:

 

De esta forma activaremos el temporizador para que, cada medio segundo, realice la búsqueda en la base de datos. Optamos por retardar este medio segundo para que no hubiera un exceso en las consultas SQL a ejecutar (se ejecutaría una consulta SQL sobre la base de datos por cada palabra introducida por el usuario). Ahora estamos barajando la posibilidad de poder permitir que el usuario pueda configurar si desea que las búsquedas sean automáticas o no (se buscaría al hacer intro). Esta opción de búsqueda automática, a veces (con bases de datos conectadas por Internet) puede ser un poco lenta.

 

  • En el evento OnTimer del TTimer (temporizador) podremos el siguiente código:

 

En este procedimiento, realizaremos la consulta de selección (SELECT) con el LIKE y los porcentajes ("%") para buscar por palabras coincidentes independientemente de la posición en la que se encuentren. Una vez más utilizamos las constantes vtNumCliente y vtNumProveedor para diferenciar la consulta SQL a ejecutar y demás. Al final del procedmiento ejecutaremos "arreglarCampos" para mostrar las columnas correctamente.

 

 

  • En el evento OnClick de los componentes TRadioButton haremos una llamada al procedimiento "ActRefrescarExecute", para que cuando el usuario haga clic sobre uno de los campos a buscar se ordene automáticamente por éste.
  • En el evento ActNuevoExecute pondremos el siguiente código:

 

Lógicamente, para que este procedimiento funcione tendremos que tener las ventanas correspondientes de alta de: recurso, cliente, proveedor, artículo, marca, modelo, técnico y contacto. Este procedimiento es un ejemplo aplicable a un desarrollo de un programa de Gestión, cada uno lo adaptará a sus necesidades

  • En la ventana que hace la llamada a la ventana de selección (en nuestro ejemplo FormGCobro), el botón de abrir selección tendrá el siguiente código:

 

En este botón, para diferenciar el tipo de registro que queramos mostrar en la ventana de selección, utilizamos el "tag" del formulario selección, pasándole el valor de la constante que identifica los registros a mostrar. En este ejemplo "vtNumCliente". Tras cerrarse la ventana de selección, este procedimiento comprueba si se ha seleccionado algún valor, de ser así se lo asignará al campo "codigocliente" de la tabla de cobros que estamos modificando. Como siempre os indicamos esto deberéis adaptarlo a vuestras necesidades.
 
 

 

 

 

 

 

 

NOTAS ADICIONALES

En nuestro caso, el componente de acceso a base de datos, lo hemos colocado en un módulo de datos (Data Module), aunque se podría colocar en el propio formulario. Por ello, cuando nos referimos al componente TQuery ponemos:

md.TCSeleccion

donde "md" es el nombre del módulo de datos y "TCSeleccion" es el nombre del "TQuery".

 

Os mostramos el código completo de una ventana de selección de una de nuestras aplicaciones, AjpdSoft Gestión Integral:

 

 

 

Para realizar este artículo hemos utilizado:

  • MySQL Server 4.1.
  • Borland Delphi 6.

 

 

Créditos:

  • Diseño de la ventana y código por AjpdSoft.
  • Algoritmo de búsqueda automático (mediante temporizador y LIKE) por Antonio RN de RS.