Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal,
Estou trabalhando em um projeto que preciso gerar diversos relatório, porém não queria ter de criar um Userform pra cada relatório, por isso criei um Userform com um reportviewer e crio os relatórios, e apenas faço a mudança de qual relatório exibir via código.
Até ai tudo bem, meu problema surge nos relatórios que preciso usar um dataset para popular o mesmo.
Tenho um dataset chamado "Same_relDataset.xsd" onde possui varios Datatable, como por exemplo "rel_ls_clientes" e "rel_ls_produtos", um para cada relatório.
Preciso mudar a fonte de dados do reportviewer via código para que eu possa fazer em tempo de execução.
Já li varios tutoriais principalmente sobre a instrução datasource.add do reportviewer mas até agora não obtive sucesso.
>
4 horas atrás, quintelab disse:
Da uma olhada: https://forums.asp.net/t/1681823.aspx?Creating+Dataset+Dynamically+in+c+and+passing+to+Report+Viewer+
Conferi o link mas como sou meio noob em programação principalmente quando se trata de tratamento de dados, não consegui fazer funcionar aqui.
Converti o código do link pra .net usando o http://converter.telerik.com/ e fiz as adaptações pro meu projeto, mas não funcionou.
Como assim converteu pra .net ? O código é .net, é c#. Esta usando vb.net ?
Foi essa parte aqui que tentou ?
private void rptGetDataset()
{
DataSet ds = new DataSet();
ds.DataSetName = "dsNewDataSet";
string sql = "";
sql = "SELECT ID, CLIENT_ID, AGENT_ID FROM TBLMAILDELETED";
OdbcDataAdapter da = new OdbcDataAdapter(sql, conn);
ds.GetXmlSchema();
da.Fill(ds);
ds.WriteXmlSchema(_path + "/App_Code/Ds.xsd");
ds.WriteXml(_path + "/App_Code/Ds.xml");
}
private DataTable getData()
{
DataSet dss = new DataSet();
string sql = "";
sql = "SELECT ID, CLIENT_ID, AGENT_ID FROM TBLMAILDELETED";
OdbcDataAdapter da = new OdbcDataAdapter(sql, conn);
da.Fill(dss);
DataTable dt = dss.Tables[0];
return dt;
}
private void runRptViewer()
{
this.ReportViewer1.Reset();
this.ReportViewer1.LocalReport.ReportPath = Server.MapPath("Report.rdlc");
ReportDataSource rds = new ReportDataSource("dsNewDataSet_Table", getData());
this.ReportViewer1.LocalReport.DataSources.Clear();
this.ReportViewer1.LocalReport.DataSources.Add(rds);
this.ReportViewer1.DataBind();
this.ReportViewer1.LocalReport.Refresh();
}Desculpe é vb.net mesmo.
Exatamente essa parte que fiz a conversão.
Poste seu código em vb.net e qual erro esta acontecendo e em qual linha.
Segue abaixo. Pode ser que eu esteja cometendo algum erro muito simples, mas não estou conseguindo achar, até mesmo por ser um amador da programação rsrs.
A principio o código roda sem problema algum, mas quando abre a janela do relatório ele não carrega data, simplesmente o reportviewer aparece em branco.
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\programa loja\same_rel.mdb")
Dim cmd As OleDbCommand
Dim sql As String
Dim i As Integer = 0
Dim filtro As String
conn.Open()
'->>>>>>>>
relatórios.ReportViewer2.Reset()
relatórios.ReportViewer2.LocalReport.ReportEmbeddedResource = "Same_1._0___Alpha.Report3.rdlc"
Dim rds As New ReportDataSource("same_relDataset_Table", getData())
relatórios.ReportViewer2.LocalReport.DataSources.Clear()
relatórios.ReportViewer2.LocalReport.DataSources.Add(rds)
relatórios.ReportViewer2.LocalReport.Refresh()
'------>>>>>
conn.Close()
relatórios.MdiParent = principal
relatórios.Show()
End Sub
Private Sub rptGetDataset()
Dim ds As New DataSet()
ds.DataSetName = "same_relDataset"
Dim sql As String = ""
sql = "SELECT * FROM rel_ls_produtos"
Dim da As New OleDbDataAdapter(sql, conn)
da.Fill(ds)
End Sub
Private Function getData() As DataTable
Dim dss As New DataSet()
Dim sql As String = ""
sql = "SELECT * FROM rel_ls_produtos"
Dim da As New OleDbDataAdapter(sql, conn)
da.Fill(dss)
Dim dt As DataTable = dss.Tables(0)
Return dt
End FunctionFavor desconsiderar o código acima, e considerar o abaixo:
Não apresenta nenhum erro, mas quando a janela do reportviewer abre, no lugar do relatório aparece "Não foi fornecida nenhuma instância de origem de dados para a origem de dados 'same_relDataSet'"
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\programa loja\same_rel.mdb")
Dim cmd As OleDbCommand
Dim sql As String
Dim i As Integer = 0
Dim filtro As String
conn.Open()
'->>>>>>>>
relatórios.ReportViewer2.Reset()
relatórios.ReportViewer2.LocalReport.ReportEmbeddedResource = "Same_1._0___Alpha.Report3.rdlc"
Dim rds As New ReportDataSource("same_relDataset_Table", getData())
relatórios.ReportViewer2.LocalReport.DataSources.Clear()
relatórios.ReportViewer2.LocalReport.DataSources.Add(rds)
relatórios.ReportViewer2.LocalReport.Refresh()
'------>>>>>
If tb_desc.Text = "" Then
If cb_tipo.Text = "" Then
filtro = "Nenhum"
Else
filtro = "Tipo => " & cb_tipo.Text
End If
Else
If cb_tipo.Text = "" Then
filtro = "Descrição => " & tb_desc.Text
Else
filtro = "Descrição => " & tb_desc.Text & " Tipo => " & cb_tipo.Text
End If
End If
relatórios.ReportViewer2.LocalReport.SetParameters(New ReportParameter("filtro", filtro))
relatórios.ReportViewer2.LocalReport.SetParameters(New ReportParameter("qtd", lb_itens.Text))
relatórios.MdiParent = principal
relatórios.Show()
End Sub
Private Sub rptGetDataset()
Dim ds As New DataSet()
ds.DataSetName = "same_relDataset"
Dim sql As String = ""
sql = "SELECT * FROM rel_ls_produtos"
Dim da As New OleDbDataAdapter(sql, conn)
da.Fill(ds)
End Sub
Private Function getData() As DataTable
Dim dss As New DataSet()
Dim sql As String = ""
sql = "SELECT * FROM rel_ls_produtos"
Dim da As New OleDbDataAdapter(sql, conn)
da.Fill(dss)
Dim dt As DataTable = dss.Tables(0)
Return dt
End FunctionJá debugou pra ver se os dataset ta sendo preenchido corretamente ?
Comparando com o código c# vi que esta falando essa linha:
this.ReportViewer1.DataBind();
Outra dica, não utilize acento. Vi que esta usando **relatórios**>
3 horas atrás, quintelab disse:
Já debugou pra ver se os dataset ta sendo preenchido corretamente ?
Comparando com o código c# vi que esta falando essa linha:
this.ReportViewer1.DataBind();
Outra dica, não utilize acento. Vi que esta usando **relatórios**
Sim o dataset está prenchido.
Não utilizei essa linha porque apresenta o seguinte erro "Erro 16 Acesso à propriedade deve atribuir à propriedade ou usar seu valor." antes mesmo de executar.
E não faço a menor ideia de como usar essa propriedade.
A linha no vb.net ficou assim:
relatórios.ReportViewer1.DataBindings()
Não tenho vb.net aqui pra testar, mas estou olhando outras pessoas que tiveram o mesmo problema como aqui: https://stackoverflow.com/questions/14940074/reportviewer-programmatically-generate-report vejo poucas diferenças. Já tentou remover os filtros ? Olhando este link vi também que ao invés de:
relatórios.ReportViewer2.LocalReport.Refresh()
Ele usou:
relatórios.ReportViewer2.LocalReport.RefreshReport()
Veja se tem esse método.
Bom tentei de tudo já e não tive sucesso.
A unica solução que consegui é utilizar um reportviewer pra cada relatório a ser gerado.
Da uma olhada: https://forums.asp.net/t/1681823.aspx?Creating+Dataset+Dynamically+in+c+and+passing+to+Report+Viewer+