Para a criação de relatórios, o Lazarus já trás o componente LazReport,
no entanto ele precisa ser instalado no IDE. Para fazer a instalação do
pacote, acesse o menu
Package -> Open package file (.lpk). Localize o diretório de instalação do Lazarus e na pasta
components abra
lazreport e depois
source. Abra o pacote
lazreport.lpk, clique em
Compile e depois em
Install. Como já sabemos isso irá recompilar o IDE. Depois de inicializado novamente estará disponível a aba
LazReport. Leia
aqui um tutorial básico sobre o LazReport.
No entanto queremos mostrar uma alternativa ao
LazReport. Por essa razão, vamos apresentar neste artigo o
FortesReport.
Para quem conhece o QuickReport, que fazia parte do Delphi, não terá
dificuldade de desenvolver com esse componente. Baixe o pacote
aqui e instale. Os procedimentos são semelhantes aos que mostramos acima. Você terá uma nova aba chamada
Fortes Report.
Conectando o banco de dados
O primeiro passo para criar a aplicação é fazer a conexão com o banco de
dados. Vamos usar o SQLite e o ZeosLib. O banco de dados será o mesmo
já usado em exemplos anteriores. Selecione a aba
Zeos Access e coloque um
TZConnection no
Data Module. Defina a propriedade
Database com o caminho e o nome do arquivo do banco de dados. Na propriedade
Protocol escolha
sqlite-3.
Agora coloque um
TZReadOnlyQuery da mesma aba. Na propriedade
Connection escola o
TZConnection anterior. Na propriedade
SQL digite
SELECT * FROM CIDADE ORDER BY NOME. Localize a aba
Data Access e coloque um
TDataSource no
Data Module. Na propriedade
DataSet selecione o
TZReadOnlyQuery.
Para que possamos visualizar uma prévia do relatório deixe o banco
conectado e a Query aberta. Queremos criar um relatório com a seguinte
aparência:
Ou seja, mostraremos as cidades em ordem alfabética e a cada letra
inicial nova ela será impressa destacando um novo grupo de cidades.
A aplicação deverá ter dois forms. Um onde será criado o relatório, e
outro que chamará o primeiro. Assim, se a aplicação já possui um form,
adicione o segundo. Nosso trabalho será todo efetuado em cima do segundo
form.
Selecione a aba
Fortes Report e coloque um
TRLReport no
form. Esse componente é como se fosse a folha de papel e possui um
quadriculado para facilitar o desenho. No Inspetor de Objetos expanda a
propriedade
AllowedBands e coloque em
True as opções
btColumnHeader,
btDetail e
btHeader.
O componente trabalha com bandas e isso define quais as bandas que são
permitidas no relatório. Definimos que nosso relatório terá um cabeçalho
de página (btHeader), um cabeçalho de coluna (btColumnHeader) e uma
banda de detalhe (btDetail). Na propriedade
DataSource selecione o
TDataSource colocado no
Data Module anteriormente.
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 Cidades. 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
BandType como
btColumnHeader.
Coloque dois
TRLLabel sobre esta e defina as propriedades
Caption como
ID e
Nome respectivamente.
Como desejamos agrupar as cidades precisamos de um
TRLGroup. Coloque um componente desses. Expanda
AllowedBands e defina
btDetail e
btHeader como
True.
As propriedades
DataField ou
DataFormula são responsáveis por definir como se dará a quebra de grupos.
Como queremos que a quebra ocorra pela primeira letra do nome da cidade, então informamos em
DataFormula,
copy(nome, 1, 1).
Se a quebra fosse por um campo, este seria informado em
DataField. Coloque um
TRLBand sobre
TRLGroup. Defina
BandType como
btHeader. Coloque um
TRLDBText sobre o
btHeader. Defina a propriedade
DataSource com o
TDataSource que foi inserido no
DataModule. Podemos aqui imprimir um campo ou uma fórmula. Usaremos
DataFormula para imprimir apenas a letra inicial do nome da cidade informando
copy(nome, 1, 1). Coloque outro
TRLBand sobre
TRLGroup e dessa vez defina
BandType como
btDetail. Na banda detalhe é que são mostradas as linhas da tabela. Coloque dois
TRLDBText sobre o
btDetail de forma que fiquem abaixo dos rótulos
ID e
Nome inseridos no
btColumnHeader. Defina a propriedade
DataSource de ambos com o mesmo
TDataSource usado desde o início do artigo. Na propriedade
DataField do primeiro
TRLDBText, informe
ID_CIDADE. E no segundo informe
NOME.
Podemos obter uma prévia do relatório clicando com o botão em
TRLReport e selecionando
Preview.
Para finalizar o exemplo coloque um botão no form que irá chamar o relatório. Abaixo de
implementation acrescente no uses o nome da unit referente ao form do relatório. E no evento
OnClick do botão escreva o código para chamar o método
Preview() de
RLReport.
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.