Você está na página 1de 8

UNEB

Professor: Giuliano

Linguagem de Programao 7 Workshop Delphi

CAPT ULO

Relatrios com Quickreport

O QuickReport permite a criao de relatrios que podem ser impressos diretamente a


partir do Delphi. Ele elimina alguns problemas verificados em ferramentas de relatrio
externas, como o ReportSmith. Os componentes QuickReport permitem que os
desenvolvedores trabalhem de uma forma similar que j conhecem quando desenham
formulrios de entrada de dados.
Para iniciar a construo de um relatrio, preciso adicionar o componente
QuickReport a um formulrio. Ele fornece a superfcie de desenho do relatrio

Formulrio com o objeto QuickReport


O componente QuickReport possui uma srie de opes que podem ser definidas
clicando-se com o boto direito e escolhendo a opo Report Settings. Nesta janela, podemos
especificar vrias definies para o layout, como tamanho do papel, margens, borda, etc.

UNEB
Professor: Giuliano

Linguagem de Programao 7 Workshop Delphi

Janela Report Setings

Bandas
Os geradores de relatrios atuais trabalham com o conceito de sees, como
Cabealho, Ttulo da Pgina, Rodap da Pgina, Pgina Inicial, ltima Pgina, Linhas
Detalhes, e assim por diante. No QuickReport, essas sees so chamadas de Bandas.
Existem duas formas de colocar bandas num relatrio. A primeira utilizando a rea
Bands da janela da figura 2 (Report Setings), marcando o tipo de banda desejada. Outra
colocar manualmente o componente QRBand sobre o QuickReport.
O componente QRBand possui uma propriedade chamada BandType que determina a
posio e com que frequncia ela ser impressa. Vejamos o que cada opo representa:

Tipo da banda
rbTitle
rbPageHeader
rbDetail
rbPageFooter
rbSummary
rbColumnHeader
rbGroupHeader
rbGroupFooter
rbSubDetail
rbChild
rbOverlay

Posio e Freqncia
Somente uma vez no incio do relatrio
No incio de cada pgina.
Uma vez para cada registro do Dataset
No rodap da cada pgina
No final do relatrio, depois da banda rbDetail
No topo de cada coluna do relatrio. til para imprimir
nomes de campos em relatrios com mais de uma coluna.
Uma vez para cada grupo, antes dos dados. Usado tambm
para fazer os cabealhos da banda QRSubDetail.
Uma vez para cada grupo, depois dos dados.
Tipo especial de banda usada pelo componente QRSubDetail.
No ajuste esse tipo de banda manualmente
Tipo especial de banda usada pelo componente
QRChildBand. No ajuste esse tipo de banda manualmente
No usada na verso 2 do QuickReport. Includa apenas
para manter a compatibilidade com a verso anterior.

UNEB
Professor: Giuliano

Linguagem de Programao 7 Workshop Delphi

Criando um Relatrio Simples


Para exemplificar a criao de um relatrio, utilizaremos uma tabela chamada Produto,
com os seguintes campos: Codigo, Descricao, Embal (embalagem), Valor e Estoque.
1. primeiro passo definir a estrutura das bandas do relatrio. Um relatrio bsico precisa ter
no mnimo duas bandas: PageHeader e Detail.
Page Header
Detail

-------- Conter o ttulo do relatrio, a data de emisso, nmero da


pgina e os cabealhos das colunas
-------- Conter os objetos que imprimiro os dados da tabela

Obs.: Se quisssemos enfatizar os cabealhos das colunas, introduziramos uma banda do


tipo ColumnHeader. Algumas informaes como nmero de pgina e data de emisso
podem ser colocadas no rodap, em uma banda Page Footer. E se quisssemos totalizar
alguma informao, colocaramos ainda uma banda do tipo Summary.
2. o prximo passo ser definir todas as informaes estticas do relatrio. O componente do
QuickReport que corresponde aos labels dos formulrios o QRLabel. Basta selecionar o
componente, arrastar para a banda correta e modificar sua propriedade Caption. Assim,
colocaremos o ttulo do relatrio e os cabealhos das colunas na banda PageHeader
dispostos da seguinte forma.

Relatrio de Produtos
Cdigo

Descrio

Embalagem

Valor

Estoque

Page Header

Para centralizar o ttulo, altere as seguintes propriedades do objeto QRLabel:


Alignment: taCenterJustify e AlignToBand: True
3. depois de ter adicionado os objetos QRLabel, queremos mostrar o nmero da pgina no
canto direito superior. Colocaremos na posio adequada um objeto QRSysData, que se
encarrega de imprimir opes do sistema. Em seguida, temos que alterar sua propriedade
Data para qrsPageNumber. Depois, colocaremos o texto Pgina: na propriedade Text.

Relatrio de Produtos
Cdigo

Descrio

Embalagem

Pgina: (Page#)
Valor

Estoque

Page Header

Se desejarmos imprimir a data do sistema tambm, basta colocarmos outro QRSysData e


alterarmos a propriedade Data para qrsDate.

UNEB
Professor: Giuliano

Linguagem de Programao 7 Workshop Delphi

4. Para que o nosso relatrio imprima os dados a partir de uma tabela, necessrio colocar
um objeto Dataset (Table ou Query), que tambm podem estar num DataModule. No
nosso exemplo, colocaremos um Table (TbProduto) e o conectaremos tabela Produto
Em seguida, selecionamos o componente QuickReport e alteramos sua propriedade
Dataset para TbProduto.
5. Terminada a definio da parte esttica, partiremos agora para a impresso dos dados. O
componente responsvel pela exibio dos campos o QRDBText. Colocaremos cinco
objetos QRDBText na banda Detail, alinhados com os QRLabel do cabealho das colunas.
Para cada QRDBText, alteraremos as propriedades Dataset e DataField, assim como
fazemos num formulrio comum com objetos DataControls.

Relatrio de Produtos
Cdigo

Descrio

Embalagem

[DESCRICAO]

[EMBAL]

Pgina: (Page#)

Preo de Venda

Estoque

Page Header

[CODIGO]

[VALOR]

[ESTOQUE]

Detail

6. Para testar o relatrio em tempo de projeto, alteramos a propriedade Active do table


TbProduto para True e damos um clique com o boto direito em qualquer parte do objeto
QuickReport e selecionamos a opo Preview.

Preview do QuickReport

UNEB
Professor: Giuliano

Linguagem de Programao 7 Workshop Delphi

Relatrios Mestre/Detalhe
Os relatrios mestre/detalhe seguem o mesmo padro visto anteriormente. A nica
diferena que precisamos de uma banda especial para imprimir os registros da parte detalhe,
o QRSubDetail. Um relatrio mestre/detalhe deve possuir as seguintes bandas:
Page Header
Detail
QRSubDetail

-------- Ttulo do relatrio, data, n da pgina e cabealho das colunas


-------- Dados da tabela mestre
-------- Dados da tabela detalhe

1. Como se trata de um relatrio mestre/detalhe, devemos possuir primeiramente, dois


datasets com esse relacionamento. Eles podem ficar no prprio relatrio, ou de
preferncia, no Data Module. Para exemplificar, utilizaremos dois tables: TbPedido
(mestre) e TbItem (detalhe).
2. depois, devemos alterar a propriedade Dataset do QuickReport para o dataset mestre
(TbPedido) e o Dataset da banda QRSubDetail para o dataset detalhe (tbItem).
3. o cabealho dos itens ficar logo abaixo dos campos da tabela mestre, na prpria banda
Detail. Se quisermos que seja impresso apenas um pedido por pgina, precisamos alterar a
propriedade ForceNewPage deta banda detail para True
Pedido [NUMPEDIDO]

Pgina: (Page#)

Page Header

Cliente
Endereo
Vendedor

[CLIENTE]
[ENDERECO]
[VENDEDOR]

Cdigo

Descrio

Qtde

Preco Unit

Preo Total

[DESCRICAO]

[QUANT]

[PRECOUNIT]

[VALORTOTAL]

Total do Pedido:

[TOTALPEDIDO]

Data:

[DATA]

Detail

[CODIGO]
SubDetail

Summary

Totalizando Informaes
Para criar campos que faam algum tipo de clculo baseado nos dados impressos por
um relatrio usaremos o componente QRExpr. comum criar campos de totalizao no final
dos relatrios contendo o somatrio, nmero de registros, mdia ou qualquer outro clculo.
O componente QRExpr possui a propriedade Expression, que abre uma caixa de
dilogo permitindo construir um grande nmero de expresses.

UNEB
Professor: Giuliano

Linguagem de Programao 7 Workshop Delphi

Para exemplificar, criaremos um campo que conter o somatrio de uma coluna.


Primeiramente, necessrio colocar um objeto QRBand e definir seu BandType para
rbSummary, para que s ser impresso no final do relatrio.
Em seguida, colocamos um componente QRExpr na banda Summary e clicamos na
sua propriedade Expression. Na seo Function da janela Expression builder, selecionaremos
a funo SUM na lista e pressionaremos o boto ADD para adicionar expresso.
Em seguida, escolheremos o campo que ser somado. Na seo Data Field, selecionaremos o
objeto dataset que contm o campo a ser somado e damos um clique no campo da lista Field.
Clicamos no boto ADD para adicion-lo na expresso. Com a expresso terminada, clicamos
em Ok.
Ao final, termos que informar tambm o valor da propriedade Master, que ser o nome
do objeto QuickReport.

Relatrios com Quebras


Relatrio com quebra outra forma bastante comum de relatrio. Observe a seguinte
listagem de pases com quebra por continente, obtido a partir da tabela Country do alias
DbDemos do Delphi:
North America
Canada
Cuba
El Salvador
...
South America
Argentina
Bolivia
Brazil
...

1. esse relatrio necessita de um componente query contendo um Sql de agrupamento (com a


clusula Group By) como o exemplo a seguir:
SELECT continent, name
FROM country
GROUP BY continent, name

UNEB
Professor: Giuliano

Linguagem de Programao 7 Workshop Delphi

ORDER BY continent, name

2. em seguida, montaremos o esqueleto do relatrio com as seguintes bandas:


Page Header
QrGroup
Detail

----------

Ttulo do relatrio, data, n da pgina e cabealho das colunas


Cabealho do grupo. Repete-se quando o campo agrupado se altera.
Imprime os dados dos registros agrupados

3. como o Delphi sabe a hora de mudar o grupo ? Atravs da propriedade Expression da


banda QrGroup.
No nosso caso, o grupo mudar dependendo do valor de um campo da tabela. Assim,
abrimos a janela Expression Wizard (clicando nas reticncias da propriedade Expression),
clicamos em Database Field e escolhemos o campo Continent

4. Por ltimo, colocamos um QrDbText na banda QrGroup e o conectamos ao campo


Continent, que representa o agrupamento. Ele s impresso quando recebe um novo valor
(incio de cada grupo). E um QrDbText na banda Detail para imprimir o nome do pas.
Esquema final do relatrio:

Relatrio de Pases por Continente

Pgina: (Page#)

Continente: [CONTINENT]
Group Header

Pas: [NAME]
Detail

Definindo Mscaras
A forma com que os dados so impressos num relatrio muito importante. Para
campos numricos, interessante definir a propriedade Alignment dos objetos QRDBText
para taRightJustify. Outra preocupao diz respeito s mscaras. Se o campo for
alfanumrico, faremos da forma que j conhecemos: acessaremos a propriedade EditMask dos
objetos Field (clique duplo no objeto Table ou Query para abrir o Field Editor) e
especificamos a mscara. Se o campo for numrico, precisaremos mudar a propriedade Mask

UNEB
Professor: Giuliano

Linguagem de Programao 7 Workshop Delphi

dos componentes QRDBText ou QRExpr. Vejamos quais so as regras para gerar a


formatao:

Operador
#
0
.
,
C
;

Descrio
Se houver um digito na posio ele ser impresso. Caso contrrio, nada impresso.
Se no houver um dgito na posio, um zero ser exibido.
Separador de casas decimais
Separador de milhar
Caracteres entre aspas so exibidos da forma como so informados
Permite formatos diferentes para nmeros positivos, negativos e zero

Exemplo de mscara para valores monetrios: R$ ###,##0.00

Chamando um Relatrio a Partir do Programa


Ao escrevermos um manipulador de eventos para executar um relatrio, temos duas
opes: mostrar o relatrio na tela (preview) ou envi-lo direto para a impressora (print). Para
tanto, devemos seguir a seguinte sintaxe:
<nome do formulrio>.<nome do QuickReport>.Preview / Print

Exemplo:
FRelPedido.QuickRep1.Preview; // Mostra o relatrio FRelPedido na tela
FRelProduto.QuickRep1.Print; // Imprime o relatrio FRelProduto

Você também pode gostar