Criando relatórios com Crystal Reports e ASP.NET – Parte 4

Nos posts Criando relatórios com Crystal Reports e ASP.NETParte 1, Parte 2,Parte 3 nós desenvolvemos o coração do relatório.Nessa última parte vamor finalizar o relatório com o rodapé,e depois veremos como manipula-lo em tempo de execução e como visualiza-lo na página .aspx.

Criando o rodapé

O último passo no desenvolvimento do relatório é ádiconar o número da página na seção “Page Footer”:

  1. Clique com o direito na seção “Page Footer” e selecione “Insert Special Field Page N of M”.
  2. Arraste o campo para a seção “Page Footer”.
  3. Deixe o campo da largura da página.
  4. Clique com o direito no campo e selecione “Format Object”.
  5. Na aba “Common”,mude o alinhamento horizontal para “centered” e clique OK.

Se você ver o relatório agora,vai notar que o número da página reseta  para 1 cada vez que o “SalesOrderNumber” muda.

Visualizando o relatório na página ASP.NET

Agora que o relatório está pronto,podemos criar a página para visualiza-lo.Vamos criar uma página simples que permite ao usuário selecionar o cliente e ver qualquer fatura para o mesmo.

  1. Abra a página Default.aspx no VS.Adicione a seguinte declaração logo abaixo da tag “Page”,ou simplesmente arraste o controle Crystal Reports Viewer para a página:
<%@ Register assembly=”CrystalDecisions.Web, Version=10.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304″ namespace=”CrystalDecisions.Web” tagprefix=”CR” %>

Isso permite você usar o controle Crystal Reports Viewer que vem com o VS.

Adicione o seguinte código entre as tags “DIV”:

Select a customer:<asp:DropDownList ID="ddlCustomer" runat="server">
</asp:DropDownList>

<asp:Button ID="btnPreview" runat="server" onclick="btnPreview_Click"
  Text="Preview" />

<br />
<br />
<CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server"
  AutoDataBind="true" />

Isso adiciona um DropDownList que será preenchido com a lista de Customers (clientes) no Page_Load da página.O botão preview irá buscar todos os dados do cliente selecionado e dar uma bind no relatório.

  1. Adicione os seguintes namespaces no code behind:
using System.Data.SqlClient;
using System.Configuration;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;

Adicione o seguinte código no evento Page_Load:

if (!IsPostBack)
{

SqlConnection cn = new SqlConnection(
ConfigurationManager.ConnectionStrings[“AdventureWorks”].ConnectionString);
cn.Open();

SqlCommand cmd = new SqlCommand(“SELECT DISTINCT LastName + ‘, ‘ +
FirstName AS Name,
Person.Contact.ContactID ” +
“FROM Sales.SalesOrderHeader ” +
“INNER JOIN Person.Contact ” +
“ON Sales.SalesOrderHeader.ContactID =
Person.Contact.ContactID ” +
“ORDER BY LastName + ‘, ‘ + FirstName”, cn);
SqlDataReader dr = cmd.ExecuteReader();

ddlCustomer.DataSource = dr;
ddlCustomer.DataTextField = “Name”;
ddlCustomer.DataValueField = “ContactId”;
ddlCustomer.DataBind();

CrystalReportViewer1.Visible = false;
}
else
{
if (CrystalReportViewer1.Visible == true)
{
BindReport();
}
}

Esse código carrega o DropDownList com os customers do banco.Você precisa adicionar a ConnectionString do seu banco no Web.Config pra esse código funcionar.Na seção “AppSettings” você deve adicionar o seguinte:

<connectionStrings>

<add name="AdventureWorks" connectionString="Data Source=YOURSERVER;User
  ID=aspalliance;Password=aspalliance;Initial Catalog=AdventureWorks;"/>
</connectionStrings>

Esse código assume que você tenha um Login “aspalliance” com a senha “aspalliance” e as devidas permissões no banco.Seu SQL precisa estar configurado para o modo “Mixed Authentication” pros logins serem permitidos.

Adicione o seguinte código no evento de click do botão preview:

protected void btnPreview_Click(object sender, EventArgs e)
{
BindReport();
CrystalReportViewer1.Visible = true;
}

Esse código chama o método “BindReport()” e depois mostra o controle Report Viewer.

Agora adicione os seguintes métodos:

private void BindReport()
{
ReportDocument report = new ReportDocument();
report.Load(Server.MapPath(“Invoice.rpt”));

SetTableLocation(report.Database.Tables);

CrystalReportViewer1.ReportSource = report;

report.DataDefinition.RecordSelectionFormula =
“{SalesOrderHeader.ContactID} = ” + ddlCustomer.SelectedItem.Value;
}

private void SetTableLocation(Tables tables)
{
ConnectionInfo connectionInfo = new ConnectionInfo();

connectionInfo.ServerName = @”LTMTI30\SQL2008″;
connectionInfo.DatabaseName = “AdventureWorks”;
connectionInfo.UserID = “aspalliance”;
connectionInfo.Password = “aspalliance”;

foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables)
{
TableLogOnInfo tableLogOnInfo = table.LogOnInfo;
tableLogOnInfo.ConnectionInfo = connectionInfo;
table.ApplyLogOnInfo(tableLogOnInfo);
}
}

O primeiro método cria a instância da classe ReportDocument.Ela representa o relatório que você criou anteriormente e permite manipula-lo em tempon de execução.O método SetTableLocation seta a “table location” de cada tabela do relatório.De novo,isso assume que você criado o Login “aspalliance” no SQL e tenha dado acesso a ele.A fonte (source) do Crystal Reports Viewer é depois setada para o objeto do relatório.Você cria uma string simples como uma clausula where de comando SQL.Você tem que usar “{}” em volta de campos referenciados do relatório.

Você pode rodar o relatório agora.Se você selecionar “Abel,Catherine” no DropDownList e clicar no botão preview,você deve ver a seguinte página:

É isso!Elaboramos nosso relatório,nas Partes 1,2 e 3 e nesta última parte vimos como visualiza-lo na página .aspx.

Espero que essa série de posts tenha sido útil pra quem está começando com relatórios ,e que percebam que não é nenhum bicho de 7 cabeças.

Mais sobre o Crystal Reports com ASP.NET.

Até a próxima!

Anúncios

Criando relatórios com Crystal Reports e ASP.NET – Parte 3

Esta é a continuação da série sobre relatórios com Crystal Reports e ASP.NET,nasParte 1 e Parte 2 criamos o cabeçalho do relatório.Nesse post agora estaremos exibindo os dados principais.

Quando o relatório for mostrado,todos os registros de SalesOrderDetail (Detalhes do pedido),devem ser mostrados para o SalesOrderNumber (Numero da fatura) atual.Para isso você pode criar um grupo baseado no campo SalesOrderNumber,e depois adicionar uma quebra de página  depois da seção “Group Footer”.Quando você adiciona um grupo no Crystal Reports,você automaticamente tem uma seção “Group Header” e “Group Footer Section”.Você pode formatar essas seções dinamicamente pra quebra de página,resetar o número da página,e muitas outras coisas.Para o nosso relatório nós queremos quebrar a página,depois da sessão “Group Footer”,então a próxima fatura começa na próxima página e nós queremos resetar o número da página,então você pode imprimir as  faturas em grande quantidades  mas  envia-las individualmente:

  1. Clique com o direito em qualquer espaço em branco do relatório e selecione “Insert Group…”
  2. Selecione o campo SalesOrderHeader.SalesOrderNumber no DropDownList e clique em OK.

  1. Você vai notar que duas novas seções foram adicionadas ao relatório:”Group Header#1″ e “Group Footer #1”.Por padrão,o Crystal adiciona o  “Special Field” chamado “Group #1”.Esse irá mostrar o valor pra qualquer campo que você estaja agrupando.Para este relatório você não vai precisar do nome do grupo,porque este é o campo SalesOrderNumber e é imprimido no cabeçalho do relatório.Você pode remover este campo clicando nele e pressionando delete.
  2. Nós não precisamos da seção “Group Header #1”,então você pode esconde-la,clicando com o botão direito no seu titulo e selecionando “Suppress(No-Drill-Down)” no pop-up.
  3. O próximo passo é dizer ao Crystal para quebrar a página depois da seção “Group Footer” e resetar o número da página.Clique com o direito no titulo “Group Footer #1” e selecione “Section Expert” no menu popUp.
  4. Marque as checkboxs “NewPageAfter”,”Reset Page Number After” e clique em OK.
  5. O próximo passo é adicionar os itens para a fatura.A seção “Details” irá se repetir,para cada registro na tabela SalesOrderDetail.Expanda  a tabela Products no FieldExplorer.Arraste o campo ProductNumber para a seção “Details”.Note que quando fizer isso,o Crystal automaticamente adiciona um campo “Column Header” na seção “Page Header”.O “Column Header” é simplesmente  um “Text Object”,que você pode editar para um nome mais amigavel.Mude o nome para “Número do produto”.
  6. Arraste o campo Product.Name para a seção “Details”.Ajuste sua largura.
  7. Arraste o campo SalesOrderDetail.OrderQty para a seção “Details”.Mude a column header para “Qtd”.
  8. Arraste o campo SalesOrderDetail.UnitPrice para a seção “Details”.Mude a column header para “Preço”.
  9. Arraste o campo SalesOrderDetail.UnitPriceDiscount para a seção “Details”.Ajuste sua largura.Mude a column header para “Desc”.
  10. Arraste o campo SalesOrderDetail.LineTotal para a seção “Details”.Mude a column header para “Total Itens”.
  11. O próximo passo é adicionar um “Box”,assim os Columns Header e os detalhes,ficam contornados e destacados no relatório.Clique com o direito em um espaço em branco no relatório e selecione “Insert Box”.Arraste a caixa em volta dos Column Headers e abaixo da seção “Group Footer”

  1. De um preview no relatório.

O último passo é criar os totais na seçãoo “Group Footer”.A soma dos campos “LineTotal”  (Total de cada item) corresponde ao subTotal da fatura.Tem um campo na tabela SalesOrderHeader chamado “Subtotal”,mas por algum motivo ele não corresponde a soma dos detalhes.Para contornar isso nós iremos criar nosso próprio Subtotal no relatório.Nós iremos depois adicionar o Freight(Frete) e Tax(taxa) para calcular a fatura total.

  1. Clique com o direiro no campo Line Total na seção “Details”.Selecione “Insert Summary”.
  2. O dropdown “Field to Summarize” deve estar por padrão setado para SalesOrderDetail.LineTotal e o “Calculate this summary” deve estar em Sum.Mude o dropdown  “Summary Location” para “Group #1:SalesOrderHeader.SalesOrderNumber – A.Clique em OK.

  1. Isso irá automaticamente criar o “Summary field” na seção “Group Footer” abaixo do campo  “LineTotal”.Você pode precisar aumentar a altura da seção “Group Footer” pra que os dados apareçam corretamente.
  2. Clique com o direito no campo e selecione “Formar Object”.Clique na aba “Font” e mude o “Style” para regular.Clique na aba “Number” e marque o checkbox “Display Currency Symbol”.Clique em Ok.’
  3. Clique nos campos  “Summary Field”  e “Line Total” enquanto pressiona a tecla CTRL.Deixe-os do mesmo tamanho e os alinhe a direita.
  4. Clique em um espaço em branco no “Summary Field” e selecione “Insert Text Object”.Mude o texto para “SubTotal:”.Essa é a label para o “SummaryField”.
  5. Agora adicione o campo “Tax”.Expanda o “DataBase Fields” no Field Explorer.Expanda a tabela SalesOrderHeader.Arraste o campo Tax para a seção “Group Footer” logo abaixo do Summary Field “Line Total”.
  6. Clique em um espaço e em branco e selecione “Insert Text object”.Mude o texto para “Taxa:”.E coloque como label do campo “Tax”.
  1. Agora arraste o campo “Freight” abaixo do campo “Tax”.
  2. Clique em um espaço e em branco e selecione “Insert Text object”.Mude o texto para “Frete:”.E coloque como label do campo “Freight”.
  3. Clique nos campos  “Tax”  e “Freight” enquanto pressiona a tecla CTRL.Deixe-os do mesmo tamanho e os alinhe a direita.
  4. Agora você tem que criar uma formula para o total da fatura.Clique no Formula Fields no Field Explorer e selecione “New…”.De o nome de “InvoiceTotal” e clique em Use Editor.
  5. Entre com o seguinte código.
Sum ({SalesOrderDetail.LineTotal}, {SalesOrderHeader.SalesOrderNumber}) +
{SalesOrderHeader.TaxAmt} + {SalesOrderHeader.Freight}
  1. Clique no botão Save and Close.
  2. Arraste o Formula Field “InvoiceTotal” para a seção “Group Footer” logo abaixo do campo freight.Deixe esses campos do mesmo tamanho e alinhe-os a direita.
  3. Como esse é um campo de Total nós iremos adicionar uma linha acima do campo e duas abaixo.Pra fazer isso clique com o direito no campo “InvoiceTotal” e selecione “Formar Object”.
  4. Clique na aba “Border”,e selecione a linha superior (top) como Single,e a inferior (Bottom) como double.
  5. Agora insira um label a esquerda do campo “InvoiceTotal”.Clique com o direito em um espaço em branco campo e selecione “Insert text object”.Mude o texto para “Fatura Total:”.

O relatório deve estar parecido com a figura abaixo:

As Seções “Report Header” e Report Footer” não são usadas nesse relatório e podem ser escondidas.Clique no titulo delas e selecione “Supress(No-Drill-Down)”.

Nosso relatório está praticamente pronto,agora precisamos criar o rodapé,e depois mostra-lo na página ASP.NET,coisas que estarei mostrando nos próximos posts desta série.

Até lá!