elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  Bases de Datos (Moderador: Carloswaldo)
| | | |-+  Ayuda con una consulta usando procedimientos almacenados
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con una consulta usando procedimientos almacenados  (Leído 647 veces)
S4ms3pi0l__

Desconectado Desconectado

Mensajes: 21


Ver Perfil
Ayuda con una consulta usando procedimientos almacenados
« en: 23 Marzo 2019, 03:54 am »

Bien, tengo la siguiente base de datos:

Código
  1. CREATE DATABASE Hotel
  2. GO
  3. USE Hotel;
  4. GO
  5.  
  6. CREATE TABLE tipo_habitacion(
  7. cod_tipo INTEGER PRIMARY KEY,
  8. nom_tipo VARCHAR(25) NOT NULL,
  9. precio money NOT NULL
  10. );
  11.  
  12. CREATE TABLE habitacion(
  13. no_habitacion INTEGER PRIMARY KEY,
  14. cod_tipo INTEGER FOREIGN KEY REFERENCES tipo_habitacion(cod_tipo),
  15. descr VARCHAR(60),
  16. cap INTEGER NOT NULL,
  17. stat VARCHAR(15)
  18. );
  19.  
  20. CREATE TABLE cliente(
  21. id_cliente INTEGER PRIMARY KEY IDENTITY(0,1),
  22. p_nom VARCHAR(15),
  23. s_nom VARCHAR(15),
  24. p_apell VARCHAR(15),
  25. s_apell VARCHAR(15),
  26. direccion VARCHAR(70),
  27. tel VARCHAR(10),
  28. correo VARCHAR(25)
  29. );
  30.  
  31. CREATE TABLE empleado(
  32. id_empleado INTEGER PRIMARY KEY IDENTITY(0,1),
  33. p_nom VARCHAR(15),
  34. s_nom VARCHAR(15),
  35. p_apell VARCHAR(15),
  36. s_apell VARCHAR(15),
  37. direccion VARCHAR(70),
  38. tel VARCHAR(10),
  39. correo VARCHAR(25)
  40. );
  41.  
  42. CREATE TABLE reserva(
  43. id_reserva INTEGER PRIMARY KEY IDENTITY(0,1),
  44. id_cliente INTEGER FOREIGN KEY REFERENCES cliente(id_cliente),
  45. id_empleado INTEGER FOREIGN KEY REFERENCES empleado(id_empleado),
  46. fecha_reserva DATE NOT NULL,
  47. forma_pago VARCHAR(15),
  48. divisa VARCHAR(3),
  49. stat VARCHAR(15)
  50. );
  51.  
  52. CREATE TABLE habitacion_reserva(
  53. id_hab_reserva INTEGER PRIMARY KEY IDENTITY(0,1),
  54. id_habitacion INTEGER FOREIGN KEY REFERENCES habitacion(no_habitacion),
  55. id_reserva INTEGER FOREIGN KEY REFERENCES reserva(id_reserva),
  56. fecha_entrada DATE NOT NULL,
  57. fecha_salida DATE NOT NULL,
  58.        precio money
  59. );
  60.  
  61. CREATE TABLE huesped(
  62. id_huesped INTEGER PRIMARY KEY IDENTITY(0,1),
  63. p_nom VARCHAR(15),
  64. s_nom VARCHAR(15),
  65. p_apell VARCHAR(15),
  66. s_apell VARCHAR(15),
  67. direccion VARCHAR(70),
  68. tel VARCHAR(10),
  69. nacionalidad VARCHAR(25),
  70. correo VARCHAR(25)
  71. );
  72.  
  73. CREATE TABLE huesped_hab_reserva(
  74. id_huesped INT FOREIGN KEY REFERENCES huesped(id_huesped) NOT NULL,
  75. id_hab_reserva INT FOREIGN KEY REFERENCES habitacion_reserva        (id_hab_reserva) NOT NULL
  76. );
  77.  
  78. ALTER TABLE huesped_hab_reserva
  79. ADD PRIMARY KEY(id_huesped, id_hab_reserva);
  80.  
  81. CREATE TABLE servicio(
  82. id_servicio INTEGER PRIMARY KEY IDENTITY(0,1),
  83. descr VARCHAR(60),
  84. precio money
  85. );
  86.  
  87. CREATE TABLE cargos_servicios(
  88. id_servicio INT FOREIGN KEY REFERENCES servicio        (id_servicio) NOT NULL,
  89. id_hab_reserva INT FOREIGN KEY REFERENCES habitacion_reserva       (id_hab_reserva) NOT NULL, precio money
  90. );
  91. ALTER TABLE cargos_servicios
  92. ADD PRIMARY KEY(id_servicio, id_hab_reserva);
  93.  

El problema es el siguiente:

Realizar un procedimiento almacenado que reciba como parámetro: ID Habitación, Fecha de Entrada, Fecha de Salida.
Consultar la disponibilidad de la habitación en cuanto a las fechas solicitadas mediante un estado.
Ejemplo:
Entrada
IdHabitación: 2
Fecha de Entrada: 2019-03-14
Fecha de Salida:  2019-03-20
Ejecución
Fecha          Estado
2019-03-14     Disponible
2019-03-15     Disponible
2019-03-16     Disponible
2019-03-17     Disponible
2019-03-18     Disponible
2019-03-19     Disponible
2019-03-20     Salida

