ReportViewer - Relatórios dinâmicos com ASP .NET


Vamos falar sobre como gerar relatórios dinâmicos usando o ReportViewer em aplicações ASP .NET usando a linguagem VB .NET. Se você nunca trabalhou com este componente sugiro que leia os artigos citados nas referências.

Eu vou usar os seguintes recursos nos exemplos deste artigo:

 Nosso objetivo será gerar relatórios dinâmicos e vou mostrar alguns cenários que podemos ter e como podemos obter um resultado satisfatório usando o componente ReportViewer 2008. Lembrando que temos outras opções para gerar relatórios em aplicações ASP .NET como por exemplo usar o Crystal Reports isso sem falar nos componentes de terceiros que podemos usar; a seguir cito alguns deles para conhecimento:

A primeira coisa que temos que ter em mente é que se tivermos uma estrutura de dados fortemente tipada o nosso trabalho ficará mais fácil e por isso vamos trabalhar com dataset fortemente tipado.

Nosso primeira etapa será criar o dataset tipado e nosso ponto de partida será a tabela Vendas do banco de dados macoratti.mdf criado no SQL Server 2008 que estou usando para este exemplo. A estrutura da tabela Vendas é bem simples e esta exibida abaixo e ao lado vemos alguns dados que já inclui na tabela:

Devemos ter uma conexão ativa com o banco de dados usado através da janela Server Explorer:

- Se a conexão não estiver ativa clique em Data Connections com o botão direito do mouse e selecione Add New Connection;

- A janela Add Connection irá surgir onde você deve informar o nome do servidor e selecionar o banco de dados.

obs: para a máquina local o servidor pode ser definido como .\SQLEXPRESS

A idéia ao criar o dataset tipado e que para vincular o relatório a uma instrução SELECT precisamos criar um dataset que contém exatamente as mesmas colunas que desejamos retornar, e, dessa forma poderemos trabalhar com filtros, vinculações e ordenações mas a estrutura deverá permanecer a mesma.

No menu WebSite clique em Add New Item e a seguir selecione o template DataSet informando o nome Vendas.xsd e clicando em Add;

Na janela Solution Explorer selecione o dataset Vendas.xsd criado e a partir da janela Server Explorer arraste a tabela Vendas para o descritor dataset para criar o dataset tipado conforme abaixo:

Com o dataset tipado criado vamos criar o relatório no ReportViewer. No menu WebSite selecione Add New Item e a seguir selecione o template Report informando o nome Vendas.rdlc e clicando no botão Add;   

A partir da ToolBox arraste o objeto Table para descritor Vendas.rdlc e a partir da janela Web Site DataSource inclua cada um dos campos do dataset na respectiva coluna da tabela conforme a figura abaixo:

 

Nota: Observe que o nome do DataSource é Vendas_Vendas. Você pode verificar isso no menu Report.

Como relatório criado vamos incluir um componente MicrosoftReportViewer a partir da ToolBox no formulário web Default.aspx;

Finalmente insira o código a seguir no evento Load do formulário no arquivo code-behind Default.aspx.vb:

namespaces usados:

Imports Microsoft.Reporting.WebForms
Imports
System.Data
Imports
System.Data.SqlClient

código do evento Load:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'define o modo Local como o processamneto para o ReportViewer 
        ReportViewer1.ProcessingMode = ProcessingMode.Local
        Dim rep As LocalReport = ReportViewer1.LocalReport
        'obtem o caminho do relatório
        Dim caminhoRpt As String = HttpContext.Current.Server.MapPath("~/")
        'define o local do relatorio criado
        rep.ReportPath = caminhoRpt & "Vendas.rdlc"
        'obtem o dataset
        Dim ds As DataSet = GetVendas()
        'Cria uma fonte de dados no relatório para o dataset vendas
        Dim dsVendasRpt As New ReportDataSource()
        'define o nome do datasource
        dsVendasRpt.Name = "Vendas_Vendas"
        'usa primeira tabela do dataset
        dsVendasRpt.Value = ds.Tables(0)
        'atribui o datasource ao relatorio
        rep.DataSources.Add(dsVendasRpt)
    End Sub

 

Observe que temos uma função que retorna o dataset que será usado como fonte do relatório.

O código da função GetVendas() é dado a seguir:

Private Function GetVendas() As DataSet
        Dim ds As New DataSet
        Dim sqlVendas As String = _
                    "SELECT vendedorid, nome, " & _
                    "       cota, vendas, regiao " & _
                    "FROM   Vendas "
        Using conexaoSQL As New SqlConnection( _
                                                                  "Data Source=.\SQLEXPRESS; " & _
                                                                  "Initial Catalog=macoratti; " & _
                                                                  "User ID=macoratti;Password=numsey")
 
            Dim command As New SqlCommand(sqlVendas, conexaoSQL)
            Dim daVendas As New SqlDataAdapter(command)
            daVendas.Fill(ds, "Vendas")
            daVendas.Dispose()
            command.Dispose()
        End Using
        Return ds
    End Function

 

Este código é bem simples, ele acessa a nossa base de dados e gera um dataset com as informações desejadas.

Executando o projeto iremos obter:

Simples, simples assim...

Pegue o projeto completo aqui: RelatoriosDinamicos.zip

Eu sei é apenas ReportViewer , mas eu gosto...

Referências:

José Carlos Macoratti