quinta-feira, 29 de novembro de 2007

Soma Condicional no Rave Reports

Nesse artigo vou demonstrar como se faz uma soma condicional no Rave Reports. Na verdade, podemos fazer qualquer cálculo, mas o mais comum em um relatório é realmente o somatório de um campo.

Nesse caso, vou fazer o somatório de um campo, baseado no valor de outro campo. Por exemplo, quero fazer o somatório dos valores que já foram pagos e dos valores que ainda não foram pagos, onde terei uma coluna chamada “PAID” que terá valor “y” (pagos) ou “n” (não pagos).

Outro exemplo prático para esse artigo, poderia ser o somatório de faturas baixadas, faturas em aberto e faturas em atraso. Bom, na verdade, temos vários exemplos práticos para esse modelo de relatório.

Infelizmente não podemos fazer isso diretamente usando componentes do Rave, de uma maneira simples.

Inicialmente, preciso de um banco de dados para fazer meu relatório. Eu vou utilizar o banco de dados “EMPLOYEE.GDB” que acompanha o Delphi há algum tempo. Ele está localizado em “C:\Arquivos de programas\Arquivos comuns\Borland Shared\Data” para o Delphi 2006, 2005 ou 7, ou no caso do RAD Studio 2007 está localizado em “C:\Arquivos de programas\Arquivos comuns\CodeGear Shared\Data”.

Na minha aplicação eu vou utilizar o dbExpress, e farei um relatório mestre-detalhe, usando a prática de Nested DataSets (DataSets aninhados) para fazer esse relacionamento. Não vou entrar em detalhes de como será feito o relacionamento, pois o foco do artigo é no Rave Reports.

Vamos à aplicação em si. Crie um novo projeto através do menu File | New | VCL Forms Application.

Defina o nome do formulário principal como “frmPrincipal” e salve a unit do como “uPrincipal.pas” e o projeto como “ProjetoRaveSomaCondicional.dpr”.

Insera um componente TSQLConnection, o renomeie para “conexao” e o aponte para o banco EMPLOYEE.GDB.

Coloque os seguintes componentes, nessa ordem e configure as seguintes propriedades:


Após a configuração do cdsClientes, adicionaremos todos os campos nele, clicando duas vezes no componente e abrindo o Fields Editor, após isso, acionamos o menu de contexto com o botão direito, e selecionamos “Add all fields” ou Ctrl + F. Repare na lista de campos, que o último campo deve ser do tipo TDataSetField, ou seja, um campo que contém um dataset, com o nome “sqlDsVendas”. Se ele não aparecer, repita o processo.

Na seqüência vamos configurar mais alguns componentes.


A tela deverá estar configurada semelhante a da figura abaixo.


Vamos partir para o relatório agora. Com um duplo-clique no RvProject abriremos o Rave Reports Designer.

Selecione o menu File | New para criar um novo relatório, salvaremos o arquivo gerado como “RelatorioCondicional.rav”, salvando-o no mesmo diretório da aplicação.
Devemos agora criar os Data Views dentro do relatório importando os campos dos ClientDataSets configurados na nossa aplicação através dos RvDataSetConnections, para isso, selecione o menu File | New Data Object e selecione a opção Direct Data View, e selecione primeiro o RvDataSetClientes. Repita o processo para a criação do Data View e selecione depois o RvDataSetVendas.

Foram criados dois DataViews no Project Tree, vamos renomeá-los para dvClientes e dvVendas, respectivamente, como na figura abaixo.


A parte inicial do relatório, nós faremos com o Wizard, pois não é tema do artigo, como gerar um relatório desde o início. Para isso acesse o menu Tools | Report Wizards | Master/Detail Report.

O assistente irá nos guiar para a criação básica do relatório. Na primeira tela, ele pergunta qual o DataView Mestre, selecione dvClientes. Na segunta tela, pergunta qual o DataView Detalhe, seleciona dvVendas.
Na seqüência, quais os campos do dvClientes que queremos no relatório, selecione CUSTOMER e CITY. Na tela seguinte, ele especifica a ordem de impressão das colunas, deixe o padrão. Ele também pergunta, quais os campos do dvVendas que queremos no relatório, selecione PO_NUMBER, PAID e TOTAL_VALUE. E também deixe os campos na ordem padrão. Após isso, ele pede qual o relacionamento entre os dois DataViews, selecione CUST_NO nos dois DataViews e pressione Next. Na penúltima tela, informe o título do relatório como: “Relatório de Vendas por Cliente”, e finalmente na última tela, somente diminua um pouco os fontes para que o relatório não fique encavalado. Repare na figura abaixo, que mesmo diminuindo a fonte, o relatório fica um pouco encavalado nos campos PAID e TOTAL_VALUE. Dê uma ajustada para que o relatório fique mais apresentável.


