RAVE – Imprimindo Gráficos (Chart)

por Eduardo Rocha

Uma coisa muito comum nos sistemas, são os relatórios com gráficos estatísticos, os famosos Charts.

Antigamente eu usava o QuickReport e o ReportBuilder, porém relatórios com gráficos só precisei fazer no QuickReport e não tive muitas dificuldade, pois ele já tem um componente que facilita a vida.

Mas, como agora larguei o QuickReport e estou usando somente o Rave, houve então a necessidade de saber como fazer relatórios nele com gráficos.

Comecei então a fuçar no Rave e percebi que não existia nenhum componente que facilitasse a vida. Então fiz algumas pesquisas na internet para saber se não existiam componentes de terceiros, mas infelizmente não achei nenhum, porém nessas pesquisas, achei duas soluções para o caso :

1 – Salvar o conteúdo de um TCustomChart em um BMP e imprimir esse BMP no Rave
2 – Usar o método WriteChartData disponível na unit RPTChart

Esta última solução é a indicada pela Nevrona.

Fiz o teste com as duas soluções e as duas foram satisfatórias, porém gostei mais da última solução, pois como disse, é indicada pela própria Nevrona e não aparenta ser uma "gambiarra" :-) como a primeira solução.

Depois desta pesquisa, resolvi escrever este artigo para demonstrar como não é um bicho de sete cabeças fazer isso funcionar.

Então vamos lá...

Antes de iniciarmos, gostaria de explicar como a "coisa funciona", para depois partirmos para prática.

O método WriteChartData, "escreve" o conteúdo de um TCustomChart dentro de um campo do tipo Graphic. Então, a princípio, nosso gráfico será montado no TChart ou TDBChart do Delphi, e depois disso, iremos utilizar o WriteChartData para fazer com que o conteúdo do gráfico seja impresso, desenhado dentro do nosso relatório.

Agora vamos colocar em prática esta teoria...

Irei utilizar um RVCustomConnection, pois não preciso estar conectado a um DataSet para gerar o gráfico no Rave, só preciso de alguém que me disponibilize um campo para poder usá-lo na impressão, então o RVCustomConnection é o ideal para isso. Para quem não sabe para que serve o RVCustomConnection, vale a pena começar a mexer nele, pois é muito interessante.

Agora é serio, chega de teoria e vamos para prática...:-)

1 - Insira os seguintes componentes no Form:
TRVProject
TRVCustomConnection
TRVSystem
TChart

2 – Na clausula uses, insira a unit RPTChart. É esta unit que nos disponibilizará o método WriteChartData

3 - Ajuste a propriedade Engine do RaveProject, apontando para o RVSystem.

4 - Ajuste o Chart, de forma que represente algum gráfico, só para podermos visualizar o resultado final.

5 – Agora iremos ajustar dois eventos do componente RVCustomConnection:

OnGetCols: Este evento é chamado quando o Rave necessita extrair os meta-data dos campos. É aqui que criaremos nosso campo do tipo graphic. Para isso, coloque o seguinte código neste evento:

with Connection do
begin
WriteField('CampoChart', dtGraphic, 0, '', '');
end;

OnGetRow:Este evento é chamado quando o Rave necessita extrair os valores dos campos do registro atual. É aqui que iremos alimentar o valor do campo que criamos acima. Para isso, coloque o seguinte código neste evento:

WriteChartData(Connection, Chart1);

Chart1 é o nome do TChart que inserimos no Form.

A parte de codificação já está pronta, agora vamos para parte visual.

6 – Entre no RaveDesigner

7 – Crie uma Region e dentro desta Region crie uma banda simples.

8 – Dentro da Band1(que acabou de ser criada), insira o componente MetaFile, que está na palheta Standard do Rave.

9 – Crie uma DataView, da mesma forma que se fosse criar uma outra qualquer, a diferença é que os dados agora virão de um RVCustomConnection.

10 - Após ter criado, perceba que na TreeView o DataView1 está disponível, porém se clicar no sinal de mais do DataView1 para exibir os campos, perceberá que o campo que criamos via código(CampoChart) não está disponível, só tem um campo, que é o que vem de brinde, mas não use-o. Para que o nosso campo possa ser criado, o evento OnGetCols terá que ser chamado, e como fazer isso em tempo de projeto ?

O segredo é :O RaveDesigner tem que estar aberto juntamente com a aplicação e depois chamar o Refresh do DataView.

Então vamos lá...

11 - Execute a aplicação e volte para o RaveDesigner, mas não feche a aplicação ainda.

12 – Selecione o DataView1 lá na TreeView e clique com o botão direito do mouse sobre o DataView1. Aparecerá um item chamado Refresh, basta clicar nele e...bingo :-). Pronto, o campo que criamos via código irá aparecer na lista. Quando clicar pela primeira vez no Refresh, vai aparecer uma mensagem, é uma alerta de que um campo será excluído, isso ocorre pois quando criamos a DataView, já veio aquele campo de brinde, mas como não criamos ele no OnGetCols, então a mensagem alertará de que o mesmo será excluído.

13 – Agora selecione o componente MetaFile que foi inserindo em Band1 e altere duas propriedades dele:

DataField : CampoChart (nome do campo que criamos)
DataView : DataView1 (nome da dataview criada)

Pronto...Pode executar a aplicação e fazer o teste.

Caso queira fazer o teste no próprio preview do RaveDesigner, basta deixar a aplicação aberta, caso contrário, se a aplicação não estiver aberta e você chamar o preview do RaveDesigner, receberá de presente um errinho básico, o famoso "Acess violation..." :-)

Lembre-se, o exemplo que fizemos foi com um TChart, o mesmo poderá ser feito com um TDBChart.

Outro detalhe, utilizamos um RVCustomConnection, mas poderíamos utilizar um RVDataSetConnection sem problemas, porém neste caso, só fique atento com o seguinte:

No evento OnGetCols, antes de criar o campo, chame o método DoGetCols do Connection que vem como parâmetro neste evento. Isso deve ser feito para que primeiro sejam criadas as colunas do DataSet que está associado e depois sim poder criar as suas colunas.

E no evento OnGetRow, antes de chamar o WriteChartData, chame o método DoGetRow do Connection que vem como parâmetro neste evento. Isso deve ser feito para que primeiro seja alimentando os campos do DataSet que está associado e depois sim poder alimentar seus campos criados manualmente.

Espero que um dia possa surgir um componente para utilizarmos no Rave, pois assim ficará muito mais fácil, mas enquanto isso não acontece, temos esta solução.

Sobre o Autor

Eduardo Rocha é mantenedor do site http://www.edudelphipage.com.b e
pode ser contatado através do email
eduardo@edudelphipage.com.b

COMENTÁRIOS
EOFSYS - 25/10/2003 - 09:20:32
Muito bom.
................................................
neo - 29/10/2003 - 18:43:43
educativo
................................................
Alison Ramos Lacerda - 05/12/2003 - 13:40:21
Este artigo, chegou na hora certa pra mim...

Sóuma dúvida, este componente TChart ou TDBChart, é um componente de Terceiro ou é um componente nativo do Delphi

Obrigado
................................................
Marcos P. Gomes - 05/12/2003 - 15:35:37
o Tchart é de uma empresa chamada TeeChart, o que existia dentro do Quick Report é da mesma empresa.

Marcos
DelphiBR
................................................
Cesar - 08/01/2004 - 11:37:07
Nada a ver diretamente com o artigo, mas falando de Rave. Alguém sabe uma forma de fazer ou tem algum filtro para matricial com RAVE, assim como o Fortes Reporté
................................................
Gilberto Leandro - 09/02/2004 - 10:03:18
O artigo é muito interessante, com uma forma muito clara do uso desse componente para programadores experientes e novatos.
................................................
Valeu - 13/02/2004 - 13:52:43
Com esse artigo resolvi meu problema, só que demorei para achar ele.
................................................
Clairton - 01/03/2004 - 22:07:53
Excelente esta matéria sobre rave
................................................
Luiz Carlos - 12/05/2004 - 17:04:58
Porque mesmo colocando RpTChart no USES
d? erro na compilação

Undeclared identifier: 'WriteChartData'

luiz@parinformatica.com.br
................................................
C?sar Augusto - 29/06/2004 - 10:36:57
Qual o seu e-mail p/ + informa??es?!?!?!

O meu ?: ttx@zipmail.com.br

Obrigado!!!
................................................
Juliano Amaral - 27/08/2004 - 18:16:54
Tenho a versão 7.0 do TeeChart e estou tentando usar o Rave mas ao incluir a unit RpTChart no projeto, recebo o erro "Unit RpTChart was compiled with a different version of Chart.TCustomChart.

Alguém sabe se existe algum patch para corrigir isso?

J? pesquisei no site da Nevrona e no da Steema mas não achei nada...
................................................
Ederson - 01/09/2004 - 16:10:57
Muito bom artigo.
Como eu acho o rptchart ?
................................................
Anderson - 11/01/2005 - 21:44:03
Excelente artigo, o autor esté de parabens
................................................
Alex Sander - alex.s - 06/04/2005 - 08:33:25
Muito Bom esta técnica, mas ela só funcina se vc trabalha com 1 unico gr?fico, gostaria de saber se ja existe alguma forma de se fazer com que o grafico altere-se (dinamicamente) conforme os dados que eu tenha. Ex. tenho um fornecedor que me o fornece N produtos , e queria fazer um acompanhamento mes a mes de cada produto e gerar um grafico disso, ou seja, cada pagina teria um produto e um grafico, na tela do programa isso ocorre, mas quando levo para o rave não. permanece o primeiro grafico para todos os demais.
Se alguem poder me ajudar fico devendo uma...valeu.
................................................
Alex Sander - - 06/04/2005 - 08:35:13
para entrar contato - alexsander29@hotmail.com (msn)
................................................
Welson - 02/06/2005 - 14:35:04
Excelente dica !!!
A comunidade Delphiana agradece, acredite !!!

Atenciosamente.
................................................
Fernanda Pradella - 07/07/2005 - 14:53:28
Olá, Eduardo... ou alguém no site

Será que vc teria algum exemplo de como imprimir um gr?fico apartir via Code-Based?

Obrigada
................................................
O Envio de Comentários está suspenso temporáriamente