You are on page 1of 7

FORMULARIO BUSCADOR AL TECLEO1

Una vez ms debo hacer pblico mi agradecimiento a


Sveinbjorn por compartir este ejemplo con nosotros. Y una
vez ms debo recalcar que mi misin en este ejemplo
nicamente ha sido escribir este documento explicativo;
todo el mrito del ejemplo corresponde a Sveinbjorn.

Y qu conseguimos a travs de este ejemplo? Pues conseguimos


dos cosas: la primera es que, a travs de un cuadro de lista, a
medida que vamos escribiendo en un textbox la lista nos va
depurando los elementos coincidentes con lo que vamos
escribiendo.

La segunda es que el cuadro de lista nos permite seleccionar varios valores de los encontrados,
mostrndonos, tras un click de botn, la informacin referente a aquello que hayamos
seleccionado.

El ejemplo se basa en una agenda de contactos: buscamos el nombre de (o de los)


contacto(s), los seleccionamos y vemos la informacin.

Veamos cmo montar el sistema.

CREANDO NUESTRA TABLA


Para empezar por alguna parte nos montaremos una tabla que guardar los datos de nuestra
agenda. La guardaremos como TAgenda. Algo tan sencillo como esto:

Hasta aqu no hay dificultad. Prosigamos.

CREANDO NUESTRO FORMULARIO FAGENDA


Vamos a crearnos un formulario sobre TAgenda y lo guardaremos como FAgenda. Veris que
hay unos botones para moverse entre los registros, un botn para aadir registros, as como
un botn para cerrar el formulario.

El botn para aadir registros lo vamos a llamar cmdAadir 2 porque veremos que tiene un
tratamiento especial en los cdigos.

Los botones para trabajar con registros han sido creados usando el asistente, por lo que no

1 La BD de ejemplo os la podis bajar aqu


2 Para asignar un nombre a un control lo que debemos hacer es sacar las propiedades de ese control e irnos a la Pestaa Otras
Nombre. Ah escribimos el nombre que queramos.

1
Vistame en http://neckkito.siliconproject.com.ar
cabe destacar nada de ellos. El botn para cerrar el formulario, que se llama cmdCerrar, tiene
el siguiente cdigo3 en el evento Al hacer click:


Private Sub cmdCerrar_Click()
DoCmd.OpenForm "FMenu"
DoCmd.Close acForm, Me.Name
End Sub

Como veis, el cdigo cierra el formulario actual y abre otro que


llamamos FMenu. Hablaremos de este formulario un poco ms
adelante.

El formulario podra quedarnos algo as:

CREANDO NUESTRO FORMULARIO FMENU


A modo de panel de control vamos a crearnos un formulario en blanco, que llamaremos
FMenu. En dicho formulario insertaremos lo siguiente:

- Un botn de comando para aadir un nuevo registro en la agenda. Lo llamaremos


cmdNuevaR.

- Un botn de comando para buscar nombres de la agenda. Lo llamaremos cmdBuscar.

- Un botn de comando para cerrar la aplicacin. Lo llamaremos cmdCerrar.

En el botn cmdNuevaR, en el evento Al hacer click, generaremos el siguiente cdigo:

Private Sub cmdNuevaR_Click()


AbreFormAgenda 1
DoCmd.Close acForm, Me.Name
End Sub

3 Para generar cdigo debemos sacar las propiedades del control Pestaa Eventos, y nos situamos en la parte blanca a la
derecha del evento que queremos programar. Veremos un pequeo botn de puntos suspensivos. Si hacemos click sobre l nos
aparecer una ventana que nos pedir qu operacin deseamos realizar. Le indicamos que queremos generar cdigo.

2
Vistame en http://neckkito.siliconproject.com.ar

Si os fijis la primera lnea de cdigo llama al procedimiento


AbreFormAgenda, y le pasamos como argumento un 1
(uno). Cuando veamos el cdigo del mdulo entenderemos
el sentido de escribir ese 1.

El cdigo, en el mismo evento, para cmdBuscar, ser:


Private Sub cmdBuscar_Click()
DoCmd.OpenForm "FBuscador"
DoCmd.Close acForm, Me.Name
End Sub

Como vemos se abrir un formulario llamado FBuscador, que comentaremos ms adelante.

Finalmente, para cmdCerrar, en el mismo evento, el cdigo ser, simplemente:

Private Sub cmdSalir_Click()


DoCmd.Quit
End Sub

