Filtros en Access 2007 Access 2007 incorpora importantes herramientas para facilitar que el usuario pueda realizar filtros

complejos sobre formularios, incluso sobre informes, de una manera manera muy sencilla, tanto que uno se pregunta si merece la pena continuar con los procedimientos que, durante años, hemos ido añadiendo a nuestras aplicaciones para filtrar. Para muestra vale un botón (el de filtro):

Con sólo posicionarnos en un campo de un formulario, en este caso de fecha, y pulsar el botón de Filtro que encontramos en la Cinta de Opciones, Access despliega una abrumadora relación de opciones para filtrar el formulario por el campo en el que nos encontramos. Las opciones que se despliegan varían según el campo por el que vamos a filtrar sea numérico, de texto o de fecha.

pero falta el combo multivalor y se añade la opción de filtro por selección. se despliega un menú contextual que. podemos usar: CommandBars("Column Filter"). Dos posibilidades de herramientas de filtro casi iguales. Son muy parecidas a las que hemos visto antes con el botón de filtro de la cinta de opciones. mayor o menor. muestra las de filtro. el valor actual del control como opción de filtro igual. distinto. podemos invocar el menú de filtro (el del Ribbon) posicionándonos el cualquier control y usando el código: DoCmd. es decir. pero distintas. El caso es que el menú contextual no está disponible con la runtime de Access y el Ribbon no es accesible en los formularios emergentes :-( Sin embargo. si lo queremos que se mueste es el menú contextual. además de las opciones de edición y orden.RunCommand acCmdFilterMenu Y.Varias maneras de acceder a las herramientas de filtro Usando el menú contextual Pulsando con el botón derecho del ratón sobre un control del formulario.ShowPopup Usando el Ribbon .

los distintos criterios de filtro se van concatenando con AND sin opciones de usar OR y sin mostrar una vista conjunta de los distintos criterios que se están aplicando. Alternar el filtrado . No existe para texto. pero también existe para un rango de números. No es necesario elegir entre una y otras. Son viejos conocidos de versiones anteriores. La imagen es para un rango de fechas. bastante novedosa y útil: muestra un cuadro de diálogo con dos cuadros de texto para indicar los límites de un rango por el que filtrar. el primero presenta el formulario en una vista especial para introducir criterios y el segungo muestra la cuadrícula QBE para editar el text SQL correspondiente al filtro.En el grupo de la Cinta de Opciones Ordenar y Filtrar. Son herramientas mas complicadas de usar que las nuevas de 2007. Los botones Selección y Avanzadas despliegan una serie de opciones que ya existían en versiones anteriores de Access. Mediante las herramientas del botón de Filtro del Ribbon o del menú contextual.  Las opciones de Selección ya existían en versiones anteriores. aunque para texto hay otras alternativas. salvo la última. pues se pueden ir complemantando: el filtro que hayamos creado con el menú desplegable podemos editarlo con Filtro por formulario o con Filtro avanzado/Ordenar para hacerlo más complejo. no sólo tenemos el botón de filtro que veíamos antes. pero siguen siendo necesarias si queremos manejar cierta complejidad. Entre….  Desplegando el botón Avanzadas encontramos Filtro por formulario y Filtro avanzado/Ordenar. también disponible en el menú contextual y en el botón de filtro.

Al filtrar. sin necesidad de que se trata de un subformulario. Si volvemos a pulsar. ir eliminando selectivamente esos criterios es tan sencillo. Además. como volver a posicionarse sobre el control con el que habíamos filtrado y pulsar de nuevo el botón derecho del ratón. pulsando sobre el pequeño triángulo con un vértice hacia abajo que aparece junto al nombre de cada campo. . el botón sirve para alternar la propiedad FilterOn del formulario. Es decir. se mostrará entonces una opción en el menú desplegable para quitar ese criterio. para el primero usando el botón derecho del ratón y. se desactiva el filtro y cambia el texto del botón a “Sin filtrar”. se vuelve a activar el filtro y a cambiar el texto. se resalta en naranja un nuevo botón poniendo “Filtrado” en la barra de navegación del formulario : Pulsando sobre él. Como hemos visto. están directamente accesibles ambos menús de filtro. Filtros en hojas de datos Los menús de filtro también están disponibles en las vistas de hojas de datos de tablas y consultas. para el segundo. pues bien. los criterios de filtro se van acumulando con AND. de manera que un formulario puede estar filtrado por varios criterios. el contextual y el que veíamos desde el Ribbon. Pero aún afina más.

si pulsamos en él se despliega el menú de filtro con.Al aplicar el filtro. la opción para quitar el filtro por ese campo. entre otras. junto nombre del campo que hemos usado aparece un minúsculo icono de filtro Y. .

Filtros en informes Algo sorprendente en Access 2007 es que los informes también pueden filtrarse dinámicamente de la misma manera que hacemos en un formulario. Como veíamos en un artículo anterior. . existen Nuevas vistas de informe en Access 2007 distintas de la Vista Preiliminar.

se presenta de una forma peculiar.SetFocus DoCmd.Si abrimos nuestro infrome como Vista Informe. etiquetas inteligentes o las opciones de filtro. no podemos usar el menú de filtro propio de esa cinta. por lo tanto. podemos imprimirlo directamente utilizando Botón de Office | Imprimir o pasar a laVista Preliminar desde la opción Vistas del Ribbon. pero con algunas opciones propias de los formularios. todas las que hemos visto antes para filtrar informe. sin opciones de impresión o vista previa y sin saltos de página. como la posibilidad de seleccionar y copiar texto. salvo que lo hagamos por código: Private Sub Filtro_Click() Dim ctrl As Control On Error GoTo Filtro_Click_Error Set ctrl = Screen. Una vez filtrado.PreviousControl ctrl. Un poco de código Menú de filtro en formularios emergentes La cinta de opciones no está disponible si estamos utilizando un formulario emergente.RunCommand acCmdFilterMenu .

On Error GoTo 0 Exit Sub Filtro_Click_Error: MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure Filtro_Click of Documento VBA Form_Detalles de empleados" End Sub .

.

Filter End Sub De esta manera.El mismo botón sirve para filtrar en el formulario principal o en un subformulario.txtFiltro = Me. cada vez que apliquemos un filtro. Sólo es cuestión de posicionarse previamente en el campo por el que queremos filtrar Aprender de Access Resulta un ejercicio interesante ver cómo los menús de filtro de Access construyen los criterios de filtro. . ApplyType As Integer) Me. veremos el criterio que se ha generado. Para ello. en un formulario para ensayos añadimos un cuadro de texto txtFiltro y el siguiente código: Private Sub Form_ApplyFilter(Cancel As Integer.

lo cual era perfectamente previsible. éste se convierta en el nuevo filtro de nuestro formulario.FilterOn = True End Sub Desplegable Multivalor para filtrar Resulta curioso observar cómo la sintáxis va cambiando según la cantidad y proporción de elementos que vayamos seleccionando para filtrar en el desplegable multivalor del menú de filtro.5) Observamos que. a medida que vamos filtrando.[Categoría]="Bebidas")) AND ([Productos]. se van añadiendo cadenas de filtro unidas por AND.(([Productos].[Costo estándar]<=13. Con un par de líneas nás de código podemos hacer que.Filter = Me. si editamos el texto que nos muestra el filtro. Private Sub txtFiltro_AfterUpdate() Me. que sólo cabe unir los distintos criterior con AND y a lo mejor nos interesa unir alguno con OR.txtFiltro Me. . Claro.

[Apellidos]="Acevedo") ([Empleados ampliados].[Apellidos]<>"Chaves" Or [Empleados ampliados]."Jesús Cuesta")) ([Empleados ampliados]. Los criterios generados son las siguientes.[Apellidos] Not In ("Chaves". específicos de Access 2007.[Apellidos] In ("Acevedo". así que vamos a ver cómo se generan los filtros con campos multivalor."Jesús Cuesta") Or [Empleados ampliados]. ([Empleados ampliados]. o todos menos uno o todos menus unos pocos.[Apellidos] IS Null) Filtrando campos multivalor Nada de todo esto nos resulta novedoso.Las distintas selecciones provocan distintos criterios de filtro según se haya seleccionado un sólo elemento o unos pocos.[Apellidos] IS Null) ([Empleados ampliados]."Bonifaz". .

[Compañía]="Proveedor F") LookUP Es decir.[Compañía]="Proveedor D" AND [Lookup_Supplier IDs]. nuestro campo se llama [Supplier IDs] mientras que el nombre que aparece es [Lookup_Suplier IDs]. lo mismo pero con un “LookUp_” delante. Filtramos y vemos que el filtro generado es el siguiente: ([Lookup_Supplier IDs]. Eso me suena de versiones anteriores utilizando “Filtro por formulario”… Utilizando la herramienta de filtro “Avanzadas | Filtro avanzado/Ordenar…” vamos a verlo por dentro. Sin embargo. Proveedor F”. de manera que. o sea. Esa herramienta se encuentra en el Ribbon y. o bien quitamos la propiedad Emergente al formulario y seleccionamos la opción correspondiente en el Ribbon… . si nos fijamos. como estamos en un formulario emergente.En el menú contextual de filtro elegimos el valor actual de nuestro campo multivalor: “Contiene Proveedor D. no podemos acceder a ella. que ha concantenado con AND los distintos valores de nuestro campo multivalor. algo previsible.

se le ha relacionado una tabla o consulta llamada Lookup_Supplier IDs y que coinciden con los campos que se encuentran en el Origen de la Fila del cuadro combinado que usamos para la búsqueda de Id de Proveedores. .RunCommand acCmdAdvancedFilterSort End Sub De cualquiera de las dos maneras el resultado será que se muestre el diseñador gráfico de consultas con el filtro actual Observamos que a la tabla origen de nuestro formulario. Productos. en el diseño de la tabla. Recordemos que. para que un campo sea Multivalor.O bien añadimos un botón que llame a la herramienta mediante código: Private Sub FiltroAvanzado_Click() DoCmd. en la pestaña “Búsqueda” debemos usar un cuadro combinado con un origen válido y Permitir varios valores.

OPTIONAL VARIANT WhereCondition) Sintaxis nueva VOID ApplyFilter (OPTIONAL VARIANT FilterName. es este enlace de Allenbrowne que lo usa. si queremos crear nuestro propios criterios con Lookup_ . la cosa cambia. . OPTIONAL VARIANT WhereCondition. En resumen.html. "Transacción='Compra'". esto puede facilitar un poco las cosas en determinadas ocasiones.-) ApplyFilter Entre las novedades en Access 2007 se cita la nueva sintáxis de AppliFilter Sintaxis anterior VOID ApplyFilter (OPTIONAL VARIANT FilterName. pues para eso podemos buscar directamente por el campo dependiente.[NombreColumnaMostrada]="Criterio filtro") Usando el operador "=" no deja de ser una chorradita. la macro se simplifica notablemente. nos encontramos con que sólo es válido el nombre de un control de subformulario o subinforme. por lo que es fácil deducir que sirve para filtrar directamente el subformulario o subinforme desde el principal. en una aplicación de ejemplo:http://www. si sólo añadiendo un parámetro. Por ejemplo. La sintáxis.Por lo tanto.ApplyFilter . Prometo que profundizaré en el asunto y publicaré los resultados. aunque todo el mundos sabe ya que. Evidentemente. si queremos filtrar el subformulario Child22. Private Sub Mibotón_Click() DoCmd. el filtro se puede aplicar a un subformulario. pues el filtro se hace por la columna mostrada que no está en el origen de datos del formulario filtrado. OPTIONAL VARIANT ControlName) Sencillamente se le ha añadido un parámetro ControlName y. para estas cosas. Todo lo que he encontrado. que es una herramiento muy maja y que funciona muy bien y.allenbrowne.com/AppFindAsUType. y con ayuda de Emilio Sancha. añadiéndole potencia de una forma muy sencilla. Si utilizamos esa sintaxis al montar nuestra propia cadena de filtro. Pero si usamos "Like" o cualquier otro operador en su lugar. pero no pasa de ser una insignificancia ¿Para qué se han tomado la molestia? Me imagino que será para facilitar el uso de macros. esto es una gran ventaja a la hora de construir un filtro. para búsquedas. podemos poner en el formulario principal un botón con el siguiente código. sería algo así: ([Lookup_NombreControl]. probando. funciona perfectamente. Las macros ejecutan comandos y. soy hombre de poca palabra . no he encontrado nada en la ayuda ni en ningún otro lado. sin embargo. "child22" End Sub Teniéndolo en mente. el filtro con Lookup se usa en los campos multivalor porque son cuadros combinados.