EderDias 0 Denunciar post Postado Julho 9, 2007 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
Rodrigo Miss 1 Denunciar post Postado Julho 10, 2007 mais nda impede que efetue a soma ....em q formato q é guardado no Db ??? (dd/mm/yyyy hh:mm:ss) ?? Compartilhar este post Link para o post Compartilhar em outros sites
EderDias 0 Denunciar post Postado Julho 10, 2007 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
Rodrigo Miss 1 Denunciar post Postado Julho 10, 2007 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
EderDias 0 Denunciar post Postado Julho 10, 2007 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
Rodrigo Miss 1 Denunciar post Postado Julho 10, 2007 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
EderDias 0 Denunciar post Postado Julho 10, 2007 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
Rodrigo Miss 1 Denunciar post Postado Julho 10, 2007 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
EderDias 0 Denunciar post Postado Julho 10, 2007 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
Paulo H Oliveira 0 Denunciar post Postado Julho 10, 2007 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
EderDias 0 Denunciar post Postado Julho 10, 2007 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
EderDias 0 Denunciar post Postado Julho 10, 2007 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
Rodrigo Miss 1 Denunciar post Postado Julho 11, 2007 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
EderDias 0 Denunciar post Postado Julho 11, 2007 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:00mas 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
Rodrigo Miss 1 Denunciar post Postado Julho 12, 2007 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
EderDias 0 Denunciar post Postado Julho 12, 2007 Ok...Vou dar uma tentada por aqui...valew.. Mto Grato http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites
EderDias 0 Denunciar post Postado Julho 16, 2007 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
Hugo Slepicka 0 Denunciar post Postado Julho 16, 2007 Beleza Eder Dias... valeu pelo retorno e pelo exemplo!! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites
Rodrigo Miss 1 Denunciar post Postado Julho 17, 2007 Isto aew garoto!!! parabéns aew .. Compartilhar este post Link para o post Compartilhar em outros sites