Se pressionarmos F9, ou no menu File | Execute Report, poderemos testar a pré-visualização do nosso relatório.

Vamos colocar uma formatação no campo TOTAL_VALUE, para isso, vá no Project Tree, expanda Data View Dictionary e expanda dvVendas. Agora em dvVendasTOTAL_VALUE, configure a propriedade DisplayFormat como “R$ #,##0.00”.

Bem, agora vamos para a parte principal do nosso artigo, montar o rodapé de cada cliente, mostrando o total de vendas pagas e de vendas não pagas. Para isso, vamos incluir uma Band no nosso relatório dentro da Region.
Vamos configurar a propriedade ControllerBand para dvVendasDataBand e em BandStyles vamos deixar ela como rodapé, marcando a opção “Body Footer”. Vamos aumentar um pouco a Band deixando a propriedade Height com “0,700”.

Dentro dessa Band, vamos inserir um componente CalcText, para fazer o somatório de todas as vendas, não importando se as vendas estão pagas ou não, configurando-o da seguinte forma: DataView=dvVendas, DataField=TOTAL_VALUE, Controller=dvVendasDataBand, DisplayFormat=R$ #,##0.00

Colocaremos também um Text antes do CalcText, para indicar a totalização com a propriedade Text sendo “TOTAL DE VENDAS:”. O relatório deve se parecer com o da figura abaixo.


Como não temos uma maneira simples de fazer um somatório condicional através de um componente, como fizemos com o CalcText, vamos fazê-lo utilizando o recurso de parâmetros e Rave Language, que é a linguagem de programação do Rave.

Vamos mudar o nome do nosso relatório no Project Tree, expandindo a opção Report Tree e mudando no Report2 a propriedade Name para “rptVendasPorCliente” e FullName para “Relatório de Vendas por Cliente”.

Com o relatório selecionado no Project Tree, vamos criar dois novos parâmetros para esse relatório, na propriedade Parameters, configure-a como na figura abaixo.


A cada impressão de um novo cliente devemos zerar VENDAS_PAGAS e VENDAS_NAO_PAGAS. Para isso usaremos Rave Language, selecionando a dvClientesDataBand e clicando na aba Event Editor, ao lado da aba Page Designer, como mostrado no círculo vermelho na figura abaixo.


Após termos entrado no editor de eventos, vamos selecionar no combobox “Available Events” o evento “OnAfterPrint”. Criando logo abaixo um cabeçalho para que possamos digitar o nosso código para o evento.

Após o begin, vamos digitar o seguinte código:


Esse código faz com que passamos o valor “0” (zero) para cada parâmetro.

Após isso, devemos clicar no botão Compile para compilarmos o evento. Sempre após a criação de um evento, compile-o para correta utilização. Se a compilação estiver correta ele irá mostrar uma mensagem “Compile finished”, na mesma barra do botão Compile, no canto direito, senão, no mesmo lugar, mostrará uma mensagem em vermelho, indicando o erro.

Agora, voltamos ao Page Designer, clicando na aba de mesmo nome, ao lado da aba Event Editor.

Selecionaremos o componente dvVendasDataBand, e voltaremos ao Event Editor, selecionando o evento “OnAfterPrint” e inserindo o seguinte código:


Repare que a codificação por mais que seja parecida com Pascal, tem algumas diferenças, por exemplo, antes do elseif, temos “;” (ponto-e-vírgula). Também o “end” para fechar o “if” não é um simples “end” e sim é um “end if”. Tome cuidado com esse tipo de sintaxe.

Após a codificação, compile o código.

Pronto, os parâmetros foram definidos, os valores corretos foram assinalados para os parâmetros, agora falta somente imprimir os parâmetros. Para isso, vamos incluir dois DataTexts na banda de rodapé, e na propriedade DataField deles, ao invés de selecionarmos um campo de um DataView, vamos imprimir o valor de um parâmetro, clicando no botão “...” ao invés de abrir o combobox para mostrar todos os campos disponíveis. Ao clicar no botão “...”, irá abrir o Data Text Editor. Selecione o parâmetro, como na figura abaixo e clique no botão “Insert Parameter”, ao fazer isso, será colocado no campo “Data Text” o valor “Param.VENDAS_PAGAS”, clique em OK. Repita o processo para o parâmetro VENDAS_NAO_PAGAS.



Para finalizar coloque dois componentes Texts antes dos DataTexts para descrever os totais. O relatório se parecerá como o da figura abaixo.



Podemos perceber que faltou a formatação do valor na impressão das vendas pagas e não pagas. Porém, o nosso componente DataText não tem a propriedade DisplayFormat, faremos isso através de Rave Language, selecionamos o DataText de Vendas Pagas, e vamos adicionar código ao evento “OnGetText”, pois é a última chance de transformarmos o texto antes de ser impresso. Usaremos o parâmetro por referência “Value” que nos traz o texto a ser impresso, e se atribuirmos um novo valor a “Value” podemos modificar o texto. Então adicionaremos o seguinte código:


Não esqueça de compiler o evento. Faça a mesma coisa para o DataText de Vendas Não Pagas.

Nosso relatório está pronto, agora salve o relatório e feche o Rave Reports Designer. Para finalizar basta adicionarmos código ao botão Imprimir do nosso projeto, e adicionarmos referência ao nosso projeto de relatórios .rav.

No evento OnCreate do nosso formulário vamos adicionar o código:


No evento OnClick do botão IMPRIMIR vamos adicionar:


Pronto, está terminado nosso relatório com soma condicional por grupos.

Se quisermos adicionar um somatório total do relatório, basta seguir basicamente os mesmos passos, criando mais dois parâmetros, porém, não o zeramos a cada cliente.

Espero que vocês tenham gostado desse artigo. Para fazer o download do exemplo, basta clicar aqui.

Abraços

Giordano Kostcoski - Borland Instructor Certified
(giordano@tdstecnologia.com.br / giordanocwb@yahoo.com.br)
Instrutor TDS Tecnologia - Curitiba/PR

4 comentários:

Edimar disse...

Olá, boa tarde.

Seguí o seu tutorial para desenvolver os totais de acordo com os parâmetros, mas quando crio as variáveis está apresentando erro de memória. Estou usando Delphi 7 e Rave 5.01.

Sabe o q pode tá acontecendo?

Eu sou maluco por bombas disse...

kra nao consigo ligar as tabelas
pois trabalho com data view.. e so uma tabela
peciso urgente q vc me ajude
meu relatorio e assim .
NºORC NUMFAB TOTLIQ FROM_PGn_FOPGTO
001 0002 12.300 005 ESPECIE
___________________________________
NºORC NUMFAB TOTLIQ FROM_PGn_FOPGTO
002 0003 1.300 005 ESPECIE
___________________________________
NºORC NUMFAB TOTLIQ FROM_PGn_FOPGTO
003 0004 12.300 006 CARTAO
___________________________________
NºORC NUMFAB TOTLIQ FROM_PGn_FOPGTO
004 0005 300.00 007 CARTAO ___________________________________
NºORC NUMFAB TOTLIQ FROM_PGn_FOPGTO
005 0006 1.000 008 CHEQUE

QUERO SOMAR SO OS CARTOES SO OS EM ESPECIE SO OS EM CHEQUE ... COLUNAS ESPECIFICAS SEPARADAS ...
AJUDA SE PUDER MUITO BOM SEU TOPICO MAIS NAO CONSEGUI DESENVOLVER....

Magno disse...

Cara muito bom o tópico... deu certinho...

Só um comentário pro povo ai... verifica com calma que podem ter feito o mesmo erro que eu fiz... é pra adicionar parametros e nao variaveis.. derrepente colocou vairiaveis sem perceber...

Marcelo disse...

O único problema quando muda de pagina ele zera os parâmetros, fiz um relatório Mestre / Detalhe, que zera os parâmetros quando é impresso o Mestre e totaliza o detalhe em uma band abaixo.