** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Consulta de fecha y disponibilidad
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoConsulta de fecha y disponibilidad

 Responder Responder Página  12>
Autor
Mensaje
Parche Ver desplegable
Nuevo
Nuevo


Unido: 03/Julio/2018
Localización: Alicante
Estado: Sin conexión
Puntos: 30
Enlace directo a este mensaje Tema: Consulta de fecha y disponibilidad
    Enviado: 30/Julio/2018 a las 21:03
Buenas tardes:

Revisando la aplicación de hotel de Marciano, he visto que si se hace una reserva de hab. tres noches, por ejemplo, en h.101, luego puedo hacer otra reserva distinto cliente en la fecha de enmedio. Ejemplo:

Hab. 101 entrada 30.07.18 y salida 02.08.18 (tres noches) de localizador Juan García.

Ahora si hago reserva en misma hab.101 con otro nombre con entrada 31.07.18 me permite hacerla.

Editado: ... Con entrada 31.07.18 y salida 01.08.18.

Estoy atascado ahí.

¿Cómo podría modificar la función: CompruebaDisponibilidad para que no permita esto?

Función:

'Comprueba que el registro que se está insertando o modificando no entre en conflicto con alguno de los ya existentes
Function CompruebaDisponibilidad() As Boolean
Dim rst As DAO.Recordset

'Recordset que seleccionaria cualquier registro (excepto el actual) existente en la base de datos
'para la misma habitación y con algún día coincidente.
Set rst = CurrentDb.OpenRecordset("SELECT * FROM Reservas WHERE IdOcupacion <> " & Me.IdOcupacion & " AND Habitacion = " & Me.Habitacion & _
                                    " AND ((FechaEntrada BETWEEN #" & Format(Me.FechaEntrada, "mm/dd/yyyy") & "# AND #" & _
                                    Format(DateAdd("d", -1, Me.FechaSalida), "mm/dd/yyyy") & "#) OR (DateAdd('d', -1, FechaSalida) BETWEEN #" & Format(Me.FechaEntrada, "mm/dd/yyyy") & _
                                    "# AND #" & Format(DateAdd("d", -1, Me.FechaSalida), "mm/dd/yyyy") & "#))")
'Si encuentra registros tenemos un problema, esa habitación está ocupado alguno de los
'dias que estamos intentando reservar
If Not rst.EOF And Not rst.BOF Then
    MsgBox "OCUPADO"
    CompruebaDisponibilidad = False 'Hay al menos uno de los dias ocupado, devolvemos false
Else
    CompruebaDisponibilidad = True 'Si no ha encontrado registro, no hay problema, devolvemos True
End If
rst.Close
Set rst = Nothing
End Function

----------------------------------------------

Gracias por el interés.



Editado por Parche - 31/Julio/2018 a las 09:21
Arriba
MexMan70 Ver desplegable
Colaborador
Colaborador


Unido: 17/Julio/2007
Localización: DarkSide
Estado: Sin conexión
Puntos: 9220
Enlace directo a este mensaje Enviado: 31/Julio/2018 a las 15:49
Revisa meticulosamente los tipo de campos que usas y aplica las reglas para el tratamiento de ellos, ejemplo:

Numero.- Nada
Texto.- Comillas simples, dobles o bien Chr(34)
Fecha.- Almohadillas en formato americano o tratarlas como números

Ya comentas.

Saludos !
OneDrive: http://sdrv.ms/Vk6eJd
Arriba
Parche Ver desplegable
Nuevo
Nuevo


Unido: 03/Julio/2018
Localización: Alicante
Estado: Sin conexión
Puntos: 30
Enlace directo a este mensaje Enviado: 01/Agosto/2018 a las 10:04
Buenos días:

Gracias por el interés.

Todo funciona bien, salvo cuando hay fecha de reserva entre medias, como cito, en el intervalo de días que pongo de ejemplo ya sea:

- Entrada 01.08.18 y salida 30.08.18, en cuanto haya una fecha que no "toque" el 01.08.18 ni el 30.0818, sigue adelante y "pisa" la reserva previa que hubiera.

Lo que desearía es que si hay una nueva reserva por ejemplo el 03.08.18 (una noche) que marque como OCUPADA.

Saludos.
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: España
Estado: en línea
Puntos: 10260
Enlace directo a este mensaje Enviado: 01/Agosto/2018 a las 13:52
Mírate esto:

Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
MexMan70 Ver desplegable
Colaborador
Colaborador


Unido: 17/Julio/2007
Localización: DarkSide
Estado: Sin conexión
Puntos: 9220
Enlace directo a este mensaje Enviado: 01/Agosto/2018 a las 16:06
Hola, buen día !

Te esta permitiendo el ingreso porque estas realizando el filtro incluyendo al localizador, elimínalo para que averigüe si la habitación esta ocupada por cualquier localizador.

