Não quer dar certo soma de campo calculado

Delphi

28/07/2003

Estou fazendo um calculo em um relatório para somar um campo calculado de horas, mas não soma tudo pois o valor total não dá o que realmente daria, estou fazendo da seguinte forma:

Var WTotal : TDateTime;
begin
WTotal:=0;
TbPonto.First;
While not TbPonto.Eof do
Begin
WTotal:=WTotal+TbPontoHEXTRA.Value;
TbPonto.Next;
End;
QRLabel11.Caption := TimeToStr(WTotal);

Uso table paradox, alguém pode me ajudar?


Janete

Janete

Curtidas 0

Respostas

Mabh

Mabh

28/07/2003

Cara Janete

Quando somamos horas usando variáveis do tipo TDateTime ou TTime e o resultado excede 24 horas a variável é zerada, ou seja ´13:00:00´ + ´14:00:00´ é igual a ´03:00:00´ e não 27:00:00 como seria esperado. A maneira mais fácil de resolver este problema é converter as horas, minutos e segundos para uma base inteira, para então somar os valores e depois converter o total para o formato horário novamente.

Espero ter ajudado

Márcio


GOSTEI 0
Janete

Janete

28/07/2003

Márcio! dá pra me explicar na prática como devo fazer, pois tentei e não deu certo.


GOSTEI 0
Djjunior

Djjunior

28/07/2003

Oi cara eu sei o que é isso é um pé na paciência somar horas do jeito que tu quer segue abaixo uma rotina que eu criei para controle de ponto espero que ajude.

O que eu fiz nela foi transformar tudo em minutos para depois calcular

djr

ps qualquer duvida me manda um email que eu te explico melhor
ps2 se quizer eu tenho outra para subtração (beeeem mais simples)

procedure TTPonto.Button3Click(Sender: TObject);
Var HorasE, MinE, HorasA, MinA, TotalE, TotalA, Resulta, i, Faltas, Abonos: integer;
TotHoras, TotMin: Real;
HoraT, MinT: string;
begin
HorasE := 0;
MinE := 0;
HorasA := 0;
MinA := 0;
Faltas := 0;
Abonos:= 0;
Globais.Ponto.First;
For i := 0 to Globais.Ponto.RecordCount do begin
If (Globais.PontoResultado.Text = ´E´) or (Globais.PontoResultado.Text = ´X´) then begin
HorasE := HorasE + StrToInt(copy(Globais.PontoExtraAtrazo.Text,1,2));
MinE := MinE + StrToInt(copy(Globais.PontoExtraAtrazo.Text,4,2));
end Else If (Globais.PontoResultado.Text = ´A´) or (Globais.PontoResultado.Text = ´T´) then begin
HorasA := HorasA + StrToInt(copy(Globais.PontoExtraAtrazo.Text,1,2));
MinA := MinA + StrToInt(copy(Globais.PontoExtraAtrazo.Text,4,2));
end Else If Globais.PontoResultado.Text = ´F´ then
Inc(Faltas)
else If Globais.PontoResultado.Text = ´B´ then
Inc(Abonos);
Globais.Ponto.Next;
end;

TotalE := (HorasE * 60) + MinE;
TotalA := (HorasA * 60) + MinA;
If TotalE >= TotalA then
Resulta := TotalE - TotalA
else
Resulta := TotalA - TotalE;

TotHoras := Int(Resulta/60);
TotMin := Resulta mod 60;
If TotHoras < 10 then
HoraT := ´0´ + FloatToStr(TotHoras)
Else HoraT := FloatToStr(TotHoras);
If TotMin < 10 then
MinT := ´0´ + FloatToStr(TotMin)
Else MinT := FloatToStr(TotMin);
Label17.Caption := HoraT + ´:´ + MinT;

TotHoras := Int(TotalE/60);
TotMin := TotalE mod 60;
If TotHoras < 10 then
HoraT := ´0´ + FloatToStr(TotHoras)
Else HoraT := FloatToStr(TotHoras);
If TotMin < 10 then
MinT := ´0´ + FloatToStr(TotMin)
Else MinT := FloatToStr(TotMin);
Label16.Caption := HoraT + ´:´ + MinT;;

TotHoras := Int(TotalA/60);
TotMin := TotalA mod 60;
If TotHoras < 10 then
HoraT := ´0´ + FloatToStr(TotHoras)
Else HoraT := FloatToStr(TotHoras);
If TotMin < 10 then
MinT := ´0´ + FloatToStr(TotMin)
Else MinT := FloatToStr(TotMin);
Label18.Caption := HoraT + ´:´ + MinT;;

Label20.Caption := IntToStr(Faltas);
Label24.Caption := IntToStr(Abonos);
end;


GOSTEI 0
Mabh

Mabh

28/07/2003

Obrigado, vou analisar seu funcionamento e lhe respondo, já trabalhei com sistemas de ponto eletrônico. Desculpe pela demora das respostas pois não tenho muito tempo.

Márcio.


GOSTEI 0
POSTAR