Array
(
)

Escala, como fazer?

onjahyr
   - 26 mar 2006

Olá pessoal,
Minha mãe é enfermeira, responsável pela tarefa de fazer a escala do pessoal no hospital. Ela faz tudo na mão. Eu queria criar um programa que fizesse isso automático, alguém poderia me dar uma ajuda para criar um programinha para construção de escalas?
São 14 funcionários no hospital (pequena clínica), são vários setores.
Quais dados vocês precisariam para iniciar?
Aguardo

RM
   - 26 mar 2006

Certamente os dados dos funcionários devem conter as restrições como por exemplo :horários de disponibilidade,frequência no rodizio,setores em que pode atuar,etc.
Os dados de setor devem conter os horários as serem preenchidos nos diversos setores.
Para montar a escala voce pode usar uma serie lógica de Ifs ou coisa parecida ou então implementar um algoritmo de ´programação linear ou ´pesquisa operacional´ Se não está familiarizado com estes termos instale e estude o suplemento ´Solver´ do Excel.Se bem me lembro um dos exemplos de uso deste suplemento do excel é justamente a elaboração de escalas ou coisa parecida.Não sei se para Delphi existe alguma implementação disponivel destes procedimentos.De qualquer forma é um assunto fascinante (como diria o Dr.Spock).
Espero ter sido de alguma utilidade.

onjahyr
   - 27 mar 2006

Bom, você não resolveu, mas deu uma idéia de onde eu posso tirar a resposta: SOLVER
Vou analisar o Excel e ver se existe algum modelo pronto, de lá vou tentar fazer um programinha.
Falowww

Robson

onjahyr
   - 28 mar 2006

:( Ainda preciso de ajuda, alguém poderia me ajudar com isso?

RM
   - 28 mar 2006

Ainda não resolvendo...
O solver era uma ideia se a tua opção fosse pela pesquisa operacional.
Pode ser pelos Ifs que comentei.Se for por pesquisa operacional>programação linear pode ver a lógica do ´Algoritmo Simplex´ para implmentar em teu programa.
Este caminho é o mais complexo que uma análise lógica com IFs
Espero que outros colegas te ajudem mais apropriadamente...
SDS/RM

RM
   - 29 mar 2006

Talvez um início de raciocínio...

Turnos ou horarios de trabalho.Refira-se a eles como
1
2
3

Considerando 3 setores AAA,BBB,CCC

Tabela funcionários TBLFun01 com restrições de turno e setor
Codfun
Funcionário
RestrT1-Varchar 3-Restrição de Turno1 (SIM ou em branco)
RestrT2
RestT3
RestStr1- Varchar 3 Restrição de setor
RestStr2
RestStr3
Utilizado Varchar3 –Neste campo será marcado “SIM” quando o funcionário for pego para rodizio

Tabela escala TBLEscala
Coddia
Dia -Datetime
Turno1Setor1-Varchar 30 (aqui irá o nome do funcionário)
Turno2Setor1
Turno3Setor1
Turno1Setor2
Turno2Setor2
Turno3Setor2
Turno1Setor3
Turno2Setor3
Turno3Setor3

Exemplo um setor três turnos

Crie primeiro o calendário na tabela Escala
Marque as restrições na tabela funcionario

Funcionário RestrT1 RestrT2 RestrT3 RestStr1 RestStr2 RestStr3
João SIM SIM
Marcos SIM SIM
Lucas SIM

Isto é João não pode assumir o turno 1 nem o setor AAA.
Marcos não pode assumir o turno 2 nem o Setor CCC
Lucas só não pode assumir turno 3

O objetivo é preencher a Tabela escala obedecendo estas restrições.

Uma idéia pode ser (em button)ir ao inicio da TBLEscala.Ir ao inicio da TBLFun. Abrir um loop na TBLEscala.Então localizar cada funcionário que possa assumir Setor/Turno. Uma vez utilizado o funcionário fica marcado no campo Utilizado da TBLFun como “SIM” .A posterior busca deve ter em conta este campo (utilizado) TAMBEM como restrição.

Após preencher todos os campos da escala no dia prossegue o loop com next na TBlEscala.

Questão:Como buscar o funcionário com as restrições:>

Poderia ser por SQL com select where ,etc.(presumo) ou abrir um repeat dentro do loop acima mencionado com os Ifs que te falei

EXEMPLO para UM setor e UM turno

TBLEscala.First;
While not TBLEscala.eof do begin
TBLFun.first;
repeat
If (TBLFunRestrT1.value=’SIM’) or (TBLFunRestStr1.value=’SIM’) or (TBLFUtilizado.value=’SIM’) then BEGIN //TESTA RESTRIÇÕES
TBLFun.NEXT;
Until
(TBLFunRestrT1.value=’NAO’) AND (TBLFunRestStr1.value=’NAO’) AND (TBLFUtilizado.value=’NAO’) OR TBLFUN.eof //ACHA LIVRE
END;
TBLEscala.edit ;
TBLEscalaTurno1Setor1.Value:=TBLFunFuncionario.value;
TBLEscala.post;

Depois de ter feito todos setores/turnos
TBLEscala.next ;
End ;

Esta é a ideia básica.Não testei ,não sei se funciona e deve ter vários erros.(quando chega no fim TBLFun.eof- pode ocorrer de pegar o funcionario de qualquer jeito)Tambem existem questões especificas da escala que não sei como por ex :quando remarcar o funcionário como livre(utilizado=não)?

.Se quizer mesmo fazer vai dar algum trabalho.

RM
   - 30 mar 2006

E aí?Funcionou?