Nenhum comentário Download


Delphi – Parte IX

 

Vimos no artigo anterior, um pequeno exemplo de como criar um controle VCL no Delphi. Neste artigo, finalizaremos a série mostrando relatórios com Delphi. Nas primeiras versões do Delphi tivemos uma ferramenta simples de trabalhar e muito poderosa o Quick Report (www.quickreport.co.uk). Algumas caraterísticas da ferramenta:

·         Utilizada juntamente com um formulário (o preeview do relatório ficava no formulário);

·         Possibilidade de usar herança visual de relatórios (semelhante ao que vimos com os formulários de cadastros);

·         Rica biblioteca de componentes para mostrar os dados (com gráficos etc);

 

Uma desvantagem, no meu ponto de vista, sobre o Quick, é de que se precisamos modificar algum relatório, será necessário recompilar e distribuir o nosso executável.

 

Isso não acontece com o Rave Reports (www.nevrona.com/rave), que passou a ser a ferramenta padrão do Delphi a partir da versão 7, pois ele trabalha com um IDE separado do Delphi e possui um arquivo com todos os relatórios do projeto. Outras características:

·         Pode conectar diretamente ao banco de dados ou usando componentes do Delphi;

·         Exporta nativamente relatórios para os formatos: RTF, HTML, PDF e texto;

 

Vou mostrar nesse artigo o Rave Reports, que assim como o Quick, ainda possui compatibilidade com as ultimas versões do Delphi.

Conhecendo a IDE do Rave Reports

Como comentado, o Rave possui um ambiente visual separado do Delphi. Para acessar, acesse o menu Tools>Rave Reports Designer. Outra maneira, é adicionar um RvProject da aba Rave e dar um duplo clique. Na Figura 1 temos o IDE do Rave,

 

 

Figura 1. IDE do Rave Reports

 

Ao executar percebemos várias semelhanças com o Delphi, como a paleta de componentes na parte superior e o Property Panel (equivalente ao Object Inspector) à esquerda.

Page

É no Page, parte central do IDE, onde todos os objetos do relatório são colocados, ou seja, onde o relatório é desenhado. Um relatório pode possuir várias Pages, que podem ser acessadas a partir do Project Tree (equivalente ao Object TreeView) conforme podemos ver na Figura 2.

 

 

Figura 2. Pages e como acessa-los através do Project Tree

Property Panel

No Property Panel é possível acessar e alterar as propriedades de todos os componentes do relatório. Bastante semelhante ao Object Inspector do Delphi, o Property Panel mostra a propriedade em negrito quando seu valor padrão é alterado, como podemos ver na Figura 3.

 

 

Figura 3. Property Panel do IDE do Rave

Project Tree

A partir do Project Tree é possível acessar todos os relatórios e objetos do projeto. Isso é muito bom, pois podemos ter em alguns casos, controles que podem ser ruins de serem acessados pelo Page e só podem ser acessados pelo Project Tree.

 

Dentro do painel, ainda podemos visualizar a hierarquia dos componentes colocados no relatório e também, objetos muito importante: os de acesso a dados.  Todas as conexões feitas diretamente ao banco de dados ou a partir de uma aplicação Delphi são listadas no Data View Dictionary.

Rave Event Editor

O Rave possui uma linguagem de script própria que permite a implementação de eventos nos relatórios, a Rave Language. O Event Editor é onde toda a codificação dos eventos é realizada e onde definimos quais eventos serão implementados.

 

O Rave possui um compilador próprio para validar os scripts inseridos nos eventos, o RaveCC compiler.

Componentes do Rave Reports

O Rave possui vários componentes visuais e não-visuais, para serem usados no relatório. Além disso, podemos adicionar novos componentes na IDE (no site do desenvolvedor, temos outros componentes).

Na Figura 4 vemos os principais componentes do Rave.

 

 

Figura 4. Componentes do Rave

Criando o primeiro relatório

Vamos fazer um exemplo simples para o relatório. Com o Rave podemos utilizar como fonte de dados do relatório nossos DataSources “normais” da aplicação ou usar o acesso do IDE do Rave Reports.

 

Nesse primeiro exemplo, vamos fazer uma listagem de clientes. Adicione um RvProject no formulário principal. Dê um duplo clique no componente e acesse o Rave. Salve o arquivo .RAV (salve como “relatório.rav”).

 

Acesse o relatório e altere o nome para “rptListagemCliente”. Adicione um Region no relatório (aba Report), pois o mesmo determina a área de impressão da página do relatório. Redimensione o mesmo na página. Adicione um Band e um Databand (aba Report). Veja como esta nosso relatório na Figura 5.

 

 

