none
Problema num query RRS feed

  • Pergunta

  • Olá,

    Estou com o seguinte problema.

    Estou a fazer um trabalho para gestão de reservas de um hotel. O problema está no tratamento das reservas, ou seja o funcionário do hotel atribuir quartos específicos a uma reserva. O problema está aqui, pretendo mostrar ao funcionário os quartos que estão disponíveis nas datas da reserva que seleccionou, ao funcionário aparece uma tabela com todas reservas que tem o estado pendente e o funcionário ao escolher uma delas para atribuir os quartos à reserva, leva as datas da mesma de check-in e check-out.

    Então eu tentei fazer o seguinte query:

    SELECT Quartos.nr_quarto FROM [Reserva/Quarto] INNER JOIN Reserva ON [Reserva/Quarto].id_reserva = Reserva.id_reserva

    INNER JOIN Quartos ON [Reserva/Quarto].id_quarto = Quartos.id_quarto

    WHERE (Reserva.estado = @estado) AND (Quartos.id_tipoquarto = @id_tipoquarto)

    AND (@dataCI NOT BETWEEN Reserva.data_chegada AND Reserva.data_partida) OR (Reserva.estado = @estado)

    AND (Quartos.id_tipoquarto = @id_tipoquarto) AND (@dataCO NOT BETWEEN Reserva.data_chegada AND Reserva.data_partida)

    Na minha base de dados eu tenho por exemplo 3 quartos do tipo duplo nos quais 2 estão reservados e com reserva já confirmada para o mês todo de Setembro (é para fazer os testes), se eu quiser atribuir a uma reserva onde as datas de check-in e check-out estão entre esse mês de Setembro o NOT BETWEEN funciona perfeitamente pois esses quartos nao os motra, mas no entanto o 3º quarto do tipo duplo não mostra isto porque não existe nenhuma reserva na tabela N para N na BD em que o 3º quarto do tipo duplo esteja numa reserva confirmada.

    Para esclarecer melhor:

    Essas são as tabelas que estão relacionadas com as reservas.

    na tabela quartos eu tenho por exemplo quarto nr 101 com id 1 do tipo individual, nr 102 duplo com id 2, 103 duplo com id 3 e 104 duplo com id 4

    na tabela Reserva tenho duas reservas confirmadas para o dia 01/09/2012 ate ao dia 30/09/2012 em que os quartos reservados são duplos ou seja por exemplo o quarto nr 102 e 103. As reservas tem o id 1 e 2 respectivamente.

    Na tabela Reserva/Quarto tenho então o id reserva 1 e o id quarto 2 e a outra reserva com o id 2 e o id quarto 3.

    Então o funcionário pretende atribuir um quarto duplo (neste caso o quarto nr 104 com o id 4) a uma nova reserva também para o mês de Setembro. Então na pagina para mostrar os quartos disponiveis não pode mostrar os quartos nr 102 e 103 como é obvio, então usei esse query para tentar fazer isso, os quartos 102 e 103 nao aparecem graças ao NOT BETWEEN mas o quarto nr 104 que está livre e nao está em nenhuma reserva da tabela Reserva/Quarto logo nao aparece isto por causa desta linha: 

    INNER JOIN Quartos ON [Reserva/Quarto].id_quarto = Quartos.id_quarto

    Só mostra os quartos onde o id seja igual nas duas tabelas o problema está ai e não sei como fazer este query. Aquilo que pretendo é que apenas apareça os quartos que estão disponíveis naquelas datas da reserva estando ou não na tabela Reserva/Quarto.

    Alguém tem outra ideia de como fazer este query? já tentei varias coisas como FULL JOIN, OUTER JOIN e nada resulta.

    Obrigado.

    sábado, 1 de setembro de 2012 00:49

Respostas

  • Olá!
    Obrigado por responder.
    Estive ocupado com outras coisas e não tive tempo de responder aqui.
    Antes de você ter respondido à pergunta eu resolvi o problema de outra forma.
    Fiz queries à mão no c# onde fiz um select aos quartos ocupados naquelas datas e guardava numa lista, de seguida fazia um select aos quartos todos,comparava e quando o número dos quartos fosse diferente da lista com os quartos ocupados então mostrava esse quarto, não sei se é a melhor maneira. 
    Como você falou acho que até percebi, mas não estou a ver como ficaria o select.

    Obrigado.
    terça-feira, 25 de setembro de 2012 01:23

Todas as Respostas

  • Boa noite JrcN !

    O problema é que com este join o quarto e a reserva tem que estar nas 3 tabelas para voltar no resultado.

    O que acredito que resolveria o seu problema para verificar a disponibilidade de um quarto sem reserva seria fazer um select simples na tabela de quartos onde o ID do quarto não esteja na tabela de reservas em uma data especifica, assim só mostrariam os quartos que não tem reserva na data que voce quer.

    Acredito que isto resolveria o seu problema, se não resolver poste novamente.


    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    segunda-feira, 10 de setembro de 2012 21:22
  • Boa tarde Jrcn, voce consegui resolver ?

    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    terça-feira, 18 de setembro de 2012 20:45
  • Olá!
    Obrigado por responder.
    Estive ocupado com outras coisas e não tive tempo de responder aqui.
    Antes de você ter respondido à pergunta eu resolvi o problema de outra forma.
    Fiz queries à mão no c# onde fiz um select aos quartos ocupados naquelas datas e guardava numa lista, de seguida fazia um select aos quartos todos,comparava e quando o número dos quartos fosse diferente da lista com os quartos ocupados então mostrava esse quarto, não sei se é a melhor maneira. 
    Como você falou acho que até percebi, mas não estou a ver como ficaria o select.

    Obrigado.
    terça-feira, 25 de setembro de 2012 01:23