Hora maior que 24

Delphi

28/09/2005

Como faço para transformar um astring que contem por exemplo o valor ´36´ em horas???

Eu estou fazendo:

StrToTime(´36´);

Mas 36 não é uma hora valida e eu gostaria que fosse, qp elea é uma somatorias de varias horas.

Obrigada


Celamar

Celamar

Curtidas 0

Respostas

Rjun

Rjun

28/09/2005

Que tipo de operação você pretende fazer?


GOSTEI 0
Celamar

Celamar

28/09/2005

Eu fiz:


  //total previsto
  sTotalPrevisto := IntToStr(iTotalDias * iCargaHoraria);
  lbTotalPrevisto.Caption := sTotalPrevisto + ´:00´;

  //total executado
  lbTotalExecutado.Caption := TimeToStr(tTotalExecutado);

  //saldo
  tTeste := StrTotime(sTotalPrevisto);
  lbSaldo.Caption := TimeToStr(tTotalExecutado - tTeste);


O numero de horas previsto no mês
O numero de horas trabalhadas
E O Saldo


GOSTEI 0
Rjun

Rjun

28/09/2005

Trabalhe com segundos. Dê uma pesquisada no forum que tem como converter os segundos em uma string no formato de hora. Talvez isso resolva seu problema.


GOSTEI 0
Massuda

Massuda

28/09/2005

Você pode fazer algo assim...
var
  iTotalPrevisto: Integer;
...
  //total previsto
  iTotalPrevisto := iTotalDias * iCargaHoraria;
  sTotalPrevisto := IntToStr(iTotalPrevisto);
  lbTotalPrevisto.Caption := sTotalPrevisto + ´:00´;

  //total executado
  lbTotalExecutado.Caption := TimeToStr(tTotalExecutado);

  //saldo
  tTeste := iTotalPrevisto / 24;
  lbSaldo.Caption := FormatDateTime(´d h:mm:ss´ , tTotalExecutado - tTeste);



GOSTEI 0
Celamar

Celamar

28/09/2005

Tem certeza q isso da certo, comigo nao funcionou nao.


GOSTEI 0
Celamar

Celamar

28/09/2005

Desculpa car, funciona sim, eu que estava marcando.
Obrigada


GOSTEI 0
Celamar

Celamar

28/09/2005

Gostaria de saber como faço para trabalhar com o TTime quando a hora passa de 23:59:59, por exemplo:

Dia um = 12:00
Dia dois = 10:00
Dia tres = 8:00

Total = 30:00h

Obrigada


GOSTEI 0
Massuda

Massuda

28/09/2005

O TTime (assim como o TDate e o TDateTime) é um número que representa um total de dias; a parte inteira é o número de dias e a parte fracionária é a fração de dia. Por exemplo, 36 horas equivale a um TTime igual a 1.5, ou seja, um dia (24 horas) mais 12 horas.

Para exibir o valor da forma que você quer, use uma função para formatar parecida com esta...
function Exemplo(T: TTime): string;
var
  H, M, S, MS: Word
begin
  DecodeTime(T, H, M, S, MS);
  Result := Format(´¬d:¬02d:¬02d´, [Int(T)*24 + H, M, S]);
end;
...é meio complicado, mas o Delphi só possui (acho) funções que consideram a hora no intervalo entre 0 e 23.


GOSTEI 0
Celamar

Celamar

28/09/2005

Mas deu errode incompatibilidade

DecodeTime(tPrevistoAux, H, M, S, MS);
lbSaldo.Caption := Format(´¬d:¬02d:¬02d´, [Int(tPrevistoAux)*24 + H, M, S]);

Erro: Format ¬d invalid or incompatible with argument


GOSTEI 0
Massuda

Massuda

28/09/2005

Desculpe... o correto seria...
  lbSaldo.Caption := Format(´¬d:¬02d:¬02d´, [Trunc(tPrevistoAux)*24 + H, M, S]);



GOSTEI 0
Luineumann

Luineumann

28/09/2005

pq vc não armazena o total de horas em um campo integer?

se vc controla apenas horas inteiras soma 1 a cada hora

se vc controla horas e minutos faz alguma coisa assim para armazenar

decodetime(tempo, hh, mm, ss, sss);

horas_a_somar := (hh * 60) + mm;

horas_totais := horas_totais + horas_a_somar;


no final do mês, decompoe o campom horas_totais


aux := horas_totais;
dias := 0;
horas := 0;
minutos := 0;

while aux > 23
do begin
dias := dias + 1;
aux := aux - 24;
end

while aux > 59
do begin
horas := horas + 1;
aux := aux - 60;
end;

minutos := aux;

ao final desta rotina vc tem o tempo total em dias, horas e minutos


GOSTEI 0
Celamar

Celamar

28/09/2005

Valores reais:
- Total previsto = 28:00h
- Total realizado = 16:26

Para:
lbSaldo.Caption := Format(´¬d:¬02d:¬02d´, [Trunc(tPrevistoAux)*24 + H, M, S]);

Resultado = 672:0:0

Para: dias, horas, minutos

Resutlado = 9 dias, 0 horas 23 minutos

E teria que ser 11:34 devedor


GOSTEI 0
Martins

Martins

28/09/2005

O TTime (assim como o TDate e o TDateTime) é um número que representa um total de dias; a parte inteira é o número de dias e a parte fracionária é a fração de dia. Por exemplo, 36 horas equivale a um TTime igual a 1.5, ou seja, um dia (24 horas) mais 12 horas. Para exibir o valor da forma que você quer, use uma função para formatar parecida com esta...
function Exemplo(T: TTime): string;
var
  H, M, S, MS: Word
begin
  DecodeTime(T, H, M, S, MS);
  Result := Format(´¬d:¬02d:¬02d´, [Int(T)*24 + H, M, S]);
end;
...é meio complicado, mas o Delphi só possui (acho) funções que consideram a hora no intervalo entre 0 e 23.


E se vc mudar o [b:40c874e330]Int[/b:40c874e330] para [b:40c874e330]Trunc[/b:40c874e330], funcionária como vc quer?


GOSTEI 0
Massuda

Massuda

28/09/2005

tPrevistoAux está com o valor 28, o que o código está interpretando como 28 dias e não 28 horas. Poste o código que está calculando o tPrevistoAux.


GOSTEI 0
Martins

Martins

28/09/2005

Desculpe... o correto seria...
  lbSaldo.Caption := Format(´¬d:¬02d:¬02d´, [Trunc(tPrevistoAux)*24 + H, M, S]);


É isso memso [b:3518da8088]Massuda[/b:3518da8088], mandou bem novamente, só pra variar, hehe!!!

t +


GOSTEI 0
Massuda

Massuda

28/09/2005

Aparentemente, o mesmo erro que citei no meu post anterior está ocorrendo no valor do tempo realizado.


GOSTEI 0
Luineumann

Luineumann

28/09/2005

Valores reais:
- Total previsto = 28:00h
- Total realizado = 16:26

na idéia de armazenar num campo inteiro vc guardaria

total_previsto = 1680 // 28*60
total_realizado = 986 // (16*60)+26
saldo = 1680 - 986 = 694

ao desmembrar os 694 vc terá as 11h e 34 min

armazena no bd os campos do tipo inteiro e para exibir o resultado use campos string calculados


GOSTEI 0
Celamar

Celamar

28/09/2005

Observação:

meu TTime (tPrevistoAux) está em segundos, justamente pq pode passa de 24, veja:

  tPrevistoAux := iTotalPrevisto / 24;

  DecodeTime(tPrevistoAux, H, M, S, MS);
  lbSaldo.Caption := Format(´¬d:¬02d:¬02d´, [Trunc(tPrevistoAux)*24 + H, M, S]);



Para:
28h previstas
16:26 realizadas --> que tb pode ser maior que 24h (me auto me ferrei)

total 11:34 devedor

Resultado usando lógica acima: 28:0:0


GOSTEI 0
Massuda

Massuda

28/09/2005

Resultado usando lógica acima: 28:0:0
...o que está correto. Você pegou 28 dividiu por 24 e depois multiplicou de novo por 24. Parece que faltou algum cálculo no código que você postou.

O segredo é fazer as contas todas na mesma unidade de tempo, seja essa unidade um dia (como estou sugerindo) ou segundos como o rjun e o luineumann sugeriram.

Seria interessante postar todo seu código aqui.


GOSTEI 0
Luineumann

Luineumann

28/09/2005

armazene em segundos

um minuto tem 60 segundos

uma hora tem 60 minutos, logo 60 * 60 segundos = 3600

um dia tem 24 horas, logo 24 * 3600 segundos = 86400

se vc transformar tudo em segundos vc teria

28 horas são 28*3600 = 100800 segundos

16 horas e 26 minutos são (16 * 3600) + (26*60) = 59160 segundos

ss = 100800 - 59160 = 41640

dd = 0
hh = 0
mm = 0

while ss > 86399 // segundos num dia - 1
do begin
dd := dd + 1
ss := ss - 86400
end
while ss > 3599
do begin
hh := hh + 1
ss := ss - 3600
end
while ss > 59
do begin
mm := mm + 1
ss := ss - 60
end

ao final temos nesta rotina o número de dias em dd, horas em hh, minutos em mm e segundos em ss

qual a seua versão do delphi? as + novas tem tb o decodedatetime


GOSTEI 0
Celamar

Celamar

28/09/2005

Versão 7


GOSTEI 0
Luineumann

Luineumann

28/09/2005

se é o 7 experimente usar o decodedatetime

veja o que ele devolve como ano, mes e dia


GOSTEI 0
POSTAR