Vous êtes sur la page 1sur 37

http://ozsenegal.wordpress.

com/tag/crystal-reports/

Crystal Reports

Publicado emjulho 11, 2010MarcadoASP.NETc#CRCrystal ReportsFormula FieldRelatriosComentriosNenhum Comentrio

Variveis com formulas fields no Crystal Reports Introduo


Formula fields do Crystal reports permitem a voc injetar blocos de cdigo em um relatrio quando um simples comando SELECT,no suficiente.Voc pode declarar variveis,criar blocos if/then,criar arrays,executar loops,ou chamar funes j prontas do Crystal Reports.Esse artigo vai criar um relatrio num web site ASP.NET e mostrar como criar um formula field,manipular datas na formula assim como criar uma variavel e lhe atribuir um valor, e tambem usar a lgica if/then pra criar campos de resumo para o trimestre no relatrio. Antes de comear voc precisa ter o VS2008 instalado com o crystal reports.Os exemplos foram escritos no VS2008 mas funcionam tambm no VS2005.Eu criei um banco de dados simples com uma tabela,pra usar como exemplo no relatrio:

Passo 1:Criar o banco


1. Abra o Sql Management Studio 2005/2008 e conecte se ao seu servidor. 2. Crie um novo banco e lhe de o nome de CrystalFormulas 3. Esse banco s vai conter uma tabela chamada SalesHeader.Crie a tabela conforme a seguir: Nome Do Campo Tipo Permite Nulo SalesHeaderID SalesDate Total Int (Identity) Datetime Money No No No

Eu preenchi esta tabela com registros de Janeiro a Junho.Segue o script para a criao deste banco: create database CrystalFormulas go use CrystalFormulas go create table [dbo].SalesHeader ( SalesHeaderID int identity(10,1) not null, SalesDate datetime not null, Total money not null, constraint PK_SALES_HD primary key clustered(SalesHeaderID) )

go INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES (CAST(0x00009D2C00000000 AS DateTime), 632.7600) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES (CAST(0x00009D1000000000 AS DateTime), 45.6500) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES (CAST(0x00009CF100000000 AS DateTime), 65.8700) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES (CAST(0x00009D2C00000000 AS DateTime), 231.5600) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES (CAST(0x00009D1000000000 AS DateTime), 76.8900) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009CF100000000 AS DateTime), 235.7400) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D2C00000000 AS DateTime), 874.3600) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES (CAST(0x00009D1000000000 AS DateTime), 98.7600) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009CF100000000 AS DateTime), 234.8400) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D2C00000000 AS DateTime), 121.7600) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D1000000000 AS DateTime), 738.8900) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009CF100000000 AS DateTime), 376.1000) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D2C00000000 AS DateTime), 473.9800) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D1000000000 AS DateTime), 46.9800) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009CF100000000 AS DateTime), 87.8700) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D2C00000000 AS DateTime), 234.8700) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D1000000000 AS DateTime), 334.5600) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009CF100000000 AS DateTime), 908.7000) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D2C00000000 AS DateTime), 23.6700) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D1000000000 AS DateTime), 45.8900) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009CF100000000 AS DateTime), 23.5600) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D2C00000000 AS DateTime), 93.8700) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D1000000000 AS DateTime), 363.9800) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009CF100000000 AS DateTime), 63.2300) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES

( CAST(0x00009D2C00000000 AS DateTime), 574.0000) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D1000000000 AS DateTime), 34.7600) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009CF100000000 AS DateTime), 897.4600) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D2C00000000 AS DateTime), 232.4300) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D1000000000 AS DateTime), 121.5600) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009CF100000000 AS DateTime), 88.5400) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D2C00000000 AS DateTime), 34.5400) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D1000000000 AS DateTime), 87.5400) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009CF100000000 AS DateTime), 22.4200) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D2C00000000 AS DateTime), 234.6600) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D1000000000 AS DateTime), 44.7600) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009CF100000000 AS DateTime), 99.5600) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D2C00000000 AS DateTime), 235.6500) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D1000000000 AS DateTime), 34.5400) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009CF100000000 AS DateTime), 232.6300) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D2C00000000 AS DateTime), 78.6700) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D1000000000 AS DateTime), 46.8700) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009CF100000000 AS DateTime), 34.8800) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D8800000000 AS DateTime), 454.6500) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D6900000000 AS DateTime), 452.6500) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D4B00000000 AS DateTime), 651.8700) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D8800000000 AS DateTime), 23.5600) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D6900000000 AS DateTime), 767.8900) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D4B00000000 AS DateTime), 25.7400) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D8800000000 AS DateTime), 84.3600) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES

( CAST(0x00009D6900000000 AS DateTime), 985.7600) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D4B00000000 AS DateTime), 24.8400) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D8800000000 AS DateTime), 21.7600) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D6900000000 AS DateTime), 78.8900) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D4B00000000 AS DateTime), 36.1000) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D8800000000 AS DateTime), 73.9800) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D6900000000 AS DateTime), 465.9800) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D4B00000000 AS DateTime), 873.8700) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D8800000000 AS DateTime), 23.8700) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES (CAST(0x00009D6900000000 AS DateTime), 34.5600) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D4B00000000 AS DateTime), 808.7000) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D8800000000 AS DateTime), 234.6700) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D6900000000 AS DateTime), 453.8900) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES (CAST(0x00009D4B00000000 AS DateTime), 232.5600) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D8800000000 AS DateTime), 937.8700) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D6900000000 AS DateTime), 36.9800) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D4B00000000 AS DateTime), 633.2300) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D8800000000 AS DateTime), 57.0000) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D6900000000 AS DateTime), 345.7600) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D4B00000000 AS DateTime), 89.4600) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D8800000000 AS DateTime), 22.4300) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D6900000000 AS DateTime), 21.5600) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D4B00000000 AS DateTime), 885.5400) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D8800000000 AS DateTime), 343.5400) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D6900000000 AS DateTime), 879.5400) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES

( CAST(0x00009D4B00000000 AS DateTime), 222.4200) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D8800000000 AS DateTime), 24.6600) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D6900000000 AS DateTime), 404.7600) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D4B00000000 AS DateTime), 996.5600) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D8800000000 AS DateTime), 23.6500) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D6900000000 AS DateTime), 344.5400) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D4B00000000 AS DateTime), 23.6300) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D8800000000 AS DateTime), 783.6700) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D6900000000 AS DateTime), 462.8700) INSERT [SalesHeader] ( [SalesDate], [Total]) VALUES ( CAST(0x00009D4B00000000 AS DateTime), 348.8800) Voc pode rodar esse script no SQL Management Studio pra criar a tabela e inserir os registros. Voc pode usar Integrated Security quando for conectar ao banco ou criar um SQL Login.De qualquer forma voc precisa se lembrar qual mtodo voc escolheu quando estiver pronto pra se conectar ao banco,como definido nos passos abaixo.

Passo 2:Criar o web site,Add o relatrio, e conectar ao banco


1. Rode o VS2008 e escolha File>New WebSite 2. Selecione o template de ASP.NET Web Site.Escolha o local que deseja salvar o projeto.Escolha a linguagem C# e clique em OK. 3. Clique com o direito no nome do projeto no Solution Explorer e escolha Add New Item 4. Selecione o template Crystal Reports e mude o nome para QuartelySales.rpt.Clique no boto adicionar. 5. Ir aparecer uma caixa de dialogo do CR.Selecione As Blank Report e clique no boto OK.Isso ir add o arquivo do CR ao seu projeto e vai abrir o CR Design. 6. Agora voc precisa se conectar ao banco.Clique com o direito em Database Fields no Field Explorer e selecione Database Expert. 7. A caixa de dialogo Database Expert ir aparecer.Clique no sinal de expanso de Create New Connection.Clique no sinal de expanso de OLE DB(ADO).A caixa de dialogo do OLE DB(ADO) deve aparecer. 8. Selecione SQL Native Client na lista de provedores e clique em NEXT. 9. Coloque o nome do seu servidor.Voc tem ento a opo de escolher usar SQL LOGIN ou Integrated Security.Para esse exemplo ns vamos usar Integrated Security,clicando no checkbox Integrated Security. 10. Coloque o nome do banco que foi criado no Passo 1,CrystalFormulas.Clique no boto finish.

11. Voc deve ver o banco listado abaixo do n OLE DB(ADO).Clique no sinal de expanso do banco para ver o schemas.Clique no sinal de expanso do dbo para ver as tabelas. 12. Clique na tabela SalesHeader e depois clique no boto > pra mover esta tabela para a lista de tabelas selecionadas para esse relatrio.

Clique no boto OK.

Passo 3:Adicionando fields e formulas para o relatorio


Agora que voc est conectado ao banco voc pode adicionar os campos para o seu relatrio.Qualquer campo que voc queira mostrar em linha no relatrio,deve ser posto na Details Section. 1. No field explorer clique no sinal de expanso de DatabaseFields.Clique no sinal de expanso de SalesHeader para ver os campos desta tabela. 2. Arraste os campos SalesDate e Total para a Details Section no relatrio.O CR ir automaticamente add o cabealho da coluna na seo Page Header quando voc arrastar os campos na Details Section.

3. Agora iremos criar um formula field pra mostrar o trimeste de SalesDate.Clique com o direito no n Formula fields no Field Explorer e escolha New.Coloque quarter para o nome do formula field e clique no boto Use Editor.

1. O CR tem inumeras funes j prontas que voc pode usar nas suas prprias formulas.As funes esto listadas na seo de Functions do formula editor.Clique no sinal de expanso de Functions e depois clique no n de Date and time.Isso ir mostrar a lista de funes disponiveis para manipular datas.A que estamos procurando se chama DatePart.Se voc descer a barra de rolagem do Date and Time voc deve encontrar essa funo.Observe que as funes no esto em ordem alfabtica ento voc deve ir at o final da lista. 2. A funo DatePart tem 3 diferentes assinaturas.Clique-duplo na primeira assinatura e essa ir aparecer no corpo da frmula.

1. O primeiro parmetro para a funo DataPart o Intervalo.O intervalo pode ser year(yyyy),quarter(q),month(m),day(d),hour(h),minute(n),second( s),day of week (w) e week (ww).Coloque (q) ento o trimeste recuperado das datas. 2. O segundo parmetro a expresso de data que deve ser analisada.Esse o campo SalesData na tabela SalesHeader.O texto da formula deve se parecer com o seguinte: DatePart (q, {SalesHeader.SalesDate}) 1. Clique no boto Save and Close.A formula Quarter,ir agora aparecer no n de Formula fields no Field Explorer. 2. Arraste o campo para a Details Section.Clique no boto Main Report Preview pra mostrar o relatrio .Voc deve ver ou 1 ou 2 para o trimestre.

Passo 4:Criar formulas com variveis


O prximo passo ser adicionar duas formulas para o relatrio.Esse relatrio deve mostrar a soma para o 1 trimestre e 2 trimestre. 1. Clique para voltar em Main report. 2. Clique com o direito em Formula Fields e escolha New. 3. Nomeie para Quarter1 e clique no boto Use editor Essa frmula vai criar uma varivel para armazenar o total de qualquer venda que ocorreu no 1 trimestre.Variaveis tem 3 opes de escopo:Local,Global,ou Shared.Local significa que a varivel usada na funo especifica e seu valor perdido quando a formula acaba.Global significa que a variavel mantm o valor mesmo depois do final da funo e poder ser usada em outras formulas no relatorio.Shared significa que voc pode usar essa varivel em outras frmulas ou mesmo em subrelatrios.Por padro se voc omitir o escopo a varivel ser Global.Entre com o seguinte cdigo no corpo da formula: Global NumberVar quarter1; if DatePart(q, {SalesHeader.SalesDate}) = 1 then quarter1 := quarter1 + ToNumber({SalesHeader.Total})

else quarter1 := quarter1 Isso cria uma variavel global chamada quarter1.O cdigo depois ento checa se a data est no primeiro trimestre.Se estiver ento adicionada para a variavel quarter1. 1. Clique no boto Save and Close 2. Clique no boto Main Report Preview pra mostrar o relatrio

1. Clique para voltar em Main report. 2. Crie um segundo formula field chamado Quarter2 e entre com o seguinte cdigo: Global NumberVar quarter2; if DatePart(q, {SalesHeader.SalesDate}) = 2 then quarter2 := quarter2 + ToNumber({SalesHeader.Total}) else quarter2 := quarter2 Salve a formula e arraste para a Details Section proximo do formula Quarter1 e clique no boto preview:

Note que o cdigo no est mostrando o total.Isso porque a variavel foi declara num escopo local e no global. 1. Clique para voltar para o design. 2. Clique com o direito no campo Quarter2 na Details Section e selecion Edit .Retire a palavra local antes da declarao da variavel.Por padro esta agora ser global.Clique em Save and close.De um preview no relatrio novamente.Desta vez voc ver o total para o 2 trimestre. 3. Clique para voltar para o design.Arraste os fields Quarter1 e Quarter2 para a seo Report footer do relatrio nas suas repectivas colunas. 4. Delete os fields Quarter1 e Quarter2 da Details Section. 5. Clique com o direito na Details Section e escolha Suppress (NoDrill-down) 6. Agora se voc rever o relatrio voc ver somente os totais.

Concluso

Formula Fields no crystal reports permitem voc manipular seus dados de vrias maneiras quando um simples SELECT no suficiente.A sintaxe bem simples de usar se voc j conhece C# ou VB.CR tambm tem inumeras funes j prontas que voc pode usar nas frmulas.Voc tambm pode usar loopings,como FOR e WHILE.Voc tambm pode achar o prximo valor ou o valor anterior de um field.O poder das formulas e a linguagem de script tremendo e permite a voc cobrir qualquer requerimento dos usuarios mais exigentes.

Publicado emmaro 22, 2010MarcadoASP.NETCrystal ReportsCrystal Reports ViewerReportDocumentComentrios2 Comentrios

Criando relatrios com Crystal Reports e ASP.NET Parte 4


Nos posts Criando relatrios com Crystal Reports e ASP.NET Parte 1, Parte 2,Parte 3ns desenvolvemos o corao do relatrio.Nessa ltima parte vamor finalizar o relatrio com o rodap,e depois veremos como manipula-lo em tempo de execuo e como visualiza-lo na pgina .aspx.

Criando o rodap
O ltimo passo no desenvolvimento do relatrio diconar o nmero da pgina na seo Page Footer: 1. Clique com o direito na seo Page Footer e selecione Insert Special Field Page N of M. 2. Arraste o campo para a seo Page Footer. 3. Deixe o campo da largura da pgina. 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 relatrio agora,vai notar que o nmero da pgina reseta para 1 cada vez que o SalesOrderNumber muda.

Visualizando o relatrio na pgina ASP.NET


Agora que o relatrio est pronto,podemos criar a pgina para visualizalo.Vamos criar uma pgina simples que permite ao usurio selecionar o cliente e ver qualquer fatura para o mesmo.

1. Abra a pgina Default.aspx no VS.Adicione a seguinte declarao logo abaixo da tag Page,ou simplesmente arraste o controle Crystal Reports Viewer para a pgina: <%@ 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 cdigo 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 pgina.O boto preview ir buscar todos os dados do cliente selecionado e dar uma bind no relatrio. 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 cdigo no evento Page_Load: if (!IsPostBack) { SqlConnection cn = new SqlConnection( ConfigurationManager.ConnectionStrings["AdventureWorks"].Connection String); 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 cdigo carrega o DropDownList com os customers do banco.Voc precisa adicionar a ConnectionString do seu banco no Web.Config pra esse cdigo funcionar.Na seo AppSettings voc deve adicionar o seguinte: <connectionStrings>
<add name="AdventureWorks" connectionString="Data Source=YOURSERVER;User ID=aspalliance;Password=aspalliance;Initial Catalog=AdventureWorks;"/> </connectionStrings>

Esse cdigo assume que voc tenha um Login aspalliance com a senha aspalliance e as devidas permisses no banco.Seu SQL precisa estar configurado para o modo Mixed Authentication pros logins serem permitidos. Adicione o seguinte cdigo no evento de click do boto preview:

protected void btnPreview_Click(object sender, EventArgs e) { BindReport(); CrystalReportViewer1.Visible = true; } Esse cdigo chama o mtodo BindReport() e depois mostra o controle Report Viewer. Agora adicione os seguintes mtodos: 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 mtodo cria a instncia da classe ReportDocument.Ela representa o relatrio que voc criou anteriormente e permite manipulalo em tempon de execuo.O mtodo SetTableLocation seta a table location de cada tabela do relatrio.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 relatrio.Voc cria uma string simples como uma clausula where de comando SQL.Voc tem que usar {} em volta de campos referenciados do relatrio.

Voc pode rodar o relatrio agora.Se voc selecionar Abel,Catherine no DropDownList e clicar no boto preview,voc deve ver a seguinte pgina:

isso!Elaboramos nosso relatrio,nas Partes 1,2 e 3 e nesta ltima parte vimos como visualiza-lo na pgina .aspx. Espero que essa srie de posts tenha sido til pra quem est comeando com relatrios ,e que percebam que no nenhum bicho de 7 cabeas. Mais sobre o Crystal Reports com ASP.NET. At a prxima!
Publicado emmaro 22, 2010MarcadoASP.NETCrystal ReportsRelatrioComentriosNenhum Comentrio

Criando relatrios com Crystal Reports e ASP.NET Parte 3


Esta a continuao da srie sobre relatrios com Crystal Reports e ASP.NET,nasParte 1 eParte 2 criamos o cabealho do relatrio.Nesse post agora estaremos exibindo os dados principais. Quando o relatrio 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 pgina

depois da seo Group Footer.Quando voc adiciona um grupo no Crystal Reports,voc automaticamente tem uma seo Group Header e Group Footer Section.Voc pode formatar essas sees dinamicamente pra quebra de pgina,resetar o nmero da pgina,e muitas outras coisas.Para o nosso relatrio ns queremos quebrar a pgina,depois da sesso Group Footer,ento a prxima fatura comea na prxima pgina e ns queremos resetar o nmero da pgina,ento voc pode imprimir as faturas em grande quantidades mas envia-las individualmente: 1. Clique com o direito em qualquer espao em branco do relatrio e selecione Insert Group 2. Selecione o campo SalesOrderHeader.SalesOrderNumber no DropDownList e clique em OK.

1. Voc vai notar que duas novas sees foram adicionadas ao relatrio:Group Header#1 e Group Footer #1.Por padro,o Crystal adiciona o Special Field chamado Group #1.Esse ir mostrar o valor pra qualquer campo que voc estaja agrupando.Para este relatrio voc no vai precisar do nome do grupo,porque este o campo SalesOrderNumber e imprimido no cabealho do relatrio.Voc pode remover este campo clicando nele e pressionando delete. 2. Ns no precisamos da seo Group Header #1,ento voc pode esconde-la,clicando com o boto direito no seu titulo e selecionando Suppress(No-Drill-Down) no pop-up.

3. O prximo passo dizer ao Crystal para quebrar a pgina depois da seo Group Footer e resetar o nmero da pgina.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 prximo passo adicionar os itens para a fatura.A seo Details ir se repetir,para cada registro na tabela SalesOrderDetail.Expanda a tabela Products no FieldExplorer.Arraste o campo ProductNumber para a seo Details.Note que quando fizer isso,o Crystal automaticamente adiciona um campo Column Header na seo Page Header.O Column Header simplesmente um Text Object,que voc pode editar para um nome mais amigavel.Mude o nome para Nmero do produto. 6. Arraste o campo Product.Name para a seo Details.Ajuste sua largura. 7. Arraste o campo SalesOrderDetail.OrderQty para a seo Details.Mude a column header para Qtd. 8. Arraste o campo SalesOrderDetail.UnitPrice para a seo Details.Mude a column header para Preo. 9. Arraste o campo SalesOrderDetail.UnitPriceDiscount para a seo Details.Ajuste sua largura.Mude a column header para Desc. 10. Arraste o campo SalesOrderDetail.LineTotal para a seo Details.Mude a column header para Total Itens. 11. O prximo passo adicionar um Box,assim os Columns Header e os detalhes,ficam contornados e destacados no relatrio.Clique com o direito em um espao em branco no relatrio e selecione Insert Box.Arraste a caixa em volta dos Column Headers e abaixo da seo Group Footer

1. De um preview no relatrio. O ltimo passo criar os totais na seoo 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 no corresponde a soma dos detalhes.Para contornar isso ns iremos criar nosso prprio Subtotal no relatrio.Ns iremos depois adicionar o Freight(Frete) e Tax(taxa) para calcular a fatura total. 1. Clique com o direiro no campo Line Total na seo Details.Selecione Insert Summary. 2. O dropdown Field to Summarize deve estar por padro 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 seo Group Footer abaixo do campo LineTotal.Voc pode precisar aumentar a altura da seo Group Footer pra que os dados apaream 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 espao 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 seo Group Footer logo abaixo do Summary Field Line Total. 6. Clique em um espao 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 espao 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 cdigo. Sum ({SalesOrderDetail.LineTotal}, {SalesOrderHeader.SalesOrderNumber}) + {SalesOrderHeader.TaxAmt} + {SalesOrderHeader.Freight} 1. Clique no boto Save and Close. 2. Arraste o Formula Field InvoiceTotal para a seo 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 ns 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 espao em branco campo e selecione Insert text object.Mude o texto para Fatura Total:.

O relatrio deve estar parecido com a figura abaixo:

As Sees Report Header e Report Footer no so usadas nesse relatrio e podem ser escondidas.Clique no titulo delas e selecione Supress(No-Drill-Down). Nosso relatrio est praticamente pronto,agora precisamos criar o rodap,e depois mostra-lo na pgina ASP.NET,coisas que estarei mostrando nos prximos posts desta srie. At l!
Publicado emmaro 19, 2010MarcadoCrystal ReportsFormula FieldComentrios1 Comentrio

Criando relatrios com Crystal Reports e ASP.NET Parte 2


Nesse post vou continuar com a criao do relatrio que comecei em Criando relatrios com Crystal Reports e ASP.NET Parte 1,se voc ainda no viu,de uma olhada. O prximo passo adicionar o nome do cliente (CustomerName),e os campos de endereo,bill to (Cobrana para) e ship to (Entrega para).Ns iremos usar os Formula Fields do Crystal Reports para fazer isso.Formula Fields so poderosos,eles permitem voc usar lgica de programao para criar campos.Voc pode usar If/Then,loops,do loops,while loops,criar variaveis locais e globais,manipular arrays e muitas outras coisas.Os Formula Fields permitem voc fazer quase tudo num relatrio.Vamos comear adicionando o Text Object ,como label para o Nome do cliente,e o formula field para mostrar o campo Customer Name: 1. Insira um Text Object abaixo do logo e mude o texto para:Nome do cliente:.Redimensione o obejto de texto para ficar somente do tamanho do texto. 2. Clique com o direito no Formula Fields no field explorer e selecione New,no pop-up. 3. Sete CustomerFullName para o nome da formula e clique em Use editor. 4. Nem todos os Customers (Clientes) tem um Title,middle name e suffix.Ns iremos criar uma variavel local na formula e uma lgica pra concatenar os campos de nome se eles existirem.Coloque o seguinte cdigo na frmula: local stringVar customerName := ; if isnull({Contact.Title}) = false then customerName := customerName + {Contact.Title} + ; customerName := customerName + {Contact.FirstName} + + {Contact.LastName}; if isnull({Contact.Suffix}) = false then customerName := customerName + + {Contact.Suffix};

customerName; 1. Clique no boto Save and Close no canto superior esquerdo do editor. 2. Expanda o Formula Field no field explorer,e arraste o campo CustomerFullName,prximo ao label do nome do cliente.Voc pode deixar o campo maior clicando no campo e arrastando suas extremidades. 3. Clique no boto Main Report Preview e voc deve ver o nome do cliente aparecer.Use os botes de rolagem de pginas pra ver que alguns nomes tem Title e middle name.

O prximo passo criar o formula field bill to address.Ele tem um problema parecido com o do nome,porque nem todos os clientes tem o campo AddressLine 2 preenchido.Ns s podemos incluir esse campo se ele no for nulo.Ns poderiamos somente arrastar todos os campos para o relatorio em linhas separadas,mas se algum registro no campo AddressLine 2 estivesse nulo ns teramos um buraco no relatrio.O Formula Field,nos ajuda a resolver este problema: 1. Insira um Text Object embaixo do Formula Field CustomerFullName,e coloque Cobrana para:.Formate o Text object deixando seu texto em negrito. 2. Clique com o direito no Formula Fields no field explorer e selecione New,no pop-up. 3. Sete BillToAddress para o nome da formula e clique em Use editor. 4. Insira o seguinte cdigo: local StringVar billTo := {addressbillto.AddressLine1} + chr(13); if isnull({addressbillto.AddressLine2}) = false then billTo := billTo + {addressbillto.AddressLine2} + chr(13); billTo := billTo + {addressbillto.City} + , + {stateprovincebillto.StateProvinceCode} + + {addressbillto.PostalCode} Esse cdigo cria uma variavel local e a inicializa com o campo AddressLine1 e adiciona uma quebra de linha.O chr(13) cria uma quebra de linha na formula.Depois checamos se o AddressLine2 nulo e concatenamos na variavel se este tiver valor.Depois concatenamos os campos,City,State/Province, e PostalCode.

1. Clique no boto Save and close. 2. Arraste o Formula Field BillToAddress abaixo do Text object Cobrana para:.Aumente a largura do campo. 3. Como voc no sabe qual a altura necessria porque vai depender se o cliente tem endereo no campo AddressLine2,voc pode deixar a altura do campo como est.Porm,voc poder fazer com que o campo ajuste sua altura automaticamente clicando com o boto direito no campo e selecionando Format Object. 4. Marque a checkbox Can grow.Isso permite que o campo cresa verticalmente. 5. Ns tambm queremos contornar o campo com uma borda.Clique na aba border,na caixa de dilogo Format Editor. 6. Selecione Single para os combos left,Right e Top e Bottom.Clique em OK. 7. Clique em Main Report Preview.

1. Agora voc pode criar o campo Ship to da mesma maneira.Primeiro insira um Text Object e digite Entrega para:.Deixe o texto em negrito.Coloque-o no meio do relatrio. 2. Clique com o boto direito em Formula Field no field explorer e selecione New 3. Coloque o nome ShipToAddress e clique em Use editor. 4. Coloque o seguinte cdigo: local StringVar shipTo := {addressshipto.AddressLine1} + chr(13); if isnull({addressshipto.AddressLine2}) = false then shipTo := shipTo + {addressshipto.AddressLine2} + chr(13); shipTo := shipTo + {addressshipto.City} + , + {stateprovinceshipto.StateProvinceCode} + + {addressshipto.PostalCode} 1. Clique no boto Save and close. 2. Arraste o Formula Field ShipToAddress abaixo do Text object Entrega para:.Aumente a largura do campo. 3. Clique com o boto direito no Formula Field e selecione Format Object. 4. Marque a checkbox Can grow.Isso permite que o campo cresa verticalmente.Coloque as bordas da mesma forma que fez anteriormente.

Aqui terminamos o cabealho de nosso relatrio.Em breve publicarei a Parte 3,com a continuao da criao deste relatrio. At la!
Publicado emmaro 18, 2010MarcadoAdventure WorksCrystal ReportsTutorialVisual StudioComentrios4 Comentrios

Criando relatrios com Crystal Reports e ASP.NET Parte 1


Na primeira parte desta srie,vamos criar uma fatura (invoice) com ajuda do Crystal Reports e ASP.NET,usando o banco de dados de demonstrao AdventureWorks .A verso que iremos usar do Crystal Reports , a verso gratuita que vem com o Visual Studio,o banco AdventureWorks pode ser baixado aqui O objetivo deste artigo criar uma fatura semelhante a da figura seguinte:

Passo 1:Criando a nova soluo


1. Abra o Visual Studio 2. Selecet New WebSite no menu File 3. Escolha ASP.NET na lista dos templates. 4. Escolha o nome do projeto. 5. Escolha a linguagem C# Agora vamos adicionar o arquivo do Crystal Reports para o projeto:

1. Clique com direito no Solution Explorer 2. Escolha Add new item 3. Clique no template do Crystal Reports 4. Mude o nome do arquivo para Invoice.rpt Ir aparecer a caixa de dilogo,do Crystal Reports.Selecione As a blank report e clique em OK:

Seu relatrio ser salvo no VS e estamos prontos pra comear.

Passo 2:Conectando ao banco


Vamos conectar ao banco AdventureWorks e trazer todas as tabelas e Views que precisamos: 1. Cique com o boto direito no Database Fields no Field Explorer.Selecione DataBase Experts no pop-up. 2. Esse relatrio vai se conectar diretamente com o banco usando OLE DB.Para conectar clique no sinal de expanso prximo ao n Create new Connection. 3. Clique no sinal de expanso prximo a OLE DB (ADO).Isso vai abrir a caixa de dialogo que lhe permite selecionar o AdventureWorks. 4. Selecione SQL Native Client na lista de providers e clique next 5. Coloque o nome do servidor onde o banco est instalado. 6. Voc pode usar tanto Integrated Security ou Login para se conectar ao banco. 7. Agora clique no combo database.E selecione o banco AdventureWorks.Clique Ok e Finish. Seu Sql server deve aparecer abaixo do n OLE DB (ADO) e o banco AdventureWorks,deve ser listado abaixo do nome do servidor.

1. Clique no sinal de expanso do banco AdventureWorks e voc ver a lista de schemas do banco.Se voc clicar no n de um esquema voc ver mais dois ns,um para tabelas e outro para as views. 2. Vamos selecionar as tabelas e views apropriadas para o relatrio e manda-las para a lista de Tabelas selecionadas na caixa de dilogo.Expanda o schema Person e expanda Tables.Clique na tabela Contacts e depois clique no boto >pra move-la pra lista de tabelas selecionadas.Faa o mesmo para as tabelas:Production.Product,Sales.SalesOrderDetail e Sales.SalesOrderHeader. 3. A tabela Sales.SalesOrderHeader tem dois campos de endereo (Address),uma para o endereo de cobrana (BillAddress) e outro para o endereo de entrega (ShipAddress).Cada um desses campos tem uma chave estrangeira com a tabela Person.Address.Ns teremos que adicionar duas cpias da tabela Address,para cada chave estrangeira.Mas ns podemos apelidar (alias) a tabela pra depois sabermos qual qual.Adicione a tabela Person.Address para a lista de tabelas selecionadas usando o boto >. 4. Clique com o direito na tabela Address na lista de tabelas selecionadas e renomei a atravs do menu pop-up.Mude o nome para AddressBillTo e pressione enter.O Crystal vai dar um lowerCase no nome automaticamente.

5. Agora a adicione a tabela Person.Address para a lista de tabelas selecionadas novamente.Dessa vez renomeie-a para AddressShipTo.

1. A tabela Person.Address tem uma chave estrangeira com a tabela Person.StateProvince ento voc tambm vai precisar adicionar a tabela Person.StateProvince duas vezes para a lista de tabelas selecionadas.Renomeie a tabela para StateProvinceBillTo e StateProvinceShipTo.

1. Agora que voc selecionou as tabelas,voc precisa definir as relaes entre essas tabelas.O Crystal faz um bom trabalho descobrindo essas relaes,mas ele no pode descobrir tudo automaticamente.Para configurar manualmente as relaes clique na aba Links na caixa de dilogo do Database experts 2. Aparecer uma representao grfica das tabelas.Voc pode tornar a caixa de dilogo maior,arrastando o canto inferior direito .Eu gosto de fazer isso pra poder ver o mximo de tabelas possiveis. 3. A tabela SalesOrderHeader a tabela principal que tem os dados que ns estamos procurando.Crystal deve ter encontrado as relaes entre as tabelas SalesOrderHeader.SalesOrderId e SalesOrderDetail.SalesOrderId, e SalesOrderHeader.ContactId e Contact.Contact.Id,e SalesOrderHeader.BillToAddressId e AddressBillTo.AddressId,e AddressBillTo.StateProvinceId e StateProvinceBillTo.StateProvinceId.Voc deve ver uma linha entre as chaves primrias e as chaves estrangeiras destas tabelas.Seno,voc pode cria essas relaes facilmente clicando na chave estrangeira e arrastando para a primary key desejavel. 4. Voc precisa adicionar as relaes entre,SalesOrderDetail.ProductId e Product.ProductId.Clique no campo SalesOrderDetail.ProductId e arraste-o para o campo Product.ProductId.Voc deve ver uma linha azul aparecer entre estas duas tabelas representando a relao.Na verdade o que isso

est fazendo criando joins pra voc, na query que seleciona os dados. parecido com Access Query Designer.Se voc precisar fazer um outer join s dar um clique-duplo,na linha entre as tabelas e selecionar entre Left,Right ou Full join. 5. Crie o resto das relaes da mesma maneira,arrastando a chave estrangeira sobre a chave primria.O restante das relaes so:SalesOrderHeader.ShipToAddressId = AddressShipTo.AddressID, e AddressShipTo.StateProvinceId = StateProvinceShipTo.StateProvinceId.Clique no boto OK.

1. Voc agora pode ver o relatrio no VS 2008 de novo.Cique no sinal de expanso prximo a Database Fields no Field Explorer.Voc ver todas as suas tabelas listadas.Clique no sinal de expanso de uma tabela e voc ver os campos daquela tabela.Essas so as tabelas disponiveis para serem usadas no relatrio agora.

Passo 3:Criando o cabealho


A Page Header Section (Cabealho),se repete em todas as pginas.Para essa demonstrao,ns queremos repetir o Logo da empresa,o nome da empresa,o nmero da fatura,o nmero da compra,a data da compra,a data de entrega,o nome do cliente o endereo de cobrana e o endereo de entrega. Siga estes passos para o cabealho: 1. Altere a altura do cabealho,colocando o mouse na borda da Details Section.O mouse deve mudar para uma barra horizontal.Clique e arraste.Isso vai deixar o cabealho maior.

2. Clique com o boto direito em um espao em branco na Page Header Section e selecione Insert Picture,no pop-up.Escolha a imagem e clique em Abrir.Arraste a figura para o topo esquerda,na Page Header Section. 3. Use a janela de propriedades para mudar a altura e largura da imagem.

1. Agora voc precisa adicionar o Nome da empresa.Clique com o boto direito em um espao em branco e selecione Insert Text Object no menu Pop-Up.Deixe o objeto de texto ao lado do logo. 2. Insira o texto.Para parar de editar clique em algum outro lugar do relatrio. 3. Clique com o boto direito no objeto de texto,e selecione Format Object no pop-up.Esse menu lhe d mais opes do que a janela de propriedades. 4. Clique na aba Font.Altere a fonte como desejar. 5. Clique na aba Paragraph.Altere o alinhamento para horizontal.

1. O prximo passo arrastar os campos do banco para o relatrio.Comece com o campo SalesOrderHeader.SalesOrderNumber.Mesmo que esse no seja o nmero da fatura,iremos trata-lo como se fosse.Expanda o n de DataBase fields no field explorer.Expanda a tabela SalesOrderHeader.Arraste o campo SalesOrderNumber,para a direita no cabealho. 2. Diminua a largura do campo. 3. Insira um Text Object a esquerda do campo SalesOrderNumber,clicando com o boto direito em um espao vazio e escolhendo Insert text object.Mude o texto para Fatura#:.Alinhe o texto para a direita. 4. Ajuste o objeto de texto para no cobrir o campo SalesOrderNumber.

1. Adicione os campos PurchaseOrderNumber,Orderdate,ShipDate,e Due Date da mesma maneira.Adicione um Text Object para cada um desses campos,para que sirva como label. 2. De uma olhada no seu relatrio clicando no boto Main Report Preview,no rodap do relatrio.

1. Note que os trs campos de data tem hora,includa neles.Para remove-las clique de volta no Main Report View.Segure a tecla CTRL,e clique em cada campo de data.Clique com o direito e selecione Format Multiple Objects no pop-up. 2. Clique na aba Date And time e escolha 03/01/1999 na lista de estilos.Clique ok. 3. Clique em preview de novo,e desta vez a hora deve ter sumido. Por enquanto isso,em breve publicarei a parte 2,continuando com a criao deste relatrio.

At l!