converte campo numerico em horas

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

wandersonwfs
Usuário Nível 1
Usuário Nível 1
Mensagens: 2
Registrado em: 16 Set 2009 08:23
Localização: minas

converte campo numerico em horas

Mensagem por wandersonwfs »

Boa Tarde,

estou precisando converter uma variavel numerico em um campo hora

a soma da minha variavel esta dando 5,73 e o correto calculando em horas serias 7:16:00,

como faço isso em clipper?
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

converte campo numerico em horas

Mensagem por alxsts »

Olá!

Seja bem-vindo ao fórum Wanderson!
wandersonwfs escreveu:a soma da minha variavel esta dando 5,73 e o correto calculando em horas serias 7:16:00
O que foi somado para obter 5,73? Forneça mais detalhes. Não vejo como associar 5,73 com 7:16:00.
[]´s
Alexandre Santos (AlxSts)
wandersonwfs
Usuário Nível 1
Usuário Nível 1
Mensagens: 2
Registrado em: 16 Set 2009 08:23
Localização: minas

converte campo numerico em horas

Mensagem por wandersonwfs »

Alessandre,

Meu relatorio esta tendo os seguintes valores:

0,16 minutos
0,16 minutos
0,20 minutos
0,17 minutos
0,17 minutos
0,14 minutos
0,14 minutos
0,10 minutos
0,07 minutos
0,06 minutos
0,12 minutos
0,11 minutos
0,14 minutos
0,08 minutos
0,07 minutos
0,24 minutos
1,13 1hora e 13 minutos
2,39 2 horas e 13 minutos
-----
5,56 errado correto seria 07:16:00
sambomb
Usuário Nível 3
Usuário Nível 3
Mensagens: 250
Registrado em: 24 Out 2008 17:02
Localização: Itaocara - RJ - Brasil

converte campo numerico em horas

Mensagem por sambomb »

nSecs := Secs("00:00:16")
nSecs += Secs("00:00:16")
nSecs += Secs("00:00:20")
nSecs += Secs("00:00:17")
nSecs += Secs("00:00:17")
nSecs += Secs("00:00:14")
nSecs += Secs("00:00:14")
nSecs += Secs("00:00:10")
nSecs += Secs("00:00:07")
nSecs += Secs("00:00:06")
nSecs += Secs("00:00:12")
nSecs += Secs("00:00:11")
nSecs += Secs("00:00:14")
nSecs += Secs("00:00:08")
nSecs += Secs("00:00:07")
nSecs += Secs("00:00:24")
nSecs += Secs("01:13:00")
nSecs += Secs("02:39:00")

cTempo := TString(nSecs)
Imagem

Rca Sistemas - Itaocara - RJ
anacatacombs
Membro Master
Membro Master
Mensagens: 472
Registrado em: 12 Jul 2005 16:53
Localização: Cianorte-Paraná
Contato:

converte campo numerico em horas

Mensagem por anacatacombs »

Opa opa, calma.
0,16 minutos equivale a 16 minutos ou a 9.6 segundos?
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

converte campo numerico em horas

Mensagem por alxsts »

Olá!

Quando lemos uma string de horário no formato HH:MM:SS, como em 07:16:00, temos tres grandezas envolvidas, ou seja, horas, minutos e segundos onde uma é fração de outra. Assim, se você somar tudo como números, obterá um resultado incorreto.

A solução é reduzir tudo para a menor unidade (neste caso segundos) e acumular à medida em que vai imprimindo o relatório. Na hora de totalizar o campo, converter os segundos de volta para o formato HH:MM:SS.

Consulte os exemplos do Clipper: C:\CLIPPER5\SOURCE\SAMPLE\TIME.PRG

O Sambomb mostrou quase isso. Apenas formatou as strings de forma incorreta (os minutos passaram a ser segundos).
[]´s
Alexandre Santos (AlxSts)
anacatacombs
Membro Master
Membro Master
Mensagens: 472
Registrado em: 12 Jul 2005 16:53
Localização: Cianorte-Paraná
Contato:

converte campo numerico em horas

Mensagem por anacatacombs »

alxsts escreveu:A solução é reduzir tudo para a menor unidade (neste caso segundos) e acumular à medida em que vai imprimindo o relatório.
Era aí que eu ia chegar :) ...
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

converte campo numerico em horas

Mensagem por Jairo Maia »

Olá Wanderson,

Sua soma está errada. O total de horas do seu exemplo soma 07:25:00 e não 07:16:00.

Se a variavel é numérica, não é virgula, e sim ponto. Assim, com base nas dicas dos colegas veja se o exemplo abaixo lhe ajuda:

Código: Selecionar todos

Cls
cTempo := SomaScs( 0.16 )
cTempo += SomaScs( 0.16 )
cTempo += SomaScs( 0.20 )
cTempo += SomaScs( 0.17 )
cTempo += SomaScs( 0.17 )
cTempo += SomaScs( 0.14 )
cTempo += SomaScs( 0.14 )
cTempo += SomaScs( 0.10 )
cTempo += SomaScs( 0.07 )
cTempo += SomaScs( 0.06 )
cTempo += SomaScs( 0.12 )
cTempo += SomaScs( 0.11 )
cTempo += SomaScs( 0.14 )
cTempo += SomaScs( 0.08 )
cTempo += SomaScs( 0.07 )
cTempo += SomaScs( 0.24 )
cTempo += SomaScs( 1.13 )
cTempo += SomaScs( 2.39 )

cTempo := TString( cTempo )

? cTempo

Func SomaScs( nTime )
Local cTime := "0" + StrTran( LTrim( Str( nTime ) ), ".", ":" ) + ":00"
Retu Secs( cTime )
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)
sambomb
Usuário Nível 3
Usuário Nível 3
Mensagens: 250
Registrado em: 24 Out 2008 17:02
Localização: Itaocara - RJ - Brasil

converte campo numerico em horas

Mensagem por sambomb »

No caso não seria apenas para multiplicar os valores por 3600 para obter a quantidade em segundos?


1.00 horas = 3600 segundos
0.16 horas = 3600 * 0.16 = 576 segundos

No meu exemplo bastaria somar os valores multiplicados por 3600 e depois usar a função TString()
Imagem

Rca Sistemas - Itaocara - RJ
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

converte campo numerico em horas

Mensagem por alxsts »

Olá!

Não Sam.

Uma hora tem 60 minutos de 60 segundos portanto, 3600 segundos.

Assim, para converter uma string no formato HH:MM:SS em segundos, deve-se aplicar a fórmula:

Código: Selecionar todos

nSecs :=( Val(HH) * 3600 ) + ( Val(MM) * 60 ) + Val( SS )
[]´s
Alexandre Santos (AlxSts)
sambomb
Usuário Nível 3
Usuário Nível 3
Mensagens: 250
Registrado em: 24 Out 2008 17:02
Localização: Itaocara - RJ - Brasil

converte campo numerico em horas

Mensagem por sambomb »

Só que não está nesse formato...

Se estiver nesse formato basta usar o Secs("00:10:00")
Imagem

Rca Sistemas - Itaocara - RJ
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

converte campo numerico em horas

Mensagem por Jairo Maia »

Olá Sambomb,

Em seu post das 11h03m vc diz:
1.00 horas = 3600 segundos <= Aqui Correto
0.16 horas = 3600 * 0.16 = 576 segundos <= Aqui Errado
Veja que no caso do autor do tópico, 0.16 refere-se a 16 minutos. Assim, 16 minutos x 60 segundos = 960 segundos, e não 576 segundos.
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)
sambomb
Usuário Nível 3
Usuário Nível 3
Mensagens: 250
Registrado em: 24 Out 2008 17:02
Localização: Itaocara - RJ - Brasil

converte campo numerico em horas

Mensagem por sambomb »

Wanderson, explica isso melhor!
Imagem

Rca Sistemas - Itaocara - RJ
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

converte campo numerico em horas

Mensagem por alxsts »

Olá!
sambomb escreveu:Só que não está nesse formato... Se estiver nesse formato basta usar o Secs("00:10:00")
Realmente, não está no formato padrão para representar horários. Mas aí, seria muito melhor e mais fácil o Wanderson se adequar ao padrão... A fórmula que passei é a fórmula da função Secs()
sambomb escreveu:explica isso melhor!
O cálculo que você faz resulta em 16% de uma hora: (16/100) * 3600 = 576s. E o correto é, sabendo-se que são 16 minutos e que 1 minuto tem 60 segundos, 16 * 60 = 960s
anacatacombs escreveu:Era aí que eu ia chegar
Desculpe querida, valeu pela ajuda.
[]´s
Alexandre Santos (AlxSts)
sambomb
Usuário Nível 3
Usuário Nível 3
Mensagens: 250
Registrado em: 24 Out 2008 17:02
Localização: Itaocara - RJ - Brasil

converte campo numerico em horas

Mensagem por sambomb »

Alexandre, eu entendi o que vc quis dizer, não entendi o que Wanderson (autor do tópico) quer afinal...
Imagem

Rca Sistemas - Itaocara - RJ
Responder