Sei sulla pagina 1di 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


Page Header

Descrio

Embalagem

Valor

Estoque

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


Page Header

Pgina: (Page#) Valor Estoque

Descrio

Embalagem

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


Page Header

Pgina: (Page#) Estoque


[ESTOQUE]

Descrio
[DESCRICAO]

Embalagem
[EMBAL]

Preo de Venda
[VALOR]

[CODIGO]
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]
Page Header

Pgina: (Page#) Data: [DATA]

Cliente Endereo Vendedor Cdigo


Detail

[CLIENTE] [ENDERECO] [VENDEDOR] Descrio [DESCRICAO] Qtde [QUANT]

Preco Unit [PRECOUNIT] Total do Pedido:

Preo Total [VALORTOTAL] [TOTALPEDIDO]

[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 Continente: [CONTINENT]


Group Header

Pgina: (Page#)

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