Escolar Documentos
Profissional Documentos
Cultura Documentos
Revistas
Cursos
Pocket videos
DevWare
Frum
Servios
Publicar
post favorito
comentrios
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
Componente Database
AliasName
Componente SQLQuery
Name
qryOrders
SQL
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
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...).
qryOrders.Close; qryOrders.Open;
qryCustomer.Close; qryCustomer.Open;
qryCustomer.Close; qryCustomer.Open;
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:
//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.
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;
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;
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.
while not qryOrders.Eof do begin if (intCustNo <> qryOrdersCustNo.AsInteger) then begin if intCustNo > 0 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;
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;
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;
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
Video aula
Escopo Local, Result, Self e Constantes Tipificadas - Curso Delphi para Iniciantes - 42
Video aula
DevMedia | Anuncie | Fale conosco Hospedagem web por Porta 80 Web Hosting
2013 - Todos os Dire itos R e se rvados a web-03