En caso que exista una reserva en los días solicitados el estado será: "Reservado". El estado del último día debe ser: "Salida" y no ocupa implica una reserva.

Llevo atascado en eso desde hace varios días, y lo último que pude hacer fue esto:

Código
  1. CREATE PROCEDURE Disponibilidad @FechaEntrada DATE,
  2. @FechaSalida DATE,
  3. @IdHabitación INT
  4. AS
  5. SELECT
  6. hr.fecha_entrada,
  7. r.stat AS Estado
  8. FROM habitacion_reserva hr
  9. INNER JOIN reserva r ON r.id_reserva = hr.id_reserva
  10. INNER JOIN habitacion h ON h.no_habitacion = hr.id_habitacion
  11. WHERE r.fecha_reserva NOT BETWEEN @FechaEntrada AND @FechaSalida
  12. AND hr.id_habitacion = @IdHabitación
  13.  
  14. EXEC Disponibilidad '2019-04-01', '2019-04-10', 2
  15.  
  16.  

Y obviamente está incorrecto, así que, espero que sean de gran ayuda ya que la resolución de ese problema es de 'vida o muerte'


En línea

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 1.711



Ver Perfil
Re: Ayuda con una consulta usando procedimientos almacenados
« Respuesta #1 en: 23 Marzo 2019, 07:02 am »

Saludos,

- He estado haciendo unoas pruebas con lo siguiente y me parece que se puede adaptar a lo que necesitas

Código
  1. /******************/
  2. CREATE TABLE habitacion_reserva (
  3.  id_habitacion INTEGER,
  4.  fecha_entrada DATE NOT NULL,
  5.  fecha_salida DATE NOT NULL
  6. )
  7.  
  8. INSERT INTO habitacion_reserva VALUES
  9.  (1, '2019-03-01', '2019-03-05')
  10.  
  11. /**********************/
  12. CREATE PROCEDURE SP_Disponibilidad
  13.  @id_habitacion INTEGER,
  14.  @fecha_entrada DATE,
  15.  @fecha_salida  DATE
  16. AS BEGIN
  17.  DECLARE @ocupado INTEGER
  18.  DECLARE @tmp_table TABLE (
  19.    fecha  DATE,
  20.    estado VARCHAR(10)
  21.  )
  22.  
  23.  WHILE ( @fecha_entrada <= @fecha_salida )
  24.  BEGIN
  25.    SET @ocupado = (
  26.      SELECT COUNT(*)
  27.      FROM habitacion_reserva
  28.      WHERE id_habitacion = @id_habitacion
  29.        AND @fecha_entrada BETWEEN fecha_entrada AND fecha_salida
  30.    )
  31.  
  32.    IF ( @ocupado > 0 )
  33.      INSERT INTO @tmp_table VALUES ( @fecha_entrada, 'Reservado' )
  34.    ELSE
  35.      INSERT INTO @tmp_table VALUES ( @fecha_entrada, 'Disponible' )
  36.  
  37.    SET @fecha_entrada = DATEADD( DAY, 1, @fecha_entrada )
  38.  END
  39.  
  40.  SELECT * FROM @tmp_table
  41. END
  42.  
  43. /********************************/
  44. EXECUTE SP_Disponibilidad 1, '2019-03-03', '2019-03-09'


+------------+------------+
| Fecha      | Estado     |
+------------+------------+
| 2019-03-03 | Reservado  |
| 2019-03-04 | Reservado  |
| 2019-03-05 | Reservado  |
| 2019-03-06 | Disponible |
| 2019-03-07 | Disponible |
| 2019-03-08 | Disponible |
| 2019-03-09 | Disponible |
+------------+------------+


En línea

S4ms3pi0l__

Desconectado Desconectado

Mensajes: 21


Ver Perfil
Re: Ayuda con una consulta usando procedimientos almacenados
« Respuesta #2 en: 23 Marzo 2019, 13:33 pm »

¡Muchas gracias! Es justamente lo que necesitaba.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
PHP, MySQL y Procedimientos Almacenados?
PHP
jguillen 1 8,465 Último mensaje 28 Noviembre 2008, 16:03 pm
por дٳŦ٭
Efectividad de los Procedimientos Almacenados.
Nivel Web
^Tifa^ 3 3,295 Último mensaje 15 Febrero 2010, 18:57 pm
por Nakp
UDF? Procedimientos Almacenados? cual?
Bases de Datos
Skeletron 6 3,705 Último mensaje 1 Junio 2010, 02:52 am
por ^Tifa^
SQL Server - Procedimientos almacenados y permisos - AYUDA
Bases de Datos
NetStorm 2 6,940 Último mensaje 13 Noviembre 2010, 15:30 pm
por NetStorm
MOVIDO: SQL Server - Procedimientos almacenados y permisos - AYUDA
.NET (C#, VB.NET, ASP)
[D4N93R] 0 1,198 Último mensaje 10 Noviembre 2010, 22:46 pm
por [D4N93R]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines