VBA. Where Fecha between A and B AND Disponibilidad=1 SIEMPRE entre esas fechas

Tengo 2 Tablas: la tabla Lista que tiene una lista de personas ( con su Rut, entre otras cosas), y la tabla Disponibilidad que tiene 3 columnas (Rut, Dia, Disponibilidad) con la misma lista de personas para cada día del año e indica si esta disponible (1) o no está disponible (0) cada día.

Necesito seleccionar de la tabla LISTA todos los que cumplan ciertas condiciones pero ademas estén disponibles en el plazo que los necesito (asumamos desde el 2019-02-12 al 2019-02-18), por lo que debo revisar la tabla Disponibilidad.

sqllista = "SELECT A.* " & _
"FROM Lista A " & _
"LEFT JOIN Disponibilidad B " & _
"ON A.Rut=B.Rut " & _
"WHERE " & _
"A.Cargo='" & (varCargo) & "' AND A.Postura='" & (varPostura) & "' AND A.Cliente='" & (varCliente) & "' " & _
"AND A.Calidad='" & vector(i) & "' " & _
"AND B.Disponibilidad=1 para todos los dias entre 2019-02-12 y 2019-02-18.

Eso llevo, pero no sé como decirle que debe tener Disponibilidad = 1 todos los días desde Inicio y Fin. Intenté con:

AND B.Disponibilidad=1 AND B.Dia BETWEEN #2019-02-12# AND #2019-02-18#

Pero no me da el resultado correcto, ya que si hay 1 valor con B.Disponibilidad=1, para cualquiera de esos días, lo retorna como correcto, pero yo necesito que la persona todos los días en ese periodo esté =1.

Respuesta
1

Como me parece que la solución que te propone Icue es la misma que has probado y no te sirve, te propongo otra cosa:

1º/ Crea un módulo nuevo en tu BD y en él pega esta función:

Public Function fncDisponible(elRut As Long, laFechaIni As Date, laFechaFin As Date) As Byte
Dim losDias As Long
Dim losRegistros As Long
losDias = DateDiff("d", laFechaIni, laFechaFin) + 1
losRegistros = DCount("Rut", "Disponibilidad", "Rut=" & elRut & " AND Dia BETWEEN #" & Format(laFechaIni, "mm/dd/yyyy") & "# AND #" & Format(laFechaFin, "mm/dd/yyyy") & "# AND Disponibilidad=1")
If losDias = losRegistros Then
fncDisponible = 1
Else
fncDisponible = 0
End If
End Function

Si el campo Rut fuera de texto y no numérico, usa esta otra:

Public Function fncDisponible(elRut As String, laFechaIni As Date, laFechaFin As Date) As Byte
Dim losDias As Long
Dim losRegistros As Long
losDias = DateDiff("d", laFechaIni, laFechaFin) + 1
losRegistros = DCount("Rut", "Disponibilidad", "Rut='" & elRut & "' AND Dia BETWEEN #" & Format(laFechaIni, "mm/dd/yyyy") & "# AND #" & Format(laFechaFin, "mm/dd/yyyy") & "# AND Disponibilidad=1")
If losDias = losRegistros Then
fncDisponible = 1
Else
fncDisponible = 0
End If
End Function

2º/ Luego usas esa función como criterio de filtrado, en vez de usar los campos Dia y Disponible, algo así:

sqllista = "SELECT DISTINCT A.* " & _
"FROM Lista A " & _
"LEFT JOIN Disponibilidad B " & _
"ON A.Rut=B.Rut " & _
"WHERE " & _
"A.Cargo='" & (varCargo) & "' AND A.Postura='" & (varPostura) & "' AND A.Cliente='" & (varCliente) & "' " & _
"AND A.Calidad='" & vector(i) & "' " & _
"fncDisponible([A].[Rut],#02/12/2019#,#02/18/2019#)=1"

También podrías poner parámetros en vez de fechas fijas, o usar variables o referencias a controles de un formulario...

Te dejo un mini-ejemplo para que veas el uso de la función: http://www.filebig.net/files/jNikxfCtQF

Consulta1 sería similar a la inicial que no te funciona (verás que devuelve cualquier nombre que esté disponible en algún día de ese período del 12 al 18 de febrero) y Consulta2 sería donde aplico la función y ya solo devuelve un resultado, que es el que está disponible todos los días de ese intervalo.

Un saludo.


1 respuesta más de otro experto

Respuesta
1

Vamos a suponer que disponibilidad es una casilla de verificación, y vamos a suponer que te muestre el resultado en un formulario llamado Disponibles.

En algún evento, por ejemplo, Al hacer clic de un botón(pero puede ser en cualquier otro, en el formulario que quieras prueba a poner

Docmd.openform"disponibles",,,"dia between [Escriba una fecha inicial] and [Escriba una fecha final] and disponibilidad=-1 and...las demas condiciones"

Así, cuando pulses el botón te preguntará por una fecha inicial, la escribes, Aceptas, Te pedirá una fecha final y te abre el formulario sólo con los registros que cumplan esas condiciones. Y como tienes el RUT, sabes el nombre, dirección, etc.

No logro entender cómo a esa instrucción le pido condiciones que son de tablas diferentes (tabla Lista y tabla Disponibilidad). Por eso yo pensaba que se solucionaba con un Join.

Yo me refería a usar el código después de haber unido las tablas, pero como ya te han respondido por otro lado, prueba lo que te dicen.

La pregunta no admite más respuestas

Más respuestas relacionadas