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.