Calculo baseado em horas

Delphi

02/10/2006

Boa tarde a todos...

Pessoal, eu desenvolvi um sistema de ponto, onde fica registrado a saída e entrada dos usuários, bem sendo assim tenho uma tabela de registro com os campos:
+------------------+
|DATA     | DATE   |
|HORA     | TIME   |
|ID_USER  | INTEGER|
|ID_EVENT | INTEGER|
+----------+-------+

Sendo assim, no fim o meu relatório exibirá os seguintes dados:
+==============================================+
| RELATORIO DE PONTO                           |
+==============================================+
|                                              |
+----------------------------------------------+
| * DATA: 02/10/2006 *                         |
+----------------------------------------------+
| 08:10 ENTRADA                                |
| 12:07 SAIDA ALMOCO                           |
| 13:35 RETORNO ALMOCO                         |
| 17:00 SAIDA                                  |
+----------------------------------------------+
|                   Tempo trabalhado: ??:??:?? |
+----------------------------------------------+
| * DATA: 03/10/2006 *                         |
+----------------------------------------------+
| 08:07 ENTRADA                                |
| 12:05 SAIDA ALMOCO                           |
| 13:32 RETORNO ALMOCO                         |
| 17:02 SAIDA                                  |
+----------------------------------------------+
|                   Tempo trabalhado: ??:??:?? |
+----------------------------------------------+
|                   Total trabalhado: ??:??:?? |
+==============================================+

A minha dúvida é como somar somente os periodos aproveitados, ignorando os intervalos..

Antecipadamente agradeço a todos...


Aloizio Castro

Aloizio Castro

Curtidas 0

Respostas

Micheus

Micheus

02/10/2006

Que valores assume ID_EVENT?


GOSTEI 0
Aloizio Castro

Aloizio Castro

02/10/2006

Que valores assume ID_EVENT?


é o ID de uma tabela de eventos, para fazer o relacionamento...

+----------+-----------+
| ID_EVENT | DESCRICAO |
+----------+-----------+
|  1       | "ENTRADA" |
|  2       | "SAIDA"   |
+----------------------+



GOSTEI 0
Micheus

Micheus

02/10/2006

Perguntei pois poderia haver a possibilidade de identificar entrada e saída nos diferentes períodos (4 valores), e então iria lhe sugerir algo como:
select (RS.HORA -RE.HORA) HR_TRABALHADA from registro RE, registro RS where RE.DATA = RS.DATA and RE.ID_EVENT = 1 and RS.ID_EVENT = 2

Mas neste caso não funcionará.

Vc não poderia fazer isto no processo de geração do relatório. Faça sua consulta ordenada por data e hora. Para o relatório crie um grupo por data, as horas correção pela detalhe. Horas trabalhadas no dia ficariam num groupfooter onde vc totaliza o dia. Uma banda de sumario totalizaria os dias.

Informe que componente vc pretende utilizar para gerar o relatório, assim, pode ser mais fácil de alguém dar uma sugestão.

[]s


GOSTEI 0
Aloizio Castro

Aloizio Castro

02/10/2006

Eu pretendia fazer uso do FreeReport...

Qto aos eventos, vc acha q se eu criasse flag para identificar entrada e saida, o calculo de horas trabalhadas ficaria mais simples?


GOSTEI 0
Raserafim

Raserafim

02/10/2006

vc pode fazer o seguinte.
vá para o primeiro registro (pelo que vc mostrou vai ser a hora de entrada, ID = 1) e pegue a hora que entrou.
vá para o próximo registro (que vai ser a hora de saída, ID = 2).
agora calcule a diferença em um array dinâmico.
vá para o próximo registro, caso tenha, faça o mesmo procedimento.
até varrer a tabela intera, e sempre armazenando a diferenca no array que vc vai dimensionando a medida em for varrendo a tabela e encontrando a diferença da hora.

e finalmente vc varre o array somando os tempos.

