Está en la página 1de 4

BÚSQUEDA EN DIFERENTES CAMPOS DE LA

MISMA TABLA1

A raíz de una “amable petición” os propongo este ejemplo.


Como el título indica, vamos a realizar una búsqueda por
aproximación no sólo en un campo de la tabla, sino en
varios, y vamos a poder ver los resultados de dicha
búsqueda en un formulario auxiliar.

Una vez tengamos esos resultados podremos seleccionar el


registro que nos interese y utilizarlo como elemento de
filtro.

Creo que la idea está clara, ¿verdad? Pues vamos a ello.

MIS TABLAS Y MIS FORMULARIOS


Imaginemos que tenemos unos clientes en una tabla con una serie de datos (¡más de los que
veis en la ilustración!). Esa tabla la llamaremos TClientes, y tendrá la siguiente estructura.

Vamos a crearnos un formulario continuo (varios elementos) sobre la anterior tabla, que
llamaremos FClientes.

En ese formulario, en su encabezado, vamos a añadir un cuadro de texto que nos servirá como
elemento de búsqueda. A este textbox lo llamaremos txtBusca 2, y añadiremos a su lado un
botón de comando que llamaremos cmdBusca. Finalmente, a su derecha, añadiremos un botón
que llamaremos cmdLimpiar. Más o menos como os muestro a continuación:

1 La BD de ejemplo os la podéis 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 Pestaña Otras →
Nombre. Ahí escribimos el nombre que queramos.

1
Visítame en http://neckkito.siliconproject.com.ar
UNA TABLA INESPERADA... O NO
Como vamos a realizar la búsqueda, para este ejemplo,
sobre los campos de nombre, primer apellido y segundo
apellido vamos a crearnos una tabla auxiliar que nos recoja
los resultados de la búsqueda. A esta tabla la llamaremos
TAux y tendrá los campos que comentábamos más el código
de cliente, que será el que utilizaremos como criterio de
filtro. La tabla podría tener la siguiente estructura:

Fijaos en unos detalles importantes:

• El código cliente es numérico (entero largo) porque nuestro código de cliente lo hemos
definido como autonumérico. Si, por ejemplo, lo hubiéramos definido como texto en
TClientes en TAux también lo deberíamos haber definido como texto. Es importante que
haya una correcta equivalencia entre los tipos de campo.

• Los tres campos restantes, en TClientes, yo los he definido con un tamaño del campo
de 25, por lo que en TAux también los defino con un tipo de tamaño de 25. Si no hay
también esta equivalencia entre tamaños podemos encontrarnos con datos truncados.
En consecuencia, también es importante mantener esta homogeneidad en cuanto al
tamaño de los campos.

Una vez tenemos esta tabla auxiliar vamos a crearnos un formulario continuo sobre TAux, que
llamaremos FAux. Vamos a añadir un botón de comando a la izquierda del código de cliente
para poder seleccionar el que nos interese, y que llamaremos cmdSeleccionar. A mí me ha
quedado así:

Vamos a sacar las propiedades de este formulario y nos vamos a ir a la Pestaña Otras, y ahí
situaremos en SÍ las propiedades emergente y modal.

A continuación modificaremos algunas propiedades más:

• Pestaña Formato:
◦ Centrado automático: SÍ
◦ Estilo de los bordes: DIÁLOGO
◦ Selectores de registro: NO
◦ Botones de desplazamiento: NO

2
Visítame en http://neckkito.siliconproject.com.ar
PROGRAMANDO NUESTROS CÓDIGOS
Vamos a empezar calentando con un código sencillito. Así,
en FClientes, en el evento “Al hacer clic” del botón
cmdLimpiar generaremos el siguiente código3:


Private Sub cmdLimpiar_Click()
With Me
'Limpiamos el valor del textbox
.txtBusca.Value = Null
'Quitamos el filtro del formulario
.FilterOn = False
End With
End Sub

Vamos a por el botón cmdBusca. En el mismo evento “Al hacer clic” vamos a generar el
siguiente código:

….
Private Sub cmdBusca_Click()
'Declaramos las variables
Dim elValor As String
Dim miSql As String
Dim i As Long
Dim losCampos(1 To 3) As String
'Cogemos el valor del textbox
elValor = Nz(Me.txtBusca.Value, "")
'Si no hay valor salimos
If elValor = "" Then Exit Sub
'Eliminamos los valores que pudiera haber en TAux
CurrentDb.Execute ("DELETE FROM TAux")
'Nos rellenamos la matriz con los nombres de los campos
'sobre los que queremos realizar la búsqueda en TClientes
losCampos(1) = "NomCli"
losCampos(2) = "Apell1Cli"
losCampos(3) = "Apell2Cli"
'Como vamos a buscar sobre 3 campos realizamos un bucle FOR con
'3 pasadas
For i = 1 To 3
'Creamos la SQL que buscará sobre los sucesivos campos
miSql = "INSERT INTO TAux (CodCliAux, NomCliAux, Apell1Aux, Apell2Aux)" _
& " SELECT TClientes.CodCli, TClientes.NomCli, TClientes.Apell1Cli," _
& " TClientes.Apell2Cli FROM TClientes" _
& " WHERE TClientes.[" & losCampos(i) & "] LIKE '*" _
& elValor & "*'"
'Ejecutamos la consulta
CurrentDb.Execute (miSql)
Next i
'Abrimos el formulario de resultados. Nos aseguramos de abrirlo en modo
'sólo lectura para que no se puedan modificar los datos.
DoCmd.OpenForm "FAux", , , , acFormReadOnly

Echemos un vistazo al código:

Los campos que vamos a buscar se almacenan en una matriz <losCampos()>. Como en el
ejemplo vamos a buscar en tres campos yo la he declarado así:

Dim losCampos(1 To 3) As String

3 Para generar código debemos sacar las propiedades del control → Pestaña Eventos, y nos situamos en la parte “blanca” a la
derecha del evento que queremos programar. Veremos un pequeño botón de puntos suspensivos. Si hacemos clic sobre él nos
aparecerá una ventana que nos pedirá qué operación deseamos realizar. Le indicamos que queremos “generar código”.

3
Visítame en http://neckkito.siliconproject.com.ar
Si necesitáramos más o menos campos deberíamos dimensionarla en función del número de
campos. Por ejemplo, si realizáramos la búsqueda en 4 campos la deberíamos declarar así:

Dim losCampos(1 To 4) As String

En consecuencia, al asignar valores a la matriz, tendríamos


que haber añadido ese cuarto campo, por ejemplo así:

losCampos(1) = "NomCli"
losCampos(2) = "Apell1Cli"
losCampos(3) = "Apell2Cli"
losCampos(4) = "Otros"

Sigamos: con la misma tónica, como son tres campos i va de 1 a 3. Si necesitáramos cuatro
campos el inicio bucle FOR debería haber sido así:

For i = 1 To 4

Lo que hace el código en el bucle FOR es buscar, en una primera pasada, en el primer campo a
través de la SQL y anexar los datos que encuentra; buscar en el segundo campo en la segunda
pasada y así sucesivamente.

Para finalizar sólo necesitaríamos programar el botón que hemos ubicado en el formulario
FAux. Para ello debemos generar, en el evento “Al hacer clic” de cmdSeleccionar, el siguiente
código:


Private Sub cmdSeleccionar_Click()
'Filtramos FClientes por el código cliente del registro seleccionado
With Forms!FClientes
.Filter = "CodCli=" & Me.CodCliAux.Value
.FilterOn = True
End With
'Cerramos FAux
DoCmd.Close acForm, Me.Name
End Sub

¿Qué pasaría si mi [CodCli] fuera un campo de tipo texto? Pues que el filtro debería escribirse
entre comillas simples, así:

.Filter = "CodCli='" & Me.CodCliAux.Value & "'"

PARA FINALIZAR EL EJEMPLO


Bueno... Creo que con todo lo anterior ya tendríamos claro la sistemática para crearnos un
filtro que busca en diferentes campos de una tabla.

Espero que os pueda ser útil. Un saludo, y...

¡suerte!

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