Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

EderDias

Somar Campo Time (horas) Paradox

Recommended Posts

Ola...pessoal

 

Eu preciso montar um relatorio de horas extras.....sintetico, ou seja, totalizar quantos horas extras o camarada fez num periodo.

Eu sei fazer o layout pra este tipo de relatorio, só não to conseguindo somar estas horas.

Se eu fosse somar digamos ou campo numerico eu apenas utilizaria assim:

SUM(query1.PESO)
e pronto....ja me traria o peso acumulado por funcionario(exemplo).

Mas como na tabela eu to trabalhando com campo Timer...ai ele não me traz nada .......coloquei assim:

SUM(query1.hora_extra)

Alguem poderia me dizer como é que eu mostraria a soma das horas no quick??

 

Grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

mais nda impede que efetue a soma ....

em q formato q é guardado no Db ??? (dd/mm/yyyy hh:mm:ss) ??

R.: As Horas extras ja estão guardadas só falta somar elas.....não envolve dd/mm/yyyy pois elas são guardadas normalmente...

Tipo:

registro1 - 23:30:00

registro2 - 14:45:00

registro3 - 10:00:00

qto ao formato da hora é T-Time Paradox (hh:mm:ss)

 

É só pegar os registros e somar....parece mto fácil, se fosse um campo numerico normal tipo..campo de salario, mas como é hora ai ferrou....hehehe

 

Valeu amigão...fico noa guardo de uma dica sua.

 

Mto Grato. mais uma vez.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum!!! ele não ta somando corretamente, pq qdo você invoca a funcão SUM ele pede um numero inteiro, e você tava pasando uma time ....

 

Uma idéia é você montar um select normalmente e somar essas horas e colocar em uma variavel ...

dai você pode colocar o conteudo desta variavel em um QRLabel por exemplo entende?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma idéia é você montar um select normalmente e somar essas horas e colocar em uma variavel ...dai você pode colocar o conteudo desta variavel em um QRLabel por exemplo entende?

R. Amigo..poderias me passar uma dica de como faz isto?? Como eu somo http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

você pode fazer assim:

 

var  Horas: TTime;begin  with qry do  begin	Close;	SQL.Clear;	SQL.Add('SELECT HORAEXTRA,OUTROSCAMPOS FROM MINHATABELA');	Open;  end;  qry.First;  while not qry.Eof do  begin	Horas:= Horas + qryHoraExtra.Value;	qry.Next;  end;  frmRelatorio.QrLabelHoras.Caption:= TimeToStr(Horas);  frmRelatorio.QuickRep.Preview;

bele?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Rodrigo..Bza??

Eu tentei fazer como você menciona....coloquei este codigo adptado ao seu...no OnPrint do QRLabel3 que vai receber o valor.

 

procedure TFormRel_HE.QRLabel3Print(sender: TObject; var Value: String);var  HoraExtra: TTime;begin  horaExtra:=0;  with Query1 do  begin	Close;	SQL.Clear;	SQL.Add('SELECT * FROM AJUSTE, VIAGEM, MOTORIS where (ajuste.codigo = viagem.codlan) and (ajuste.codmot = Motoris.codmot) order by motoris.nome');	Open;  end;Query1.First;while not Query1.Eof do  begin	HoraExtra:= HoraExtra + Query1He_diurna.Value;	query1.Next;  end;  value:= TimeToStr(HoraExtra);  QuickRep1.Preview;  end;
Na verdade ele deveria somar estas horas:

02:30:00

03:00:00

05:15:00

======

10:45:00 (deveria dar este resultado)

mas esta dando este resultado:

15:45:00

você Saberia que dizer porque esta dando o resultado diferente?? ou sera que coloquei o codido no lugar errado??

 

Mto Grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aki eu testei o codigo que eu te passei, no click do bota Gerar Relatorio ....

Coloque no click do botao q chama o relatorio q vai funcionar beleza ...

 

daew poste aki o resultado ok

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aki eu testei o codigo que eu te passei, no click do bota Gerar Relatorio ....

Coloque no click do botao q chama o relatorio q vai funcionar beleza ...

R. Amigão..não tem jeito....nãu funca...a soma é esta:

02:30:00

03:00:00

05:15:00

======

10:45:00 (correto)

 

esta dando este: 15:45:00 (5 horas a mais).

 

O Outro funcionario logo a frente no relatorio ai o resultado distorce geral.

 

o que pode estar incorreto será??

 

Pergunta: este seu codigo ele soma mais de 24 horas??..pois como é um acumulado vai ter funcionario que terá mais de 50 horas mes....

 

Mto Grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Amigo, Acho q isso te resolve, esta função abaixo te retorna o total de horas trabalhadas, exemplo: 34:56 horas. Modo de usar: Label1.Caption := GetHours(Query1.FieldByName('TOTALHORA').AsDateTime);function GetHours(T: TDateTime): string;{Transforma TDateTime em número de horas}var i: real; begin i := 24 * T; {Multiplica por 24 p/ obter número de horas} Result := IntToStr(Trunc(i)) + ':' + {Horas} FormatFloat('00', Trunc(Frac(i)*60+0.01)) //+ ':' + {Minutos}// FormatFloat('00', Trunc(Frac(Frac(i)*60+0.01)*60)); {Segundos}end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Label1.Caption := GetHours(Query1.FieldByName('TOTALHORA').AsDateTime);

Paulo.....este codigo acima...aonde eu coloco ele no quickreport??Pois tentei em vários lugares e não da certo.Mto Grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

Rodrigo...achei esta função aqui..mto boa:

 

//Função converter Hora para Segundos

 

function 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;

//Função converter Segundos para Horas

 

function Seg_Hora( Seg:LongInt ):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;
Pra Chamar coloque no OnBeforePrint do Quickrep1:

 

procedure TForm2.QuickRep1BeforePrint(Sender: TCustomQuickRep;  var PrintReport: Boolean);varHEPAG: Integer;beginHEPAG := 0;Query1.Open;   while ( not Query1.EOF ) do	begin   HEPAG := HEPAG + Hora_Seg( TimeToStr( Query1.FieldByName('HE_DIURNA').AsDateTime ) );   Query1.Next;   QRLABEL4.CAPTION:=(seg_hora(HEPAG));   end;	END;
Ele traz as horas..sem limites. Mto Boa...testei e deu certo.

 

Marcio só uma coisinha...o resultado saiu direitinho mas sai de todo os funcionarios misturados.....mas eu preciso que sai por funcionario acumulado e não to conseguindo trazer a soma.

Exemplo:

mario: 15:00:00

jose: 20:00:00

Carlos:25:00:00

total: 60:00:00

O que teria que fazer pra somar por funcionario?

 

Mto Grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia amigo.... O Timer trabalha com horarios validos, por exemplo 12:00:00 existe? e 25:00:00 existe?? saca????Realmente axei a melhor ideia esta tua de converter td pra segundos .... na minha opinião, pra este seu caso eu axaria mais interessante você já guardar no DB td em segundos, oque você axa???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente axei a melhor ideia esta tua de converter td pra segundos .... na minha opinião, pra este seu caso eu axaria mais interessante você já guardar no DB td em segundos, oque você axa???

R. amigão....acho que não pois o banco ja esta em andamento o cadastramento.....ele grava assim: 20:00:00(hh:mm:ss).

Rodrigo..aquelas duas funções que coloquei aqui..uma pra segundos e depois retornar pra hh/mm/ss é ideal...funciona legal...ja testei...fiz o teste assim: mandei somar todos as horas num periodo..tipo corrido...tem todos os funcionarios..juntos...lista e total geral...funcionou legal.

 

Mas eu precisaria acumular por funcionario tipo assim layout do relatorio:

 

Relatorio total de horas extras por funcionar do

 

RELATÓRIO TOTAL DE HORAS EXTRAS POR PERIODOjose:	20:00:00maria:  30:00:00Carla:   05:30:00--------------------total.....55:30:00
mas no quick não to conseguinte montar deste jeito..por isto precisava de uma ajudinha sua.

 

Posso contar com você??

 

Mto Grato..abraço

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia EderDias ...

Claro q pode contar, não só eu como todos aki, estamos aki pra ajudar e ser ajudado ... precisando so da um grito heeheh ....

 

Não testei nda aki, pq to sem delphi nesta maquina, mais uma opção seria você criar um campo calculated (TotalHoras) nesta sua qry e ligue este com a coluna que quer exibir as horas no relatorio. Monte um select usando a clausula distinct, guarde o nome de todos os funcionarios em uma variavel (Array,TStingList...), depois monte um select pra cada funcionario, efetue a soma das horas de acordo com a sua funcao e guarde a soma no campo calculated (TotalHoras) .... Finalmente monte novamente um select distinct e de o preview no relatorio ....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvido

Segue abaixo a minha unit do relatorio para caso alguém necessite de um modelo:

 

Segue abaixo Unit:

 

unit UnitRelHE2;interfaceuses  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,  Qrctrls, QuickRpt, ExtCtrls, Db, DBTables, StdCtrls, ComCtrls;type  TFormRel_HE2 = class(TForm)	Query1: TQuery;	QuickRep1: TQuickRep;	QRGroup1: TQRGroup;	QRDBText8: TQRDBText;	QRLabel28: TQRLabel;	QRBand7: TQRBand;	QRLabel58: TQRLabel;	QRExpr3: TQRExpr;	QRBand9: TQRBand;	QRImage1: TQRImage;	QRLabel15: TQRLabel;	QRSysData4: TQRSysData;	QRSysData5: TQRSysData;	QRLabel1: TQRLabel;	QRLabel26: TQRLabel;	QRBand5: TQRBand;	QRDBText10: TQRDBText;	QRDBText27: TQRDBText;	QRDBText29: TQRDBText;	QRDBText32: TQRDBText;	QrLDiurna: TQRLabel;	QRBand1: TQRBand;	QRLabel2: TQRLabel;	QRLabel3: TQRLabel;	QRLabel20: TQRLabel;	QRLabel6: TQRLabel;	QRLabel22: TQRLabel;	QRLabel5: TQRLabel;	QRLabel7: TQRLabel;	QRLabel8: TQRLabel;	QRLabel9: TQRLabel;	QrLNoturna: TQRLabel;	QrLPagadora: TQRLabel;	QRDBText1: TQRDBText;	QRLabel4: TQRLabel;	QRBand2: TQRBand;	Button1: TButton;	QRLabel10: TQRLabel;	QRLabel11: TQRLabel;	QRLabel12: TQRLabel;	Query1Codigo: TIntegerField;	Query1Codlan: TIntegerField;	Query1CodMot: TIntegerField;	Query1CodMot_1: TIntegerField;	Query1Nome: TStringField;	Query1He_Diurna: TTimeField;	Query1He_Noturna: TTimeField;	Query1He_Pagadora: TTimeField;	procedure QRBand5BeforePrint(Sender: TQRCustomBand;	  var PrintBand: Boolean);	procedure QRBand7BeforePrint(Sender: TQRCustomBand;	  var PrintBand: Boolean);	procedure QRBand2BeforePrint(Sender: TQRCustomBand;	  var PrintBand: Boolean);	procedure Button1Click(Sender: TObject);	procedure QuickRep1BeforePrint(Sender: TCustomQuickRep;	  var PrintReport: Boolean);	procedure QRGroup1BeforePrint(Sender: TQRCustomBand;	  var PrintBand: Boolean);  private  {VARIAVEIS QUE ARMAZENA AS HORAS  horas diurnas, noturnas e pagadora que seria a soma da diruna + noturna}  DIURNA, NOTURNA, PAGADORA : Integer;  {abaixo as totalizadoras da bandaSumary}  DIURNA_SUMARY, NOTURNA_SUMARY, PAGADORA_SUMARY : Integer;	{ Private declarations }  public	{ Public declarations }  end;var  FormRel_HE2: TFormRel_HE2;implementationuses UnitRelMedia;{$R *.DFM}//Função converter Hora para Segundosfunction Hora_Seg( Horas:string ):LongInt;Var Hor,Min,Seg:LongInt;beginHoras[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;//Função converter Segundos para Horasfunction Seg_Hora( Seg:LongInt ):string;Var Hora,Min:LongInt;  Tmp : Double;beginTmp := 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;{Banda Detail}procedure TFormRel_HE2.QRBand5BeforePrint(Sender: TQRCustomBand;  var PrintBand: Boolean);begin{Abaixo recebe os valores da tabela}DIURNA := DIURNA + Hora_Seg( TimeToStr( Query1.FieldByName('HE_DIURNA').AsDateTime ) );NOTURNA := NOTURNA + Hora_Seg( TimeToStr( Query1.FieldByName('HE_NOTURNA').AsDateTime ) );PAGADORA := PAGADORA + Hora_Seg( TimeToStr( Query1.FieldByName('HE_PAGADORA').AsDateTime ) );end;{Abaixo é a RbGroupFooter}procedure TFormRel_HE2.QRBand7BeforePrint(Sender: TQRCustomBand;  var PrintBand: Boolean);begin{abaixo totaliza a bandSumary}Diurna_Sumary := Diurna_Sumary + DIURNA;   Noturna_Sumary := Noturna_Sumary + Noturna;	 Pagadora_Sumary := Pagadora_Sumary + Pagadora;{Abaixo Totaliza a Banda GRoupFooter de Cada Funcionario.}   QRLDiurna.CAPTION:=(seg_hora(DIURNA));	  QRLNoturna.CAPTION:=(seg_hora(NOTURNA));		 QRLPagadora.CAPTION:=(seg_hora(PAGADORA));   end;{banda Sumary}procedure TFormRel_HE2.QRBand2BeforePrint(Sender: TQRCustomBand;  var PrintBand: Boolean);begin{Abaixo os totalizadores da BandSumary}QRLABEL10.CAPTION:=(SEG_HORA(DIURNA_SUMARY));QRLABEL11.CAPTION:=(SEG_HORA(NOTURNA_SUMARY));QRLABEL12.CAPTION:=(SEG_HORA(PAGADORA_SUMARY));end;procedure TFormRel_HE2.Button1Click(Sender: TObject);begin{codigo sql da Query:SELECT Ajuste.Codigo, Viagem.Codlan,Ajuste.CodMot, Motoris.CodMot, Motoris.Nome,Viagem.He_Diurna, Viagem.He_Noturna, Viagem.He_PagadoraFROM AJUSTE, VIAGEM, MOTORIS where(ajuste.codigo = viagem.codlan) and(ajuste.codmot = Motoris.codmot)order by motoris.nome}{ativa aquery e manda o Preview}QUERY1.Active:=TRUE;QUICKREP1.PREVIEW;end;procedure TFormRel_HE2.QuickRep1BeforePrint(Sender: TCustomQuickRep;  var PrintReport: Boolean);begin//Limpa as Variaveis totalizadoras da BandSumaryDIURNA_SUMARY := 0;NOTURNA_SUMARY := 0;PAGADORA_SUMARY := 0;end;{Abaixo é a QRGroup1}procedure TFormRel_HE2.QRGroup1BeforePrint(Sender: TQRCustomBand;  var PrintBand: Boolean);begin//Limpa as Variaveis totalizadoras da GroupFooterDIURNA := 0;NOTURNA := 0;PAGADORA := 0;end;end.

 

Valeu.... http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.