Você está na página 1de 7

Validandos dados em relatrios

Escolhendo os dados a serem impressos



A grande utilizao de relatrios em um projeto, necessita do reaproveitamento dos
mesmos, seno teremos uma quantidade muito grande de arquivos onde os dados
apresentados podem ser os mesmos.

Um exemplo: um relatrio onde constam parcelas das vendas do seu cliente. Ele precisa
verificar em situaes diferentes as parcelas pagas, no pagas, vencidas, h vencer etc. se
voc imaginou fazer um relatrio apenas e filtrar os dados no banco de acordo com a
necessidade, esta meio certo.

Mas sua consulta vai mudar de acordo com a opo desejada e assim, ter consultas ao
banco desnecessrias. O que fazer? Simples, vamos fazer um relatrio apenas, retornando
todas as parcelas (claro, usando outro filtro, como por exemplo, um perodo de datas) e
filtrando os dados de acordo com a opo.

Ficou curioso como fazer? Ento vamos aprender isso e muito mais neste artigo. Usaremos
o Quick Report e o Rave Reports para mostrar esse exemplo. Para exemplos usaremos o
Delphi 2007, mas os exemplos podem ser realizados em qualquer verso do Delphi ou dos
geradores de relatrios.
Filtrando parcelas
Primeiramente, faremos o exemplo citado anteriormente, no Quick Report. Usei aqui um
banco de dados criado por mim, que estar disponvel para download.

Nossa consulta retornar as parcelas de acordo com o perodo, independente do campo
PAGO, que indica se a mesma esta paga ou no. Nossas opes de filtragem sero: Pagas
(PAGO = T), No Pagas (PAGO = F), Vencidas (parcelas no pagas at a data atual), h
vencer (parcelas no pagas acima da data atual).

A consulta pelo perodo vai se basear pelo campo DATA_LANCAMENTO. No Delphi, crie um
novo projeto e crie a consulta ao banco de dados (aqui usaremos o dbExpress com o driver
mostrado na edio 64). Nossa consulta ter o comando SQL da Listagem 1.

Listagem 1. Comando SQL da consulta
select
PA.ID_PARCELA, CO.NR_CONTRATO, CL.CLIENTE, PA.NR_PARCELA,
PA.DATA_VENCIMENTO, PA.VALOR_PARCELA, PA.PAGO
from PARCELAS PA
inner join CLIENTES CL on (PA.ID_CLIENTE = CL.ID_CLIENTE)
inner join CONTRATO CO on (PA.ID_CONTRATO = CO.ID_CONTRATO)
where
PA.DATA_LANCAMENTO between :DATAINI and :DATAFIM
and PA.STATUS = 'A'
order by PA.DATA_VENCIMENTO, CO.NR_CONTRATO, PA.NR_PARCELA

Configure os parmetros no componente. Nossa consulta esta pronta, ento precisamos
criar o relatrio. Crie um relatrio no Quick Report com a consulta, usando o layout da
Figura 1.


Figura 1. Relatrio no Quick Report
Para testar o relatrio, vamos criar um novo formulrio e adicionar os controles, confirme a
Figura 2.


Figura 2. Formulrio de filtragem de dados
No Data Module, vamos criar uma procedure que ir filtrar o nosso ClientDataSet que
retorna os dados da consulta. Uso o cdigo da Listagem 2.

Listagem 2. Procedure para filtrar os dados
procedure TDM.Filtrar(dtInicio, dtFim: TDateTime);
begin
cdsConsulta.Close;
cdsConsulta.Params[0].AsDate := dtInicio;
cdsConsulta.Params[1].AsDate := dtFim;
cdsConsulta.Open;
end;

Voltando ao formulrio de filtros, adicione o cdigo da Listagem 3 para o boto Relatrio.
Adicione no uses a unit do Data Module e relatrio.

Listagem 4. Chamada ao relatrio
//verifica se escolheu um item
if RadioGroup1.ItemIndex = -1 then
MessageDlg('Escolha uma opo de Filtro', mtError, [mbok], 0)
else
begin
//filtra a consulta
DM.Filtrar(dtInicial.Date, dtFinal.Date);
try
frmRelatorioConsulta := TfrmRelatorioConsulta.Create(nil);
frmRelatorioConsulta.QuickRep1.Preview;
finally
frmRelatorioConsulta.Free;
end;
end;

Nota: dtInicial e dtFinal so controles DateTimePicker colocados no formulrio.

Caso deseje testar, coloque o Data Module como primeiro formulrio a ser criado, a seguir o
formulrio de filtragem. At o momento, nossos dados estaro apenas sendo filtrado pela
consulta principal (Listagem 1).

Para que possamos implementar a filtragem de acordo com as opes, adicione uma
varivel pblica no formulrio do relatrio chamada iIndex, do tipo integer. Passaremos
para esse varivel a opo escolhida no RadioGroup.

Na chamada ao relatrio, modifique o cdigo para repassar o valor do RadioGroup para a
varivel:

frmRelatorioConsulta.iIndex := RadioGroup1.ItemIndex;

Agora a parte principal do nosso exemplo, onde vamos filtrar os dados da consulta, de
acordo com a opo escolhida. Toda a mgica esta no evento BeforedPrint da banda Detail.
Nela temos um parmetro chamado PrintBand do tipo boolean, que indica se o item que
esta sendo impresso, deve ser impresso.

Assim, com o valor que temos da varivel (iIndex), podemos filtrar os dados. No referido
evento, utilize o cdigo da Listagem 4.

