Páginas

quinta-feira, 29 de abril de 2010

Lazarus - Criando relatórios com FortesReport (Parte II)

No post Lazarus - Criando relatórios com FortesReport (Parte I) mostramos a criação de um relatório simples com agrupamento. Neste artigo vamos mostrar como criar um relatório mestre detalhe usando o FortesReport. Para implementar o exemplo usei um banco de dados Firebird e ZeosLib. Use o seguinte script para criar as tabelas. Neste caso o relacionamento mestre detalhe é formado pelas tabelas VENDA e ITEM.

O Data Module

Inicie uma aplicação no Lazarus e insira um Data Module. Selecione a aba Zeos Access e coloque um TZConnection no Data Module. Defina as propriedades da seguinte forma:

Database - informe o banco de dados Firebird que foi criado.
Name - dê um nome ao componente. Por exemplo: dbVendas.
Password - masterkey.
Protocol - firebird-2.0 ou a versão que está sendo usada.
User - sysdba.

Mude Connected para true, para verificar se a conexão está configurada corretamente.
Coloque um TZReadOnlyQuery e defina:

Connection - selecione o TZConnection.
Name - defina um nome para o componente. Por exemplo: queVenda.
SQL - select a.id_venda, a.data_venda, b.nome from venda a, cliente b where a.id_cliente = b.id_cliente.

Selecione a aba Data Access e coloque um TDataSource, onde DataSet deve estar associado à Query anterior. Defina Name como dsVenda.

Coloque um segundo TZReadOnlyQuery, defina Connection da mesma maneira e em Name digite queItem, por exemplo. Na propriedade SQL informe select a.id_produto, b.nome, a.quantidade, b.preco_venda, a.quantidade * b.preco_venda total from item a, produto b where a.id_produto = b.id_produto and id_venda = :id_venda.

Defina a propriedade DataSource desta Query com dsVenda. Isto, juntamente com o parâmetro :id_venda definem o relacionamento mestre detalhe entre as duas Queries. O parâmetro :id_venda é definido por queVenda através de dsVenda.

Coloque mais um TDataSource e defina a propriedade DataSet com a Query queItem. Defina Name como dsItem. Leia mais para conexão com Firebird em Lazarus - Conectando Firebird com SQLdb ou ZeosLib.

O relatório

Esse é o aspecto do relatório que iremos construir:



Agora adicione um novo form à aplicação. Localize a aba Fortes Report e coloque um TRLReport. No Inspetor de Objetos expanda a propriedade AllowedBands e coloque em True as opções btColumnHeader, btDetail e btHeader. Na propriedade DataSource selecione dsVenda, a tabela mestre.
Agora coloque um TRLBand. Defina a propriedade BandType como btHeader. Aumente a altura da banda e coloque um TRLLabel sobre a TRLBand. Defina a propriedade Caption como Relatório de Vendas. Na propriedade Align selecione faCenter, para centralizar o rótulo na banda. Expanda a propriedade Font e defina Size como 14, por exemplo. Coloque um TRLSystemInfo no lado esquerdo da banda. Na propriedade Info selecione itDate. Isso mostrará a data atual na banda. Coloque outro TRLSystemInfo, este no lado direito da banda e defina a propriedade Info como itPageNumber. Isso mostra o número da página.
Coloque outro TRLBand e defina a propriedade BandType como btDetail. Sobre essa banda, que deve mostrar os dados da tabela mestre, coloque TRLLabels definindo seus Caption como Venda, Data, Cliente, CÓDIGO, NOME, QTDE, PREÇO e TOTAL. Coloque também três TRLDBTexts. Defina seus DataSource como dsVenda e DataField como ID_VENDA, DATA_VENDA e NOME.


A banda deve ser dimensionada adequadamente de acordo com a figura acima. Coloque um TRLSubDetail e defina a propriedade DataSource como dsItem. Esta banda irá mostrar os dados da tabela detalhe. Expanda a propriedade AllowedBands e coloque em True as opções btDetail e btSummary. Sobre essa banda coloque um TRLBand. Defina BandType como btDetail. Coloque cinco TRLDBTexts e defina DataSource como dsItem. Em DataField informe ID_PRODUTO, NOME, QUANTIDADE, PRECO_VENDA e TOTAL. Coloque outro TRLBand sobre TRLSubDetail e defina BandType como btSummary. Esta banda é usada para imprimir totais de relatórios ou grupos. Sobre esta banda coloque um TRLLable e defina seu Caption como Total da Venda:. Ao lado dele coloque um TRLDBResult. Este componente é usado para totalizar uma coluna, por exemplo. Defina DataSource como dsItem. Em DataField informe TOTAL. A propriedade Info define a operação que será realizada. Defina como riSum. que indica que a coluna TOTAL será somada. Na propriedade DisplayMask escreva #,###,##0.00. Isso irá formatar o valor mostrado. Pode-se definir DisplayMask para os TRLDBTexts referentes a PRECO_VENDA e TOTAL.

No form que irá chamar o relatório coloque um botão e no evento OnClick escreva o código que mostrar uma prévia do relatório:

frmMestreDetalhe.rlVendas.Preview();

É necessário informar na cláusula uses o nome da unit do relatório. Abrir a conexão e as Queries também é necessário para que o relatório seja visualizado. Faça o download do exemplo aqui.

10 comentários:

Isaac Trindade disse...

Ola professor Carlos
Parabens pela iniciativa e pelo apoio ao projeto Fortes4Lazarus. Exemplos como esse tornam mais transparentes o uso do componente aos usuarios que tem intenção de usar o Lazarus, mas que carecia de mais opções de gerador de relatorios. Parabens.

Professor Carlos disse...

Oi Isaac

Tenho me esforçado para divulgar cada vez mais este IDE fantástico e iniciativas louváveis como a sua. Sabemos que quanto mais pessoas tiverem acesso e conhecimento da ferramenta mais ela se desenvolverá. Comentários como o seu me fazem sentir que estou no caminho certo. Obrigado e parabéns pelo seu trabalho.

Anonimo disse...

Bom tarde professor, sou iniciante no lozarus. Tentei instalar o fortes4 no windowns, mas ele não compila. Tem algum conhecimento desse problema? Obrigado e parabéns pelo trabalho.

Professor Carlos disse...

Obrigado pelo comentário.
Seria bom saber qual a versão do Lazarus. Qual o erro que acontece?

Aleson disse...

Com esse comando ele mostraria o relatório gerado em tela
frmMestreDetalhe.rlVendas.Preview();

No caso se eu quisesse que ele fosse direto para impressora qual seria o comando?

Professor Carlos disse...

Use frmMestreDetalhe.rlVendas.Print()

Anônimo disse...

Achei muito bom o seu artigo, eu utilizo delphi 2009 com fortes report e fiz aqui perfeito funcionou, apenas estou com problemas com o rldbresult q não mostra o resultado! e agora com um gambi q eu fiz esta mostrando atravez de uma rllabel, mas quando tem mais que um item não mostra! pq da esses bugs, sera q é do fortes ou é da instalação?

Professor Carlos disse...

Não creio que seja da instalação, mas não tenho nenhuma ideia do que pode ser.

Edson Lidorio disse...

olá Professor,

É possível criar relatório no Fortes em arquivo, tipo no fastreport, eu não preciso inserir no exe o arquivo do relatório?

Edson

Professor Carlos disse...

Não é possível

 
Creative Commons License
This work by Carlos Alberto P. Araújo is licensed under a Creative Commons Atribuição-Uso não-comercial-Compartilhamento pela mesma licença 3.0 Brasil License.