Programa de Gestão Hoteleira

jags17

Power Member
Boas pessoal,

estou a desenvolver um programa de gestão hoteleira para a minha PAP e deparei.me com 2 duvidas que me tão a impedir de prosseguir com o projeto que consiste nisto:

O software terá 3 sub-softwares que serão chamados consoante as informações no painel de login do programa (ex: se o nome de utilizador for X e a password for Y entao abre o sub-software da recepção, se o utilizador for K e a pass for Z entao abre o sub-software do bar, se o utilizador for A e a pass for B entao abre o sub-software do quarto)...isto tudo sera gerido por uma base de dados (ainda tou indeciso entre Access e SQL Server Express...se me puderem dar a vossa opiniao tambem...obrigado)

entao aqui estao as duvidas:

1ª No sub-software do quarto existe um serviço de quartos electronico que permite ao hospede seleccionar produtos em stock e enviar uma mensagem ao sub-software do bar com o respetivo pedido...o ideal era quando alguem faz um pedido no quarto, o computador do bar receber um alerta no ecra com a descrição do pedido...como faço isto de modo a que em qualquer altura que o programa esteja a correr ele possa receber os alertas? É que eu so consigo fazer este tipo de operação se a form estiver a fazer load ou close e nao em qualquer altura em que o programa esteja a correr...

2ª No sub-software da recepção (e já postei isto antes mas nao acho que tenha sido muito explicito na altura) eu pretendo que a minha form de reservas seja aberta atraves da planta do edificio...por exemplo quando eu carregar num botão chamado reservas abre uma form com a planta e depois mediante o quarto em que eu carregar abre a form da reserva do hospede...a minha ideia era tornar a planta mais inteligente e mudar a cor dos quartos mediante o seu estado (livre=verde; reservado=amarelo; ocupado=vermelho) utilizando para isto a propriedade "estado" na tabela dos quartos...resumindo se na tabela o estado do quarto 21 for "livre" entao na planta o quarto 21 tera a cor verde...mas como é que consigo manipular o desenho da planta para mudar as cores? atraves de paineis? e como é que realizo esta operação sem ter de fazer uma consulta a base de dados para cada quarto para poder manipular o painel certo? tenho de fazer um ciclo por quarto?

sei que posso nao me estar a fazer entender muito bem mas se nao perceberem a duvida por favor perguntem que eu tento explicar de forma mais clara...



se me puderem ajudar fico muito agradecido

Obrigado

Boa noite a todos
 
Quanto à base de dados, se tiveres conhecimentos suficientes, vai para o SQL Server. O access serve para iniciar a aprendizagem de bases de dados e para pequenos projectos caseiros. O SQL server já é SGBD a sério.

Quanto ao sistema de mensagens, o melhor a fazer é usares um modelo de sockets, cliente servidor. O teu SW do bar tem uma thread à escuta numa porta predeterminada, e cada vez que recebe um pedido nessa porta (enviado pelo pc do quarto) processa o pedido. Podes ter várias abordagens. Uma é o pc do quarto indicar que existe um pedido para o quarto x na base de dados, e o SW do bar vai à base de dados buscar o pedido. Outro é o PC do quarto fazer o pedido ao PC do bar, e o PC do bar faz o processamento do mesmo e insere-o na BD. Depois tens a possibilidade de colocar o SW do bar a fazer consultas periódicas à base de dados (numa thread distinta em background), mas este método não é lá muito eficiente.
Também não sei se há forma de usar um trigger na própria base de dados. Alguém que perceba mais de SQL Server poderá tirar a dúvida.

Quanto à reserva de quartos, creio que não haverá maneira simples de fazer isso com uma só imagem (mas deixa ver se alguém conhece uma solução fácil para isso). Uma maneira será partir a imagem da planta em paineis, e colorir cada um individualmente.
Quanto à ligação à bd, podes fazer uma consulta de todos os quartos, e pintas os paineis de acordo com o estado de cada quarto dessa consulta.
 
Flinger obrigado por responderes.

Eu pensei exatamente na mesma coisa em relação aos paineis dos quartos...o unico problema é que o hotel tem 3 pisos e 126 quartos...ou seja eu teria de fazer um if para comparar o valor na base de dados para cada quarto? 126 ifs?...nao da para fazer isto mais automaticamente? eu sei que talvez esteja a pedir demais mas se conseguisse por esta parte do porgrama a funcionar ia ficar espetacular...
 
Fazes uma consulta à base de dados, que te devolve um conjunto de entradas com todos os quartos e o estado de cada um.

Aqui tens duas hipóteses. Ou fazes um ciclo, onde, para cada quarto mudas a côr do painel respectivo, ou usas um databind para os paineis. Isto permite que, ao alterares o valor do estado dos quartos, os paineis sejam actualizados automáticamente. Em teoria isto é possível, como se faz na prática... isso é outra história :D De qualquer forma, o que estás a usar para o SW? VB6, .net?
 
é .net na mesma. Não é o Visual Studio, mas a diferença está nas linguagens e no tipo de aplicações que podes usar. Como é o 2010 também podes tirar partido da framework 4.0... vou dar uma vista de olhos, a ver se consigo descobrir algo mais palpável. Entretanto vai investigando tu também, não fiques parado :D
 
Aplica o KISS (Keep It Short and Simple).

A solução que apresentaste:
SO: Windows
Software aplicacional: VB.net
Base Dados: SQL Server
Total $$: Pago

Solução free:
SO: Qualquer um
Software aplicacional: server side: PHP; client side: qualquer web browser
Base Dados: MySQL
Total $$: Gratuito

Mensagens, alertas, whatever? AJAX all the way =P
 
Flinger...aqui esta um codigo que me sugeriram...funciona apenas para um quarto e nao consigo põ-lo a identificar o numero do quarto na query porque da.me um erro...mesmo utilizando um AND...aqui está:

Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Application.StartupPath & "\BD_PAP.mdb")
Dim cmd As New OleDbCommand("SELECT * FROM quarto WHERE EstadoQuarto = 'Ocupado'", con)
con.Open()
Dim dr As OleDbDataReader = cmd.ExecuteReader()

If dr.HasRows Then
If dr.Read Then
Panel1.BackColor = Color.Red
End If
Else : Panel1.BackColor = Color.Green
End If




se me conseguires dar una ajuda para generalizar isto para todos os quartos identificando 1 a 1 e mudando paines diferentes (cada quarto tem um painel diferente)...agradecia..


obrigado


cumprimentos
 
O ideal seria teres todos os paineis num array, ou ainda melhor, num hashmap, com o número de quarto como key. Assim terias uma forma de ligar dinamicamente os paineis aos quartos.

Ao fazer o load do quarto terias de criar o hashmap e adicionar todos os paineis, sendo este processo manual. A partir daí fica ainda mais fácil do que o que essa query está a fazer.

Eu não sou programador de VB. Também não estou habituado a usar o OleDB para conecções (normalmente uso linq). Mas essa query não me parece a mais indicada. Isso permite-te saber se existem quartos ocupados. não só não te faz a ligação ao quarto que queres, como não te permite saber se está livre (a menos que depreendas que se não está ocupado está livre. Não sei se queres ter outro estado, como reservado).

Deixa-me só ver qual é o tipo de dr, e o que posso sacar da consulta. Posta aí a tabela quartos, para saber os campos que tens.

Para te dar uma deixa (o código não está a funcionar porque me faltam bases de VB):

Variável do form:
Código:
[COLOR=blue]Dim[/COLOR] tabe [COLOR=blue]As[/COLOR] [COLOR=#2b91af]Hashtable[/COLOR] = [COLOR=blue]New[/COLOR] [COLOR=#2b91af]Hashtable[/COLOR]()

Load do form:
Código:
[COLOR=black][FONT=Consolas] 
table.Add(1, Panel1)[/FONT][/COLOR]
table.Add(2, Panel2)        
table.Add(3, Panel3)        
table.Add(4, Panel4)

Coloração dos paineis:
Código:
[COLOR=blue]Dim[/COLOR] con [COLOR=blue]As[/COLOR] [COLOR=#2b91af]OleDbConnection[/COLOR] = [COLOR=blue]New[/COLOR] [COLOR=#2b91af]OleDbConnection[/COLOR]([COLOR=#a31515]"Provider=Microsoft.Jet.OLEDB.4.0; Data Source="[/COLOR] & [COLOR=#2b91af]Application[/COLOR].StartupPath & [COLOR=#a31515]"\BD_PAP.mdb"[/COLOR])        
[COLOR=blue]Dim[/COLOR] cmd [COLOR=blue]As[/COLOR] [COLOR=blue]New[/COLOR] [COLOR=#2b91af]OleDbCommand[/COLOR]([COLOR=#a31515]"SELECT * FROM quarto"[/COLOR], con)        con.Open()        [COLOR=blue]Dim[/COLOR] dr [COLOR=blue]As[/COLOR] [COLOR=#2b91af]OleDbDataReader[/COLOR] = cmd.ExecuteReader()         
[COLOR=blue]While[/COLOR] (dr.Read())            
[COLOR=blue]      Dim[/COLOR] n [COLOR=blue]As[/COLOR] [COLOR=blue]Integer[/COLOR] = dr(0)            
[COLOR=blue]      Dim[/COLOR] estado [COLOR=blue]As[/COLOR] [COLOR=blue]String[/COLOR] = dr(1)            
[COLOR=blue]      If[/COLOR] (estado.Equals([COLOR=#a31515]"ocupado"[/COLOR])) [COLOR=blue]Then[/COLOR]                 
              table.Item(n).BackColor = [COLOR=#2b91af]Color[/COLOR].Red            
[COLOR=blue]      ElseIf[/COLOR] (estado.Equals([COLOR=#a31515]"livre"[/COLOR])) [COLOR=blue]Then[/COLOR]                 
              table.Item(n).BackColor = [COLOR=#2b91af]Color[/COLOR].Green            
[COLOR=blue]      End[/COLOR] [COLOR=blue]If 
[/COLOR][COLOR=blue][FONT=Consolas]End[/FONT][/COLOR][COLOR=blue][FONT=Consolas]While[/FONT][/COLOR]

O código não está a funcionar porque o cast não está a ser feito bem, julgo eu. Alguém que perceba mais de VB que dê uma mãozinha.

EDIT: Já está a funcionar. Acerta o nome dos campos, e tens de adapatar o nome dos paineis e número dos quartos ao teu programa.
 
Última edição:
Boas,
A solução do Flinger está correcta.A utilização do HashMap é uma boa ideia e penso que resolve os problemas.
Cumps
 
Eu nunca ouvi falar de hashmap mas vou.me informar e se tu dizes que funcionou....

A tabela quarto é composta pelos seguintes campos:
-PK_CodQuarto
-TipoQuarto
-EstadoQuarto
-ValorQuarto

mais uma vez obrigado por toda a ajuda...obrigado a todos...
 
Acabei de testar e está a funcionar EXATAMENTE como eu queria...eu quase que saltava da cadeira de tanta alegria (ao tempo que eu ja imaginava isto e nao conseguia pôr em prática :001:....obrigado pessoal...obrigadao mesmo
 
Ora bem agora estou com outro problema...lol...vai ser possivel (utilizando context menu strips) carregar com o botão direito do rato em cima de qualquer painel e reservar aquele quarto especifico...o problema é que depois de fazer a reserva a cor do quarto nao atualiza enquanto eu nao fechar o programa e o iniciar outra vez...ja exerimentei botões, timers...com o refresh o update, etc... mas nada funcionou...eu penso que se fechar a form e a abrir de novo o problema fica resolvido mas como eu adicionei um efeito de iniciação (a form quando é carregada vem a deslizar da direita par o centro)...fica um pouco "inprofissional" estar a fechar a form ao estilo do windows aero e carrega.la como eu a programei....nao existem uma função qualquer que me faça o equivalente ao load da form? uma coisa de frações de segundo?...

Obrigado


Cumprimentos
 
Como atalho rápido, podes colocar o código que te dei numa função, e chamas essa função no load do form, bem como no fim de fazer a reserva.
 
Flinger obrigado pelo apoio e paciência :p....eu ja criei a função e copiei o codigo mas nao funcionava e o erro era que a conexão nao tinha sido fechada, ou seja, ele abria a conexao, distribuia as cores mas quando eu precisasse de chamar a função outra vez dava erro porque ele abria outra vez a conexao, sem a ter fechado...entao passei o con.open para o load da form em vez de o por no procedimento e aí da.me outro erro que nao sei o que significa: "Variável de objecto ou de bloco With não definida." e a linha de código para onde o erro aponta é: "table.Item(n).BackColor = Color.OliveDrab"

o código da função:
"Dim cmd As New OleDbCommand("SELECT * FROM quarto", con)

Dim dr As OleDbDataReader = cmd.ExecuteReader()
While (dr.Read())
Dim n As Integer = dr(0)
Dim estado As String = dr(2)
If (estado.Equals("Ocupado")) Then
table.Item(n).BackColor = Color.Brown
ElseIf (estado.Equals("Livre")) Then
table.Item(n).BackColor = Color.OliveDrab <-- é esta a linha de código que o erro aponta....
ElseIf (estado.Equals("Reservado")) Then
table.Item(n).BackColor = Color.Gold
End If
End While"

e o mais irónico nisto tudo é que deu o erro, eu parei o debug e voltei a corre-lo e a cor alterou...>(

nao estou a perceber o porque do erro...podes dar mais uma ajuda?
 
Última edição:
Back
Topo