Fórum Não quer dar certo soma de campo calculado #171994

28/07/2003

0

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

Responder

Posts

29/07/2003

Mabh

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


Responder

Gostei + 0

29/07/2003

Janete

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


Responder

Gostei + 0

29/07/2003

Djjunior

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;


Responder

Gostei + 0

04/08/2003

Mabh

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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar