Usuário com melhor resposta
Selecionar o Dataset do Report Viewer por programação em VB.NET 2005

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
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.SqlClientImports
System.Data'referências do reportview
Imports
Microsoft.Reporting.WinFormsImports
System.Text'referência imagem
Imports
System.IOImports
System.DrawingstrPathreport = strPathreport.Replace(
"bin\Debug\", "")rvPrintPreview.LocalReport.ReportPath = strPathreport
'2 passo: passar os dados para o relatório 'abrindo conexão com o banco de dadosoConn.ConnectionString = strConexao
oConn.Open()
'definindo o SQL do relatóriostrSQL.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 SQLoCmd.Parameters.Add(
New SqlParameter("@Color", SqlDbType.Char)).Value = "Red" 'executando o SQLCommand Dim oDataReader As SqlDataReader = oCmd.ExecuteReader(CommandBehavior.CloseConnection) 'converter o DataReader para DataTableoTable.Load(oDataReader)
'definindo o DataSource do relatório Dim myReportDataSource As ReportDataSource = New ReportDataSource("dsProduct", oTable)rvPrintPreview.LocalReport.DataSources.Add(myReportDataSource)
Catch ex As ExceptionSystem.Diagnostics.Debug.WriteLine(ex.Message)
Finally 'liberando os objetosoConn.Dispose()
oTable.Dispose()
oConn =
NothingoTable =
Nothing End Try End SubAjude a melhorar o nosso Fórum!
Não esqueça de marca a mensagem como "útil", caso tenha ajudado.
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.SqlClientImports
System.Data'referências do reportview
Imports
Microsoft.Reporting.WinFormsImports
System.Text'referência imagem
Imports
System.IOImports
System.DrawingstrPathreport = strPathreport.Replace(
"bin\Debug\", "")rvPrintPreview.LocalReport.ReportPath = strPathreport
'2 passo: passar os dados para o relatório 'abrindo conexão com o banco de dadosoConn.ConnectionString = strConexao
oConn.Open()
'definindo o SQL do relatóriostrSQL.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 SQLoCmd.Parameters.Add(
New SqlParameter("@Color", SqlDbType.Char)).Value = "Red" 'executando o SQLCommand Dim oDataReader As SqlDataReader = oCmd.ExecuteReader(CommandBehavior.CloseConnection) 'converter o DataReader para DataTableoTable.Load(oDataReader)
'definindo o DataSource do relatório Dim myReportDataSource As ReportDataSource = New ReportDataSource("dsProduct", oTable)rvPrintPreview.LocalReport.DataSources.Add(myReportDataSource)
Catch ex As ExceptionSystem.Diagnostics.Debug.WriteLine(ex.Message)
Finally 'liberando os objetosoConn.Dispose()
oTable.Dispose()
oConn =
NothingoTable =
Nothing End Try End SubAjude a melhorar o nosso Fórum!
Não esqueça de marca a mensagem como "útil", caso tenha ajudado. -
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 -
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. -
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.SqlClientImports
System.Data'referências do reportview
Imports
Microsoft.Reporting.WinFormsPublic
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 PropertyclnEvento.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 SnippetPrivate 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
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
-
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 Snippetdr = clnEvento.ListarTodos(Codigo)
dt.Load(dr)faça um teste para ver se a function "ListarTodos" está retornando os registros
fica assim:
Code Snippetdr = 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)
elsemsgbox "Nenhum registro encontrado."
end if
Posta o código da function clnEvento.ListarTodos(Codigo)
E hoje va "nascer" esse relatório !
-
Opa Laércio,
Então cara, ta aí o código da função e eu explico ele:
Code Snippet{ _
cldBancoDados.CriarParametro(
"@ch_pr", SqlDbType.Int, ch_pr) _}
Return cldBancoDados.RetornaDataReadercomParametro(NomeProcedure, param) End Functioncomo pode ver, ela precisa de um parametro codigo, que é o parametro da procedure
vamos lá, agora eu tenho a classe "cldBancoDados.CriarParametro:
Code SnippetPublic Function CriarParametro(ByVal nome As String, ByVal tipo As SqlDbType, ByVal valor As Object) As SqlParameter
Dim param As New SqlParameterparam.ParameterName = nome
param.SqlDbType = tipo
If valor Is Nothing Thenparam.Value = DBNull.Value
ElseIf tipo = SqlDbType.VarChar And valor.ToString().Length = 0 Thenparam.Value = DBNull.Value
Elseparam.Value = valor
End If Return param End FunctionAcho 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 SnippetPublic Function RetornaDataReadercomParametro(ByVal NomeProcedure As String, ByVal ParamArray parameters() As SqlParameter) As SqlDataReader
Dim cn As New SqlConnectioncn = 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 Functionessa 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
-
adicione um breakpoint nessa linha e faça o debug
Code SnippetrptViewer.LocalReport.DataSources.Add(reportSource)Então foi retornado 1 registro? entrou nesse IF?
Code SnippetIf dt.Rows.Count > 0 Then
Dim reportSource As ReportDataSource = New ReportDataSource("GestaoDataSet", dt)
rptViewer.LocalReport.DataSources.Add(reportSource)
elsemsgbox "Nenhum registro encontrado."
end if
na function RetornaDataReadercomParametro
altere a linha
Code SnippetReturn cmd.ExecuteReader
para
Code SnippetDim oDataReader As SqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
return oDataReader -
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
-
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 -
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 -
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 -
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"!
-
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 -
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