Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Sistema de reserva

Estas en el tema de Sistema de reserva en el foro de Mysql en Foros del Web. Hola.. Estoy haciendo un sistema de reservas de cabañas y ya me ha llevado semanas, encontrar la consulta principal, ahora a medida q comence a ...
  #1 (permalink)  
Antiguo 22/12/2011, 14:31
 
Fecha de Ingreso: diciembre-2011
Ubicación: San Luis
Mensajes: 9
Antigüedad: 12 años, 4 meses
Puntos: 0
Mensaje Sistema de reserva

Hola.. Estoy haciendo un sistema de reservas de cabañas y ya me ha llevado semanas, encontrar la consulta principal, ahora a medida q comence a ingresar mas datos he descubierto que mi proposito no se cumple.
Les cuento mi idea; tengo una bd q se llama "cabanias" en las q guardo la información en la q cada cabaña de cada complejo esta ocupada!! en un rango de fecha, luego el usuario cuando ingresa pone una fecha de INicio y otra de fin, y sin coincide con esa cabaña no debe estar ocupada..
Esta es la consulta:

$query= "SELECT * FROM cabanias,complejos where ((NOT ('$fecha1' >= fecha_inicio AND '$fecha1' < fecha_final )) AND

(NOT ('$fecha2' >= fecha_inicio AND '$fecha2'<= fecha_final)) AND(estado='Vacia') AND (CantPersonas='$Cantidad') AND (ComplejoPertenece=Id))GROUP BY ComplejoPertenece";

Ahora un ejemplo: Id=1 CABANIA1 esta ocupada del 10/01/2012 al 15/01/2012 en ese rango estara ocupada!.. pero en la misma tabla tengo que id=2 CABANIA1 esta ocupada del 20/01/2012 al 22/01/2012 y si el usuario cuando busca entre los rangos de fecha por ej. el 1ero ese ID=1 NO APARECE correctamente pero sii el 2do ID, y la cabaña esta ocupada...

ayudaa!!NO se como hacer para mantener los registros de una cabania, osea q se le guarden todas las fechas que esten ocupadas, asi cuando el usuario busca la encuentra solo en los rango de fechas q no este ocupada--.

Gracias..me esta matando este sistema
  #2 (permalink)  
Antiguo 23/12/2011, 03:27
 
Fecha de Ingreso: febrero-2010
Mensajes: 157
Antigüedad: 14 años, 2 meses
Puntos: 5
Respuesta: Sistema de reserva

yo que tu utlizaba las fechas con rango numerico, 20120110 al 20120115 y asi no tendras problemas.
  #3 (permalink)  
Antiguo 23/12/2011, 07:05
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Sistema de reserva

Se ha preguntado muchas veces, no me he puesto nunca a resolverlo... a ver si lo conseguimos...

Vamos por partes

supongo que tienes un identificador de cabaña (digamos idCabaña) unico sobre todos los complejos....

Código MySQL:
Ver original
  1. SELECT idCabania
  2. FROM cabanias
  3. WHERE fecha_inicio<='$fecha1' AND fecha_final>='$fecha1'

Estas no interesan ya que como minimo la primera fecha esta ocupada....

Código MySQL:
Ver original
  1. SELECT idCabania
  2. FROM cabanias
  3. WHERE fecha_inicio<='$fecha2' AND fecha_final>='$fecha2'

Estas tampoco por que como minimo la ultima esta ocupada

Código MySQL:
Ver original
  1. SELECT idCabania
  2. FROM cabanias
  3. WHERE fecha_inicio>='$fecha1' AND fecha_final<='$fecha2'

Estas tampoco porque tienen algun periodo ocupado entre $fecha1 y $fecha2

Código MySQL:
Ver original
  1. SELECT idCabania
  2. FROM cabanias
  3. WHERE fecha_inicio<='$fecha1' AND fecha_final>='$fecha1'
  4. SELECT idCabania
  5. FROM cabanias
  6. WHERE fecha_inicio<='$fecha2' AND fecha_final>='$fecha2'
  7. SELECT idCabania
  8. FROM cabanias
  9. WHERE fecha_inicio>='$fecha1' AND fecha_final<='$fecha2'

Un UNION DISTINCT de todo lo anterior nos da una lista sin repeticiones de las cabañas que no nos interesan...

Luego

Código MySQL:
Ver original
  1. FROM cabanias,complejos
  2. WHERE idCabania NOT IN (SELECT idCabania
  3. FROM cabanias
  4. WHERE fecha_inicio<='$fecha1' AND fecha_final>='$fecha1'
  5. SELECT idCabania
  6. FROM cabanias
  7. WHERE fecha_inicio<='$fecha2' AND fecha_final>='$fecha2'
  8. SELECT idCabania
  9. FROM cabanias
  10. WHERE fecha_inicio>='$fecha1' AND fecha_final<='$fecha2')

