DevMedia

Escala, como fazer?

0
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


Publicidade

Respostas (6)

0
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.


0
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


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


0
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


0
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.


0
E aí?Funcionou?