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.

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