Nos da el conjunto complementario al anterior... es decir las cabañas libres...

Creo.... he empezado diciendo que se ha preguntado muchas veces como no lo necesitaba no he leido nunca las respuesta quizas hay alguna mejor... e incluso quizas esta falla....

No acabo de ver tu diseño... creo que deberias tener tres tablas

Cabanias
idCabania
idComplejo
....otros datos de la cabaña

Complejos
idComplejo
... otros datos del Complejo

Reservas
idReserva
idCabania
fecha_inicio
fecha_final
.... otros datos de la reserva

Por no hablar de la tabla Clientes....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 23/12/2011 a las 07:18
  #4 (permalink)  
Antiguo 23/12/2011, 07:32
 
Fecha de Ingreso: febrero-2010
Mensajes: 157
Antigüedad: 14 años, 2 meses
Puntos: 5
Respuesta: Sistema de reserva

toma

sql="SELECT * FROM fecha WHERE ((fechaentrada<= #"&FechaEntrada&"# and fechasalida > #"&FechaEntrada&"#)OR(fechaentrada< #"&FechaSalida&"# and fechasalida >= #"&FechaSalida&"#)) AND id="&idabitacion
  #5 (permalink)  
Antiguo 23/12/2011, 14:23
 
Fecha de Ingreso: diciembre-2011
Ubicación: San Luis
Mensajes: 9
Antigüedad: 12 años, 4 meses
Puntos: 0
Respuesta: Sistema de reserva

Hola quimfv, estuve leyendo lo que me mandaste y entiendo tu idea.. pero cuando probe ejecutar la consulta me di cuenta al igual que SQL, que fecha_inicio es de la tabla "Resevas", y no la estoy llamando en la consulta.. Igual muchisimas gracias por contestarme tan rapido!!es una buena experiencia para ser NUEVA en el foro..

Otra idea que me dieron es hacer las tablas "Cabanias" Que siempre estaran Disponibles y una tabla "Ocupadas" con las fechas ocupadas de cada cabania.. para que al hacer las consultas me devuelva solo las cabanias disponibles y nos las q encuentra en ocupdaas..Probe hacer la siguiente consulta:

SELECT Idcabania FROM cabanias WHERE true
NOT IN
SELECT Idcabania From ocupadas WHERE fecha_inicio <= "'.$fecha1.'" and fecha_final >="'.$fecha2.'"

Pero no me deja usa el NOT IN me sale este error :
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT Idcabania From disponibles WHERE fecha_inicio <= '2012/01/03' and fecha_f' at line 3

y Por separado las consultas funcionan!..
  #6 (permalink)  
Antiguo 27/12/2011, 02:26
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Sistema de reserva

A ver mi propuesta era sobre tu diseño en el que no nos has dicho en ningun momento que tengas la tabla reservas.

Por lo que nos has mostrado tienias una tabla cabanias y otra complejos, mis consultas solo llaman esas tablas....

Luego te sugeri que el dieño no era optimo que necesitavas la tabla reservas.... en ese caso solo tienes que substituir cabanias por reservas en las subconsultas ...


En cuanto a tu query creo que deberias leer un poco del manual

Cita:
SELECT Idcabania FROM cabanias WHERE true
NOT IN
SELECT Idcabania From ocupadas WHERE fecha_inicio <= "'.$fecha1.'" and fecha_final >="'.$fecha2.'"

traduciendo esa consulta intenta seleccionar cabañas donde verdadero no este en la lista de cabañas ocupadas....


Código MySQL:
Ver original
  1. SELECT Idcabania
  2. FROM cabanias
  3. WHERE Idcabania NOT IN (SELECT Idcabania
  4.                           From ocupadas
  5.                           WHERE fecha_inicio <= "'.$fecha1.'"
  6.                           and fecha_final >="'.$fecha2.'");

así si funcionará... pero el diseño con una tabla de cabañas ocupadas* es peor que el anterior... lo siento.

* Ocupadas en función de que?


Código MySQL:
Ver original
  1. FROM cabanias,complejos
  2. WHERE idCabania NOT IN (SELECT idCabania
  3. FROM reservas
  4. WHERE fecha_inicio<='$fecha1' AND fecha_final>='$fecha1'
  5. SELECT idCabania
  6. FROM reservas
  7. WHERE fecha_inicio<='$fecha2' AND fecha_final>='$fecha2'
  8. SELECT idCabania
  9. FROM reservas
  10. WHERE fecha_inicio>='$fecha1' AND fecha_final<='$fecha2')




