Crear 2 combos dependientes para incorporar al filtro de datos

Es una pregunta para Jacinto Trillo

Hola Jacinto

La idea es crear 2 combos dependientes, en el primero tendríamos como valores algunos campos de la tabla "Libros" .

Creamos un primer combo dependiente "CboCampos" u otro nombre, cuyos valores sean los algunos de los propios campos de la tabla (IdLibro, titulo, autor, genero, coleccion, tipodocumento, categoria, materia, idioma, año).
Ahora seleccionaríamos uno de esos campos para filtrar, y tendríamos un segundo combo "CboDatos" u otro nombre, que mostraría solo los datos del campo seleccionado en el primer combo, seleccionaríamos un valor y pulsaríamos BtnFiltrar, que es el Filtro que estamos usando.

Por ejemplo si hemos elegidos el campo "Titulo" en el primer combo, en este segundo combo, los valores del desplegable serían nombres de títulos y si hemos elegido en el CboCampos, el campo "Genero" en el segundo combo vería como valores al desplegar, el nombre de todos los géneros.

Lo único que habría que tener en cuenta es que los valores no se repitieran en el desplegable.

Así podría saber qué libros tengo de un Genero por ejemplo "Narrativa", o qué libros tengo de un idioma por ejemplo "inglés" o de una determinada materia, etc.

Sería para implementarlo en la Bd.

1 respuesta

Respuesta
1

Rafa: No lo veo difícil de programar, pero el resultado que obtendríamos sería el siguiente:

Elegimos el Campo Titulo >> En el combo Datos tendríamos "Todos los Títulos" de la BD.

Te haré una Opción en la BD que tengo y te lo incorporo en el próximo envío.

Aquí pondré las líneas de código necesarias para hacer lo que comentas.

Mis saludos >> Jacinto

Rafael: Ampliando mi respuesta anterior, resumo todo lo que puedo, sin mucho sacrificio de la Explicación.
En el Formulario donde queremos hacer la Búsqueda insertamos 2 ComboBox.
Ejemplo de Nombres >> CboCampos y CboCampoElegido
Para el Primero vamos a Propiedades y en el Origen de la Fila Ponemos >> SELECT * FROM LIBROS;
En Tipo de Origen de la Fila >> Lista de campos
En la pestaña de Formato >> Numero de Columnas >> 1
Y las dimensiones las que se necesiten.
Creamos el Procedimiento CboCampos_AfterUpdate

Private Sub CboCampos_AfterUpdate()
On Error GoTo CboCampos_AfterUpdate_TratamientoErrores

'Para que el CboCampoElegido tome los Valores de acuerdo al Campo seleccionado
Me.CboCampoElegido = Null
Dim CampoSeleccionado As String
CampoSeleccionado = Me.CboCampos.Column(0)
Me.CboCampoElegido.RowSource = "SELECT DISTINCT " & CampoSeleccionado & " FROM LIBROS;"
Me.CboCampoElegido.Requery

CboCampos_AfterUpdate_Salir:
On Error GoTo 0
Exit Sub
CboCampos_AfterUpdate_TratamientoErrores:
MsgBox "Error " & Err.Number & " en Procedimiento.:CboCampos_AfterUpdate de Documento VBA: Formulario FiltroGeneral (" & Err.Description & ")"
Resume CboCampos_AfterUpdate_Salir
End Sub
Vamos al CboCampoElegido.
En las Propiedades >> El Origen de la Fila la dejaremos en Blanco
El Tipo de Origen de la Fila >> Tabla/Consulta
En la Pestaña Formato >> Numero de Columnas = 1
En el AfterUpdate del Combo CboCampoElegido programamos las Acciones que hagan lo que deseamos.
Saludos >> Jacinto

Hola Jacinto

Al final estos combos deben estar vinculados o no "and" "or"a las demás opciones del filtrado como editorial, fechas alta-baja, existentes si/no. Deben entenderse como más opciones del filtrado que devolverán registros al seleccionar el botón "BtnFiltra".

Si se toman aisladamente con estos 2 combos se puede saber por ejemplo del campo Genero, (valor del CboCampo) cuántos libros tengo de "Narrativa" (valor del CboCampoElegido) pero si forman parte del conjunto de opciones del filtro general "BtnFiltra" podemos ponerle a esta selección de Genero y Narrativa, también las fechas alta y baja, existentes o no, la editorial, los autores, etc.

Es decir podríamos saber del género narrativa no solo los libros que tengo sino de qué editorial tengo más libros de ese género y cuántos se dieron de baja en una determinada fecha o de qué autores tengo más narrativa. Por eso el interés de meterlo como más opciones del filtro "BtnFiltra".

Me decías en otra ocasión que el funcionamiento del filtro a usar en la Bd es el "And acumulado"

pero también creo que hemos usado el "OR" porque si yo selecciono en el cboN01 de la Bd, un autor y pulso el botón del filtro también me encuentra registros.

Si fuera posible me gustaría que estos 2 combos nuevos "cboCampos" y "CboCampoElegido" interactuaran con las demás opciones o no... con el "CboN01" que es el autor, con el  "CboN02" que es la ediorial, el "CboN06" de si Existe o no, las fechas alta baja... es decir que formaran parte del filtro, como "And Acumulado" y como "OR" creo, éste último quiero decir que si solo actualizo el CboCampos y el CboCampoElegido me devuelva también registros el filtro. Pero supongo que lo de incorporar estas opciones al filtro ya lo habías tenido en cuenta.

Un saludo y ya me cuentas

Hola Jacinto

He estado estudiando el último ejemplo que me pasaste...

Lo primero decirte que no hagas caso a nada de lo que te digo en mi anterior respuesta... Mi ignorancia me hace decir muchas necedades.

      "Al final estos combos deben..."

No había entendido todo lo bien que necesitaba el funcionamiento de los filtros.

Es mejor construir como he visto en la Bd, los filtros con las distintas opciones y luego combinarlos con And para formar el filtro general y ya está.

Si quieres por otro lado pon la opción del CboCampos y el CboCampoElegido como me dijiste sin más.

Un saludo

Rafa: No te preocupes que todo se andará.

Te comento en breve plazo. Mis saludos >> jacinto

Hola Jacinto

Quería comentarte que en  el CboCampoElegido se ha hecho solo para campos con tipo de datos de texto y funciona todo bien salvo cuando selecciono en el CboOrdenar los campos:

IDLIBRO                                    (tipo autonumérico)

AÑO                                            (tipo numérico)

EXISTENTE                                (tipo si/no)

FECHAALTA y FECHABAJA   (tipo fecha)

Supongo que para estos caso habría que añadir algo a:

If not isnull (me.CboCampoElegido) and me.CboCampoElegido <>"" then

Dim FiltroCampo as string

FiltroCampo= CampoSeleccionado & " = ' " & me.CboCampoElegido & " ' "

me.Filter= FiltroCampo

Me.FilterOn = true

me.CboCampoElegido = Null

end if

end sub

Un saludo y gracias por la ayuda con la Bd

Rafa: Como tu comentas, la instrucción corresponde a un Campo de Texto.

Se que vas haciendo tus ensayos y al final vas saliendo, y creo que ese es el modo de progresar.

En éste caso, creo que podrías ponerte como ejercicio el sondeo del tipo de Campo antes de pasarlo al Filtro.

Lo puedes hacer con un Select Case o If .......Then

Si al final ves que no te sale, creo que sería bueno el hacer una pregunta nueva, ya que las que se alargan mucho, los usuarios en general no las leen completas. El texto creo que podría ser más o menos así:

Como sondear el "Tipo" de Campo de una Tabla para aplicar un filtro a Formulario

Mis saludos >> Jacinto

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas