¿Como hacer funcionar opción "todos" en cuadro combinado?

Tengo un combo "estudiantes" que realiza filtro por nombre apellido y también un combo "año" -basado en campo fecha_inscripción_anual- que filtran en un subformulario la trayectoria educativa del estudiante según el año. Mediante la consulta sql de origen de fila del combo "año" realicé una UNION SELECT que me permitió agregar la categoría "todos" a la opción de la lista desplegable así:

SELECT DISTINCT TRAYECTORIA_ESCOLAR.fecha_inscripcion_anual FROM TRAYECTORIA_ESCOLAR UNION SELECT "Todos" FROM TRAYECTORIA_ESCOLAR GROUP BY TRAYECTORIA_ESCOLAR.fecha_inscripcion_anual;
En el formulario en cuestión el combo año me despliega ahora la opción "todos" en la lista junto a los años 2020, 2021, 2022, 2023, 2024 (valores del campo fecha_inscripcion_anual) pero no encuentro el modo que ejecute la consulta mostrando a todos esos valores en relación al estudiante seleccionado- Sólo funciona el filtro por cada año.

4 Respuestas

Respuesta
1

Emiliano no se deje confundir, escríbame a [email protected] y si puede adjunte la base de datos en RAR. De todas maneras, le tengo el respectivo código

Respuesta

Con eso solo se logra la selección pero 'todos' no es un dato de fecha y lógicamente dará error (o directamente no funciona).

Donde hay que hacer la modificación es el destino del dato y esa parte no se conoce (de momento).

La modificación puede ser tan sencilla como cambiar 'Todos' por un asterisco (*), conocida la consulta se podrá adaptar para que si recibe 'Todos' lo pueda cumplir (aunque lo mas sencillo pueda ser eliminar la condición directamente)

Con (*) ya había probado también. Me faltaría el código que de el contenido similar al "seleccionar todo" del filtro tradicional. El combo es de búsqueda para mostrar información ya cargada. No comprendo lo del destino del dato. Disculpas gracias por respuesta. El dato se genera en tabla trayectorias que tiene un campo fecha_inscripcion con valor predeterminado =Año(fecha()). El combo pretende filtrar registros por año o mostrar todos los registros (años) en subformulario.

Para poder aplicar el asterisco como opción alternativa (la ambigüedad) es necesario conocer como se esta utilizando el dato que proporciona el combo.

La forma mas sencilla de aplicarlo implica modificar el combo, esto es:

Añadir una columna mas para utilizar una como elemento 'visual' (se muestra el año y la opción 'Todos' y en la segunda columna (que permanece oculta) el dato que devuelve el combo al seleccionar uno de sus elementos, para los años el mismo dato y para la opción 'Todos' un asterisco.

De no ser así aparece lo del 'destino del dato' que se refiere a 'donde se utiliza' el dato que se obtiene del combo (una consulta un filtro ...).

En una consulta se puede utilizar la funcion IIF(equivale al convencional IF ... Then ... Else) de forma que si la opción que devuelve es 'Todos' devuelva un asterisco (y si no lo es el dato original), algo como:

IIF([el-combo] <> "Todos", [el-combo], "*")

Si se utilizase para aplicar un filtro en el formulario seria mas sencillo, el formulario permite aplicar o no aplicar el filtro (activarlo/desactivarlo), el método:

Me.FilterOn = [el-combo] <> "Todos"

Con un año seleccionado  ==> ([el-combo] <> "Todos") = TRUE ===>>> Me.FilterOn = TRUE

Si se selecciona 'Todos'  ==> ([el-combo] <> "Todos") = FALSE  ===>>> Me.FilterOn = FALSE

Por ello es importante conocer donde se utiliza para poder aconsejar el método optimo para aplicar el adecuado (que será aquel que menos distorsione lo que actualmente funciona).

Hola, el combo se utiliza en un encabezado de formulario para filtrar los datos que se muestran en un subformulario que está en el detalle. ¿Cómo se estructura el método Me.FilterOn en lenguaje VBA y en que evento en ese caso?

Si el filtro se aplica en un subformulario, solo se necesita ajustar la ruta.

Los filtros del formulario funcionan con dos parámetros, uno es la condición (la igualdad a cumplir) y el otro es si se activa o no se activa (que es mas sencillo que borrar y escribir la condición).

'Me' hace referencia al formulario en que corre el código y permite que las rutas sean relativas en lugar de absolutas.

Para referirse a un formulario (en funciones de subformulario) solo hay que indicárselo a Access añadiéndole la palabra reservada 'Form':

El filtro aplicado al formulario principal:

Me.Filter = "Año = " & Me.[nombre del combo]
El mismo filtro aplicado a un subformulario que se llamase 'Reservas':
Me.Reservas.FORM.Filter =   "Año = " & Me.[nombre del combo]

(Me ==> los objetos son locales)
(Reservas ==> el nombre del objeto subformulario)
(FORM ==> el indicador de que no es un cuadro de texto o combo: es un formulario)

(Filter ==> la propiedad del formulario que contiene la condición)

Se puede referenciar a cualquier propiedad, por ejemplo el indicador de que el filtro esta activo o inactivo (FilterOn):

Me.Reservas.FORM.FilterOn =  True (-1) // False (0)

Access interpreta al cero como FALSE, a cualquier otro valor diferente de cero como TRUE

En el evento en el que se evalúe el dato del combo y se genere la condición en base al año se pueden dar dos opciones o es un año (numero) o el texto 'Todos'.

Si comparamos el valor que devuelve el combo (un numero de año o el texto 'Todos') con 'TODOS' se obtiene una de dos respuestas:

.- Se cumple (True)
.- No se cumple (False)
La respuesta es perfectamente valida para activar el filtro y el código quedará así:

Me.Reservas.FORM.Filter =   "Año = " & Me.[nombre del combo]

Me.Reservas.FORM.FilterOn =  Me.[nombre del combo] <> "Todos"

La primera línea genera el filtro a aplicar, la segunda lo aplica.

(Si el combo devuelve 'Todos' la condición no se cumple, el resultado será FALSE: el filtro no se aplica y mostrara todos los años)

Hola gracias por respuesta.

En qué evento del formulario que contiene el combo Año se debe escribir el código que trabaja sobre el filtro? 

acá abajo no me queda claro. "Año" ya es el nombre del combo, ¿luego se repite? Me.[nombre del combo]???

Me.Filter =   "Año = " & Me.[nombre del combo]

Me.FilterOn =  Me.[nombre del combo] <> "Todos"

¿que diferencia hay entre estos?

Me.Reservas.FORM.Filter =   "Año = " & Me.[nombre del combo]

Me.Reservas.FORM.FilterOn =  Me.[nombre del combo] <> "Todos"

La diferencia entre las expresiones es que una se utiliza (o funciona) en el formulario en que se crea y activa el filtro y la segunda hace lo mismo pero el código corre en el formulario principal.

En ambos casos 'Me' es el formulario en que corre el código y su ruta es relativa, esto es, el código se puede utilizar desde varios formularios sin modificar una coma (o se le puede cambiar el nombre al formulario y no se afecta al código)

Quedo una pregunta sin respuesta ...
Los eventos son consecuencias de la interactuación con el programa, por lo que se utilizara aquel que lo provoque, sea un Click/ un doble Click/ que se modifica el contenido/  que reciba el foco/ que pierde el foco/  ...

Como en este caso se selecciona uno de los elementos del combo, lo más adecuado seria 'al cambiar' del combo.

Dado que el combo esta en el el formulario principal y el filtro se aplica a un subformulario, la sintaxis más adecuada es la segunda.

Lo probé desde eventos "al cambiar" del combo año con la sintaxis que aplica al subformulario. Al elegir una opción de un año específico me tira error de compilación: "no se encontró el método o el dato miembro" (el corrector del vba me marca error en el Me.[año] de la primera línea de código que transcribiste como Me.Reservas.FORM.Filter =   "Año = " & Me.[nombre del combo]) , y si elijo opción "todos" de la lista desplegable me abre cuadro de dialogo con el enunciado "introduzca el valor de parámetro todos". Esto último era lo que ya me hacía sin colocar aquel código, pero sí me filtraba por años.

Intenté del modo sugerido pero al seleccionar un año específico me tira error de compilación: "no se encontró el método o el dato miembro" y me lleva al editor de código remarcando el Me.[año] de la primera línea del código, en tu transcripción sería: Me.Reservas.FORM.Filter =   "Año = " & Me.[nombre del combo]. Si elijo el "todos" opción de la lista desplegable del combo, me abre cuadro de dialogo access señalando "Introduzca el valor del parámetro - todos".

Según la version de Access puede haber un problema, en algunas versiones evalúa la expresión en tiempo de ejecución y en otras sin necesidad de ejecutarla..

Lo causa el que espera un dato numérico (el año) y se le envía un texto ("Todos") lo que genera un conflicto al crear el filtro.

Se puede solventar así:

Antes:
 Me.Filter =   "Año = " & Me.[nombre del combo]

Después:
Me.Filter =   "Año = " & Val(Me.[nombre del combo])

Con eso se logra que acepte a 'Todos' como valor numérico:

Val("Todos") = 0

Val(2024)= 2024

Así esta funcionando (abajo transcribo), solo que en la primera línea entre los signos  "="  va el nombre del campo tal como está en el subformulario y no en el combo al cual alimenta por supuesto. Otra cosa es que me sigue apareciendo el cuadro de dialogo "Introduzca el valor del parámetro - todos"  al menos cuando el filtro del año no posee datos en la fila, pero no siempre.

Private Sub año_Change()
Me.Reservas.Form.Filter = "fecha_inscripcion_anual = " & Me.[año]
Me.Reservas.Form.FilterOn = Me.año <> "Todos"
End Sub

Mi colaboración en el hilo era mostrar una metodología para aplicar la opción 'Todos' mediante el filtro del formulario.
Se basa en que 'Todos' en la practica se comporte como NO aplicar filtro.

Los ComboBox devuelven una variable tipo 'Variant', esta variable consume mas recursos que una especifica, su gran ventaja es su adaptación al destino
Si el 'destino' requiere texto, devuelve un texto (o una fecha, numero, booleano o un NULL).

Si el 'destino' requiere un numero y se le envía un dato no numérico dará error, error que se soluciona convirtiendo el ¿texto? A un valor numérico (que puede ser el cero) y para ello se utiliza la función VAL.
Si el dato que recibe VAL es un numero no lo altera y si no lo es devuelve cero.
(Problema solucionado: TODOS (texto) ==> 0 (numero) y el resultado siempre será un numero).

Los filtros en los formularios/informes son una de sus propiedades y complementaria a esta esta la de activarlo o desactivarlo a voluntad en tiempo de ejecución se activa/Desactiva con un dato booleano (Si/No, Verdadero/Falso ...)

Conclusion: no hace falta borrar el filtro de un formulario, basta deshabilitarlo.

He regresado al inicio del hilo (el mensaje inicial) y sospecho que no has planteado de forma correcta el proceso.

Esta SQL (tomada del mensaje inicial) llena el combo con todos los años lectivos sin tener en cuenta al estudiante y es el principio del problema.
(Trascribo):

SELECT DISTINCT TRAYECTORIA_ESCOLAR.fecha_inscripcion_anual FROM TRAYECTORIA_ESCOLAR UNION SELECT "Todos" FROM TRAYECTORIA_ESCOLAR GROUP BY TRAYECTORIA_ESCOLAR.fecha_inscripcion_anual;

Los años se obtienen así (sin la opción TODOS):
SELECT DISTINCT TRAYECTORIA_ESCOLAR.fecha_inscripcion_anual FROM TRAYECTORIA_ESCOLAR ..... GROUP BY TRAYECTORIA_ESCOLAR.fecha_inscripcion_anual;

En esa SQL no hay una referencia al alumno seleccionado, en el combo se se mostraran todos los años existentes en la tabla TRAYECTORIA_ESCOLAR.

Un alumno solo tendrá datos en los años en que este escolarizado y esos son los que se deberían mostrar en el combo (+ la opción TODOS)

Si al filtro se le añade el parámetro 'alumno seleccionado' obtendremos sus años de escolarización.

El alumno se obtiene del combo ALUMNOS y al origen de lista del combo Años le sobra la agrupación (le basta con DISTINCT) y como solo se utiliza una tabla se puede resumir un poco:

SELECT DISTINCT fecha_inscripcion_anual FROM TRAYECTORIA_ESCOLAR Where Estudiante = " & Me.[combo estudiantes] & " UNION SELECT "Todos" FROM TRAYECTORIA_ESCOLAR;

NOTA: La dependencia del alumno requiere que se regenere el combo AÑOS al cambiar de alumno

El filtro del formulario:

Me.Filter = "Año = " & Val(Me.[nombre del combo])

Para activar el filtro: dos alternativas y ambas deberían funcionar:
Me.FilterOn = Me.[nombre del combo] <> "Todos"
Me.FilterOn = Val(Me.[nombre del combo]) <> 0

Se tienen que utilizar los nombres reales en la aplicación de los combos y campos utilizados, esto solo es un ejemplo.

hOLA. Con este código de abajo se me pierde la lista desplegable de los años en el combo años y sólo me aparece la opción todos, porque la lista se nutría automáticamente de los años existentes en fecha_inscripción

SELECT DISTINCT fecha_inscripcion_anual FROM TRAYECTORIA_ESCOLAR Where Estudiante = " & Me.[combo estudiantes] & " UNION SELECT "Todos" FROM TRAYECTORIA_ESCOLAR;

Trascribo el párrafo final del post inicial:

... Pero no encuentro el modo que ejecute la consulta mostrando a todos esos valores en relación al estudiante seleccionado- Sólo funciona el filtro por cada año.


Si solo aparece la opción 'Todos' las causas probables son:

.- No hay un estudiante seleccionado

.- El estudiante no ha cursado un año lectivo (o se perdieron sus datos).

Replico una línea que parece que no se ha tenido en cuenta:


NOTA: La dependencia del alumno requiere que se regenere el combo AÑOS al cambiar de alumno


Regenerar el combo AÑOS se hace automáticamente en el evento que se selecciona un estudiante, para que el combo años sea fiel al estudiante seleccionado.

Si no se selecciona un estudiante, ¿Qué años 'del estudiante' puede mostrar?
Para que salgan 'todos los años' que existen (con y sin estudiante seleccionado), solo hay que quitar la condición (condición que comienza en Where y finaliza al llegar a Union).

Respuesta

Para que la opción "todos" funcione correctamente en tu combo "año" y muestre todos los registros independientemente del año seleccionado, puedes modificar la consulta That's Not My Neighbor SQL de origen de fila del combo "año" para incluir una condición que verifique si se ha seleccionado la opción "todos".

Respuesta

I sincerely appreciate everything that you have shared. I am grateful that you are an inspiration to me. [url=https://fivgames.io]five nights at freddy's[/url]

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas