A veces al crear un buscador para nuestra aplicación no hemos tenido en cuenta pequeños detalles, los cuales después nos harán darnos alguna carrera para solucionarlo. Uno de estos detalles, es que a la hora de introducir datos en un formulario, sobre todo en campos de tipo texto, hay gente que tiene el buen hacer de acentuar las palabras según corresponda, aunque no siempre se cumple esa regla ya que puede haber uno o varios registros donde haya puesto “García” y en otros “Garcia”. Lógicamente, esto si no lo hemos tenido en cuenta a la hora de programar con código VBA, en los resultados de una búsqueda nos encontraremos que no nos mostrará todos los datos que realmente hay en la tabla ya que para Access “García” y “Garcia” son dos cosas diferentes.
Por ello, la intención de este ejemplo es dar a conocer los pasos para poder tener en cuenta tal caso y no quedarnos con cara de sorprendido, ¿no crees?
Para ello, lo primero es copiar el siguiente código en un Módulo:
Function Buscaacent(X) On Error GoTo Err_Busca Dim I As Variant, A As Integer, L As Integer, busc As Variant Dim Letra As Variant, vocal As Variant, nuevaletra As Variant Static letras(5) As Variant L = Len(X) busc = X A = 1 letras(1) = "AÁÀÂÄ" letras(2) = "EÉÈÊË" letras(3) = "IÍÌÎÏ" letras(4) = "OÓÒÔÖ0" letras(5) = "UÚÙÛÜ" While> A <= L Letra = Mid(busc, A, 1) For Each I In letras vocal = InStr(1, I, Letra, 1) If vocal > 0 Then nuevaletra = "[" & I & "]" busc = Left(busc, A - 1) & nuevaletra & Right(busc, L - A) A = A + 1 + Len(I) L = L + 1 + Len(I) Exit For End If Next A = A + 1 Wend If busc = "" Then Buscaacent = X Else Buscaacent = busc End If ' Autor: J.Bengoechea Exit_Busca: Exit Function Err_Busca: MsgBox "No hay un dato por el que buscar", vbInformation, "AVISO" Resume Exit_Busca: End Function
Una vez tengamos esto, debemos construir nuestro buscador, el cual ya di unas nociones en otro post. Lo importante es el campo que hace la búsqueda, que es el que va a buscar todos los registros coincidentes vayan acentuados o no. Este es el campo al que me refiero:
Nos vamos a las Propiedades de este campo y en el evento “Después de actualizar”,
Ponemos el siguiente código:
Private Sub Busca_AfterUpdate() Select Case Me.lstSeleccionaCampo Case Is = "Nº Referencia" Me.Lista0.RowSource = "SELECT Clientes.NºReferencia, " _ & "Clientes.NºRef," _ & "Clientes.Nombre " _ & "FROM Clientes " _ & "WHERE [Clientes].[NºRef] LIKE '*" & Busca.Text & "*'" _ & "ORDER BY [NºRef]ASC" Case Is = "Nombre" Me.Lista0.RowSource = "SELECT Clientes.NºReferencia, " _ & "Clientes.NºRef, " _ & "Clientes.Nombre " _ & "FROM Clientes " _ & "WHERE [Clientes].[Nombre] like '*" _ & SinTildes.Buscaacent(Busca.Text) _ & "*' ORDER BY [Nombre]ASC" End Select 'Indica el Nº de registros If Me.Lista0.ListCount = 0 Then Me.txtRegistrosMostrados = "0" Else Me.txtRegistrosMostrados = Me.Lista0.ListCount - 1 End If End Sub
Como podréis observar aquellas opciones que se que sólo llevan texto y en las que puede haber texto acentuado son en donde llamo al módulo SinTildes.Buscaacent(Busca.Text), de tal forma que si hay resultados coincidentes me va a indicar todos los que haya estén o no acentuados.
De tal forma, que siguiendo este ejemplo si yo quiero buscar los registros que se apelliden “García” o “Garcia”, el buscador me arrojará los siguientes resultados, y como podréis comprobar no es necesario en el campo de búsqueda indicarle el apellido completo:
Como podréis observar el buscador ha encontrado todas aquellas coincidencias según lo indicado y ha mostrado todos los resultados estén o no acentuados.
¿Quieres probarlo por ti mismo?. Descárgate los ejemplos y pruébalos.
1- Ejemplo completo del que se ha extraído y resumido para este artículo, donde encontrarás muchos mas filtros que en el ejemplo.
2- Ejemplo resumido. Para hacer mas sencillo el artículo se ha simplificado el archivo original del autor.
hola,
estoy probando este multibuscador y lo estoy sacando bien, tengo un problema, como no!, es que cuando hago el doble click en la ventana lista0, si no hay ningun campo seleccionado me da error, por donde podría encararlo para solucionar el dobleclick sin darle a un registro.
gracias
Por ejemplo podrías controlar si es nulo el Id, mas o menos así:
If isnull(TuCampoId) then Exist sub
Si te fijas Joan en el post hay dos ejemplos, un resumido y un completo, en el ejemplo completo cuando tu haces doble clic en el campo Lista0
If Me.Lista0.ListCount = 0 Then ‘Si no hay registros
MsgBox «No hay Datos para mostrar.», vbCritical, «No Datos»
Exit Sub
End If
Por lo tanto, el ejemplo completo lleva todo lo necesario para que veas el funcionamiento del buscador en su totalidad.
si, pero si la lista0 es diferente de zero y haces click fuera de los resultados da error,
probaré lo del null.
gracias
Lo que no entiendo es pq quieres hacer doble clic fuera de donde está la lista de datos, lo normal es que sobre los resultados dados hagas doble clic y te llevará a su ficha, esa es la función de este ejemplo, pero para subsanar el error, con este código (al hacer doble clic) lo debes solucionar:
Private Sub Lista0_DblClick(Cancel As Integer)
On Error GoTo Err_Lista0_DblClick
Dim rst As Recordset
If Me.Lista0.ListCount = 0 Then ‘Si no hay registros
‘Indícamelo con un mensaje
MsgBox «No hay Datos para mostrar.», vbCritical, «No Datos»
Exit Sub
End If
DoCmd.OpenForm «Clientes»
‘Abre el formulario Clientes
Set rst = Forms!Clientes.RecordsetClone
rst.FindFirst «NºReferencia = » & Me.Lista0
‘Busca el primer registro que la referencia coincida con la que pone el cuadro de lista
Forms!Clientes.Bookmark = rst.Bookmark
‘Establece el registro actual en un objeto Recordset al registro identificado por un marcador válido
DoCmd.Close acForm, «Buscar»
‘Cierra el formulario del buscador
Exit_Lista0_DblClick:
Exit Sub
Err_Lista0_DblClick:
‘MsgBox Err.Description
Resume Exit_Lista0_DblClick
End Sub
Gracias,
Así queda mejor. Y voy aprendiendo, soy aprendíz de todo y maestro de nada.
Saludos
Hola como sería el código si quisiera que automáticamente luego de que pulse o teclee una letra el cuadro de lista se refresque o actualice sin necesidad de darle «Enter». ¿Me podría proporcionar por favor un ejemplo sencillo con esta característica? siempre tal y como lo tiene en el ejemplo sencillo, el cuadro de lista a dos columnas pero la búsqueda solo con texto. Mil Gracias de antemano. Saludos!!!
Muy buenas Dan. Para lo que me propones es tan fácil como el código que hay puesto en el ejemplo del campo «Buscar», el que hace la búsqueda y arroja los resultados sobre la lista, en la acción «Después de Actualizar» (AfterUpdate) lo cortas y lo pegas en la acción «Al cambiar» (Change). Cuando comiences a escribir en el campo «indique la búsqueda» verás como el cuadro de lista mostrará las coincidencias conforme vayas escribiendo.
He de decirte que esto tiene un «pero», si trabajas en local y con pocos datos este no te supondrá ningún problema ahora, si trabajas en red ten en cuenta que por cada letra que escribes el programa envía una orden a la tabla y te devuelve los resultados coincidentes, por lo que si hay una gran cantidad de datos puede haber pequeños retrasos a la hora de mostrar los resultados, sólo para que lo tengas en cuenta.
Estoy trabajando sobre una tabla(1) y necesito que el dato que digite lo busque en otra tabla(2) la cual contiene el mismo campo con las mismas caracteristicas de la anterior tabla(1). Lo he probado con tablas relacionales pero no he podido conseguir que me de un mensaje que el dicho dato digitado ya esta en la segunda tabla(2). Le agradeceria infinitamente a quien me pueda ayudar.
Muy buenas lucho. Hace algún tiempo tenía que averiguar cuando introducía el campo DNI/NIF saber si ya estaba dado de alta en una tabla, por lo tanto creo que se adapta a lo que tu preguntas. Para aclararte un poco más lo que yo hacía es, una vez en el campo DNI/NIF lo introducía donde pulsaba INTRO lo cual me llevaba al siguiente campo que se llamaba «Direccion» donde si encontraba el mismo registro que el introducido me lo decía y encima bloqueaba el resto de los campos del formulario, para que no pudieras seguir introduciendo datos y ponía el campo DNI/NIF en rojo. Usaba este código:
Private Sub Direccion_GotFocus()
Dim Busca As Variant
Dim miBD As Database, miTabla As Recordset
Set miBD = DBEngine.Workspaces(0).Databases(0)
Set miTabla = Me.RecordsetClone
Busca = Me.NIF
If IsNull(Busca) Then
Exit Sub
End If
Set miTabla = miBD.OpenRecordset(«tabla2», dbOpenDynaset) ‘ Abro la tabla 2.
With miTabla
‘ Busca el registro cuyo numero sea el actual.
.FindFirst «NIF =» + «‘» + Busca + «‘» ‘Campo tipo texto
If Not .NoMatch Then ‘ Si se encuentra registro.
MsgBox «Ya existe un registro con este NIF.», vbExclamation, «NIF encontrado»
Me.NIF.ForeColor = 255
Me.Nombre.SetFocus
Me.Direccion.Enabled = False
Me.EMail.Enabled = False
Me.CP.Enabled = False
Me.Localidad.Enabled = False
Me.Provincia.Enabled = False
.Close
‘End If
Else
If .NoMatch Then ‘ Si no se encuentra registro.
Me.NIF.ForeColor = 3355443
Me.Direccion.Enabled = True
Me.EMail.Enabled = True
Me.CP.Enabled = True
Me.Localidad.Enabled = True
Me.Provincia.Enabled = True
.Close
End If
End If
End With
End Sub
Buenos Dias
al dar el codigo
Private Sub lstSeleccionaCampo_Click()
Me.((Busca)).Visible = True (a mi no me aparece la función que esta entre paréntesis )
‘Muestra el campo por el que hago la búsqueda
Que puedo hacer ????
Muy buenas.
Sin una explicación de lo que intentas hacer y algo más de código, no me es posible ayudarte, pero creo que has confundido los términos. «Busca» es un control, un campo dentro de un formulario y que tras actualizarse «AfterUpdate» consigue unos resultados que se muestran en el cuadro de lista.
Buenos Días
Lo que pasa es que no me deja insertar el control (Busca) me da son otras opciones
Discúlpeme si no soy muy claro al explicarme, Me gustaría comunicarme con usted por un inbox
Gracias
Perfecto. Pues indíqueme una dirección de correo electrónico y lo vemos.
sergioduvan9@gmail.com Gracias por su atencion
Buenos dias,
He usado el ejemplo para crear una busqueda de mi base de datos. sin embargo al hacer doble click o click y enter, abre el otro formulario con todos los datos del proveedor, pero siempre abre en el primer registro de la base de datos, no en el registro que yo busco.
este es el codigo adaptado a mi BBDD
Private Sub Lista0_DblClick(Cancel As Integer)
Dim Rs As Recordset
If Me.Lista0.ListCount = 0 Then ‘Si no hay registros
MsgBox «No hay datos para mostrar.», vbCritical, «No Datos»
‘Indicamelo con un mensaje
Exit Sub
End If
DoCmd.OpenForm «Clientes»
‘Abre el formulario Clientes
Set Rst = Forms!Clientes.RecordsetClone
Rst.FindFirst «ID = » & Me.Lista0
‘Busca el primer registro que la referencia coincida con la que pone el cuadro de lista
Forms!Clientes.Bookmark = Rst.Bookmark
‘Establece el registro actual en un objeto Recordset al registro identificado por un marcador válido
DoCmd.Close acForm, «Busqueda»
‘Cierra el formulario del buscador
End Sub
Saludos cordiales