Soma de campo do tipo time no QRExpr

Delphi

13/12/2012

Olá, pessoal!
Estou usando o PostgreSQL e tentando colocar o somatório de horas trabalhadas (no período) no componente citado;
Coloquei na propriedade Expression o seguinte: sum(query_tbpontos.campo_hrtotal,0.0).

Sou novato, devo estar esquecendo algo ou fazendo errado.
Agradeço a ajuda que alguém puder dar.
Open Informática

Open Informática

Curtidas 0

Respostas

Claudia Nogueira

Claudia Nogueira

13/12/2012

Não é tão simples somar esse tipo de campo, tem que fazer umas gambis.
Vou te passar um exemplo:

Vamos supor que eu tenha um relatório somente com duas band, uma para o detalhe e outra para o rodapé que vou usar pra totalizar as horas.
Vamos supor que eu tenha um campo do tipo Time chamado horas_trabalhadas.

Declara essa variável no Private: HORAS_TRABALHADAS : Integer;

Coloca essas duas funções no seu projeto em algum lugar:

function TForm2.Hora_Seg(Horas: string): LongInt;
Var Hor,Min,Seg:LongInt;
begin
Horas[Pos(':',Horas)]:= '[';
Horas[Pos(':',Horas)]:= ']';
Hor := StrToInt(Copy(Horas,1,Pos('[',Horas)-1));
Min := StrToInt(Copy(Horas,Pos('[',Horas)+1,(Pos(']',Horas)-Pos('[',Horas)-1)));
if Pos(':',Horas) > 0 then
        Seg := StrToInt(Copy(Horas,Pos(']',Horas)+1,(Pos(':',Horas)-Pos(']',Horas)-1)))
else
        Seg := StrToInt(Copy(Horas,Pos(']',Horas)+1,2));
Result := Seg + (Hor*3600) + (Min*60);
end;

function TForm2.Seg_Hora(Seg: Integer): string;
Var Hora,Min:LongInt;
  Tmp : Double;
begin
Tmp := Seg / 3600;
Hora := Round(Int(Tmp));
Seg :=  Round(Seg - (Hora*3600));
Tmp := Seg / 60;
Min := Round(Int(Tmp));
Seg :=  Round(Seg - (Min*60));
Result := FormatFloat( '00', Hora )+ ':' + FormatFloat( '00', Min ) + ':' + FormatFloat( '00', Seg );
end;


Coloca isso no BeforePrint da banda detalhe:

procedure TForm2.DetailBand1BeforePrint(Sender: TQRCustomBand;
  var PrintBand: Boolean);
begin
HORAS_TRABALHADAS := HORAS_TRABALHADAS + Hora_Seg( TimeToStr( Tabela.FieldByName('HORAS_TRABALHADAS').AsDateTime ) );
end;


Isso no BeforePrint da banda Footer:

procedure TForm2.PageFooterBand1BeforePrint(Sender: TQRCustomBand;
  var PrintBand: Boolean);
begin
  QRLabel4.Caption := (seg_hora(HORAS_TRABALHADAS));
  HORAS_TRABALHADAS := 0;
end;


Na band footer tem que ter uma QRLabel com name = QRLabel4.
GOSTEI 0
POSTAR