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:
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:
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:
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):
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:
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