CREANDO NUESTRO FORMULARIO FBUSCADOR


Como ltimo formulario del ejemplo vamos a crearnos un formulario en blanco que
guardaremos como FBuscador.

En el encabezado aadimos un botn que nos servir para cerrar el formulario, que
llamaremos cmdcerrar.

Vamos a crearnos, en la seccin Detalle:

Un cuadro de texto, que llamaremos txtBuscar.

A continuacin nos creamos un cuadro de lista que llamaremos lstPersonas. Cuando nos
aparezca el asistente lo configuramos de la siguiente manera:

Deseo buscar los valores en una tabla


Seleccionamos TAgenda
Aadimos el campo [Nombre]
Ordenamos ascendente por [Nombre]
Redimensionamos a nuestro gusto
Como etiqueta podemos ponerle cualquier valor, puesto que eliminaremos esa etiqueta.

Sacamos las propiedades de lstPersonas y nos vamos a Pestaa Otras Seleccin mltiple, y
fijamos su valor en Extendida.

Para acabar, en el pie del formulario, aadimos un botn de comando, que llamaremos cmdVer.

Nuestro formulario podra habernos quedado as:

3
Vistame en http://neckkito.siliconproject.com.ar
Vamos a por los cdigos de los controles.

En el evento Al hacer click de cmdCerrar el cdigo sera:

Private Sub cmdCerrar_Click()


DoCmd.OpenForm "FMenu"
DoCmd.Close acForm, Me.Name
End Sub

En el mismo evento del botn cmdVer asignamos el siguiente cdigo:

Private Sub cmdVer_Click()


'Declaramos las variables
Dim ctlList As Control
Dim Opcion As Variant
Dim miSeleccion As String
'Iniciamos la estructura del filtro
miSeleccion = "[ID] IN ("

Set ctlList = Me.lstPersonas


'Cogemos los valores seleccionados en el cuadro de lista, y los aadimos al filtro
For Each Opcion In ctlList.ItemsSelected
miSeleccion = miSeleccion & ctlList.ItemData(Opcion) & ","
Next Opcion
'Si la longitud del filtro es 9, es que no seleccionamos ninguna opcion
If Len(miSeleccion) = 9 Then
MsgBox "No has seleccionado ninguna persona", vbInformation, "AVISO"
Exit Sub
End If
'Quitamos la ltima coma (,) del filtro
miSeleccion = Left(miSeleccion, Len(miSeleccion) - 1) & ")"
'Abrimos el mensaje en Modo COnsulta y cerramos el Buscador
Call AbreFormAgenda(3, miSeleccion)
DoCmd.Close acForm, Me.Name
End Sub

Veamos este cdigo:

4
Vistame en http://neckkito.siliconproject.com.ar
Debemos crearnos un filtro para abrir nuestro formulario
FAgenda filtrado. Como el filtro va a depender de la
seleccin que hagamos en el cuadro de lista inicializamos el
filtro con algo que no va depender de dicha seleccin. Ese
algo es

miSeleccion = "[ID] IN ("

Sigamos. Hemos seleccionado, hipotticamente, un o unos valores


en el cuadro de lista. Para saber qu valores son los que se han
seleccionado debemos recorrer todos los elementos de la lista.
Para ello creamos el bucle FOR EACH...NEXT:

For Each Opcion In ctlList.ItemsSelected


miSeleccion = miSeleccion & ctlList.ItemData(Opcion) & ","
Next Opcion

Si os fijis, la variable miSeleccion lo que hace aqu es ir aadiendo los elementos


seleccionados uno tras otro, separndolos con una coma.

Una vez examinados los elementos seleccionados, cmo sabemos que el usuario no ha
seleccionado ninguno? Pues para comprobarlo contamos los caracteres del filtro miSeleccin.
Si recordamos, inicializbamos el filtro con <miSeleccion = "[ID] IN (">, y esa expresin lleva
9 caracteres. Si no ha crecido es porque no se ha seleccionado ningn valor del cuadro de
lista. Ese control nos lo proporciona la lnea:

If Len(miSeleccion) = 9 Then

Si el proceso ha sido correcto la variable miSeleccin contendr una serie de valores, pero
como al construirla bamos aadiendo una coma al final ahora debemos eliminar esa ltima
coma para evitar que el cdigo nos d errores, ya que contendra un error de sintaxis.
Adems, debemos cerrar el parntesis de la lista. Eso es lo que hace la lnea:

miSeleccion = Left(miSeleccion, Len(miSeleccion) - 1) & ")"

Ya tenemos el filtro preparado. Para ello llamamos a la funcin AbreFormAgenda() de la


siguiente manera:

Call AbreFormAgenda(3, miSeleccion)

De nuevo vemos que le pasamos unos argumentos, en este caso un 3 y el contenido de la


variable miSeleccion. Cuando veamos el cdigo del mdulo entenderemos el por qu.

nicamente nos queda ahora el cdigo que nos va a ir filtrando segn escribamos en el
textbox txtBuscar. Para ello, en dicho control, en el evento Al cambiar le generamos el
siguiente cdigo:

Private Sub txtBuscar_Change()


Me.lstPersonas.RowSource = "SELECT TAgenda.ID, TAgenda.Nombre FROM TAgenda" _
& " WHERE TAgenda.Nombre " _
& "LIKE '*" & Me.txtBuscar.Text & "*' ORDER BY Nombre"
Me.lstPersonas.Requery
End Sub

5
Vistame en http://neckkito.siliconproject.com.ar
Lo que hace este cdigo es ir modificando, a medida que se
escribe, el origen del registro de lstPersonas. Para ello, va
creando una SQL que busca por aproximacin en funcin de
lo que estemos escribiendo. Al final de cada pulsacin de
teclado, adems de realizar la SQL de filtro, va refrescando
la informacin de la lista.

CREANDO NUESTRO MDULO


Vamos a aadir un mdulo que guardaremos con el nombre de
mdlCodigos4. En l vamos a escribir el procedimiento que hemos
estado mencionando a lo largo de toda explicacin. El
procedimiento sera el siguiente:

'------------------------------------------------------------------------------------------------
' Procedimiento para abrir el formulario "Agenda" en distintos modos
' Modos: 1=Aadir, 2=Editar, 3=Consultar
'------------------------------------------------------------------------------------------------

Public Sub AbreFormAgenda(Modo As Byte, Optional Filtro As String)


DoCmd.OpenForm "FAgenda", acDesign, , , , acHidden
If Modo = 1 Then
Forms("FAgenda").cmdAadir.Visible = True
Else
Forms("FAgenda").cmdAadir.Visible = False
End If
DoCmd.Close acForm, "FAgenda", acSaveYes
Select Case Modo
Case 1
DoCmd.OpenForm "FAgenda", , , , acFormAdd
Case 2
DoCmd.OpenForm "FAgenda"
Case 3
DoCmd.OpenForm "FAgenda", , , Filtro, acFormReadOnly
End Select
End Sub

Como vemos el procedimiento admite dos parmetros, uno obligatorio (Modo) y otro Opcional
(Filtro).

Los parmetros que le podemos pasar son los nmeros 1, 2 o 3. Con el 1 abriramos el
formulario para poder aadir registros, con el 2 para editarlos y el 3 para consultarlos.

Lo que hacemos en la primera lnea de cdigo es abrir FAgenda en modo diseo y de manera
oculta, para que el usuario no vea que estamos manipulando el formulario.

Si lo abrimos en modo 1 para aadir lgicamente debe verse el botn para aadir registros,
pero si lo abrimos en modo 2 o 3 no debe abrirse. Esto es lo que hace el bloque IF...END IF,
situando la propiedad VISIBLE del botn en TRUE o FALSE segn el modo.

Una vez cambiada la propiedad VISIBLE se cierra FAgenda guardando los cambios.

El bloque siguiente, el SELECT CASE, lo que hace es abrir el formulario FAgenda en vista
formulario en el modo que hemos seleccionado. Si el modo es 1 para aadir aadimos, a la
orden de apertura, el argumento acFormAdd; si el modo es 2 para modificar no le pasamos
argumento alguno; si el modo es 3 para consultar le pasamos el argumento acFormReadOnly.

4 Para insertar un mdulo estndar podemos abrir el editor de VB (ALT+F11) y nos vamos a Men Insertar Mdulo

6
Vistame en http://neckkito.siliconproject.com.ar
Fcil, verdad? ;-)

PARA FINALIZAR EL EJEMPLO


Aunque lo he comentado al principio, agradezco de nuevo a
Sveinbjorn que me haya permitido colgar este ejemplo en la
web.

Espero que el ejemplo os sea til. Un saludo, y...

suerte!

7
Vistame en http://neckkito.siliconproject.com.ar

You might also like