Rachid 0 Denunciar post Postado Setembro 20, 2007 Estou com um problema na hora de gerar informações agrupadas no Delphi, tenho três tabelas TAB_HORAS, TAB_FUNC, TAB_OPERACAO. Gostaria de agrupar as informações da TAB_HORAS, de acordo com o campo nome da Tabela TAB_FUNC, sendo que tenho a IBQuery1 = TAB_HORAS, IBQuery2 = TAB_OPER e a IBQuery3 = TAB_FUNC. Quero que o sistema gere o relatório no word da seguinte forma: Almir ------------------- 52:00:00 Vicente ----------------- 47:00:00 Diego ------------------ 59:00:00 ----------------------------------------- Total ------------------- 158:00:00 Segue abaixo o fonte do meu sistema .: unit UTeste;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IBDatabase, DB, IBCustomDataSet, IBUpdateSQL, IBQuery, Buttons, StdCtrls, Mask, Grids, DBGrids, FileCtrl, SHELLAPI, DBCtrls;type TForm1 = class(TForm) SpeedButton1: TSpeedButton; IBDatabase1: TIBDatabase; IBTransaction1: TIBTransaction; IBQuery2: TIBQuery; IBUpdateSQL2: TIBUpdateSQL; DataSource2: TDataSource; IBQuery3: TIBQuery; IBUpdateSQL3: TIBUpdateSQL; DataSource3: TDataSource; IBQuery2COD_OP: TIntegerField; IBQuery2DESCRICAO: TIBStringField; IBQuery3COD: TIntegerField; IBQuery3NOME: TIBStringField; IBQuery3DEPTO: TIBStringField; IBQuery3TURNO: TIntegerField; IBQuery1: TIBQuery; IBUpdateSQL1: TIBUpdateSQL; DataSource1: TDataSource; IBQuery1COD: TIntegerField; IBQuery1DATA_LANC: TDateField; IBQuery1COD_FUNC: TIntegerField; IBQuery1COD_TURNO: TIntegerField; IBQuery1COD_OP: TIntegerField; IBQuery1DATA_SERV: TDateField; IBQuery1COD_MAQ: TIntegerField; IBQuery1INICIO: TTimeField; IBQuery1FIM: TTimeField; IBQuery1TOTAL: TTimeField; IBQuery1NOME: TStringField; IBQuery1OPERACAO: TStringField; MaskEdit2: TMaskEdit; MaskEdit3: TMaskEdit; ComboBox1: TComboBox; BitBtn1: TBitBtn; procedure SpeedButton1Click(Sender: TObject); procedure BitBtn1Click(Sender: TObject); private { Private declarations } public procedure ExecFile( F: String); { Public declarations } end;var Form1: TForm1;implementation//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;{$R *.dfm}procedure TForm1.SpeedButton1Click(Sender: TObject); varHEPAG: Integer;TOTALG : String;Arq: Textfile; Beginwith IBQuery1 do begin close; sql.clear; sql.Add('SELECT *'); //agora vamos criar parâmetro para query que será //(DI=data inicial e DF=data final) sql.Add('FROM TAB_FUNC, TAB_HORAS where'); sql.Add('DATA_SERV>=:DI and DATA_SERV<=:DF'); //sql.Add('TAB_HORAS.COD_FUNC = TAB_FUNC.COD'); sql.Add('ORDER BY TAB_FUNC.NOME'); params[0].Value:=strtodate(maskedit2.Text); params[1].Value:=strtodate(maskedit3.Text); open; end; //se a query estiver vazia, avisa o usuário if IBQuery1.IsEmpty then begin showmessage('Nenhum informação encontrada!'); exit; end; //associa um dispositivo de saída para a variável if combobox1.Text='WORD' then assignfile(arq,'c:\MANUTENCAO.doc') //else if ComboBox1.Text='TXT' then // assignfile(arq,'c:\MANUTENCAO.txt') else assignfile(arq,'\\christian\EPSONSty'); HEPAG := 0; IBQuery1.Open; while ( not IBQuery1.EOF ) do begin HEPAG := HEPAG + Hora_Seg( TimeToStr( IBQuery1.FieldByName('TOTAL').Value ) ); IBQuery1.Next; TOTALG :=(seg_hora(HEPAG)); end;//abrir o dispositivo associado para a escrita rewrite(arq); //escreve o título no dispositivo de Saída writeln(arq,' '); writeln(arq,' '); writeln(arq,' '); writeln(arq,'Emissao .: '+DateToStr(Date)+' - '+TimeToStr(Time)); writeln(arq,' '); writeln(arq,' '); writeln(arq,' RELATORIO DE HORAS MANUTENCAO'); writeln(arq,'--------------------------------------------------------------------------------'); writeln(arq,' '); //coloca o cursor no primeiro registro IBQuery1.First; //imprime o cabeçalho, ou seja coloca-se os campos a serem impressos. //colocarei apenas três campos como exemplo, onde //Campo1, Campo2 e Campo3 poderia ser Codigo, Data_Nacimento e Nome. writeln(arq,'OPERACAO HORAS_TOTAL'); //Enquanto não chegar o fim dos dados da query, não para de escrever while not IBQuery1.Eof do begin //imprime o registro atual Writeln(arq,IBQuery3NOME.Value+' '+TOTALG); //vai ao próximo registro IBQuery1.Next; end; //fecha o acesso ao dispositivo de saída closefile(arq);end;{procedure TForm1.SpeedButton5Click(Sender: TObject);beginMaskEdit1.Text:='';MaskEdit2.Text:='';ComboBox1.Text:='';close;end;}procedure TForm1.ExecFile(F: String);varr: String; begin case ShellExecute(Handle, nil, PChar(F), nil, nil, SW_SHOWNORMAL) ofERROR_FILE_NOT_FOUND: r := 'The specified file was not found.'; ERROR_PATH_NOT_FOUND: r := 'The specified path was not found.'; ERROR_BAD_FORMAT: r := 'The .EXE file is invalid (non-Win32 .EXE or error in .EXE image).'; SE_ERR_ACCESSDENIED: r := 'Windows 95 only: The operating system denied access to the specified file.'; SE_ERR_ASSOCINCOMPLETE: r := 'The filename association is incomplete or invalid.'; SE_ERR_DDEBUSY: r := 'The DDE transaction could not be completed because other DDE transactions were being processed.'; SE_ERR_DDEFAIL: r := 'The DDE transaction failed.';SE_ERR_DDETIMEOUT: r := 'The DDE transaction could not be completed because the request timed out.'; SE_ERR_DLLNOTFOUND: r := 'Windows 95 only: The specified dynamic-link library was not found.'; SE_ERR_NOASSOC: r := 'There is no application associated with the given filename extension.';SE_ERR_OOM: r := 'Windows 95 only: There was not enough memory to complete the operation.'; SE_ERR_SHARE: r := 'A sharing violation occurred.'; else Exit; end; ShowMessage®;end;procedure TForm1.BitBtn1Click(Sender: TObject);beginExecFile('c:\MANUTENCAO.doc');end;end. Preciso resolver isso o mais rápido possível, alguém se habilita ??? Compartilhar este post Link para o post Compartilhar em outros sites
Giovani 104 Denunciar post Postado Setembro 20, 2007 Rachid, seja muito bem vindo ao fórum iMasters! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Antes de tudo é importante que leia as Regras do Fórum iMasters Aguarde até que alguém ajude você, não precisa criar outro tópico. O seu outro tópico, idêntico a esse aqui foi excluído. Qualquer dúvida, por favor, entre em contato. []´s http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites
Rachid 0 Denunciar post Postado Setembro 24, 2007 Alguém manja de Delphi pra solucionar o problema???? Compartilhar este post Link para o post Compartilhar em outros sites