Saludos !
OneDrive: http://sdrv.ms/Vk6eJd
Arriba
Parche Ver desplegable
Nuevo
Nuevo


Unido: 03/Julio/2018
Localización: Alicante
Estado: Sin conexión
Puntos: 30
Enlace directo a este mensaje Enviado: 02/Agosto/2018 a las 09:34
Buenos días:

Gracias por vuestro interés.

* Mihura:

Gracias por la referencia a su código, pero sólo se adapta con FechaPedida (horaincio y horafinal). Aquí cito que detecte un intervalo de fechas de posible reserva que intente hacer entre dos fechas ya creadas(fechaentrada y fechasalida reservadas). La verdad que es un buen comienzo. Corrígame si estoy equivocado. Lo probé pero no sé donde ubicar la posible solución, estoy perdido después de muchas pruebas.

He probado con esto, pero ocurre lo mismo, procede a la reserva entre fechas e incluso "pisa" entre fecha entrada y salida (lo que con la función: CompruebaDisponibilidad no ocurría).

--------------------------------------

Dim Rst As DAO.Recordset

Set Rst = CurrentDb.OpenRecordset("SELECT * FROM TbReservas WHERE IdOcupacion <> " & Me.IdOcupacion & " AND Habitacion = " & Me.Habitacion & " AND fechaentrada = " & RT_FechaSQL(Me.FechaEntrada) & _
     " AND ((" & RT_FechaSQL(Me.FechaEntrada) & "<= fechasalida) AND (" & RT_FechaSQL(Me.FechaSalida) & " >= fechaentrada))")
If Rst.RecordCount <> 0 Then
     Rst.Close
     MsgBox "Esta cita entra en conflicto con otra", vbCritical, Me.Caption
     Else
     MsgBox "reservada"

End If
End Sub
--------------------------------------


* MexMan70:

Esa opción ya la he probado y permite hacer reserva entre medias de dos fechas (entrada y salida). Además el Localizador no está incluído en la sql (sólo el idocupacion, habitacion, fechaentrada y fechasalida). El idocupacion marca: <> me.idocupacion por lo que tiene en cuenta que sea otra reserva diferente la que intenta "reservar".

Saludos.
Arriba
Parche Ver desplegable
Nuevo
Nuevo


Unido: 03/Julio/2018
Localización: Alicante
Estado: Sin conexión
Puntos: 30
Enlace directo a este mensaje Enviado: 04/Agosto/2018 a las 11:50
Buenos días:

No encuentro la sql adecuado para las fechas intermedias. Estoy bloqueado ahí un tiempo.

¿Alguna otra idea?

Saludos.
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 579
Enlace directo a este mensaje Enviado: 05/Agosto/2018 a las 17:33
Lo que te indica Mihura en el enlace es un sistema para determinar si un rango está parcial o completamente dentro de otro rango; no importa si son fechas, horas, kilos, sandías ... Lo importante es entender el método para usarlo en tu sistema.
Arriba
Parche Ver desplegable
Nuevo
Nuevo


Unido: 03/Julio/2018
Localización: Alicante
Estado: Sin conexión
Puntos: 30
Enlace directo a este mensaje Enviado: 06/Agosto/2018 a las 21:07
Buenas noches:

Si puedes ver el ejemplo de hotel de Marciano verás lo que te comento. Más vale un ejemplo visual que otra cosa...

Si he hecho una reserva entrada 01.08.18 y salida 04.08.18 (tres noches) y ahora hago otra reserva con la noche del 02.08.18 (entrada 02.08.18 y salida 03.08.18) me permite realizarla, y es cuando no debería hacerlo.

La función la he puesto más arriba (compruebaDisponibilidad) no copio y pego por no duplicar.

Tras varias pruebas, la de Mihura incluida, me sigue permitiendo hacer reserva del tipo arriba indicado (noche del 02.08.18).

El caso es que no detecta la fecha intermedia, aquella que no "toca" la fechaentrada ni fechasalida y continúa con la reserva.

Ruego puedas ver el ejemplo y realizar la reserva que te propongo arriba, para que me entiendas.

Es como si faltara una secuencia al final con un AND añadido en la sql del tipo: si me.fechaentrada (no la fechaentrada de la tbReservas) está entre la fechaentrada y fechasalida... que también probé pero no hacía nada.... He hecho muchas pruebas. Tambien con el OR añadido, etc.

Gracias por tu interés.

Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: España
Estado: en línea
Puntos: 10260
Enlace directo a este mensaje Enviado: 06/Agosto/2018 a las 21:14
Si quieres que te ayuden tienes que poner los datos que usas, la bola de cristal hace tiempo que no nos funciona .... LOL

Pon las tablas afectadas, con los registros afectados y el código que usas para la consulta.


Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
Parche Ver desplegable
Nuevo
Nuevo


Unido: 03/Julio/2018
Localización: Alicante
Estado: Sin conexión
Puntos: 30
Enlace directo a este mensaje Enviado: 06/Agosto/2018 a las 21:56
Buenas noches:

* Tabla: TbReserva:fechaentrada,fechasalida,idocupacion,idcte,fechareserva,habitacion,localizador,etc.... resto no influye en el resultado.

* Registros afectados: fechaentrada,fechasalida, idocupacion,habitacion.

*  Código: Función que permite reservar entre fechas como decía en el comentario anterior (el resto funciona bien, detecta fechas que "tocan" fechaentrada y fechasalida) y que no debería pq. "pisa" la reserva previa.

Función:
----------------------------------------------
'Comprueba que el registro que se está insertando o modificando no entre en conflicto con alguno de los ya existentes
Function CompruebaDisponibilidad() As Boolean
Dim rst As DAO.Recordset

'Recordset que seleccionaria cualquier registro (excepto el actual) existente en la base de datos
'para la misma habitación y con algún día coincidente.
Set rst = CurrentDb.OpenRecordset("SELECT * FROM Reservas WHERE IdOcupacion <> " & Me.IdOcupacion & " AND Habitacion = " & Me.Habitacion & _
                                    " AND ((FechaEntrada BETWEEN #" & Format(Me.FechaEntrada, "mm/dd/yyyy") & "# AND #" & _
Format(DateAdd("d", -1, Me.FechaSalida), "mm/dd/yyyy") & "#) OR (DateAdd('d', -1, FechaSalida) BETWEEN #" & Format(Me.FechaEntrada, "mm/dd/yyyy") & _
                                    "# AND #" & Format(DateAdd("d", -1, Me.FechaSalida), "mm/dd/yyyy") & "#))")

'Si encuentra registros tenemos un problema, esa habitación está ocupado alguno de los
'dias que estamos intentando reservar

If Not rst.EOF And Not rst.BOF Then
    MsgBox "OCUPADO"
    CompruebaDisponibilidad = False 'Hay al menos uno de los dias ocupado, devolvemos false
Else
    CompruebaDisponibilidad = True 'Si no ha encontrado registro, no hay problema, devolvemos True
End If
rst.Close
Set rst = Nothing
End Function

----------------------------------------------

* Prueba: entrada 01.08.18 y salida 04.08.18

----------------------------------------------

'1 - Set Rst = CurrentDb.OpenRecordset("SELECT * FROM TbReservas WHERE fechaentrada = " & RT_FechaSQL(Me.FechaEntrada) & _
     " AND ((" & RT_FechaSQL(Me.FechaEntrada) & "<= fechasalida) AND (" & RT_FechaSQL(Me.FechaSalida) & " >= fechaentrada))")

**** Permite hacer reserva intermedia *********    
    
'2 -  Set Rst = CurrentDb.OpenRecordset("SELECT * FROM TbReservas WHERE IdOcupacion <> " & Me.IdOcupacion & " AND Habitacion = " & Me.Habitacion & " and fechaentrada = " & RT_FechaSQL(Me.FechaEntrada) & _
     " AND ((" & RT_FechaSQL(Me.FechaEntrada) & "<= fechasalida) AND (" & RT_FechaSQL(Me.FechaSalida) & " >= fechaentrada))")

**** Permite hacer reserva intermedia *********    

'3 - Set Rst = CurrentDb.OpenRecordset("SELECT * FROM TbReservas WHERE IdOcupacion <> " & Me.IdOcupacion & " AND Habitacion = " & Me.Habitacion & _
                                    " AND ((FechaEntrada BETWEEN #" & Format(Me.FechaEntrada, "mm/dd/yyyy") & "# AND #" & _
                                    Format(DateAdd("d", -1, Me.FechaSalida), "mm/dd/yyyy") & "#) OR (DateAdd('d', -1, FechaSalida) BETWEEN #" & Format(Me.FechaEntrada, "mm/dd/yyyy") & _
                                    "# AND #" & Format(DateAdd("d", -1, Me.FechaSalida), "mm/dd/yyyy") & "#)) AND (FechaEntrada BETWEEN #" & Format(Me.FechaEntrada, "mm/dd/yyyy") & "#  AND #" & Format(DateAdd("d", -1, Me.FechaSalida), "mm/dd/yyyy") & "#)")

**** Permite hacer reserva intermedia y con fecha 03.08.18 *********    

