Función SiInm en consulta no funciona

Tengo un problema en una consulta usando SiInm en criterios, tengo un campo fecha y le he puesto la siguiente función

SiInm((DíaSemana(Fecha();2) Entre 1 Y 3);Fecha()+1;Entre Fecha()+1 Y Fecha()+3)

Si la expresión es verdadera (si el día de hoy esta entre lunes y martes) me coloca bien la fecha()+1, pero si la expresión es falsa lo que tengo puest ("Entre Fecha()+1 Y Fecha()+3") no arroja el resultado correcto, en cambio si solo pongo en criterios Entre Fecha()+1 Y Fecha()+3 tal cual si que me lo hace bien.

¿Qué podría ser?

1 respuesta

Respuesta
1

El problema, por lo que veo, es que al construir así el criterio, Access te lo transforma en este otro (lo puedes comprobar si abres la consulta en vista SQL):

SELECT Tabla1.ID, Tabla1.Fecha
FROM Tabla1
WHERE (((Tabla1.Fecha)=IIf((Weekday(Date(),2) Between 1 And 3),Date()+1,(Tabla1.Fecha) Between Date()+1 And Date()+3)));

Fíjate que te añade al criterio cuando la expresión es falsa el nombre del campo, con lo que realmente tu criterio en ese caso es:

Tabla1.Fecha=Tabla1.Fecha Between Date()+1 And Date()+3
y por eso no te da el resultado esperado.

Si embargo, si el criterio original lo cambias por este otro (en la vista SQL) funciona:

SELECT Tabla1.ID, Tabla1.Fecha
FROM Tabla1
WHERE (((IIf((Weekday(Date(),2) Between 1 And 3),[Fecha]=Date()+1,[Fecha] Between Date()+1 And Date()+3))<>False));

Te dejo aquí la BD sobre la que hice las pruebas, a ver si te sirve. La Consulta1 es la que usa tu criterio original, y la Consulta2 el que te propongo.

¡Gracias! funciona a la perfección.

Pero es que soy muy cazurro y me gusta entender las cosas, y lo que no entiendo es que con la función dando Falso y ejecutando por tanto la cadena entre fecha+1 y fecha+3 sea mediante el criterio <>Falso (¿distinto de FALSO?) ¿no se contradice?

Te intento explicar:
Lo que realmente haces con ese Where, es crear un campo (que está oculto), que va a devolver Verdadero o Falso (-1 o 0).

Devolverá verdadero en estos casos:

1º/ Si Dia de la semana está entre 1 y 3 Y Fecha = Fecha()+1

2º/ Si Día de la semana es mayor de 3 Y Fecha Entre Fecha()+1 Y Fecha()+3

Y falso en los contrarios.

Es decir, primero mira la condición del SiInm ("Dia de la semana está entre 1 y 3"), y luego, en función del resultado, evalúa una de las otras dos expresiones, la que corresponde a ese resultado, devolviendo Verdadero o Falso si se cumple o no.
En criterio le pones distinto de Falso, porque sólo quieres mostrar los Verdaderos.

Te pongo un ejemplo, porque la explicación es liosa:

En mi tabla de ejemplo, hay fechas entre el 09/12 y el 20/12.

Si hoy es día 08/12, la función trabaja así:

1º/ Evalúa qué dia de la semana es, y si está entre 1 y 3 o no.

2º/ El día 8/12 es lunes (1), entonces está en el rango de "Verdadero" de la expresión del SiInm, por lo que a continuación analizará la "parte verdadera" del SiInm (si el campo Fecha=Fecha()+1)
3º/ En los registros en que esta igualdad se cumpla, devolverá Verdadero (-1) y en los que no Falso (0)

4º/ Como en el criterio le ponemos que sea <>Falso, la consulta muestra sólo el 09/12.
Si hoy es 09/12, es dia de la semana 2, con lo que el registro que devuelve verdadero es el 10/12 (mismos pasos que antes).
Si hoy es 11/12, es día de la semana 4, por lo que analiza la segunda parte del SiInm( si el campo Fecha está entre Fecha()+1 y Fecha()+3), con lo que los registros que devuelve como verdaderos son los que corresponden al 12/12, 13/12 y 14/12.

Puedes comprobarlo si abres la consulta2 en vista diseño, y le marcas la casilla de Mostrar de la tercera columna.

Por cierto, la expresión es verdadera si el día de hoy es lunes, martes o miercoles. Para que sólo te coja lunes y martes, has de cambiar "DíaSemana(Fecha();2) Entre 1 Y 3" por "DíaSemana(Fecha();2) Entre 1 Y 2"

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas