Você está na página 1de 12

Tecnologias

Revistas

Cursos

Pocket videos

DevWare

Frum

Servios

Publicar

Comprar Fale conosco Meus Servios

Seja bem vindo, A LCENOR COSTA DE A LMEIDA !

post favorito

comentrios

Rave Reports Code Based - Relatrio com Quebra


Artigo demonstrando como construir um relatrio com quebra utilizando Rave Code Based

Go s t ei (2)

(0)

Ol pessoal, vamos nesse artigo aprimorar um pouco mais a construo de relatrios utilizando o Rave Code Based, desenvolveremos um relatrio de Vendas, quebrando por Clientes. Vamos ao trabalho!!!

Montando a Aplicao

Crie uma nova aplicao e insira os seguintes componentes:

Componente Database

AliasName

Alias apontando para DBDemos

Componente SQLQuery

Name

qryOrders

SQL

Select * from ORDERS Order by CustNo, OrderNo

Componente SQLQuery

Name

qryItems

SQL

Select I.*, P.Description, P.ListPrice, ((I.Qty * P.ListPrice) - I.Discount) as TotalItem From Items I Inner Join Parts P on P.PartNo = I.PartNo Where I.OrderNo = :OrderNo Order by ItemNo

Componente SQLQuery

Name

qryCustomer

SQL

Select * from Customer C Where C.CustNo = :CustNo

Insira um DataSource para cada SQLQuery, logo teremos trs DataSource (dtsOrders, dtsItems e dtsCustomer); associe o DataSource dtsOrders na propriedade DataSource das Querys qryItems e qryCustomer.

Importante: No esquea de verificar se foi gerado um parmetro (CustNo para Query Customer e OrderNo para a Query Items) propriedade Params e se esses parmetros esto configurados como DataType = ftFloat e ParamType = ptInput.

Agora, insira uma grid para demonstrar o contedo da query Orders e ligue essa grid ao DataSource correspondente a Query, insira tambm um DBNavigator associado a esse mesmo DataSource, faa esses mesmos passos para demonstrar o contedo da Query Items e Customer.

Por fim, insira dois botes, um chamado Result e o outro Report, sua tela ficar parecida com a imagem abaixo:

Tudo bem, tudo bem a sua deve ter ficado mais bonita, ahahaha, mas como o intuito desse artigo no montar uma tela bonita e sim um relatrio, no vamos nos prender a esse pequeno detalhe (ufa...).

Insira o cdigo abaixo no clique do boto Result:

qryOrders.Close; qryOrders.Open;

E no evento After Open da Query qryOrders insira o seguinte cdigo:

qryCustomer.Close; qryCustomer.Open;

qryCustomer.Close; qryCustomer.Open;

Rode a aplicao, clique sobre o boto e verifique se o mestre-detalhe est funcionando.

Montando o Relatrio

Bom, agora vamos para a parte que realmente nos interessa nesse artigo, o relatrio. Insira um componente RVSystem e configure as seguintes propriedades:

SystemPrinter

Units unCM

MarginLeft 1

MarginRight 1

MarginTop 1

MarginBottom 1

SystemPreview

FormState wsMaximized

No Evento OnBeforePrint do RVSystem, vamos configurar a pgina e criar os tabs que sero a estrutura do nosso relatrio. Com o seguinte cdigo:

with Sender as TBaseReport do begin SetPaperSize(DM PAPER_A4, 0, 0);

//Customer / Employee ClearTabs; SetTab(1.2, pjLeft, 3, 0, BOXLINEHORIZ, 0); //CustNo SetTab(NA , pjLeft, (PageWidth 5.2), 0, BOXLINEHORIZ, 0); //Company SaveTabs(1);

//Orders ClearTabs; SetTab(1.5, pjLeft, 2.0, 0, BOXLINENONE, 0); //OrderNo SetTab(NA , pjLeft, 2.5, 0, BOXLINENONE, 0); //SaleDate (data venda) SetTab(NA , pjLeft, 2.5, 0, BOXLINENONE, 0); //ShipDate (data entrega) SetTab(NA , pjLeft, 2.0, 0, BOXLINENONE, 0); //ShipVia (Forma de Entrega) SetTab(NA , pjLeft, 3.0, 0, BOXLINENONE, 0); //PaymentM ethod (Forma de Pagamento) SetTab(NA , pjLeft, 3.0, 0, BOXLINENONE, 0); //ItemsTotal (Total Venda) SaveTabs(2);

//Items ClearTabs; SetTab(2.0, pjLeft, 1.5, 0, BOXLINENONE, 0); //ItemNo SetTab(NA , pjLeft, 2.0, 0, BOXLINENONE, 0); //PartNo (cdigo do produto) SetTab(NA , pjLeft, 5.0, 0, BOXLINENONE, 0); //description (descrio) SetTab(NA , pjLeft, 2.0, 0, BOXLINENONE, 0); //ListPrice (Valor Unitrio) SetTab(NA , pjLeft, 1.5, 0, BOXLINENONE, 0); //qty (quantidade) SetTab(NA , pjLeft, 2.0, 0, BOXLINENONE, 0); //discount (Desconto) SetTab(NA , pjLeft, 2.0, 0, BOXLINENONE, 0); //TotalItem (total) SaveTabs(3); end;

Verifique que utilizamos o SetPaperSize para configurar o tamanho que ser a pgina do relatrio e o SetTab para montar a estrutura do relatrio.

Importante: No esquea de executar um ClearTabs sempre antes de iniciar a montagem de uma nova estrutura.

No evento OnPrintHeader montaremos o cabealho do relatrio, insira o cdigo abaixo:

with Sender as TBaseReport do begin SetFont('Arial',8); PrintRight('Pgina ' + M acro(midCurrentPage) + ' de ' + M acro(midTotalPages), PageWidth - M arginRight); NewLine; SetFont('Arial',12); Bold := True; PrintCenter('Relatrio de Vendas', PageWidth / 2); Bold := False;

NewLine;

M oveTo(1.0, 2.0); LineTo(20.0, 2.0); end;

Importante: Para entender melhor a funo M acro leia o artigo Rave Reports Code Based.

E para finalizar a parte de estrutura da pgina vamos montar o rodap com o cdigo abaixo:

with Sender as TBaseReport do begin M oveTo(1.0, 28.5); LineTo(20.0, 28.5); YPos := 29.0; SetFont('Arial',8); PrintCenter('Data de Impresso: ' + M acro(midCurrDateShort) + ' ' + M acro(midCurrTimeShort), PageWidth/2); end;

Execute a aplicao e verifique se o cabealho e rodap ficaro corretos.

Agora vamos montar o corpo do relatrio, o objetivo desse relatrio como j dito anteriormente demonstrar as vendas separadas por cliente, ento nossa preocupao nesse relatrio a mudana do cdigo do cliente e a mudana no cdigo da venda, pois como fizemos no inicio desse artigo, j estamos trazendo as vendas ordenadas pelo cdigo do cliente e pelo cdigo da venda, logo toda

vez que mudar de cliente temos que iniciar uma nova pgina, e enquanto o cdigo da venda for igual teremos que carregar os itens dessa venda.

No evento OnPrint insira o seguinte cdigo:

var intOrderNo, intCustNo : Integer; begin intOrderNo := 0; intCustNo := 0;

with Sender as TBaseReport do begin qryOrders.DisableControls; qryOrders.First;

while not qryOrders.Eof do begin if (intCustNo <> qryOrdersCustNo.AsInteger) then begin if intCustNo > 0 then NewPage;

with qryCustomer do begin Close; Params.ParamByName('CustNo').AsInteger := qryOrdersCustNo.AsInteger; Prepare; Open; end;

SetFont('Arial', 10); NewLine; Bold := True; PrintLeft('Cliente',M arginLeft); Bold := False;

NewLine; RestoreTabs(1); PrintTab('Cdigo .: ' + qryCustomerCustNo.AsString); PrintTab('Nome .: ' + qryCustomerCompany.AsString); end;

if intOrderNo <> qryOrdersOrderNo.AsInteger then begin if LinesLeft < 3 then NewPage;

SetFont('Arial',10); NewLine; Bold := True; RestoreTabs(2); PrintTab('Venda'); //OrderNo PrintTab('Data Venda');//SaleDate (data venda) PrintTab('Data Entrega');// ShipDate (data entrega) PrintTab('Entrega');/// ShipVia (Forma de Entrega) PrintTab('Pagamento');// PaymentM ethod (Forma de Pagamento) PrintTab('Total');// ItemsTotal (Total Venda) Bold := False;

NewLine; RestoreTabs(2); PrintTab(qryOrdersOrderNo.AsString); //OrderNo PrintTab(qryOrdersSaleDate.AsString);//SaleDate (data venda) PrintTab(qryOrdersShipDate.AsString);// ShipDate (data entrega) PrintTab(qryOrdersShipVIA.AsString);/// ShipVia (Forma de Entrega) PrintTab(qryOrdersPaymentM ethod.AsString);// PaymentM ethod (Forma de Pagamento) PrintTab(FormatFloat('R$ 0.00', qryOrdersItemsTotal.AsFloat));// ItemsTotal (Total Venda) end;

if LinesLeft < 3 then NewPage;

NewLine; RestoreTabs(3); SetFont('Arial',8); Bold := True; PrintTab('Item');//ItemNo PrintTab('Cdigo');//PartNo (cdigo do produto) PrintTab('Nome');//description (descrio) PrintTab('Vl. Unit.');//ListPrice (Valor Unitrio) PrintTab('Qtde.');//qty (quantidade) PrintTab('Desconto');//discount (Desconto) PrintTab('Total');//TotalItem (total) Bold := False;

with qryItems do begin Close; Params.ParamByName('OrderNo').AsInteger := qryOrdersOrderNo.AsInteger; Prepare; Open; end;

while not qryItems.Eof do begin if LinesLeft < 3 then NewPage; SetFont('Arial',8); NewLine; RestoreTabs(3); PrintTab(qryItemsItemNo.AsString);//ItemNo PrintTab(qryItemsPartNo.AsString);//PartNo (cdigo do produto) PrintTab(qryItemsDescription.AsString);//description (descrio) PrintTab(FormatFloat('R$ 0.00', qryItemsListPrice.AsFloat));//ListPrice (Valor Unitrio) PrintTab(qryItemsQty.AsString);//qty (quantidade) PrintTab(FormatFloat('R$ 0.00', qryItemsDiscount.AsFloat));//discount (Desconto) PrintTab(FormatFloat('R$ 0.00', qryItemsTotalItem.AsFloat));//TotalItem (total) qryItems.Next;

end;

intOrderNo := qryOrdersOrderNo.AsInteger; intCustNo := qryOrdersCustNo.AsInteger;

NewLine; qryOrders.Next; end;

qryOrders.EnableControls; end;

Entendendo o cdigo:

Declaramos duas variveis ( intOrderNo, intCustNo ) para controlar o cdigo da Venda e o cdigo do Cliente, dentro do loop da query Orders verificamos se o contedo da varivel intCustNo igual ao registro atual da Query, se for diferente significa que ocorreu uma mudana de Cliente, e de acordo com o escopo do nosso relatrio, toda vez que isso ocorrer temos que iniciar uma nova pgina (NewPage) e demonstrar quem esse novo cliente, ento restauramos a tab correspondente para escrevermos no relatrio o cdigo e o nome desse cliente. Aps isso verificamos se o contedo da varivel intOrderNo diferente do registro atual da query Orders se for diferente precisamos montar o titulo das colunas e inserir as informaes dessa nova venda. Se o cliente for o mesmo e a venda for a mesma o relatrio vai montar os itens dessa venda.

Execute a aplicao e clique sobre o boto Report para verificar o resultado do relatrio, dever ficar parecido com a imagem abaixo:

Concluso

isso pessoal, espero que tenha dado tudo certo e que esse artigo tenha te ajudado!!! At o prximo.

Fabio Miao
Delphi 7 e 2005 Product Certified e Delphi 2005 Instructor Certified. Atua como Consultor na rea de Desenvolvimento de Sistemas. Pode ser contatado em : fabiomiaco@yahoo.com.br

Go s t ei (2)

(0)

6 COMENTRIOS

Alan Adolfo Olha eu aq de novo Fabio Gostei deste exemplo gostaria q vc desse uma apimentada um pouco mais colocando Graficos de ocorrencia, graficos de estatistica para melhora cada vez mais o programa [h +1 ano] - Responder

Robson como fao para usar a funcao formatfloat no rave 5.1 [h +1 ano] - Responder

Miaco Robson, a funo formatfloat uma funo da biblioteca Sysutils do Delphi, no est relacionada com o rave. [h +1 ano] - Responder

Antonio gostaria de sabe como conseguir uma verso do rave 5.1 Se possivel me enviar pelo email: antonio_s@directnet.com.br [h +1 ano] - Responder

Antonio gostaria de sabe como conseguir uma verso do rave 5.1 Se possivel me enviar pelo email: antonio_s@directnet.com.br [h +1 ano] - Responder

Jorge Amir Li o seu post, e digo-lhe com sinceridade, abandonei a impresso grfica, pois tenho mais controle sobre a operao. Mas estou com uma dvida: como imprimir um texto na vertical? Se puder agudar-me.. valeu!! [h +1 ano] - Responder

+Delphi
Publicidade

Servios
Inclua um comentrio Adicionar aos Favoritos Marcar como lido/assistido Incluir anotao pessoal Verso para impresso

Mais posts
Video aula

Tipos de parmetros (Valor e Referncia) - Curso Delphi para Iniciantes - 43

Video aula

Escopo Local, Result, Self e Constantes Tipificadas - Curso Delphi para Iniciantes - 42
Video aula

Declarao Forward, Initializaztion e Finalization - Curso Delphi para Iniciantes - 41


Video aula

Sees Interface e Implementation de uma Unit - Curso Delphi para Iniciantes - 40


Revista

Revista ClubeDelphi 153


Video aula

Roles e Autorizao (aplicao cliente) - Curso de Multicamadas com Delphi e DataSnap - 34


Video aula

Roles e Autorizao (aplicao servidora) - Curso de Multicamadas com Delphi e DataSnap - 33


Video aula

Gravando e recuperando dados em Session - Curso de Multicamadas com Delphi e DataSnap - 32


Video aula

Introduo Sessions - Curso de Multicamadas com Delphi e DataSnap - 31


Artigo

Uso de Voz em Delphi


Listar mais contedo

DevMedia | Anuncie | Fale conosco Hospedagem web por Porta 80 Web Hosting
2013 - Todos os Dire itos R e se rvados a web-03

Você também pode gostar