Figura 5. Region e bands do primeiro relatório

 

Feche o Rave e no projeto Delphi, vamos indicar qual a componente que fará a “ponte” entre o projeto Delphi e o relatório do Rave. Primeiro, adicione um novo ClientDataSet no DMPesquisa que retorne todos os dados do cliente, pois queremos fazer uma listagem, portanto, sem filtro. Adicione um RvDataSetConnection e configure sua propriedade DataSet para o componente adicionado anteriormente.

 

Vamos agora, indicar qual a nossa fonte de dados no relatório do Rave. Abre o IDE e acesse File>New Data Object. No editor (Figura 6), escolha Direct Data View, pois vamos usar a fonte de dados constante no nosso projeto Delphi.

 

 

Figura 6. Criando a conexão com a fonte de dados

 

Clique em Next e escolha o RvDataSetConnection adicionado no projeto Delphi. No Project Tree você pode verificar o DataView criado, altere o seu nome para “dvListagemCliente”. Voltando ao relatório, temos que indicar quais as características dos controles Band e DataBand, se devem ser cabeçalhos, cabeçalho de grupo, grupo, detail etc. Acesse a propriedade BandStyle do Band1.

 

Altere para Body Header e feche o editor. Na propriedade ControllerBand altere para DataBand1. No Band2, altere DataView para a conexão de dados criada anteriormente. Essa propriedade é muito importante, pois indica a fonte de dados do relatório.

 

No Band1 você pode colocar as informações que achar necessário, pois o mesmo é o cabeçalho do nosso relatório. Veja na Figura 7, a configuração do cabeçalho.

 

 

Figura 7. Cabeçalho do relatório

 

Para adicionar a imagem, use um Bitmap (aba Standard) juntamente com a propriedade FileLink e para o rótulo use um Text (aba Standard). Para o rodapé, vamos usar um DataText (aba Report) para podermos pegar variáveis do sistema, como: número de páginas, data de impressão etc.

 

Adicione, abaixo do Region um DataText, no lado esquerdo e acesse a propriedade DataField. No editor (Figura 8), temos como configurar várias informações para o relatório com variáveis do relatório, parâmetros etc.

 

 

Figura 8. Editor do DataText

 

Na opção Data Text, digite: “Impresso em: ” & Report.DateShort. Assim, informamos a data da impressão. Adicione outro DataText no relatório e configure com o seguinte valor: “Página ” & Report.CurrentPage & “ de ” & Report.TotalPages.

 

Nossa informação será a página atual e a quantidade de páginas existente no relatório. Voltando ao DataBand, vamos adicionar alguns DataTexts e usando a propriedade DataView e DataField, configurar os campos do relatório.

 

Podemos testar o relatório, utilizando a tecla F9. Veja que as informações do relatório estão aparecendo no Rave.

Chamando o relatório do Delphi

Adicione um novo botão no formulário principal e utilize o seguinte código para chamar o relatório criado anteriormente:

 

RvProject1.ExecuteReport('rptListagemCliente');

 

Não esqueça de indicar o nome do arquivo RAV no RvProject  usando a propriedade ProjectFile. Teste e veja o relatório em execução (Figura 9).

 

 

Figura 9. Relatório criado no Rave

 

Vimos que é fácil usar o Rave no Delphi. Em um primeiro momento, você que nunca usou Rave e esta acostumado com o Quick, pode achar meio estranho, mas com o tempo, verá que temos vantagens em usar Rave.

 

Para criar um relatório parametrizado, usando controles do Delphi, é muito simples, basta usar o mesmo DataSource que esta parametrizado como fonte de dados do relatório. Faça um exemplo, para o relatório do cliente.

Crie um relatório, usando o cdsCliente que esta parametrizado com o cliente que esta em tela.

 

Nota: teremos algumas modificações para isso. No formulário base, adicione um botão responsável por chamar o relatório. Crie um método chamado no Click desse botão. Esse método será virtual, pois será subscrito nos formulários herdados.

 

Ao chamar o relatório no cadastro de clientes, sempre será mostrado o cliente filtrado no momento. Mas e se eu usar a facilidade da conexão do banco, dentro do IDE? Bom, dai teremos que passar o parâmetro da consulta, pela aplicação Delphi.

Repassando parâmetros pela aplicação

Crie um novo relatório, semelhante ao anterior. Vamos criar uma conexão com o banco, usando o menu File>New Data Object. Escolha Database connection. Note as opções de configuração com o banco de dados (Figura 10).

 

 

Figura 10. Conexões do Rave

 

Vamos usar a opção ADO para SQL Server (poderíamos também usar o DBX). Configure para o banco de dados da aplicação. Veja que na aba Test ao clicar no botão, o Rave lista as tabelas do banco de dados (Figura 11).

 

 

Figura 11. Tabelas listadas no Rave

 

Agora vamos criar uma consulta, baseada nessa conexão com o banco. Acesse o botão New Data Object e escolha Driver Data View. Escolha a conexão criada anteriormente e no editor, digite o SQL da Listagem 2.

 

Listagem 2. SQL do relatório

SELECT e.sNmEmpregado, e.tDtAdmissao, e.nPcComissao, s.sNmSetor

FROM EMPREGADO e

INNER JOIN SETOR s on s.nCdSetor = e.nCdSetor

WHERE e.nCdEmpregado = :EMPREGADO

 

Acesse a propriedade QueryParams do Driver Data View e adicione o seguinte código:

 

EMPREGADO=Param.pEmpregado

 

Estamos indicando para o parâmetro EMPREGADO do SQL, que esse será preenchido com o parâmetro de nome pEmpregado. Agora precisamos passar o valor do parâmetro através da aplicação Delphi. Mas antes, não esqueça de configurar o DataBand relatório de veículos com o Driver Data View criado anteriormente.

 

Na aplicação Delphi, use o seguinte código:

 

RvProject1.SetParam('pEmpregado', '1');

RvProject1.ExecuteReport('rptEmpregado');

 

Estamos passando um valor fixo, mas você pode adaptar a aplicação para chamar o relatório no cadastro de empregados (que deve ser criado). Fica como dica de alteração do projeto.  Para finalizar, adicione no uses da tela inicial a unit RvDLADO.

 

Nota: Caso você esteja utilizando as tecnologias BDE, DBX ou IBX no Rave Reports para fazer o acesso direto ao banco de dados, você deverá declarar as units RvDLDBX ou RvDLBDE na cláusula uses do formulário.

 

Agrupamento

Vamos criar um relatório com a listagem de empregados, agrupado pelo setor. No Rave, crie um novo DataView e use o mesmo SQL da Listagem 2, apenas removendo o WHERE, adicionando o campo nCdSetor e ordenando a consulta pelo mesmo. Vamos adicionar um Band ao relatório e altere BandStyle para Group Header. No Band2, no ControllerBand indique o DataBand1.

 

Em GroupDataView indique o DataView do relatório. Por fim, em GroupKey, indique o campo que queremos agrupar, nesse caso sNmSetor. Agora, basta acessar o relatório para ver as modificações e ter a listagem agrupada pelo tipo (Figura 12).

 

 

Figura 12. Relatório de listagem agrupado

Relatório master/detail de vendas

Agora, precisamos criar um relatório master/detail, para que possamos mostrar os dados da venda, juntamente com os produtos que fazem parte da mesma. Precisamos criar as consultas para o relatório, pois teremos que retornar os dados da venda e também dos produtos.

 Crie um novo Driver Data View e use o comando SQL da Listagem 3.

 

Listagem 3. Pesquisando os dados da OS

SELECT nCdVenda, nVlVenda, tDtVenda

FROM VENDA

WHERE nCdVenda = :VENDA

 

Na propriedade QueryParams do Driver Data View adicione o seguinte código:

 

VENDA=Param.pVenda

 

Para a próxima consulta, use o código da Listagem 4.

 

Listagem 4. Retornando os itens da OS

SELECT p.sNmProduto, i.nCdVenda, i.nQtItem, i.nVlItem,

(i.nQtItem * i.nVlItem) as SubTotal

FROM ITENS i

INNER JOIN PRODUTO p ON i.nCdProduto = p.nCdProduto

WHERE i.nCdVenda = :VENDA

 

Configura a propriedade QueryParams conforme a anterior. Crie um novo relatório, semelhante aos que já criamos até aqui. Adicione dois DataBands e configure os mesmos para cada um dos Driver Data Views criados anteriormente.

 

No DataBand1 configure o ControllerBand para DataBand2. Em BandStyle configure para BodyHeader. No DataBand2 configure o BandStyle para Details. Adicione os campos no DataBand1 para os dados da Venda, e no DataBand2 para os itens.

Veja na Figura 13 como ficou nosso relatório.

 

 

Figura 13. Relatório master/detail da OS

Conclusão

Vimos neste artigo a finalização da nossa série sobre Delphi para iniciantes. Espero ter ajudado de alguma maneira a você leitor conseguir iniciar seu caminho profissional com Delphi.

Um grande abraço a todos!