Anda di halaman 1dari 4

FORMULARIO BUSCADOR AL TECLEO (2)1

INTRODUCCIÓN
El ejemplo del formulario buscador al
tecleo surgió como consecuencia de una
consulta que me planteó en
TodoExpertos nuestro amigo Dan Ochoa. Ahora me planteó
otra nueva pregunta sobre este tema, y cito:
“De qué manera podría hacer la búsqueda pero separando los apellidos por un espacio, por
ejemplo tecleando en el cuadro de texto:
MA GO CA y me dé como resultado, por ejemplo:
MA - Nombre
GO - Apellido Paterno
CA - Apellido Materno

MAnuel GOnzalez CAmacho


MAnolo GOmez CAstro
MArtin GOnzalez CArrillo

O simplemente tecleando en tanto no le dé espacio me busque en cualquier parte a como lo


vengo haciendo.”

Me apreció un “reto” interesante y he aquí la forma de lograrlo.

MODIFICANDO LAS TABLAS Y FORMULARIOS


Para este supuesto, es necesario separar el campo Nombre en tres campos (Nombre, Apellido1
y Apellido2) para poder realizar búsquedas por cada elemento.

Por tanto pasaremos de esto: a esto otro :

(De paso le cambié los nombres a los campos por unos más “correctos”)

Obviamente, tendremos que modificar FAgenda para adaptarlo a los nuevos campos y
nombres:

1 La BD de ejemplo os la podéis bajar aquí

1
Visítame en http://neckkito.siliconproject.com.ar
MODIFICANDO NUESTRO FORMULARIO FBUSCADOR
Ahora, como tenemos 3 campos en vez de uno sólo para el nombre, hemos de modificar el
cuadro de lista. Para ello, le asignamos como origen de la fila esta SQL:

SELECT TAgenda.ID, [Nombre] & " " & [Apellido1] & " " & [Apellido2] AS NombreCompleto
FROM TAgenda ORDER BY [Nombre] & " " & [Apellido1] & " " & [Apellido2];

Es decir, nos creamos un nuevo campo (NombreCompleto) como la unión de los 3


nuevos, para tener el cuadro de lista similar al que teníamos antes, y así conseguimos que se
muestren en una única columna.

La gracia del asunto está en el código asociado al evento “Al cambiar” del cuadro de texto, que
ahora queda así:

Private Sub txtBuscar_Change()


If InStr(Me.txtBuscar.Text, " ") = 0 Then 'Si no se pulsó la barra espaciadora (si no hay espacio
en blanco)
Me.lstPersonas.RowSource = "SELECT TAgenda.ID, [Nombre] & ' ' & [Apellido1] & ' ' &
[Apellido2] AS NombreCompleto " _
& "FROM TAgenda " _
& "WHERE Nombre & ' ' & Apellido1 & ' ' & Apellido2 LIKE '*" &
Me.txtBuscar.Text & "*' " _
& "ORDER BY [Nombre] & ' ' & [Apellido1] & ' ' & [Apellido2]"
Me.lstPersonas.Requery
Else
Dim mMatriz() As String
'Dividimos la cadena en tantos trozos como cadenas separadas por espacios tenemos
'(Aunque realmente sólo vamos a trabajar con 3)
mMatriz = Split(Me.txtBuscar.Text)
'Vemos el último índice de la matriz, para saber cuántos elemento contiene
Select Case UBound(mMatriz)
Case 1 'Matriz de dos elementos (nombre y primer apellido)
Me.lstPersonas.RowSource = "SELECT TAgenda.ID, [Nombre] & ' ' & [Apellido1] & ' ' &
[Apellido2] AS NombreCompleto " _
& "FROM TAgenda " _

2
Visítame en http://neckkito.siliconproject.com.ar
& "WHERE Nombre Like '" & mMatriz(0) & "*' AND Apellido1 Like '" &
mMatriz(1) & "*' " _
& "ORDER BY [Nombre] & ' ' & [Apellido1] & ' ' & [Apellido2]"

Case 2 'Matriz de tres elementos (nombre, primer apellido y segundo apellido)


Me.lstPersonas.RowSource = "SELECT TAgenda.ID, [Nombre] & ' ' & [Apellido1] & ' ' &
[Apellido2] AS NombreCompleto " _
& "FROM TAgenda " _
& "WHERE Nombre Like '" & mMatriz(0) & "*' AND Apellido1 Like '" &
mMatriz(1) & "*' " _
& " AND Apellido2 Like '" & mMatriz(2) & "*' " _
& "ORDER BY [Nombre] & ' ' & [Apellido1] & ' ' & [Apellido2]"
End Select
End If
End Sub

El código se inicia comprobando si en lo escrito en el cuadro de texto hay un espacio


en blanco. Para eso uso la función InStr para buscar la posición del espacio en blanco. Si no
hay ningún espacio, la función devuelve el valor 0 y ejecutamos el código que ya teníamos, es
decir, el cuadro de lista se filtra por cualquier parte

Cuando hay algún espacio en blanco, declaramos una variable matriz de tipo
texto(Dim mMatriz() As String) y le asignamos los elementos (que serán el número de
espacios en blanco más 1) por medio de la función Split() (mMatriz = Split(Me.txtBuscar.Text))

A continuación, vemos cuántos elementos contiene mMatriz(), aunque al tener tres


campos sólo vamos a tener en cuenta los 3 primeros (el primero para el nombre, el segundo
para el primer apellido y el tercero para el segundo apellido). Esto lo hacemos por medio de
Select Case UBound(mMatriz)

Si Ubound(mMatriz) devuelve 1, tenemos dos elementos (o lo que es lo mismo, se


pulsó una vez la barra espaciadora) y por tanto buscaremos el nombre que empiece por los
caracteres escritos antes del espacio (primer elemento de mMatriz) y al mismo tiempo, el
primer apellido que empiece por los caracteres después del espacio. ("WHERE Nombre Like '" &
mMatriz(0) & "*' AND Apellido1 Like '" & mMatriz(1) & "*')

Si Ubound(mMatriz) devuelve 2, tenemos tres elementos (o lo que es lo mismo, se


pulsó dos veces la barra espaciadora) y por tanto buscaremos el nombre que empiece por los
caracteres escritos antes del espacio (primer elemento de mMatriz), el primer apellido que
empiece por los caracteres después del primer espacio, y el segundo apellido que empiece por
los caracteres después del segundo espacio. "WHERE Nombre Like '" & mMatriz(0) & "*' AND
Apellido1 Like '" & mMatriz(1) & "*' AND Apellido2 Like '" & mMatriz(2) & "*' ")

Lo interesante de este método, además de poder buscar “por partes” o en “general”,


es que si empiezas con un espacio en el cuadro de texto, te filtrará el cuadro de lista por los
primeros apellidos que empiezan con lo tecleado, y si empiezas con dos espacios, puedes filtrar
por el segundo apellido,

3
Visítame en http://neckkito.siliconproject.com.ar
Espero que os resulte interesante este sistema y le podáis sacar partido en vuestras
BDs.

4
Visítame en http://neckkito.siliconproject.com.ar

Anda mungkin juga menyukai