Clipper On Line • Ver Tópico - Calcular a diferença entre dois horários

Calcular a diferença entre dois horários

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

Calcular a diferença entre dois horários

Mensagempor Tomaz Edson Linhares » 24 Nov 2017 20:54

Olá amigos,
Preciso fazer uma rotina tipo cartão de ponto, quando é lançada a entrada, por exemplo 07:30 hs e saida a 14:29 hs. Preciso que seja informada o resultado da diferença em horas e minutos entre essas duas horas, afim de saber quantas horas esse funcionário trabalhou nesse dia, e por fim somar todas as horas para saber quantas horas ele trabalhou no mês. Outra situação é fazer uma critica quando, por descuido seja informado a hora de saida menor do que a hora de entreda, tipo assim: entrada 09:00hs e saida 08:22hs, pois a hora de saida não pode ser entes da hora de entrada.

Fiz uma rotina usando :

DEFINE TIMEPICKER hora_entrada1
ROW 140
COL 050
WIDTH 080
HEIGHT 20
FONTSIZE 10
TOOLTIP " Informe a hora da entrada do funcionário"
SHOWNONE .f.
VALUE ""
TIMEFORMAT "HH:mm"
on enter {||valida_horaponto( this.value , FORM_CARTAO_PONTO.hora_saida1.value ) }
END TIMEPICKER

DEFINE TIMEPICKER hora_saida1
ROW 140
COL 050
WIDTH 080
HEIGHT 20
FONTSIZE 10
TOOLTIP " Informe a hora da saida do funcionário"
SHOWNONE .f.
VALUE ""
TIMEFORMAT "HH:mm"
on enter {||valida_horaponto(FORM_CARTAO_PONTO.hora_entrada1.value , this.value ) }
END TIMEPICKER

...

Function valida_horaponto()
parameters entrada,saida

if val(saida)<val(entrada)
msgbox('A saida '+saida+' informada não pode ser menor do que a entrada '+entrada+' informada',)
return .f.
endif
return nil

Dessa forma o valor de retorno é sempre a direrença entre as horas e não levando em conta os minutos, por exemplo, para o sistemas a diferença entre 07:30hs e 08:45hs é 1h e não 1:15hs, além de não criticar por exemplo que a saída 07:45hs é menor do que a entrada 07:30hs caso eu digite por engano a hora de saída anterior a hora de entrada.

Já tentei varias formas, porém sem sucesso.

Fico grato se alguém puder me ajudar.

Abraços.
Tomaz Edson Linhares
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 32
Data de registro: 19 Abr 2016 17:03
Cidade/Estado: São Gonçalo/RJ
Curtiu: 1 vez
Mens.Curtidas: 0 vez

Calcular a diferença entre dois horários

Mensagempor Toledo » 24 Nov 2017 21:37

Amigo, você pode usar as funções SECS() e ELAPTIME(), por exemplo:

entrada:="07:30:00"
saida:="14:29:00"

If SECS(saida)<SECS(entrada)
   MsgInfo("Hora de Saida menor que Entrada")
   Return .F.
endif

cDifHs:=ELAPTIME(entrada, saida)  //retorna 06:59:00 - como caracter


Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

Calcular a diferença entre dois horários

Mensagempor Poka » 25 Nov 2017 12:08

Olá Tomaz

Veja se estas rotinas te atende

/*
MODULO - Funcoes_horas.prg
Roberto Oliveira (Poka)  Leme/SP
a entrada de horas tem que ser decimal
ex: 1,28

*/
////////////////////////////
*-------- HORAS-----------------
FUNCT DIF_HORAS(XHORA1,XHORA2)
   // CALCULA O TEMPO
   // VERIFICA HORAS E MINUTOS
   LOCAL H1,H2,M1,M2,QTH:=0,QTM:=0
   LOCAL XTEMPO:=0

   // SE F RETORNA -1 , OU RETORNA O TEMPO DE HORAS
   IF ! F_HORA(XHORA1).OR. ! F_HORA(XHORA2)
     RETU (-1)
   ENDIF
   IF XHORA1=XHORA2
      XTEMPO:=0
   ELSEIF XHORA2 > XHORA1 // MESMO DIA
      H1:=INT(XHORA1)
      H2:=INT(XHORA2)
      M1:=1440- ( (INT(H1) *60) +    ((XHORA1-H1)*100 ))
      M2:=1440- ( (INT(H2) *60) +    ((XHORA2-H2)*100 ))
                  QTM:=M1-M2
      XTEMPO:=MINUTOHORA( QTM)
   ELSE
            // DIA DIEFERENTE (H2 MENOR QUE H1)
      M1:=1440- ( (INT(XHORA1) *60) +    ((XHORA1-INT(XHORA1))*100 ))
      // CALCULO M2 APOS MEIA NOITE
      M2:=(INT(XHORA2) *60) +    ((XHORA2-INT(XHORA2))*100 )
                  QTM:= M1+M2
      XTEMPO:=MINUTOHORA( QTM)
         ENDIF

RETUR (XTEMPO)

/////////////
FUNCT HORAMINUTO(XHORA)
   // TRANSFOMA HORAS EM MINUTOS
   LOCAL X:=(INT(XHORA)*60)+ ( (XHORA-INT(XHORA))*100 )
RETUR (X)
/////////////
FUNCT MINUTOHORA(XMINUTO)
   LOCAL XH,XM , x
   // TRANSFOMA MINUTOS EM HORA
   XH:= INT(XMINUTO/60 )
   XM:=MOD(XMINUTO,60)/100
   X:=XH+XM
RETUR ( X)

/////////////
FUNCT F_MINUTO(XHORA)
   // XHORA VEM SEMPRE NUMERICO
   // VERIFICA SE OS MINUTOS SAO VALIDOS
   IF (XHORA-INT(XHORA)) *100 > 59
      RETU .F.
   ENDIF
RETUR .T.
//////////////////
FUNCT F_HORA(XHORA)
   // XHORA VEM SEMPRE NUMERICO
   // VERIFICA SE HORA E MINUTOS SAO VALIDOS
   IF XHORA>=24 .OR. (XHORA-INT(XHORA) ) *100 > 59
      RETU .F.
   ENDIF
RETUR .T.
///////////
FUNCT F_SOMAHORAS(XHORA1,XHORA2)
   LOCAL m1,m2,XTEMPO
   // XHORA VEM SEMPRE NUMERICO
   // VERIFICA SE HORA E MINUTOS SAO VALIDOS
   M1:= (INT(XHORA1) *60) +  (INT(XHORA2)*60)
   M2:=( (XHORA1- INT(XHORA1))*100)   + ( (XHORA2- INT(XHORA2))*100)
         QTM:=M1+M2

   XTEMPO:=MINUTOHORA( QTM)
RETUR XTEMPO



Poka
Avatar de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 514
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 24 vezes

Calcular a diferença entre dois horários

Mensagempor Poka » 25 Nov 2017 14:41

Tomaz disse
Outra situação é fazer uma critica quando, por descuido seja informado a hora de saida menor do que a hora de entreda, tipo assim: entrada 09:00hs e saida 08:22hs, pois a hora de saida não pode ser entes da hora de entrada.


Pode acontecer do funcionário entrar a 22:00hs de um dia e sair as 4:00 hs de outro dia
Na rotina que passei resolve esse caso. Faz um teste aí.

Poka
Avatar de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 514
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 24 vezes




Retornar para MiniGui

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 7 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro