Jump to content
Sign in to follow this  
CloudPT

Reserva de um Hotel

Recommended Posts

CloudPT

Boas eu estou a tirar um curso que dá equivalência ao 12º Técnico de Programação e Gestão de Sistemas informáticos e agora estou no 12º ano e estou a desenvolver o Projecto Final.

O meu Projecto Final é em ASP.net e com acesso a Base de Dados e consiste numa reserva de um hotel, em que o utilizador possa escolher o tipo de quarto  (uma cama duas camas por exemplo e que apareça os quartos na data Gridview) e possa fazer o Check in ( entrada no hotel) e o numero de noites que vai ficar  (por exemplo: o utilizador escolhe a data 2-02-2011 para entrar e escolhe o numero de noites por exemplo 8 noites ) então este utilizador entra no dia 02-02-2011 vai ficar até ao dia 10-02-2011 até aqui tudo bem. A minha duvida como é que eu consigo que para que ninguém consiga reservar o quarto durante esses dias, pois já se encontra ocupado ( desde o  dia 02-02-2011 até ao dia 10-02-2011) .

A minha ideia era que quando a pessoa faz o check in para aquela data e se estiver preenchida não apareça lá o quarto na datagrid view ( apareça apenas os quartos disponiveis para aquela data).

Peço por favor se alguém me pode dar uma ajuda já estou a pensar nisto á semanas e não encontro solução nenhuma. 

Share this post


Link to post
Share on other sites
CloudPT

Mas por exemplo uma pessoa procura um quarto no dia 1-1-2010 e quer ficar 5 noites até ao dia 5-1-2010 tudo bem reserva porque, nao está ocupado, mas se for outra no dia 2-1-2010 e ficar 6 noites acho que tambem vai aparecer esse quarto porque o dia 1-1-2010 não é igual ao dia 2-1-2010 e as noites tambem não.

So se o SELECT for algo do tipo CHECKIN >= NOITES ? certo ????

Share this post


Link to post
Share on other sites
bruno1234

O que podes fazer é qualquer coisa do tipo:

O utilizador insere a data inicio e fim, e tu na query pesquisas por um quarto que tenha esse periodo livre.

Imagina que tens a tabela reservas:

IdReserva | IdQuarto_FK | Inicio              | Fim

1                  1000    07-02-2011      11-07-2011

Depois a query seria qq coisa assim:

select * from quartos q
left join Reservas r
on q.IdQuarto = r.IdQuarto_FK
and @dataInicio not between r.Inicio and r.Fim
and @dataFim not between r.Inicio and r.Fim

O Resultado seria todos os quartos livres, depois podias por mais filtros pelo tipo de quarto, etc...

Isto é só uma ideia (não testada), vê se é adequada ao teu caso.


Matraquilhos para Android.

Gratuito na Play Store.

https://play.google.com/store/apps/details?id=pt.bca.matraquilhos

Share this post


Link to post
Share on other sites
CloudPT

Sim boa ideia mas tenho de ir ver um livro que tenha o between porque nunca aprendi  ;)

Share this post


Link to post
Share on other sites
CloudPT

SELECT * FROM quartos q

LEFT join Reservas r

ON q.IdQuarto = r.IdQuarto_FK

and @dataInicio not between r.Inicio and r.Fim

and @dataFim not between r.Inicio and r.Fim

Bruno neste exemplo referiu:

SELECT * FROM Quartos q - Significa para listar na tabela quartos todos os campos.

LEFT join Reservas r - Nunca dei o LEFT join mas, deverá ser algo do tipo para listar também o campos da Reserva

ON q.IdQuarto = r.IdQuarto_FK - Tudo bem é para igualar o campo qidquarto da tabela quartos  ao rquarto da tabela reserva.

