Senhores, boa tarde.
Estou tentando implementar uma agenda médica, onde existem horários pré-definidos de 50 em 50 minutos ( o tempo de uma consulta ), para isto utilizo a seguinte estrutura (foi uma idéia minha, aceito dicas de mudança rs).
TB_CONSULTA
int seq -> (numero sequencial, PK)
int id_horario
date data
TB_HORARIO
int id
varchar(5) descrição (08:00, 08:50, 09:40, 10:30, 11:20 . etc… são 15 horários)
Para recuperar os horários ocupados em uma data é muito fácil, basta fazer um join entre as duas tabelas, pois a tabela TB_CONSULTA sempre possui o id do horario agendado, bastando então recuperar a descrição do horario na tabela TB_HORARIO e exibir em tela, numa listagem.
So que nesta mesma listagem, eu também gostaria de exibir os horarios que estão desocupados, mas eu queria colocar tudo numa ordem sequencial, por exemplo:
DATA HORÁRIO SITUAÇÃO
09/03/2012 08:00 ocupado
09/03/2012 08:50 livre
09/03/2012 09:40 ocupado
09/03/2012 10:30 ocupado
09/03/2012 11:20 livre
Na tela, o usuário escolheria uma data para verificar qual a situação de todos os horários daquele dia, então a pesquisa seria feita. De tal forma, eu pensei em criar uma coleção de VO’s (VoConsulta) com 15 VO’s (pois são 15 horários pré-definidos), onde esses vo’s seriam populados com os dados dos horários do dia. De tal forma, se o horario estiver vazio, o vo conterá populado nele apenas a data e horario. Se o horario estiver ocupado, o vo terá populado outros dados também, como o nome do paciente, do médico, etc.
Até aí tudo bem, o problema é se o usuário pesquisar por um intervalo de datas. Por exemplo de 09/03/2012 a 20/03/2012. Eu teria que criar 15 Vo’s para cada dia, e se o intervalo fosse maior seriam incontáveis então a quantidade de vo’s abrigados em uma collection, o que deixaria o processo muito muito lento (provavelmente).
Finalmente, a minha pergunta é, alguém tem uma idéia melhor que essa para resolver esta situação? Levando em conta que o que eu preciso é exibir a listagem de horários, separados por data (paginação)… ? Este processo que estou usando parece ser muito “braçal”, mas não consegui pensar em outra coisa, e já pesquisei e não achei nada que pudesse me suprir.
Obrigado pela atenção de todos.