Código MySQL:
Ver original
  1. FROM cabanias,complejos
  2. WHERE idCabania NOT IN (SELECT idCabania
  3. FROM reservas
  4. WHERE (fecha_inicio<='$fecha1' AND fecha_final>='$fecha1')
  5. OR (fecha_inicio<='$fecha2' AND fecha_final>='$fecha2')
  6. OR (fecha_inicio>='$fecha1' AND fecha_final<='$fecha2'))

Una alternativa.... ya con reservas..... reuerda los parentesis no se ponen por estetica ni para que se pueda leer mas facil....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 27/12/2011 a las 02:38
  #7 (permalink)  
Antiguo 27/12/2011, 14:15
Avatar de leo_  
Fecha de Ingreso: abril-2008
Mensajes: 40
Antigüedad: 16 años
Puntos: 11
Sonrisa Respuesta: Sistema de reserva

Hola en verdad está un poco complicado el tema pero en cuanto a la cuestión de las fechas lo que quería señalar es q es más sencillo plantearlo de esta forma (habría q verificar primero que $fecha1 < $fecha2 y que $fecha1 > al día actual):
Código MySQL:
Ver original
  1. select * from reserva
  2. ($fecha1 > fecha_fin OR $fecha2 < fecha_inicio) AND fecha_fin >= CURDATE()
De esta forma me parece más legible. Saludos.
__________________
Di que no haces las cosas para que te las agradezcan, pero trata de hacerlas para gente agradecida. Cipriano.
  #8 (permalink)  
Antiguo 29/12/2011, 14:16
 
Fecha de Ingreso: diciembre-2011
Ubicación: San Luis
Mensajes: 9
Antigüedad: 12 años, 4 meses
Puntos: 0
Respuesta: Sistema de reserva

Hola a todos: ya encontre la solucion fui armando algo en base a los que me dijo quimfv
y no me reten pero tengo una bd de datos con las siguientes tablas : cabanias, ocupadas (q aca guardan las fechas en q cada cabaña esta ocupada), complejos y reservas q es donde se van a guardar las reservas para tales fechas con datos de los clientes
Entonces la consulta me quedo:

$query= "SELECT *, COUNT(IdcabaniaEs) AS disponibles FROM cabanias,complejos
WHERE (IdcabaniaEs NOT IN(SELECT Idcabania From ocupadas WHERE '".$fecha1."' >= fecha_inicio AND '".$fecha1."' < fecha_final
UNION DISTINCT
SELECT Idcabania FROM ocupadas
WHERE '".$fecha2."' >= fecha_inicio AND '".$fecha2."'<= fecha_final
UNION DISTINCT
SELECT Idcabania FROM ocupadas
WHERE fecha_inicio>='".$fecha1."' AND fecha_final<='".$fecha2."')
AND (CantPersonas='".$Cantidad."')AND (ComplejoPertenece=Id))GROUP BY ComplejoPertenece";

Ahi está al menos anda!! he hecho varias pruebas, la idea es retonar los ID de las cabanias que no se encuentran en los rangos de fechas de la tabla ocupadas..

Ahora mi duda es otra! es en cuanto a pasajes de valores de una pagina a otra, nose si lo tengo q preguntar aca o en foro de PHP;
Pero les digo mi ejemplo una ves q me retorna tods los datos de esa cabania, los tengo q pasar con un boton RESERVAR a otra pagina para q el usuario meta sus datos para reservarla, los paso por enlace :

<a href='reservo.php?&fechaInicio=$fecha1&fechaFin=$f echa2&cabania={$fila['IdcabaniaEs']}'><img src='images/BotonReserva.gif' ></a>

y en una pc anda los lee el otro formulario, otra pc donde tmb trabajo de manera loca, directamente no los toma, me deja el formulario vacio, y..cuando mandos estos datos de la cabania + usuario, NO me lee nada de los pasado por parametro, solo los ingresados por el usuario y recibidos en la otra pagina con el $_POST, ya nose como hacer!! asi no puedo guardar los datos en la tabla "reserva"..
Me ayudan o redireccionenmen a un foro q sepa de esto! MUCHISIMAS GRACIAS
  #9 (permalink)  
Antiguo 30/12/2011, 06:36
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Sistema de reserva

Eso es tema de PHP pero me parece ver una contradicción en lo que dices

Cita:
...los paso por enlace :...
Cita:
...recibidos en la otra pagina con el $_POST...
si los pasas por el enlace los recibes por $_GET no por $_POST...

O usa $_REQUEST que lo recibe todo!!!!

Pero mejor pregunta en PHP...

(Sin retarte pero la tabla ocupadas y la tabla reservas son lo mismo, analizalo y verás, cuidado no te entren nunca en contradicción, norma basica de toda base de datos relacional no tener la misma informacion dos veces en sitios distintos)
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 30/12/2011 a las 06:41

Etiquetas: query, registros, select, sistema, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:27.