and @dataInicio not between r.Inicio and r.Fim - a ideia é esta lol o NOT BETWEEN mas, eu aprendi a usar o codigo deste modo: "SELECT * FROM [Reserva] , [Quartos] WHERE (([Entrada] >= @Entrada) AND ([saida] <= @Saida))" (apenas um exemplo) não consigo preceber a tua ideia (pois  percebo a ideia mas, nunca aprendi) como por exemplo onde foste bustar o r.Inicio e o r.Fim se é da tabela ou é noutro lado . E a dataInicio deve ser a da tabela?

and @dataFim not between r.Inicio and´ r.Fim - As mesmas duvidas lol.

Se não te importares de me explicar só este pequeno problema lol é que estive a pesquisar sobre a situação (para nao dar trabalho) e não encontrei nada :P .

Share this post


Link to post
Share on other sites
bruno1234

Between significa que o valor está entre os outros 2.

Exemplo:

1 Between 0 and 2 --> Verdade.

2 Between 0 and 2 --> Verdade Também.

3 Between 0 and 2 --> Falso.

O not between é ao contrário, verifica se não está dentro do intervalo.

Quanto ao left join, é um outter join, significa que as linhas da tabela da esquerda aparecem sempre mesmo que o join não encontre equivalente na outra tabela.


Matraquilhos para Android.

Gratuito na Play Store.

https://play.google.com/store/apps/details?id=pt.bca.matraquilhos

Share this post


Link to post
Share on other sites
CloudPT

Olá outra vez estou noutra situação complicada. Estou a usar o seguinte código.

SELECT DISTINCT q.Quarto, q.Tipo, q.Varanda, q.Preco
FROM     Quarto AS q INNER JOIN
                  Reservas AS r ON q.Quarto = r.IDQuarto AND @Entrada NOT BETWEEN r.Entrada AND r.Saida AND @Saida NOT BETWEEN r.Entrada AND r.Saida

O erro aqui é que me está a dar os registos, se o quarto estiver indisponível ele dá á mesma ( o que é esquisito é que o código da disponibilidade está correcto pois eu ja testei só com uma tabela e o resultado era os quartos disponíveis)

Se eu seleccionar os campos todos das 2 tabelas (ex: Tipo de quarto nº quarto da tabela quartos e Saida,Entrada da Tabeça reservas) o resultado vai ser registos repetidos por exemplo uma pessoa reserva para dia 1-01-2011 no quarto 1 e outra vai reserva no mesmo quarto no dia 10-01-2011 e vai listar esses dois registos e o que se pretende é que so apareça 1.

Existe algum comando para não aparecer os registos repetidos (eu ja tentei com o DISTINCT mas tb não está a dar certo) ou será que eu tenho algo no codigo que não está a bater certo?  Ideias ajudas são bem vindas lol. 

 

Share this post


Link to post
Share on other sites
paulo silva

Boas,

O "disctinct" funciona perfeitamente mas se calhar não é a melhor maneira, porque ao usares disctinct já estás a ter uma redundância de dados.

Cumprimentos Paulo Silva

Share this post


Link to post
Share on other sites
CloudPT

Boas só falta um pequeno pormenor vamos supor que temos o mesmo quarto reservado duas vezes um para o dia 1-1-2011 e saida a 2-1-2011 e outra reserva no dia 3-1-2011 e saida a 10-1-2011 se uma pessoa quiser reservar para o dia 1-1-2011 e sair do dia 2-1-2011 ele era suposto nao dar como esta ocupado mas vai deixar pois o registo do dia 1-1-2011 ele bloqueia mas como a outra data ta disponivel ele vai selecionar á mesma o quarto.

Por exemplo Quarto    Entrada      Saida

                        1        1-1-2011    2-1-2011

                        1        3-1-2011    10-1-2011 

Reserva da pessoa nova dia 1-1-2011 e saida dia 2-1-2011 Bloqueia a 1 hipotese e a segunda ja não pois como não está entre o dia 3-1-2011 e 10-1-2011 vai aparece há mesma que não é o que se pretende.

HELPP!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.