none
Selecionar o Dataset do Report Viewer por programação em VB.NET 2005 RRS feed

  • Pergunta

  • Olá, boa tarde

    Gostaria de saber como posso fazer para selecionar o dataset do ReportViewer por programação, pois utilizo uma metodologia que crio uma classe separada para banco de dados, com métodos para acesso a dados , chamadas de Stored Procedures, DataReader e etc, e utilizo também classes separadas para cada tabela, então preciso selecionar o Data set por programação pois não tenho nenhum gerado por assistente.


    Como posso fazer isso?




    Desde já,
    Obrigado



    Paulo Eduardo Bueno
    quarta-feira, 3 de setembro de 2008 18:21

Respostas

  • Criei um tópico fixo no fórum MSDN com algumas dicas importantes sobre a construção de relatórios com Crystal Reports e ReportView (inclusive 2 vídeos sobre como construir relatórios e gráficos):

    http://forums.microsoft.com/MSDN-BR/ShowPost.aspx?PostID=3761576&SiteID=21

     

     

     

    Um exemplo em Windows Form (VB.NET)

     

    Code Snippet

    'referências do banco de dados

    Imports System.Data.SqlClient

    Imports System.Data

    'referências do reportview

    Imports Microsoft.Reporting.WinForms

    Imports System.Text

    'referência imagem

    Imports System.IO

    Imports System.Drawing

     

    Private Sub ListaProdutos()

    Dim strConexao As String = My.Settings.AWorks.ToString()

    Dim oConn As New SqlConnection

    Dim strSQL As New StringBuilder

    Dim oTable As New DataTable()

    Dim oCmd As SqlCommand = Nothing

    Try

    '1 passo: carregar o relatório

    Dim strPathreport As String = String.Concat(Application.StartupPath.ToString(), "\ReportViewer\rptProdutos.rdlc")

    strPathreport = strPathreport.Replace("bin\Debug\", "")

    rvPrintPreview.LocalReport.ReportPath = strPathreport

    '2 passo: passar os dados para o relatório

    'abrindo conexão com o banco de dados

    oConn.ConnectionString = strConexao

    oConn.Open()

    'definindo o SQL do relatório

    strSQL.Append(" SELECT ")

    strSQL.Append(" Production.Product.ProductID, ")

    strSQL.Append(" Production.Product.Name, ")

    strSQL.Append(" Production.Product.Color, ")

    strSQL.Append(" Production.Product.ListPrice, ")

    strSQL.Append(" Production.ProductSubcategory.Name AS NameSubcategory ")

    strSQL.Append(" FROM ")

    strSQL.Append(" Production.Product INNER JOIN Production.ProductSubcategory ")

    strSQL.Append(" ON Production.Product.ProductSubcategoryID = Production.ProductSubcategory.ProductSubcategoryID ")

    strSQL.Append(" WHERE Production.Product.Color = @Color ")

    oCmd = New SqlCommand(strSQL.ToString, oConn)

    oCmd.CommandText = strSQL.ToString

    oCmd.CommandType = CommandType.Text

    'definindo o parametro do SQL

    oCmd.Parameters.Add(New SqlParameter("@Color", SqlDbType.Char)).Value = "Red"

    'executando o SQLCommand

    Dim oDataReader As SqlDataReader = oCmd.ExecuteReader(CommandBehavior.CloseConnection)

    'converter o DataReader para DataTable

    oTable.Load(oDataReader)

    'definindo o DataSource do relatório

    Dim myReportDataSource As ReportDataSource = New ReportDataSource("dsProduct", oTable)

    rvPrintPreview.LocalReport.DataSources.Add(myReportDataSource)

    Catch ex As Exception

    System.Diagnostics.Debug.WriteLine(ex.Message)

    Finally

    'liberando os objetos

    oConn.Dispose()

    oTable.Dispose()

    oConn = Nothing

    oTable = Nothing

    End Try

    End Sub

     

     

     

    Ajude a melhorar o nosso Fórum!
    Não esqueça de marca a mensagem como "útil", caso tenha ajudado.

     

    quarta-feira, 3 de setembro de 2008 19:27
    Moderador

Todas as Respostas

  • Criei um tópico fixo no fórum MSDN com algumas dicas importantes sobre a construção de relatórios com Crystal Reports e ReportView (inclusive 2 vídeos sobre como construir relatórios e gráficos):

    http://forums.microsoft.com/MSDN-BR/ShowPost.aspx?PostID=3761576&SiteID=21

     

     

     

    Um exemplo em Windows Form (VB.NET)

     

    Code Snippet

    'referências do banco de dados

    Imports System.Data.SqlClient

    Imports System.Data

    'referências do reportview

    Imports Microsoft.Reporting.WinForms

    Imports System.Text

    'referência imagem

    Imports System.IO

    Imports System.Drawing

     

    Private Sub ListaProdutos()

    Dim strConexao As String = My.Settings.AWorks.ToString()

    Dim oConn As New SqlConnection

    Dim strSQL As New StringBuilder

    Dim oTable As New DataTable()

    Dim oCmd As SqlCommand = Nothing

    Try

    '1 passo: carregar o relatório

    Dim strPathreport As String = String.Concat(Application.StartupPath.ToString(), "\ReportViewer\rptProdutos.rdlc")

    strPathreport = strPathreport.Replace("bin\Debug\", "")

    rvPrintPreview.LocalReport.ReportPath = strPathreport

    '2 passo: passar os dados para o relatório

    'abrindo conexão com o banco de dados

    oConn.ConnectionString = strConexao

    oConn.Open()

    'definindo o SQL do relatório

    strSQL.Append(" SELECT ")

    strSQL.Append(" Production.Product.ProductID, ")

    strSQL.Append(" Production.Product.Name, ")

    strSQL.Append(" Production.Product.Color, ")

    strSQL.Append(" Production.Product.ListPrice, ")

    strSQL.Append(" Production.ProductSubcategory.Name AS NameSubcategory ")

    strSQL.Append(" FROM ")

    strSQL.Append(" Production.Product INNER JOIN Production.ProductSubcategory ")

    strSQL.Append(" ON Production.Product.ProductSubcategoryID = Production.ProductSubcategory.ProductSubcategoryID ")

    strSQL.Append(" WHERE Production.Product.Color = @Color ")

    oCmd = New SqlCommand(strSQL.ToString, oConn)

    oCmd.CommandText = strSQL.ToString

    oCmd.CommandType = CommandType.Text

    'definindo o parametro do SQL

    oCmd.Parameters.Add(New SqlParameter("@Color", SqlDbType.Char)).Value = "Red"

    'executando o SQLCommand

    Dim oDataReader As SqlDataReader = oCmd.ExecuteReader(CommandBehavior.CloseConnection)

    'converter o DataReader para DataTable

    oTable.Load(oDataReader)

    'definindo o DataSource do relatório

    Dim myReportDataSource As ReportDataSource = New ReportDataSource("dsProduct", oTable)

    rvPrintPreview.LocalReport.DataSources.Add(myReportDataSource)

    Catch ex As Exception

    System.Diagnostics.Debug.WriteLine(ex.Message)

    Finally

    'liberando os objetos

    oConn.Dispose()

    oTable.Dispose()

    oConn = Nothing

    oTable = Nothing

    End Try

    End Sub

     

     

     

    Ajude a melhorar o nosso Fórum!
    Não esqueça de marca a mensagem como "útil", caso tenha ajudado.

     

    quarta-feira, 3 de setembro de 2008 19:27
    Moderador
  • Muito obrigado Laercio, mas ainda tenho a seguinte dúvida,
    Como posso definir qual campo do dataset (query) vai para qual campo do ReportViewer?

    Algo do tipo


    '1ª coluna do Report = 1º item da query'



    Algo desse tipo, qual seria essa propriedade do Relatório? Já tentei bastante vezes aqui, mas não consegui, estou fazendo estágio e não tenho muita experiência.



    Desde já,
    Obrigado



    Paulo Eduardo Bueno
    quarta-feira, 3 de setembro de 2008 19:45
  • Paulo,

     

    O Designer do relatório e feito através de DataSet e depois os dados são carregados através de uma sub da aplicação.

     

    Como fazer:

     

    Faça o download dos Webcasts (vídeos)  (inclui os projetos com código fonte em vb.net), eu mostro justamente o que você precisa para criar os relatórios com Crystal Reports e ReportView passo a passo.

     

    Depois de assistir aos vídeos não deixe de postar um feedback sobre o que você achou (se ajudou a resolver o problema).

     

    1 - Webcasts (Vídeos) com diversos exemplos de como construir relatórios de forma profissional com os componentes Crystal Reports e ReportViewer.

     

    Link para download

    http://forums.microsoft.com/MSDN-BR/ShowPost.aspx?PostID=3271109&SiteID=21&mode=1

     

    ou

     

    http://www.msdnbrasil.com.br/mediacenter/default.aspx

    e digitar ReportView no campo Localizar conteúdo:

     

    Ajude a melhorar o nosso Fórum!
    Não esqueça de marca a mensagem como "útil", caso tenha ajudado.

    quarta-feira, 3 de setembro de 2008 22:23
    Moderador
  • Cara, estou tentando aqui de todas as formas e nada

     

    Vi toda a parte de Report Viewer do WebCast parte 1, adaptei pra VB.NET com minha metodologia e nada

    Vou postar aqui o código que estou escrevendo:

     

    Code Snippet

    'Formulário do ReportViewer

    Imports System.Data.SqlClient

    Imports System.Data

    'referências do reportview

    Imports Microsoft.Reporting.WinForms

    Public Class frmRelatorio

    Dim _codigo As Integer

    Public Property Codigo() As Integer

    Get

    Return _codigo

    End Get

    Set(ByVal value As Integer)

    _codigo = value

    End Set

    End Property

     

    Private Sub frmRelatorio_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

     

    Dim clnEvento As New clnEvento

    Dim strPathreport As String = String.Concat(Application.StartupPath.ToString(), "\Relatórios\Report1.rdlc")

    Dim dr As Data.SqlClient.SqlDataReader

    Dim dt As New DataTable

    clnEvento.ch_pr = Codigo

     

    strPathreport = strPathreport.Replace("bin\Debug\", "")

    rptViewer.LocalReport.ReportPath = strPathreport

     

    dr = clnEvento.ListarTodos(Codigo)

    dt.Load(dr)

     

    Dim reportSource As ReportDataSource = New ReportDataSource("GestaoDataSet", dt)

     

    rptViewer.LocalReport.DataSources.Add(reportSource)

     

    End Sub

     

     

    Bom, eu crio a propriedade código, porque esse formulário é chamado por um outro, no qual o usuário entra com o parâmetro da busca

     

    Neste formulário temos o seguinte código:

     

    Code Snippet

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    Dim frmRelatorio As New frmRelatorio

    With frmRelatorio

    .Codigo = 1

    .ShowDialog()

    End With

    End Sub

     

     

    Nesse caso colocou 1, pois é apenas testes, mas para o futuro isso será a variável que armazena o valor que o usuário digita para pesquisar

     

    Bom, na classe "clnEvento", eu tenho o método "ListarTodos", que recebe como parâmetro o código, para informar a classe de acesso a Banco (classe que contém todos os métodos referentes a banco de dados, Conexão, Tipo de comando sql, Criar DataSet, DataReader, etc) o parâmetro e o nome da query, e depois me retornar o datareader, mas isso não está acontecendo,

     

    Já utilizei essa metodologia em outro projeto, porém o jogava os campos trazidos do DataReader em campos do Formulário (ex. txt1.text = dr(0)), por isso perguntei se poderia fazer o Data Source do Report por programação, para não talvez não haver esse problema.

     

    Se você quiser, me passe seu e-mail para que eu possa enviar para você a apliacação inteira para você fazer análise

    não sei se fui claro.

     

     

     

    Desde já,

    Muito Obrigado

     

     

    Paulo Eduardo Bueno

    quinta-feira, 4 de setembro de 2008 17:57
  • Paulo,

     

     ..e depois me retornar o datareader, mas isso não está acontecendo..

     

     

    então esse trecho do código não está funcionando correto?

    Code Snippet

    dr = clnEvento.ListarTodos(Codigo)
    dt.Load(dr)

     

     

    faça um teste para ver se a function "ListarTodos" está retornando os registros

    fica assim:

    Code Snippet

    dr = clnEvento.ListarTodos(Codigo)
    dt.Load(dr)

     

    If dt.Rows.Count > 0 Then

     Dim reportSource As ReportDataSource = New  ReportDataSource("GestaoDataSet", dt)
     rptViewer.LocalReport.DataSources.Add(reportSource)
     
    else

     msgbox "Nenhum registro encontrado."

    end if

     

     

     

    Posta o código da function clnEvento.ListarTodos(Codigo)

     

     

    E hoje va "nascer" esse relatório !

     

    quinta-feira, 4 de setembro de 2008 18:21
    Moderador
  • Opa Laércio,

     

     

    Então cara, ta aí o código da função e eu explico ele:

    Code Snippet

     

    Public Function ListarTodos(ByVal codigo As Integer) As SqlDataReader

    Dim cldBancoDados As New cldBancoDados

    Dim NomeProcedure As String = "P_Listar_Evento_Todos"

    Dim param() As SqlParameter = _

    { _

    cldBancoDados.CriarParametro("@ch_pr", SqlDbType.Int, ch_pr) _

    }

    Return cldBancoDados.RetornaDataReadercomParametro(NomeProcedure, param)

    End Function

     

     

     

    como pode ver, ela precisa de um parametro codigo, que é o parametro da procedure

    vamos lá, agora eu tenho a classe "cldBancoDados.CriarParametro:

     

    Code Snippet

    Public Function CriarParametro(ByVal nome As String, ByVal tipo As SqlDbType, ByVal valor As Object) As SqlParameter

    Dim param As New SqlParameter

    param.ParameterName = nome

    param.SqlDbType = tipo

    If valor Is Nothing Then

    param.Value = DBNull.Value

    ElseIf tipo = SqlDbType.VarChar And valor.ToString().Length = 0 Then

    param.Value = DBNull.Value

    Else

    param.Value = valor

    End If

    Return param

    End Function

     

     

     

     

    Acho que está explícito o que essa classe faz, ela precisa dos três paramêtros que são enviados pela outra, e joga no "param"

     

    depois eu tenho a "RetornaDataReadercomParametro", que precisa do nome da procedure e o parametro dela:

     

    Code Snippet

    Public Function RetornaDataReadercomParametro(ByVal NomeProcedure As String, ByVal ParamArray parameters() As SqlParameter) As SqlDataReader

    Dim cn As New SqlConnection

    cn = AbreBanco()

    Try

    Dim cmd As New SqlCommand

    With cmd

    .CommandText = NomeProcedure

    .CommandType = CommandType.StoredProcedure

    If Not (parameters Is Nothing) Then

    Dim param As SqlParameter

    For Each param In parameters

    .Parameters.Add(param)

    Next param

    End If

    .Connection = cn

    End With

    Return cmd.ExecuteReader

    Catch ex As SqlException

    Throw ex

    Catch ex As Exception

    Throw ex

    End Try

    End Function

     

     

     

    essa função faz a conexão (que está em outro método), lê os dados, e retorna o Reader

     

     

     

     

    Bom, fiz o que você falou, ele entrou certo, debuguei e ele mostrou um Registro, mas não trouxe pro formulário, o formulário abriu em branco, sem nem menos mostrar a text box que eu setei, fiz as mesmas coisas que você faz no WebCast no DataSet, pego o nome dele que vem "MeuDataSet_NomeDaTabela" e tirei o "_NomeDaTabela"...fiz tudo igual mas não funfou

     

     

    vou tentando aqui por enquanto

    espero que saia hoje rsrs

     

     

     

    Desde já,

    Obrigado

     

    Paulo Eduardo Bueno

    quinta-feira, 4 de setembro de 2008 19:15
  • adicione um breakpoint nessa linha e faça o debug

    Code Snippet
    rptViewer.LocalReport.DataSources.Add(reportSource)

     

     

    Então foi retornado 1 registro? entrou nesse IF?

    Code Snippet

    If dt.Rows.Count > 0 Then
     
     Dim reportSource As ReportDataSource = New  ReportDataSource("GestaoDataSet", dt)
     rptViewer.LocalReport.DataSources.Add(reportSource)
     
    else

     msgbox "Nenhum registro encontrado."

    end if

     

     

    na function RetornaDataReadercomParametro

    altere a linha

    Code Snippet

    Return cmd.ExecuteReader

     

     

    para

    Code Snippet

    Dim oDataReader As SqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
    return oDataReader

     

     

     


     

    quinta-feira, 4 de setembro de 2008 19:37
    Moderador
  • Cara, modifiquei e nada =/

     

    ao que parece, a funcionalidade das funções são iguais as que acontece no seu código de exemplo, porém elas só estão separadas e no meu caso eu trabalho com Stored Procedure, é isso que não estou entendeno, já usei essa metodologia em outros projetos, sempre funcionou, nestes casos não trabalhei com Reports, mas teoricamente era pra funcionar =/

     

     

    Alguma outra sugestão?

     

     

     

    Desde já,

    Obrigado

     

     

    Paulo Eduardo Bueno

    quinta-feira, 4 de setembro de 2008 19:43
  • Opa Laercio

    Mals cara, saio do trabalho as 17:00 e vou direto pra faculdade, só fui ver o msdn agora
    hoje a noite provavelmente eu saio mais cedo, então se não se encomodar a gente fala no msn hoje =D


    Enquanto isso eu vou tentando aqui rsrs


    Obrigado pela ajuda cara



    Paulo Eduardo Bueno
    sexta-feira, 5 de setembro de 2008 11:01
  • estou lendo um artigo aqui que diz que o seguinte:

    SQL Server Express. Note: An update for SQL Server Express that includes a limited edition of Report Server is available here.


    Isso tem alguma relação com a aplicação? Nota-se que uso o SQL Server Express 2005
    sexta-feira, 5 de setembro de 2008 13:27
  • Cara, agora também notei o seguinte enquanto faço aqui as alterações

    quando eu coloco o seguinte código para testar o DataReader:


    If dr.Read
    teste = dr.(0)
    End if

    ele traz o que deveria trazer, o o dígito "1", correspondente ao código correto


    então creio que o problema acontece quando eu passo o DataReader para o DataTable, acredito que aí está acontecendo algum erro, porque o DataTable não traz nada



    alguma alternativa?



    Desde já,
    Obrigado


    Paulo Eduardo Bueno
    sexta-feira, 5 de setembro de 2008 14:33
  • Paulo,

     

    Hoje a noite resolvemos esse problema pelo MSN (vou entrar as 21:00).

     

    O seu código está correto e já não sei mais o que indicar para resolver o problema. Deve ser um detalhe que está passando despercebido por você.

     

    E fico tranquilo! Esse relatório vai "nascer"!

     

     

     

     

     

    sexta-feira, 5 de setembro de 2008 14:42
    Moderador
  • Opa
    então, cara, teu e-mail é do Yahoo né? Se der pra você usar o chat do Yahoo! Mail agora, me da um toque, senão a gente resolve isso 21:00 mesmo



    Mais uma modificação:

    Trouxe também pro DataSet que é gerado por assistente as Stored Procedures, mas mesmo assim, não deu em nada





    Desde já,
    Obrigado


    Paulo Eduardo Bueno
    sexta-feira, 5 de setembro de 2008 14:46
  • Boas Laercio, Tive por aquia pesquisar e ja reparei que voce percebe de Relatorios,

     

    Entao e minha duvida é a seguinte, tenho o meu relatorio e no Layout tenho uma Matrix, onde me carrega uma referencias, onde tem numero de horas trabalhadas naquele local durante um certo periodo de tempo, eu ja fiz um calculos que pretendo, agora precisava de noutra celula mais em baixo fazer a soma de todas as linhas.

     

    Cumprimentos,

    Diego Leite

    terça-feira, 8 de fevereiro de 2011 15:25