Este material foi desenvolvido com o delphi6 e com o quickreport; sendo que o mesmo pode ser utilizado nas versões delphi7 e 2006; atualmente eu uso com o delphi 2006 juntamente com o RDPRINT que é pago.

 

O intuito deste relatório e facilitar aos programadores com método simples e muito poderoso de gerar relatório.

 

Vamos iniciar.

 

Inicie um novo projeto.

 

Acrescente dentro do formulário os seguintes camponentes:

·                     Memo1

·                     2 Button  ( abrir tabela, Imprimir )

·                     DBGrid

·                     Camponente de acesso a banco de dados “Estou usando um ADOconnection junto com ADoQuery e DataSource; estou usando o SQL Server ”; você poderá usar qualquer camponente e qualquer banco. Faca a conecção com algum banco seu.

o        Para facilitar o name dos camponentes são:

§         ADOconnection            C1

§         ADOQuery                             A1

§         DataSource                           D1 “Ligado ao A1”

·                     Acrescente no mesmo formulário “criei no mesmo formulário apenas por conveniencia” um Quickrep e na propriedade do database do quickreport digite  A1 para ligaro quicrep a query.

·                     Dentro do quickrepor

o        2 QRBands (“BandType”)

§         PageHeader

§         Detail

·                     No qreport mude a Font para Couriew New  (Esta fonte é somente para que as letras ficam todas formatadas).

·                     Acrescente 3 QRLabels no QRBAnd1

·                     Acrescente 1 Label no QRBand2

 

Conforme figura abaixo.

 


Vamos a parte braçal do código:

 

Acrescente as seguintes variaveis:

 

var

  Form1: TForm1;                                 // já existente

  vlinha, vqualquer: string;                      

  i: integer;

 

 

No Evendo Print do label3 insira o seguinte código que serve para identicar o nome de cada coluna para o relatório. Ou seja o que você quiser mostrar no relatorio ele irar montar os campos automático nos tamanho correspondentes.

 

procedure TForm1.LABEL3Print(sender: TObject; var Value: String);

begin

 vqualquer:='';

 for i:=0 to A1.FieldCount-1 do

 begin

   if UpperCase(A1.FieldDefs[i].name)<>'ORDENAR' THEN

   BEGIN

if TipoCampo(A1.FieldDefs[i].DataType)='IN' then                                                                                                                         

   Vqualquer:=Vqualquer+space(copy(A1.FieldDefs[i].name,1,7),'F',7);

      if TipoCampo(A1.FieldDefs[i].DataType)='ST' then

          Vqualquer:=Vqualquer+space(COPY(A1.FieldDefs[i].name,1,A1.fielddefs[i].size),'F',

            A1.fielddefs[i].size)+' ';

       if TipoCampo(A1.FieldDefs[i].DataType)='DT' then

          Vqualquer:=Vqualquer+space(COPY(copy(A1.FieldDefs[i].name,1,10),1,10),'F',10)+' ';

       if TipoCampo(A1.FieldDefs[i].DataType)='NU' then

          Vqualquer:=Vqualquer+space(copy(A1.FieldDefs[i].name,1,11),'',11)+' ';

   END;

 END;

value:=vqualquer;

end;

 

Crie esta funcao que tem por finalidade verificar que tipo de campo ele vai mostrar.

 

function Tfprincipal.TipoCampo(Campo: TFieldType): String;

begin

    case campo of

       ftFixedChar: Result :='ST';

       ftString   : Result :='ST';

       ftUnknown  : Result :='ST';

       ftInteger  : Result :='IN';

       ftFloat    : Result :='NU';

       ftBCD      : Result :='NU';

       ftAutoInc  : Result :='IN';

       ftDate     : Result :='D2';

       ftDateTime : Result :='DT';

    else

       Result :='ST';

    end;

end;

 

Crie esta função para ele alinhar os campos em tamanhos fixos.

 

function SPACE(V_Campo:stRing; V_LocalEspaco:STRING; V_QtdCaracter:integer): string;

var

   I:  INTEGER;

   NU: integer;

   NO: string;

begin

   NO:=trim(V_Campo);               // elimina todos espacos

   for i:=length(NO) to V_QtdCaracter-1 do  // em branco

       IF V_LocalEspaco='F' THEN

          NO:=NO+' '

       ELSE

          NO:=' '+NO;

   result:=NO;

end;

 

No evento do label4 insira o codigo que e responsavel por imprimir todas as linha da tabel.

 

procedure TForm1.LABEL4Print(sender: TObject; var Value: String);

begin

Vlinha:='';

   for i:=0 to A1.FieldCount-1 do

   begin

       if UpperCase(A1.FieldDefs[i].name)<>'ORDENAR' THEN

       BEGIN

          if TipoCampo(A1.FieldDefs[i].DataType)='IN' then vLINHA:=vLINHA+space(A1.Fields[i].ASSTRING,'F',7);

          if TipoCampo(A1.FieldDefs[i].DataType)='ST' then vLINHA:=vLINHA+space(COPY(A1.Fields[i].AsString,1,A1.fielddefs[i].size),'F',A1.fielddefs[i].size)+' ';

          if TipoCampo(A1.FieldDefs[i].DataType)='DT' then vLINHA:=vLINHA+space(COPY(A1.Fields[i].AsString,1,10),'F',10)+' ';

          if TipoCampo(A1.FieldDefs[i].DataType)='NU' then

          begin

              if  A1.Fields[i].asstring='' then

                  vLINHA:=vLINHA+'           '+' '

              else

                  vLINHA:=vLINHA+space(FORMATFLOAT('####,##0.00',A1.Fields[i].VALUE),'',11)+' ';

          end;

       END;

   end;

value:=vlinhA;

 

end;

 

No botao abrir banco acrecente o seguinte código que serve para abrir o banco de dados.

 

procedure TForm1.Button1Click(Sender: TObject);

begin

with a1 do

  begin

    close;

    sql.clear;

    sql.add(memo1.Text);

    open;

  end;

end;

 

No botão imprimir insira o seguinte código que irar mostrar os dados no quickreport:

 

 

procedure TForm1.Button2Click(Sender: TObject);

begin

   if a1.Active=false  then exit;

   if a1.RecordCount=0 then exit;

   label1.Caption:='EMPRESA MODELO SA';

   LABEL2.Caption:='RELATORIO DE DEMONSTRACAO SA';

   QuickRep1.Preview;

End;

 

 

Pronto o gerador de relatório esta pronto. Para funcionar bote uma select qualquer no memo e clique no botão abrir logo em seguida clik em imprimir; o mesmo gera o relatorio alinhando todos os campos.

 

 

Obs: Você tem de testar o tamanho dos campos pois ele vai assumir o tamanho do campo do select para facilitar eu uso os campos SUBSTRING(Nomedocampo,1,TamanhoDesejado) no SQL Server; no firibier eu uso o COPY nos demais voce irar usar o correspondente; isto apenas para dar no formato correto e caber dentro do qreport.


Veja o resultado do relatório


Neste artigo eu usei a minha primeira versão; você pode incrementar o próprio para fazer botar um formulário e pegar exclusivamente incrementando alguns:

 

·                     Salto de linha

·                     Somatório de resultado

·                     Máster detail

·                     Fonte maior ou menor

·                     Titulo do Relatório conforme suas necessidades

 

 

Espero que tenha ajudado a vocês a incrementar a sua tarefa de fazer relatório fique bem mais fácil “SEM TRABALHO” para gerar o relatório; você incrementando não terar mais trabalho.

 

Fortaleza 12 de Marco de 2008

Erimar Feijó de Souza

erimarfs@yahoo.com.br