Relatório com Agrupamento no Quick Report

Salve comunidade Delphiana!

Olha eu de novo falando de relatório, prometo que o próximo assunto será diferente. No mês passado podemos desfrutar da excelente visita da maior autoridade em InterBase no Brasil na nossa reunião do grupo de usuários DelphiRio, Paulo Sérgio da Presence/Borland. O qual gostaria de agradecer profundamente a visita, a palestra e apoio singular a comunidade.

Lembrando que neste mês de férias nossa agenda está repleta de eventos de qualidade começando no dia 13/07 com a reunião do DelphiRio(//www.devmedia.com.br/ClubeDelphi/delphirio.asp), seguido pelo  ClubeDelphi Tech Weekend(//www.devmedia.com.br/tw) e FireBird Developers Day(http://www.firebirddevelopersday.com.br). Não deixem de prestigiar os eventos, aprenderem com que faz, trocar informações, idéias e principalmente desfrutar de uma boa diversão com os colegas e amigos de profissão.

Continuem escrevendo, e se puder ser útil em alguma coisa, sintam-se a vontade em escrever, passar uma mensagem, me convidar para um almoço, etc. Contem sempre comigo!

Bom, passemos agora ao nosso artigo de Relatórios

Relatórios com Agrupamento de Dados

Este tipo de relatório é baseado na projeção de dados relacionados em mais de um RecordSet de registros ou não, porém fornecendo agrupamento por um ou  mais valores obtidos em nosso sistema de informação.

Criemos uma situação base, tendo as nossas tabelas dos exemplos anteriores para nos auxiliarem nesta tarefa.

O departamento de vendas da empresa requisitou um relatório onde possa se averiguar o quanto se vendeu de cada produto nos meses de um determinado ano. O relatório deverá apresentar os produtos, os meses e o total vendido em cada mês. Deve apresentar o seu resultado agrupado por produtos e para cada produto os meses e o total vendido. O ano será definido pelo usuário do relatório.

Faremos uso das tabelas de Pedidos, Itens e Produtos apresentadas anteriormente. Lembrando que nosso exemplo é desenvolvido sobre InterBase ou FireBird com acesso e manipulação de dados em DBExpress.

Inicie uma nova aplicação no Delphi, assim como nos exemplos anteriores adicione um ComboBox para escolha do ano, um botão Gerar Relatório e um Panel para conter o objeto QuickRep.

Façamos a obtenção dos dados: Adicione um SqlConnection e faça a conexão com o banco. O primeiro SQLDataSet a ser adicionado ao projeto terá a função de listar os produtos vendidos no ano que for selecionado pelo usuário. Altere a propriedade Name para SQLProdutos, a propriedade SQLConnection aponte para o seu objeto de conexão configurado anteriormente. Na propriedade CommandText defina o seguinte comando:

select   distinct  produtos.descricao

       ,produtos.id_produto

       ,extract(year from pedidos.dataped) as ANO

from     pedidos

       ,itens

       ,produtos

where    extract(year from pedidos.dataped) = :ANO

and      pedidos.id_pedido = itens.id_pedido

and      itens.id_produto = produtos.id_produto

order by produtos.descricao

Este é o DataSet Mestre e proverá os produtos vendidos em um determinado ano e fará o agrupamento da amostragem como requisitado, pela descrição do produto. Abra a sua propriedade Params e defina a propriedade DataType do parâmetro ANO como ftString.

O próximo DataSet obterá os meses em que o produto foi vendido do ano escolhido, e também exibirá o total deste produto vendido naquele mês; este DataSet estará relacionado ao DataSet Master SqlProdutos através de um DataSource como feito anteriormente. Adicione ao projeto um DataSource, altere a sua propriedade Name para DsProdutos e aponte a sua propriedade DataSet para SQLProdutos.

Adicione um SQLDataSet, altere a sua propriedade Name para SQLMesVendas, aponte a propriedade SQLConnection para o seu objeto de conexão, e na propriedade DataSource aponte para DsProdutos que é o DataSet Mestre do relacionamento, em seguida defina a propriedade CommandText como:

select   extract(month from pedidos.dataped) as MES

       ,sum(itens.quantidade * itens.precovenda) as TOTAL

from     pedidos

       ,itens

where    extract(year from pedidos.dataped) = :ANO

and      pedidos.id_pedido = itens.id_pedido

and      itens.id_produto  = :ID_PRODUTO

group by extract(month from pedidos.dataped)

order by extract(month from pedidos.dataped)

Este DataSet exibirá os meses de venda de um determinado produto e o  total vendido em cada mês, os parâmetros no comando referenciados, são obtidos a partir do SQLProdutos, ao qual está relacionado.

Como estes componentes são unidirecionais utilizaremos DataSetProvider e ClientDataSet para efetuar o cacheamento e manipulação destes dados. Adicione um DataSetProvider da palheta Data Access, defina sua propriedade Name como DspProdutos e aponte a sua propriedade DataSet para SQLProdutos. Este componente tornará disponíveis os dados dos SqlDataSet, que relacionamos para obter os dados que preencherão o relatório. Adicione um ClientDataSet da palheta Data Access, defina sua propriedade Name como CdsProdutos, aponte a sua propriedade ProviderName para DspProdutos, clique com o botão direito do mouse sobre o CdsProdutos e escolha a opção Fetch Params para que este peque o parâmetro da consulta executada pelo SqlProdutos e por fim aplique um duplo clique no CdsProdutos e adicione os campos como objeto pressionando Ctrl + F.

Percebam que este trouxe o DataSet Detalhe já relacionado. Para fazermos uso dele, adicione um outro ClientDataSet, defina a propriedade Name como CdsMesVenda, e a propriedade DataSetField como CdsProdutosSQLMesVenda para fazermos uso do DataSet Detalhe do relacionamento.

Façamos as configurações do relatório. Aplique um duplo clique no objeto QuickRep.

Na banda Page Header coloque o título do relatório Vendas Mensais de Produtos e aplique uma linha inferior.

Na banda Page Footer defina a exibição do número de página e coloque uma linha na parte superior da banda como se fizesse divisão entre o conteúdo das bandas.

Aponte a propriedade DataSet do Objeto QuickRep para o DataSet Mestre CDSProdutos. Façamos agora a configuração da banda Detail. Use objetos QRDBText para exibir os dados do CDSProdutos(Descricao e Ano). Desenhe um retângulo para fazermos o cabeçalho da tabela onde apresentaremos os meses e os totais vendidos em cada mês do produto  em questão.

Adicione ao relatório um objeto QRSubDetail para exibirmos os dados dos pedidos. Defina sua propriedade DataSet para apontar para o CDSMesVenda e aponte a propriedade Master para QuickRep1. Adicione a continuação da tabela iniciada na banda Detail para exibir os dados provenientes do CDSMesVenda(Mes e Total Vendido ) e use componentes QRDBText como mostrado abaixo.

Após a configuração das bandas estamos prontos para configurar o ComboBox de escolha dos anos e o botão gerar relatório.

Abra a propriedade Items do ComboBox e configure.

Em seguida defina o código abaixo no evento onClick do botão Gerar Relatório.

 try

   CdsProdutos.Params[0].AsString := ComboBox1.Text;

   CdsProdutos.Open;

   CdsMesVenda.Open;

   QuickRep1.Preview;

 finally

   CdsProdutos.Close;

 end;

Este código passa o ano como parâmetro para o DataSet Mestre, abre os DataSets em ordem hierárquica, executa o  relatório e fecha  os DataSets.

Faça os retoques finais que desejar e execute a aplicação para testarmos o relatório.

E desta forma podemos fazer o agrupamento das informações para exibir no relatório.

E mais uma vez, estou as ordens e no aguardo dos e-mails. Nos encontramos nos eventos, não deixem de ir. Até a próxima!