para calcular as direfenças de tempo nas horas, vá ho help do delphi, na guia Índice, e digite [b:7f0ab37cd0]datetime routines[/b:7f0ab37cd0]
vai mostrar um monte de funções para este tipo de tratamento.


GOSTEI 0
Aloizio Castro

Aloizio Castro

02/10/2006

vc pode fazer o seguinte. vá para o primeiro registro (pelo que vc mostrou vai ser a hora de entrada, ID = 1) e pegue a hora que entrou. vá para o próximo registro (que vai ser a hora de saída, ID = 2). agora calcule a diferença em um array dinâmico. vá para o próximo registro, caso tenha, faça o mesmo procedimento. até varrer a tabela intera, e sempre armazenando a diferenca no array que vc vai dimensionando a medida em for varrendo a tabela e encontrando a diferença da hora. e finalmente vc varre o array somando os tempos. para calcular as direfenças de tempo nas horas, vá ho help do delphi, na guia Índice, e digite [b:11e79e2ce7]datetime routines[/b:11e79e2ce7] vai mostrar um monte de funções para este tipo de tratamento.


Ok, é uma idéia simples e prática, mas sou novo no FreeReport, sabe como implementar isto no FreeReporte??


GOSTEI 0
Aloizio Castro

Aloizio Castro

02/10/2006

up


GOSTEI 0
Aloizio Castro

Aloizio Castro

02/10/2006

up


GOSTEI 0
Micheus

Micheus

02/10/2006

Qto aos eventos, vc acha q se eu criasse flag para identificar entrada e saida, o calculo de horas trabalhadas ficaria mais simples?
Acho que não.

[b:07631ece5f]_anderson_[/b:07631ece5f], como não obteve solução ainda, vou dar a sugestão se vc utilizar QuickReport. Pelo menos pode servir de referência:
+==============================================+
| RELATORIO DE PONTO                           |
+==============================================+
|                                              |
Estaria em um PageHeader
+----------------------------------------------+
| * DATA: 02/10/2006 *                         |
+----------------------------------------------+
Estaria em um GroupHeader
| 08:10 ENTRADA                                |
Estaria em um Detail
| 12:07 SAIDA ALMOCO                           |
| 13:35 RETORNO ALMOCO                         |
| 17:00 SAIDA                                  |
resultado impresso pelo detail considerando a consulta ordenada por Data, Hora.
A questão do texto entrada/saída almoço/retorno almoço/saída teria que ser gerenciado no before print da banda de modo que utilizando um indicador (inicializado na GroupHeader) vc modificaria o caption do texto e incrementaria este indicador. Poderia iniciar em 1 e terminar em 4, daí utilizando um case no evento, daria para ajustar o texto.
+----------------------------------------------+
|                   Tempo trabalhado: ??:??:?? |
+----------------------------------------------+
Este estaria num GroupFooter, onde o somatório das hora teria que ser controlado também na banda detalhe, utilizando a mesma filosofia dos cases. Inicializa o valor na group band, então no evento before print do detail e através do case, voce faz o somatório de forma correta. Tem que ter um também para o taotal geral. Coloque a inicialização dele no Before Print do QuickReport.
+----------------------------------------------+
|                   Total trabalhado: ??:??:?? |
+==============================================+ 
Este ficaria numa banda sumary. E o valor total contabilizado anteriormente seria aqui impresso.
As variáveis para totalização da hora podem ser TDateTime, mas para visualizar total de horas superior a 24:00, não há uma formatação que contemple isto. Uma alternativa está neste post que coloquei em outro forum ([url=http://www.activedelphi.com.br/modules.php?op=modload&name=XForum&file=viewthread&tid=24194#pid61619][b:07631ece5f]link[/b:07631ece5f][/url]).

[]s


GOSTEI 0
Aloizio Castro

Aloizio Castro

02/10/2006

Obrigadissimo pela boa vontade....

Vou analisar e implementar...

abraços


GOSTEI 0
POSTAR