Imprimir página | Cerrar ventana

Consulta de fecha y disponibilidad

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=83873
Fecha de impresión: 19/Junio/2019 a las 12:55


Tema: Consulta de fecha y disponibilidad
Publicado por: Parche
Asunto: Consulta de fecha y disponibilidad
Fecha de publicación: 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.




Respuestas:
Publicado por: MexMan70
Fecha de publicación: 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


Publicado por: Parche
Fecha de publicación: 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.


Publicado por: Mihura
Fecha de publicación: 01/Agosto/2018 a las 13:52
Mírate esto:

http://www.accessaplicaciones.com/ejemplos.html#m11" rel="nofollow - Mirar cita


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

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: MexMan70
Fecha de publicación: 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


Publicado por: Parche
Fecha de publicación: 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.


Publicado por: Parche
Fecha de publicación: 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.


Publicado por: pitxiku
Fecha de publicación: 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.


Publicado por: Parche
Fecha de publicación: 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.



Publicado por: Mihura
Fecha de publicación: 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.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: Parche
Fecha de publicación: 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.


Publicado por: pitxiku
Fecha de publicación: 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.


Publicado por: Parche
Fecha de publicación: 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.




Publicado por: mounir
Fecha de publicación: 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.


Publicado por: pitxiku
Fecha de publicación: 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


Publicado por: Parche
Fecha de publicación: 08/Agosto/2018 a las 21:00
Buenas noches:

* mounir:

Las veces que he probado con la sql, cuantas vueltas con el AND y OR (el añadido que comentas) se me quedaba en rojo con errores de sintaxis, etc. y veo que el dateadd: está a veces con "d" y otras con 'd' ... esto es demasiado para mi Disapprove No entiendo en qué situaciones poner uno u otro...

Lo cierto es que ha funcionado.

* pitxiku:

Es correcta la consulta, ahora detecta que hay "algo" entre fechas y aparece el rango de entrada y salida.

Para ambos mis agradecimientos por vuestro tiempo, siempre valioso.

Se puede cerrar el hilo.


Publicado por: mounir
Fecha de publicación: 08/Agosto/2018 a las 21:49
Hola!

Me alegro que te haya servido.
Antes de cerrar te dejo un par de enlaces sobre el uso de Comillas Simples o Comillas Dobles:

1:- http://www.mvp-access.es/emilio/como/ConcatenacionCadenas.asp" rel="nofollow - Concatenación de cadenas y construcción de sentencias SQL


2:- http://www.accessdemo.info/articulos/comillas-simples-comillas-dobles.html" rel="nofollow - ¿Comillas Simples o Comillas Dobles ?

-------------
Un Saludo.


Publicado por: Parche
Fecha de publicación: 08/Agosto/2018 a las 22:02
Gracias!!





Imprimir página | Cerrar ventana