Access – Como construir filtros al abrir un formulario

Vamos a ver cómo utilizar en Access el parámetro “WhereCondition”, del comando “DoCmd.OpenForm”  a la hora de abrir un formulario mediante código VBA. En este artículo utilizaré filtros simples pero se pueden mejorar y complicar tanto como necesidades tenga nuestra aplicación. Me reservo para otro artículo la creación de filtros más complejos.

La sintaxis para abrir un formulario desde el editor de código VBA es muy sencilla:

DoCmd.OpenForm “NombreDelFormulario”,  ,  , Condición

La condición es opcional, si no la usamos se abrirá el formulario con todos los registros. Sin embargo podemos limitar los registros a mostrar añadiendo una condición.

Lo ilustraremos con un ejemplo sencillo, tenemos un formulario de clientes “frmClientes” con cuatro campos, para no liar mucho el ejemplo:

Campo Tipo de datos
CodigoCliente Numérico
CIF Texto
Nombre Texto
FechaAlta Fecha/Hora

 

En otro formulario tenemos un cuadro de texto “txtFiltro”  que utilizaremos para escribir el filtro y un botón “btnClientes” para abrir el formulario “frmClientes” y vamos a suponer tres casos distintos de filtrado según el tipo de datos del campo que vamos a filtrar.

  1. Por código de cliente, que es un campo numérico, por ejemplo, el cliente Nº 2568
  2. Por  CIF que es un campo texto, por ejemplo “30840146H”
  3. Por Fecha Alta, por ejemplo, los clientes dados de alta después del 01/01/2013

Vayamos con el primer caso, filtro numérico:

Access Filtro Número

La sintaxis para abrir el formulario desde el botón “btnClientes” es la siguiente

Private Sub btnClientes_Click()

DoCmd.OpenForm “frmClientes”,  ,  , “CodigoCliente=” & Me.txtFiltro

End Sub

Como puedes comprobar, la condición del método Openform se pone entre comillas dobles, sin embargo, al tener que hacer referencia a un cuadro de texto situado en el formulario, esta referencia, se ha de hacer fuera de las comillas, por eso después del símbolo “=” cerramos comillas y con el “&”, símbolo que se utiliza para concatenar cadenas de caracteres, unimos la condición al contenido del cuadro de texto Me.txtFiltro. Si en el cuadro de texto hemos puesto el número 2568, Access entenderá la orden de la siguiente manera:

Private Sub btnClientes_Click()

DoCmd.OpenForm “frmClientes”,  ,  , “CodigoCliente=2568”

End Sub

Lo que viene a significar “Abre el formulario de clientes donde el Código de cliente sea igual a 2568”

Vamos con el segundo caso, filtro de texto:

 Access Filtro Texto

La sintaxis para abrir el formulario desde el botón “btnClientes” es la siguiente

Private Sub btnClientes_Click()
 
DoCmd.OpenForm “frmClientes” ,  ,  , “CIF = ’ ” & Me.txtFiltro & “ ‘ “
 
End Sub

En este caso, la condición tipo texto añade una complicación más, resulta que por naturaleza, cuando usamos en una condición una cadena de caracteres, esta debe ir encerrada entre comillas, esto significa que la condición debería ir entre comillas y al mismo tiempo, el texto (CIF) que queremos filtrar también.

Este concepto es el que más quebraderos de cabeza suele dar a los programadores nóveles. La lógica te dice que si queremos filtrar esto:

Private Sub btnClientes_Click()

DoCmd.OpenForm “frmClientes” ,  ,  , “CIF =  “30840146H””

End Sub

Observa como la cadena de caracteres del CIF va también entre comillas… deberíamos haber escrito la línea de la siguiente manera:

Private Sub btnClientes_Click()

DoCmd.OpenForm “frmClientes” ,  ,  , “CIF = ' ” & Me.txtFiltro &“ ' “

End Sub

En este caso después de Me.txtFiltro tengo que concatenar con el “&” la última comilla doble que cierra la cadena de caracteres del CIF. Pero Access, con tantas comillas se lía. Para construir correctamente la condición hay que sustituir las comillas dobles que encierran el CIF por comillas simples

Private Sub btnClientes_Click()

DoCmd.OpenForm “frmClientes” ,  ,  , “CIF = ’ ” & Me.txtFiltro & “ ‘ “

End Sub

Access, al ejecutar esta línea, la entenderá de la siguiente manera:

Private Sub btnClientes_Click()

DoCmd.OpenForm “frmClientes” ,  ,  , “CIF = ’ 30840146H ‘ “

End Sub

Y por tanto abrirá el formulario clientes en el cliente cuyo CIF sea igual a 30840146H. En caso de no existir ningún registro que cumpla dicha condición, el formulario clientes se abrirá en blanco.

Por último vamos a ver como abriríamos el formulario clientes si quisiéramos filtrar por fecha:

Access Filtro Fecha

La sintaxis para abrir el formulario desde el botón “btnClientes” es la siguiente

Private Sub btnClientes_Click()

DoCmd.OpenForm “frmClientes”,  ,  , “FechaAlta = # ” & Me.txtFiltro & “ # “

End Sub

En este caso se añade la complicación de que la fecha hay que indicársela entre el símbolo de almohadilla “#”, el ejemplo es similar al de tipo texto solo que visualmente es más sencillo de interpretar.

Access, al ejecutar esta línea, la entenderá de la siguiente manera:

Private Sub btnClientes_Click()

DoCmd.OpenForm “frmClientes” ,  ,  , “FechaAlta = # 01/01/2013 # “

End Sub

Pero aquí ocurre algo que de no saberlo vuelve a crear cientos de dudas y problemas en los programadores. Resulta que Access, cuando utilizamos código VBA, estamos trabajando en Inglés, los comandos que escribimos están en Inglés, todo el entorno de programación trabaja en inglés y tú te preguntarás ¿Y qué tiene que ver esto con la fecha?, muy sencillo, la fecha, al ejecutar la línea, se está enviando en formato americano, o sea, primero el mes, luego el día y luego el año.

Quizás con la fecha que he usado para filtrar no aprecias la diferencia pero imagina que queremos filtrar por los clientes dados de alta después del 20/02/2013. Realmente Access interpretaría “Dame todos los registros cuya fecha de alta sea superior al mes 20, día 2  de 2013” y como esa fecha no existe no nos devolvería ningún registro.

¿Pues si nos complica Access la condición, no? Quizás un poco sí, pero si tenemos claro el concepto desde el primer momento no tendremos problemas en ponerle remedio muy fácilmente. La solución pasa por convertir la fecha del cuadro de texto en formato americano a la hora de ejecutar la condición, de esta manera, la conversión es transparente al usuario.

Private Sub btnClientes_Click()

DoCmd.OpenForm "frmClientes" ,  ,  , "FechaAlta = #" & Format(Me.txtFiltro, "mm-dd-yyyy") & "#"

End Sub

Como puedes observar, he añadido el comando “Format” forzando que la fecha de Alta la convierta al formato americano, primero el mes, luego el día y luego el año “mm-dd-yyyy”.

De esta manera el filtro funcionará correctamente.

Hasta aquí una pincelada el funcionamiento de los filtros. Me reservo para artículos siguientes un desglose más extenso sobre cada uno de ellos y cómo podemos combinar más de una condición en el mismo filtro.

3 comentarios

  1. el Filtro con la condicion wherecondition me esta resultando muy util, pero cuando quiero hacer el filtrado y que me filtro solo los registros que tengan una determinada palabra.
    Ejemplo:
    si tengo un campo de cargos y quiero que solo muestre los que contengan la palabra presidente
    solo consigo que me filtre los campos que tiene el campo con el valor exacto.

  2. No se si me respondan esto pero armas inició en esto de accses y quisiera saber una macro que me permita en un su formulario ar clic a un cliente y que se me abra el formulario de clientes con la información del cliente que se le dio clic

    Muchas gracias

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.