¿Como Filtrar Combox con consulta?

Tengo un formulario en el cual se vacía a una tabla llamada BD_Ordenes.

Tengo mis tablas para hacer combox y las tengo relacionadas para tener las listas desplegables.

Tengo las tablas tab_ubicacion y tab_Equipo.

Primero se selecciona una ubicación y después se filtra los equipos pertenecen a la ubicación previamente seleccionada. Eso se realizó con una consulta y en criterios [Formularios]!

El problema radica que el equipo tiene un código Ejemplo 1000001 - Equipo 1. Si yo empiezo a escribir 1000 se filtra y puedo seleccionarlo, sin embargo si quiero escribir Equi... No se filtra dentro del combo box.

He visto varias soluciones aqui sin embargo ninguna esta con combox que tienen consultas para llamado de datos.

Si alguien sabe como puede hacerse ese filtro por cualquier parte de la cadena.

3 Respuestas

Respuesta
1

Un combo es muy adecuado para seleccionar un elemento de su lista, pero la búsqueda comenzara por la izquierda y saltarse el modo natural (por diseño y gusto de su creador) da más problemas que beneficios.

Es más sencillo utilizar un cuadro de texto y hacer una selección en tiempo real (según se introducen caracteres) y presentarlos en el propio combo que modificar el comportamiento del combo.

Para filtrar un texto por una parte de su contenido se suele utilizar 'Like' (donde) y se le añade un asterisco (*) delante de los caracteres que se introducen para que sea ambiguo su comienzo y otro asterisco al final si se necesita ambigüedad en el final.

Otro método es utilizar InStr (en la cadena) que localiza el comienzo de lo que se busca y de encontrarlo indica el numero de su posición en la cadena, si no lo localiza devuelve un cero.

Localizar "la" en la frase: "En un lugar de la Mancha ... "

Con Like:
"En un lugar de la Mancha ... " Like "*la*"
Devolverá True porque localiza la coincidencia

Con InStr:

InStr("En un lugar de la Mancha ... ", "la")
Devolverá 16 que al ser diferente de cero = True

Gracias. Lo que busco es que aplique la filtrado dentro del mismo combo box

En un combo no se puede aplicar un filtro de forma directa (como se hace en un formulario).
Para modificar el contenido se ha de cambiar su origen de datos (el RowSource, así es como se llama en los combos), no es nada especial o raro.
En múltiples ocasiones (sobre todo para disminuir el volumen de datos a manipular) en lugar de aplicar un filtro se cambia el origen de datos (viene siendo similar a añadir una condición más a las ya impuestas).

El problema que tiene los combos (también los formularios en diferente medida) es que cambiar el origen de datos en tiempo de ejecución 'utilizando el propio objeto para obtener el filtro', es que con mucha facilidad se entra en un bucle, pues al refrescar el contenido para mostrar el resultado, se interfiere en lo que se va introduciendo para filtrar.

Es por ello que se utiliza un elemento externo para la toma de datos y los resultados se mostraran en donde se necesite (combo, cuadro de lista, subformulario ...).

¿Es indispensable que se utilice el propio combo para la toma de datos que van a conformar el filtro?

Respuesta
1

Lo puedes hacer de muchas formas. Lo que sería ideal es que pusieras una imagen del formulario.

Por ejemplo, tengo el formulario productos con un combinado voy a "escribir" una cadena del nombre del `producto

Si, por ejemplo, en el combinado escribo una g, el propio combinado ya sólo me muestra aquellos productos que en su nombre haya una g, esté donde esté.

Si ahora escribo una a, sólo me muestra aquellos productos que en alguna parte de su nombre tienen la cadena GA

Y así, hasta.... Y si elijo, por ejemplo, Tallarines me muestra sólo su registro

En este caso, repito, en este caso, el combinado, al que llamo ElegirOtro, no tiene origen de la fila, y en sus propiedades-Eventos-Al cambiar, le tengo puesto

Private Sub ElegirOtro_Change()
DoCmd.SetWarnings False
ElegirOtro.SetFocus
ElegirOtro.RowSource = "select producto from productos where producto like '*" & Me.ElegirOtro.Text & "*'"
ElegirOtro.Dropdown
ElegirOtro.SetFocus
End Sub

Y en sus propiedades-Eventos-Después de actualizar le tengo puesto

Private Sub ElegirOtro_AfterUpdate()
Me.RecordSource = "select * from productos where producto like '*" & Me.ElegirOtro.Text & "*'"
End Sub

Es decir, que a medida que vaya escribiendo letras en él, su origen de la fila sean aquellos productos de la tabla(consulta) productos en que su nombre tenga, en algún lugar, esa cadena.

Y después, que una vez seleccionado el producto, el origen de registros del formulario sean aquellos productos de la tabla(consulta) productos en que en su nombre esté esa cadena que he escrito en el combinado.

Personalmente, pero no tiene porqué ser artículo de fe, pondría un cuadro de texto y a medida que vaya escribiendo algo en él, automáticamente me vaya filtrando los registros del formulario.

Si ves que te gusta más esta última solución dilo y te la pongo.

Gracias. Lo que busco es que aplique la filtrado dentro del mismo combo box

Te lo pongo en un cuadro de texto, ya que si es sólo para filtrar no necesitas el combo, además es mucho más sencillo. Mira tengo un formulario Productos basado en la tabla del mismo nombre. Con 90 productos, y en el encabezado tengo un cuadro de texto llamado ElegirOtro

Escribo en el cuadro de texto, por ejemplo, una m y automáticamente me lo deja como

Ya sólo quedan 25, aquellos que tienen al menos una m en su nombre. Si ahora escribo una a

Sólo me aparecen los que tienen, en alguna parte de su nombre, la cadena Ma y si escribo una L

Y el código no puede ser más sencillo. En las propiedades del cuadro de texto ElegirOtro, en Eventos-Al cambiar tengo puesto

Private Sub ElegirOtro_Change()
Me.RecordSource = "select * from productos where producto like '*" & Me.ElegirOtro.Text & "*'"
ElegirOtro.SetFocus
End Sub

¿ Que quieres que sea un combinado?, da igual, en sus propiedades-Eventos- Al cambiar le pones lo mismo

Respuesta
1

Igualmente le recomiendo hacer la búsqueda sobre un cuadro de texto. Esta diferencia es notable cuando la tabla es de gran tamaño y ni se diga utilizarlo en tablas vinculadas a otros orígenes de datos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas