Soma de horas relogio de ponto

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
marbio
Usuário Nível 3
Usuário Nível 3
Mensagens: 206
Registrado em: 29 Jul 2004 16:26

Soma de horas relogio de ponto

Mensagem por marbio »

Boa Tarde...

Gostaria de saber como somar as horas do banco de dados esta neste formata

entrada1 saida1 entrada2 saida2

08:30 12:30 13:30 17:30


os campos sao caracter

t+
Sempre há uma solucao para os nossos problema clipper.....
DORNELES
Usuário Nível 1
Usuário Nível 1
Mensagens: 19
Registrado em: 14 Out 2005 04:51

Mensagem por DORNELES »

Amigo tenho as rotinas para calcular as horas, desenvolvi um sistema para relógio de ponto a mais de 6 anos, sofri muito para fazer esse calculo.
Vamos lá, primeiro você tem que calcular a diferença entre a entrada e saida de AM (cedo) e a diferença entre a entrada e saida de PM (tarde) e somar os dois resultados.

08:30 12:30 = 4:00
13:30 17:30 = 4:00

nTotHoraAM := Dif_Hora(entrada_am+":00",saida_am+":00")
nTotHoraPM := Dif_Hora(entrada_pm+":00",saida_pm+":00")
//
cHoraAM := SUBSTR(nTotHoraAM,0,2)+SUBSTR(nTotHoraAM,4,2)
cHoraPM := SUBSTR(nTotHoraPM,0,2)+SUBSTR(nTotHoraPM,4,2)
//
Total_Horas := SomaHora(VAL(cHoraAM),VAL(cHoraPM))

me manda o seu e-mail que ti envio as rotinas.

OK
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

Faça uso também destas funções:

Código: Selecionar todos

FUNCTION HoraToMinuto( horas )
   // Transforma horas passadas no formato caracter em um numero   
   // INTEIRO que representa o total de minutos do parametro passado
   IF VALTYPE( horas ) = 'C'
      // HoraToMinuto( "194:20" ) = 11660 min
      RETURN (VAL(SUBSTR(horas,1,AT(":",horas)-1))*60)+VAL(SUBSTR(horas,AT(":",horas)+1,2))
   ELSE
      // HoraToMinuto( 194,20 ) = 11660 min
      RETURN (VAL(SUBSTR(STR(horas,6,2),1,3))*60)+VAL(SUBSTR(STR(horas,6,2),5,2))
   ENDIF

FUNCTION HoraToNumero( horas )
   // Transforma horas passadas no formato caracter em um numero 
   // DECIMAL que representa o total de minutos do parametro passado
   IF VALTYPE( horas ) = 'C'
      A := VAL(SUBSTR(horas,1,AT(":",horas)-1))*60+VAL(SUBSTR(horas,AT(":",horas)+1,2))
   ELSE
      A := VAL(SUBSTR(STR(horas,6,2),1,3))*60+VAL(SUBSTR(STR(horas,6,2),5,2))
   ENDIF
   RETURN VAL(STRZERO(INT(DIV(A,60)),3,0)+"."+STRZERO(MOD(A,60),2,0))

FUNCTION MinutoToHora( horas )
   // Transforma minutos em horario
   IF VALTYPE( horas ) = 'C'
      BEEP()
      // MENSAGEM('Calculo com NUMEROS retornando CARACTER')
      RETURN .F.
   ELSE
      RETURN STRZERO(INT(DIV(horas,60)),3,0)+":"+STRZERO(MOD(horas,60),2,0)
   ENDIF
Exemplos:

Transforma Horas em minutos:

MinutoToHora( "240:00" )
devolve 14400 minutos

Transforma minutos em Horas:

MinutoToHora( 14400 )
devolve "240:00"

Calcular horas:

MinutoToHora( "240:00" ) - MinutoToHora( "120:00" )
devolve 7200 minutos

@braços :?)
And
Usuário Nível 3
Usuário Nível 3
Mensagens: 163
Registrado em: 25 Set 2005 18:31
Localização: São Paulo/SP

Mensagem por And »

Eu uso FT_ELTIME(cTime1,cTime2) da lib Nanforum Toolkit 2.1 e Timetosec(cTime) e Sectotime(nSeconds) da Nantucket Tools II.


Exemplo:

Expediente determinado = 08:00 as 12:00 e das 13:00 as 17:00
Expediente relógio = 07:30 as 12:00 e das 13:10 as 17:00

nEntrada := Timetosec(determinado)-Timetosec(relógio)
nIntervalo := Timetosec(Ft_eltime(relógio_saida,relógio_entrada))-Timetosec(Ft_eltime(determinado_saida,determinado_entrada))
nSaida := Timetosec(determinado)-Timetosec(relógio)

nAtrasos := 0
nExtras := 0

if nEntrada < 0
nAtrasos += nEntrada
Else
nExtras += nEntrada
endif

if nIntervalo < 0
nAtrasos += nIntervalo
else
nExtras += nIntervalo
endif

if nSaida < 0
nAtrasos += nSaida
else
nExtras += nSaida
endif

cAtrasos := Sectotime(Val(Strtran(Str(nAtrasos),"-","")))
cExtras := Sectotime(nExtras)

Isso para calcular a diferença entre o horário determinado e o horário registrado pelo relógio, pelo menos é assim que faço.


Ps: Caso o que queira realmente é somar (1+1+1+1=4), avise que tenho uma função pronta.


Abraços,

[/b]
Anderson
Clipper 52e/Clipper 53b/Blinker 7/Vlib/Fglib/DBFNTX
_______________________________________________
Migrando para [x]Harbour 0.99.60 (SimpLex) + MiniGUI 1.2 Exp. (Build 22)
_______________________________________________
Assine o manifesto dos artistas pela preservação da amazônia.
brandon75
Usuário Nível 1
Usuário Nível 1
Mensagens: 32
Registrado em: 17 Jun 2005 14:36

Mensagem por brandon75 »

Se possivel enviar-me essas rotinas por e-mail, desde já agradeceria.

ncampos@niconti.com.br
Avatar do usuário
filizola
Usuário Nível 3
Usuário Nível 3
Mensagens: 421
Registrado em: 19 Ago 2003 20:10
Localização: Belo Horizonte/MG

Mensagem por filizola »

ja existe a funcao elaptime no proprio clipper
And
Usuário Nível 3
Usuário Nível 3
Mensagens: 163
Registrado em: 25 Set 2005 18:31
Localização: São Paulo/SP

Mensagem por And »

Brandon,

O que quer são as LIBs?


No agurado,
Anderson
Clipper 52e/Clipper 53b/Blinker 7/Vlib/Fglib/DBFNTX
_______________________________________________
Migrando para [x]Harbour 0.99.60 (SimpLex) + MiniGUI 1.2 Exp. (Build 22)
_______________________________________________
Assine o manifesto dos artistas pela preservação da amazônia.
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Soma de horas relogio de ponto

Mensagem por Kapiaba »

Bom dia Rochinha: A FUNCTION DIV()??

Código: Selecionar todos

RETURN STRZERO(INT(DIV(horas,60)),3,0)+":"+STRZERO(MOD(horas,60),2,0)
Obg. abs.
Avatar do usuário
mauricioportela
Usuário Nível 2
Usuário Nível 2
Mensagens: 95
Registrado em: 29 Jul 2016 04:22
Localização: Vitoria da Conquista/Bahia

Soma de horas relogio de ponto

Mensagem por mauricioportela »

Boa noite!

O DIV seria?

Código: Selecionar todos

FUNCTION DIV(nH,nM)
RETURN (nH/nM)
Att.
Mauricio
Avatar do usuário
mauricioportela
Usuário Nível 2
Usuário Nível 2
Mensagens: 95
Registrado em: 29 Jul 2016 04:22
Localização: Vitoria da Conquista/Bahia

Soma de horas relogio de ponto

Mensagem por mauricioportela »

Executando o codigo, obtive isso:

Código: Selecionar todos

#define DUAS_LINHAS    CHR(13) + CHR(10) + CHR(13) + CHR(10)

function main()

    ? "--- Transforma Horas em minutos:"
    ? MinutoToHora("240:00")
    ? "devolve 14400 minutos" // devolveu valor logico. conforme funcao: se tipo for 'C' -> 'L'
    ? DUAS_LINHAS

    ? "--- Transforma minutos em Horas: "
    ? MinutoToHora( 14400 )
    ? "devolve '240:00'" // retornou ok
    ? DUAS_LINHAS

    ? "--- Calcular horas: "
    ? MinutoToHora("240:00") // retorna 'L'
    ? MinutoToHora(val("240:00")) // retorna 'C' ... ficou redundante ... mas, fiz para exemplificar ... rs
    ? DUAS_LINHAS

    ? valtype(MinutoToHora("240:00")) // 'L'
    ? valtype(MinutoToHora(val("240:00"))) // 'C'
    ? MinutoToHora(val("240:00")) - MinutoToHora(val("120:00")) // concatenacao.
    ? MinutoToHora(240) - MinutoToHora(120) // concatenacao.
    ? "devolve 7200 minutos"
    ? DUAS_LINHAS

RETURN Nil

FUNCTION HoraTOMinuto( xHoras )
    // Transforma horas passadas no formato caracter em um numero   
    // INTEIRO que representa o total de minutos do parametro passado
    IF VALTYPE( xHoras ) == "C"
        // Hora2Minuto( "194:20" ) = 11660 min
        RETURN (VAL(SUBSTR(xHoras,1,AT(":",xHoras)-1))*60)+VAL(SUBSTR(xHoras,AT(":",xHoras)+1,2))
    ELSE
        // Hora2Minuto( 194,20 ) = 11660 min
        RETURN (VAL(SUBSTR(STR(xHoras,6,2),1,3))*60)+VAL(SUBSTR(STR(xHoras,6,2),5,2))
    ENDIF
RETURN nTotalMinutos

FUNCTION HoraTONumero( xHoras )
    // Transforma horas passadas no formato caracter em um numero
    // DECIMAL que representa o total de minutos do parametro passado
    IF VALTYPE( xHoras ) == "C"
        A := VAL(SUBSTR(xHoras,1,AT(":",xHoras)-1))*60+VAL(SUBSTR(xHoras,AT(":",xHoras)+1,2))
    ELSE
        A := VAL(SUBSTR(STR(xHoras,6,2),1,3))*60+VAL(SUBSTR(STR(xHoras,6,2),5,2))
    ENDIF
RETURN VAL(STRZERO(INT(DIV(A,60)),3,0)+"."+STRZERO(MOD(A,60),2,0))

FUNCTION MinutoTOHora( xHoras )
    IF VALTYPE( xHoras ) == "C"
        RETURN .F.
    ELSE
        RETURN STRZERO(INT(DIV(xHoras,60)),3,0)+":"+STRZERO(MOD(xHoras,60),2,0)
    ENDIF

FUNCTION DIV( nH, nM)
RETURN (nH/nM)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Soma de horas relogio de ponto

Mensagem por JoséQuintas »

Em Harbour deve existir função específica pra isso.
Criei nos tempos do Clipper.

Código: Selecionar todos

FUNCTION TimeAdd( cTime, cTipo, nQtde )

   LOCAL nHora, nMinuto, nSegundo, cResultado

   nHora    := Val( Substr( cTime, 1, 2 ) )
   nMinuto  := Val( Substr( cTime, 4, 2 ) )
   nSegundo := Val( Substr( cTime, 7, 2 ) )
   DO CASE
   CASE cTipo == "H"
      nHora += nQtde
   CASE cTipo == "M"
      nMinuto += nQtde
   CASE cTipo == "S"
      nSegundo += nQtde
   ENDCASE
   IF nSegundo >= 60
      nMinuto += Int( nSegundo / 60 )
      nSegundo -= ( Int( nSegundo / 60 ) * 60 )
   ENDIF
   IF nMinuto >= 60
      nHora += Int( nMinuto / 60 )
      nMinuto -= ( Int( nMinuto / 60 ) * 60 )
   ENDIF
   IF nHora > 23
      cResultado := "23:59:59"
   ELSE
      nHora := nHora - ( Int( nHora / 24 ) * 24 )
      cResultado := StrZero( nHora, 2 ) + ":" + StrZero( nMinuto, 2 ) + ":" + StrZero( nSegundo, 2 )
   ENDIF

   RETURN cResultado
Pode ser usada pra calcular diferença:

Código: Selecionar todos

FUNCTION DiferencaHora( cTimeInicial, cTimeFinal )

   LOCAL cDiferenca

   cDiferenca := cTimeFinal

   cDiferenca := TimeAdd( cDiferenca, "H", -( Val( Substr( cTimeInicial, 1, 2 ) ) ) )
   cDiferenca := TimeAdd( cDiferenca, "M", -( Val( Substr( cTimeInicial, 4, 2 ) ) ) )
   cDiferenca := TimeAdd( cDiferenca, "S", -( Val( Substr( cTimeInicial, 7, 2 ) ) ) )

   RETURN cDiferenca

Código: Selecionar todos

procedure main()

   SetMode(40,100)
   CLS

   ? DiferencaHora( "08:00:00", "12:00:00" )
   ? DiferencaHora( "13:00:00", "18:00:00" )
   Inkey(0)
difhora.png
difhora.png (2.71 KiB) Exibido 8625 vezes
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Soma de horas relogio de ponto

Mensagem por Jairo Maia »

Olá Pessoal,

Em Harbour, use ElapTime( <cStartTime>, <cEndTime> ):

Código: Selecionar todos

? ElapTime( "08:00:00", "10:10:11" )  // retorna 02:10:11"
? ElapTime( "14:00:00", "18:00:00" )  // retorna 04:00:00
? ElapTime( "22:15:00", "01:00:00" )  // virou 1/2 noite - retorna 02:45:00
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Soma de horas relogio de ponto

Mensagem por Kapiaba »

Bom dia.

Forum, nota 10!

Protesto: Rochinha sempre posta exemplos pela metade. kkkkkkkkkkkkkkkkkkkkkkk

Obg. abs.

Regards, saludos.
Responder