Listagem 4. Filtrando os dados
case iIndex of
0: PrintBand := (QuickRep1.DataSet.FieldByName('PAGO').AsString = 'T');
1: PrintBand := (QuickRep1.DataSet.FieldByName('PAGO').AsString = 'F');
2: PrintBand := (QuickRep1.DataSet.FieldByName('PAGO').AsString = 'F') and
(QuickRep1.DataSet.FieldByName('DATA_VENCIMENTO').AsDateTime < Date);
3: PrintBand := (QuickRep1.DataSet.FieldByName('PAGO').AsString = 'F') and
(QuickRep1.DataSet.FieldByName('DATA_VENCIMENTO').AsDateTime > Date);
end;

Veja como simples filtrarmos os dados, basta configurar corretamente o parmetro,
usando o valor dos campos que temos vinculados ao relatrio. Neste exemplo, usei a
propriedade DataSource do relatrio, mas poderamos utilizar diretamente o controle do
Data Module, por exemplo.

Faa os testes para as vrias opes de filtragem (Figura 3).


Figura 3. Opes de filtragem do relatrio, sem mudar a consulta ao banco
Rave Reports
Para o Rave, vamos usar a mesma consulta. Primeiramente, crie um relatrio no Rave
(vamos colocar os componentes no Data Module). O layout do mesmo deve se parecer com
a Figura 4.


Figura 4. Relatrio no Rave

Para a consulta ser mostrada no relatrio, devemos adicionar um RvDataSetConnection e
ligar sua propriedade DataSet com o cdsConsulta. Faa a ligao do controle com o relatrio
(DataViews) para exibir os dados.

Nota: Caso exista alguma dvida em relao a conexo de dados em relatrios do Rave,
sugiro uma pesquisa no site da Nevrona (fabricante do Rave) ou na internet sobre o
assunto.

Aps configurar o relatrio, modifique a chamada ao relatrio do Quick, no formulrio de
filtragem com o seguinte cdigo:

DM.iIndex := RadioGroup1.ItemIndex;
DM.Filtrar(dtInicial.Date, dtFinal.Date);
DM.RvProject1.Execute;

Veja que temos uma varivel publica no Data Module que recebe o valor do RadioGroup. Por
que fazemos isso? Por que o responsvel por filtrar os dados esta no Data Module, o
RvDataSetConnection. No evento ValidateRow do controle, vamos fazer algo semelhante ao
exemplo anterior. Veja o cdigo na Listagem 5.

Listagem 5. Filtrando os dados para o Rave Reports
case iIndex of
0: ValidRow := cdsConsultaPAGO.AsString = 'T';
1: ValidRow := cdsConsultaPAGO.AsString = 'F';
2: ValidRow := (cdsConsultaPAGO.AsString = 'F') and
(cdsConsultaDATA_VENCIMENTO.AsDateTime < Date);
3: ValidRow := (cdsConsultaPAGO.AsString = 'F') and
(cdsConsultaDATA_VENCIMENTO.AsDateTime > Date);
end;

Cdigo bastante semelhante ao do exemplo do Quick Report, ficando a diferena que
acessamos diretamente o Field no ClientDataSet. Faa os testes e verifique as filtragens
(Figura 5).


Figura 5. Aplicando o exemplo de filtragem no Rave
Imprimindo registros selecionados em um DBGrid
Esse exemplo bastante interessante. Imagine que voc possa dar ao seu usurio a
possibilidade de escolher itens em um DBGrid e imprimir em um relatrio os itens
selecionados.

O exemplo continua bem simples, usaremos praticamente a mesma tcnica anterior, com
apenas uma modificao em seu cdigo. Crie uma consulta (pode se usada a mesma) e
mostre-a em um DBGrid. Altere as seguintes propriedades do DBGrid:

Options>dgRowSelection = True
Options> dgAlwaysRowSelection = True
Options>dgMultiSelect = True

Crie um novo relatrio no Quick Report, usando a consulta anterior. No mesmo evento do
exemplo anterior, vamos repassar para o parmetro PrintBand apenas os registros
selecionados no Grid, usando o seguinte cdigo (adicione no uses do relatrio a unit do
formulrio):

PrintBand := frmSelecionar.DBGrid1.SelectedRows.CurrentRowSelected;

Estamos indicando assim, que queremos imprimir apenas os registros que esta marcados no
DBGrid. Para o teste, rode a aplicao, marque alguns itens no DBGrid (utilizando a tecla
CRTL) e chame o relatrio (Figura 6).


Figura 6. Imprimindo apenas os registros selecionados
Para o exemplo em Rave, a idia a mesma, ento crie um novo relatrio e no cdigo para
filtrar os registros selecionados do DBGrid, use o seguinte cdigo:

ValidRow := frmSelecionar.DBGrid1.SelectedRows.CurrentRowSelected;

Neste exemplo didtico, usamos a unit de um formulrio no Data Module, o que no
correto. Em uma aplicao real, voc pode passar como parmetro, usar variveis etc. Veja
na Figura 7 o relatrio em execuo no Rave.


Figura 7. Imprimindo os registros selecionados no Rave
Concluso
Vimos nesse artigo, como simples de filtrar dados em relatrios do Rave ou Quick, sem a
necessidade de realizarmos vrias consultas ao banco de dados, ganhando assim, agilidade
e performance a aplicao.

Vimos tambm que podemos deixar o usurio escolher os registros de uma consulta e
imprimir o mesmo, adicionando assim valor ao seu projeto. Um grande abrao a todos e
sucesso em seus projetos!v

Você também pode gostar