Está en la página 1de 4

FILTRO POR COMBO EN FORMULARIO1

INTRODUCCIÓN
Antes de nada, tened en cuenta que este ejemplo NO es
compatible con Access 2003. Sólo funcionará con Access
2007 y superior.

Prosigamos: tenemos un formulario con un subformulario


relacionado. Y a través de un combo queremos filtrar
valores. Vamos a ver cómo podemos conseguir ese filtro.

Desarrollaremos un ejemplo utilizando unos trabajadores de una empresa, a los cuales se les
conceden unos adelantos de nómina.

Como siempre, tened en cuenta que yo utilizaré los campos mínimos necesarios. Vosotros
podéis añadir, lógicamente, todos los campos que necesitéis.

PREPARANDO NUESTRAS TABLAS


En primer lugar debemos preparar la tabla que contendrá los datos principales de los
trabajadores. Nos creamos pues la siguiente tabla, que llamaremos TEmpleados:

En segundo lugar debemos preparar la tabla que será origen a la vez de un formulario y de un
subformulario. A esta tabla la llamaremos TAdelantos, y tendrá la siguiente estructura:

Fijaos que [IdEmpl] se ha configurado a través del asistente. La configuración ha sido la


siguiente:

• Deseo buscar valores en otra tabla o consulta


• Elegimos TEmpleados
• Elegimos los campos [IdEmpl] y [NomEmpl]
• Ordenamos ascendente por [NomEmpl], por ejemplo
• Ocultamos la columna clave, si no queremos ver los códigos de empleado, o si nos es
de utilidad la mostramos (a gusto del consumidor). Redimensionamos, si lo
consideramos conveniente, la columna correspondiente al nombre del empleado
• Dejamos el nombre que le habíamos puesto al campo

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

1
Visítame en http://siliconproject.com.ar/neckkito/
Nos daremos cuenta de que el proceso se ha completado porque ahora nuestro campo
[IdEmpl] de TAdelantos se mostrará como de tipo numérico.

CONFIGURANDO NUESTROS
FORMULARIOS
Vamos a crearnos una serie de formularios. Empecemos:

1.- Creamos un formulario en blanco que nos hará de menú. Lo


llamaremos FMenu.
2.- Creamos un formulario basado en la tabla TEmpleados, y lo llamamos FEmpleados
(eliminamos el subformulario que nos habrá salido por defecto).
3.- Creamos un formulario basado en la tabla TAdelantos y lo llamamos FAdelantos.
4.- Creamos un formulario basado en la tabla TEmpleados, y lo llamamos FEmpleadosFiltro
(este formulario sufrirá algunas transformaciones, por lo que en principio lo dejaremos tal y
como nos sale).

FORMULARIO FMENU
Vamos a insertar una serie de botones para poder operar con el resto de formularios. Así,
añadimos un primer botón de comando y le ponemos de nombre2 cmdAbreFEmpleados.

En el evento “Al hacer click” de ese botón (Propiedades → Pestaña Eventos) generamos el
siguiente código3:


Private Sub cmdAbreFEmpleados_Click()
'Cerramos el formulario actual
DoCmd.Close acForm, Me.Name
'Abrimos FEmpleados para añadir un nuevo registro
DoCmd.OpenForm "FEmpleados", , , , acFormAdd
End Sub

Fijaos que el código abre FEmpleados ya preparado para introducir un nuevo registro. Si
quisiéramos que lo abriera para mostrar todos los registros introducidos deberíamos haber
escrito, simplemente:

DoCmd.OpenForm "FEmpleados"

Añadimos un nuevo botón para abrir FAdelantos, y le ponemos de nombre cmdAbreFAdelantos.

El código del evento “Al hacer click” sería:


Private Sub cmdAbreFAdelantos_Click()
DoCmd.Close acForm, Me.Name
DoCmd.OpenForm "FAdelantos", , , , acFormAdd
End Sub

2 A partir de ahora, cuando me refiera a cualquier control y diga “le ponemos de nombre” me estoy refiriendo al proceso de sacar las
propiedades del control → Pestaña Otras → Nombre, y ahí escribimos el nombre propuesto.
3 Para generar código nos ponemos en la parte en blanco junto al evento que queramos, y veremos cómo nos aparece un pequeño
botón de puntos suspensivos. Si hacemos click sobre él nos aparecerá una ventana. Le decimos que queremos generar código.
Se nos abrirá el editor de VB, con dos líneas por defecto (Private Sub... y End Sub). Esas dos líneas no deben tocarse. El código lo
escribimos entre dichas líneas

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

Añadimos un tercer botón, que llamaremos


cmdAbreFEmpleadosFiltro, que tendrá el siguiente código
en el evento “Al hacer click”:


Private Sub cmdAbreFEmpleadosFiltro_Click()
DoCmd.Close acForm, Me.Name
DoCmd.OpenForm "FEmpleadosFiltro", , , , acFormEdit
Forms!FEmpleadosFiltro.AllowAdditions = False
End Sub

Fijaos que, en esta ocasión, abro el formulario para edición/consulta (acFormEdit) y que a
través de (Forms!FEmpleadosFiltro.AllowAdditions = False) impido que se puedan dar de alta
nuevos registros.

FORMULARIO FEMPLEADOS
Aquí simplemente, en el encabezado del formulario, añadimos un botón de comando, que
llamaremos cmdCerrar, cuyo evento “Al hacer click” tendrá el siguiente código:


Private Sub cmdCerrar_Click()
DoCmd.Close acForm, Me.Name
DoCmd.OpenForm "FMenu"
End Sub

FORMULARIO FADELANTOS
Al igual que hemos hecho con FEmpleados, añadimos, en su encabezado, un botón de
comando que llamamos cmdCerrar y que tendrá exactamente el mismo código que cmdCerrar
de FEmpleados.

FORMULARIO FEMPLEADOSFILTRO
Quizá no necesitemos toda la información que nos aparece en ese formulario, sino sólo la que
consideramos más relevante. En nuestro ejemplo vamos a borrar el campo [FechAlta].
Evidentemente lo anterior es sólo una idea, por si puede seros útil. Si los necesitamos dejamos
todos los campos y “a otra cosa, mariposa”.

En el encabezado del formulario vamos a añadir un cuadro combinado, que llamaremos


cboFiltro. Cuando nos aparezca el asistente lo configuramos así:

• Deseo buscar los valores en una tabla o consulta


• Seleccionamos la tabla TEmpleados
• Elegimos los campos [IdEmpl] y [NomEmpl]
• Ordenamos por el campo que nos sea más útil
• Como ya hemos comentado, mostramos o no la clave principal según nuestras
preferencias, y redimensionamos la/las columna/s mostrada/s
• Marcamos la opción: Recordar el valor para utilizarlo más adelante
• Como etiqueta podemos poner algo así como “Seleccione el empleado a filtrar”

3
Visítame en http://siliconproject.com.ar/neckkito/
Ahora debemos programar el código. Así, en el evento “Después
de actualizar” del combo generamos el siguiente código:


Private Sub cboFiltro_AfterUpdate()
'Declaramos las variables
Dim vEmpl As Long
Dim miFiltro As String
'Cogemos el empleado seleccionado
vEmpl = Nz(Me.cboFiltro.Value, 0)

'Si no hay valor en el combo sale del proceso


If vEmpl = 0 Then Exit Sub
'Creamos el filtro
miFiltro = "[IdEmpl]=" & vEmpl
'Aplicamos el filtro
Me.Filter = miFiltro
'Ejecutamos el filtro
Me.FilterOn = True
End Sub

Ahora sólo nos queda añadir un botón de comando para cerrar el formulario, que como ya
habréis adivinado se llamará cmdCerrar y tendrá el mismo código que cmdCerrar de
FEmpleados o FAdelantos.

Cuando seleccionemos un valor el formulario nos filtrará por el empleado seleccionado, que a
su vez hará que el subformulario quede filtrado por los registros que afectan a ese trabajador.

¡Y listo!

PARA FINALIZAR
Sólo cabe resaltar del ejemplo que al utilizar un asistente para búsquedas para definir el tipo
de campo ha sido el propio Access el que ya nos ha creado, por defecto, los subformularios
relacionados. De esta manera nos hemos ahorrado el tener que crear esos subformularios y
relacionarlos con un formulario principal. Y, como reza el dicho, “a caballo regalado no le mires
el dentado” 

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

¡suerte!

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

También podría gustarte