'4 - Set Rst = CurrentDb.OpenRecordset("SELECT * FROM TbReservas WHERE IdOcupacion <> " & Me.IdOcupacion & " AND Habitacion = " & Me.Habitacion & _
                                    " AND ((FechaEntrada BETWEEN #" & Format(Me.FechaEntrada, "mm/dd/yyyy") & "# AND #" & _
                                    Format(DateAdd("d", -1, Me.FechaSalida), "mm/dd/yyyy") & "#) OR (DateAdd('d', -1, FechaSalida) BETWEEN #" & Format(Me.FechaEntrada, "mm/dd/yyyy") & _
                                    "# AND #" & Format(DateAdd("d", -1, Me.FechaSalida), "mm/dd/yyyy") & "#) & AND " & ((RT_FechaSQL(Me.FechaEntrada) & "<= fechasalida) AND (" & RT_FechaSQL(Me.FechaSalida) & " >= fechaentrada))")))

**** Esta prueba no hace nada.... le doy a grabar y nada *********    

No quiero saturar poniendo más pruebas que he hecho y que no me funcionan para no marearos.

Sólo saber si existe la posiblidad de denegar, en este ejemplo o si habéis tenido que hacer algún ejemplo o con la experiencia, que no pueda realizar reserva entre fechas definidas y como abordais esa sql de fechas.


Saludos y gracias por el interés.
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 579
Enlace directo a este mensaje Enviado: 07/Agosto/2018 a las 19:42
Te he preparado un mini ejemplo:

- https://1drv.ms/u/s!AsYMk9OS3HAChltds-OJirJZ_JMp

Tiene una tabla con 3 campos: un autonumérico y fechas de inicio y fin del rango. Luego tenemos una consulta que nos pide las fechas de inicio y fin del rango que queremos comprobar, y nos devuelve los rangos que coinciden en parte o completamente con lo indicado.
Arriba
Parche Ver desplegable
Nuevo
Nuevo


Unido: 03/Julio/2018
Localización: Alicante
Estado: Sin conexión
Puntos: 30
Enlace directo a este mensaje Enviado: 07/Agosto/2018 a las 20:22
Buenas tardes:

Muchas gracias pitxiku por tu ejemplo, agradezco tu tiempo.

He hecho una prueba: Me he fijado en la tercera línea, idrango3, iniRango:060818 finRango:120818.

Si pongo: inicio: 07/08/18 fin: 08/08/18 no aparece ningún registro.

En lo que expongo, si hago una reserva entre las fechas que he puesto, y previamente hay una reserva en la misma habitación entre las fechas: 060818 - 120818... ¿permitiria seguir con la reserva?, pq. no sale rango alguno, no muestra ninguna fecha. En las pruebas, si marco alguna fecha inicial o final sí aparece rango de fechas, pq. "toca" la fechainicio o la fechafinal.... Pero si anoto fechas intermedias... No sale ningún rango. Cuando se supone que ahí hay "algo" según la prueba que he hecho ahora.

No sé si me he explicado.

Saludos y gracias por el interés.


Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 4703
Enlace directo a este mensaje Enviado: 08/Agosto/2018 a las 11:57
Hola!

Prueba así:

Set rst = CurrentDb.OpenRecordset("SELECT * FROM Reservas WHERE IdOcupacion <> " & Me.IdOcupacion & " AND Habitacion = " & Me.Habitacion & _
                                    " AND ((FechaEntrada BETWEEN #" & Format(Me.FechaEntrada, "mm/dd/yyyy") & "# AND #" & _
                                    Format(DateAdd("d", -1, Me.FechaSalida), "mm/dd/yyyy") & "#) OR (DateAdd('d', -1, FechaSalida) BETWEEN #" & Format(Me.FechaEntrada, "mm/dd/yyyy") & _
                                    "# AND #" & Format(DateAdd("d", -1, Me.FechaSalida), "mm/dd/yyyy") & "#) Or FechaEntrada < #" & Format(DateAdd("d", -1, Me.FechaSalida), "mm/dd/yyyy") & "# AND (DateAdd('d', -1, FechaSalida) > #" & Format(Me.FechaEntrada, "mm/dd/yyyy") & "#))")


He añadido la condición de que la fecha de entrada sea menos que la fecha salida y la fecha salida mayor que la fecha entrada.
Un Saludo.
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 579
Enlace directo a este mensaje Enviado: 08/Agosto/2018 a las 17:46
Estuve comprobando el caso contrario, y se me pasó este, lo siento.

He modificado la consulta, para agregar este caso: que la fecha de inicio que pasamos como parámetro esté dentro del rango de fechas guardado. No compruebo la fecha de fin, porque entiendo que si el inicio ya casa, el final nos da igual. Y para los otros casos, los otros 2 criterios ya nos daban los resultados correctos; aunque siempre me puedo equivocar. Si no, se trata de agregar otro criterio O con la fecha final.

La base de datos con la consulta actualizada la puedes descargar del mismo sitio:

- https://1drv.ms/u/s!AsYMk9OS3HAChltds-OJirJZ_JMp
Arriba
 Responder Responder Página  12>
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable