Usuário com melhor resposta
Report Viewer - Problema com SubReport - Itens relacionados de uma tabela

Pergunta
-
Boa tarde,
Estou desenvolvendo um relatório para exibir os dados de propostas de venda e os produtos referentes a essas propostas.
Eu já consegui fazer normalmente o relatório para o caso de somente uma proposta, mas preciso imprimir varias de uma vez, para isso coloquei tudo numa matrix para repetir os dados a cada registro, a questão é que não estou conseguindo fazer com que os produtos apareçam. A matrix tem um dataset com os dados da proposta (nome do cliente, endereço e etc) e existe um outro dataset que contem os dados dos produtos que eu não consigo setar para a tabela que exibe os produtos.
Não sei se ficou totalmente claro, o modelo do relatório é assim:
proposta 1 (varios txtbox com dados da tebela do bd de propostas)
produto proposta 1 (table com dados da tabela do bd de produtos da proposta)
produto proposta 1
...
proposta 2
produto proposta 2
produto proposta 2
...
proposta 3
produto proposta 3
produto proposta 4
...
proposta 4
...
Acho que a solução seria algo com SubReport, por isso criei um com a tebela de produtos mas não consigo chama-lo corretamente.
Segue abaixo o meu código(Vb.Net):
Public Sub ProdutosSubreportProcessingEventHandler(ByVal sender As Object, ByVal e As SubreportProcessingEventArgs) Try Dim rtp As Microsoft.Reporting.WebForms.ReportDataSource rtp = New Microsoft.Reporting.WebForms.ReportDataSource rtp.Name = "RelatorioProposta_Proposta_Produtos" Dim tp = New RelatorioPropostaTableAdapters.Proposta_ProdutosTableAdapter Dim dtp As New System.Data.DataTable ''''''''aqui não sei como pegar o ID da proposta em questão, por isso está aí com um ID qualquer do meu banco''''''''' dtp = tp.GetDataProdutos("100000220", "100000221", "101") rtp.Value = dtp e.DataSources.Add(rtp) Catch ex As Exception End Try End Sub Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init Try Dim _ID As String = Request.QueryString("id") Dim arq As New XmlDocument Dim teste As New System.IO.DirectoryInfo(Server.MapPath("/sistema/pages/atendimento-venda")) Dim arquivos As System.IO.FileInfo() arquivos = teste.GetFiles("Proposta1.rdlc") Dim testando As System.IO.FileInfo For Each arquivo As System.IO.FileInfo In arquivos testando = arquivo Next arq.Load(testando.OpenText) Dim ms As New IO.MemoryStream(Encoding.UTF8.GetBytes(arq.OuterXml)) ''''''SubProdutos'''''' Dim arqProd As New XmlDocument Dim DIprod As New System.IO.DirectoryInfo(Server.MapPath("/sistema/pages/atendimento-venda")) Dim arquivosProd As System.IO.FileInfo() arquivosProd = DIprod.GetFiles("SubProdutos.rdlc") Dim testandoProd As System.IO.FileInfo For Each arquivoProd As System.IO.FileInfo In arquivosProd testandoProd = arquivoProd Next arqProd.Load(testandoProd.OpenText) Dim msProd As New IO.MemoryStream(Encoding.UTF8.GetBytes(arqProd.OuterXml)) ''''''''''''''''''''''' Dim rds As Microsoft.Reporting.WebForms.ReportDataSource rds = New Microsoft.Reporting.WebForms.ReportDataSource rds.Name = "RelatorioProposta_Proposta_Dados" Dim ta = New RelatorioPropostaTableAdapters.Proposta_DadosTableAdapter Dim dtb As New System.Data.DataTable dtb = ta.GetData(_propostaID, _propostaID, _empresaID) rds.Value = dtb ReportViewer1.LocalReport.DataSources.Clear() ReportViewer1.LocalReport.DataSources.Add(rds) ReportViewer1.LocalReport.EnableExternalImages = True ReportViewer1.LocalReport.LoadReportDefinition(ms) ''''''SubProdutos'''''' ReportViewer1.LocalReport.LoadSubreportDefinition("SubProdutos", msProd) AddHandler ReportViewer1.LocalReport.SubreportProcessing, AddressOf ProdutosSubreportProcessingEventHandler ReportViewer1.LocalReport.Refresh() ''''''''''''''''''''''' Dim streamids As String() = Nothing Dim mimeType As String = Nothing Dim _encoding As String = Nothing Dim fileNameExtension As String = ".pdf" Dim exportBytes() As Byte = ReportViewer1.LocalReport.Render("PDF", Nothing, mimeType, _encoding, fileNameExtension, streamids, Nothing) HttpContext.Current.Response.Buffer = True HttpContext.Current.Response.Clear() HttpContext.Current.Response.ContentType = mimeType HttpContext.Current.Response.AddHeader("content-disposition", ("inline; filename=Proposta.pdf")) HttpContext.Current.Response.BinaryWrite(exportBytes) HttpContext.Current.Response.Flush() HttpContext.Current.Response.End() Catch ex As Exception End Try End Sub
Muito obrigado desde já a todos.
Caio
Respostas
-
Olá Caio,
Para resolver esta questão, você precisa realizar um merge em seu DataSource, para cada proposta vc realiza um merge.
Por exemplo:
string[] listaCodPassado = codPassados.Split(';'); TableAdapter ta = new TableAdapter(); DataTable tb = new DataTable(); for (int i = 0; i < listaCodPassado.Length; i++) tb.Merge(ta.SelecionaDados(listaCodPassado[i])); //Onde o método SelecionaDados retorna as informações referênte apenas ao cod passado
Veja isto:
http://rafaelzaccanini.net/2010/11/11/criando-relatorios-com-o-report-viewer/
Abs,
Rafael Zaccanini
MTAC - Microsoft Technical Audience Contributor
- Marcado como Resposta Caio S Freitas quinta-feira, 9 de fevereiro de 2012 16:44
-
Debugando ele não entra no método ?
Quanto ao design de seu report, está tudo configurado corretamente? vc fez como no artigo ?
Abs- Marcado como Resposta Caio S Freitas quinta-feira, 9 de fevereiro de 2012 16:45
Todas as Respostas
-
Olá Caio,
Para resolver esta questão, você precisa realizar um merge em seu DataSource, para cada proposta vc realiza um merge.
Por exemplo:
string[] listaCodPassado = codPassados.Split(';'); TableAdapter ta = new TableAdapter(); DataTable tb = new DataTable(); for (int i = 0; i < listaCodPassado.Length; i++) tb.Merge(ta.SelecionaDados(listaCodPassado[i])); //Onde o método SelecionaDados retorna as informações referênte apenas ao cod passado
Veja isto:
http://rafaelzaccanini.net/2010/11/11/criando-relatorios-com-o-report-viewer/
Abs,
Rafael Zaccanini
MTAC - Microsoft Technical Audience Contributor
- Marcado como Resposta Caio S Freitas quinta-feira, 9 de fevereiro de 2012 16:44
-
Muito obrigado por responder Rafael, eu não entendi muito bem como e onde eu usaria esse esquema do Merge, achei no seu site um outro artigo que me foi bastante esclarecedor em relação a outras duvidas minhas:
O meu problema agora é fazer com o SubRelatório apareça no relatório, ele só vem com a mensagem: "Subreport could not be shown"
A execução passa por aqui
AddHandler ReportViewer1.LocalReport.SubreportProcessing, AddressOf Me.ProdutosSubreportProcessingEventHandler
mas não entra no meu metodo ProdutosSubreportProcessingEventHandler, que equivale ao RenderizaSubRelatorioPedido do seu artigo.
Valeu pela atenção, grande abraço.
Caio
-
Debugando ele não entra no método ?
Quanto ao design de seu report, está tudo configurado corretamente? vc fez como no artigo ?
Abs- Marcado como Resposta Caio S Freitas quinta-feira, 9 de fevereiro de 2012 16:45
-
não está entrando no metodo.
o design está configurado corretamente (pelo menos parece estar, refiz tudo novamente kkk).
será que existe alguma relação entre o size do componente SubReport do relatorio pai e o size do sub-relatorio?
ou o problema pode ser pq o subreport está sendo criado dentro de uma matrix?
Caio
- Editado Caio S Freitas terça-feira, 7 de fevereiro de 2012 19:13
-
Muito estranho heim...
Não tem sentido não o tamanho, nem por estar em uma Matrix!
Tente fazer sem esta linha na chamada principal:
ReportViewer1.LocalReport.LoadSubreportDefinition("SubProdutos", msProd)
Pois no exemplo, eu verifico qual é o subreport dentro do próprio método RenderizaSubRelatorioPedido !!
...
-
consegui resolver o problema, faltava setar o rdlc junto ao componente report viewer do asp. não tinha feito isso antes porque quando não usava sub-relatórios funcionava normalmente
obrigados a todos e em especial ao Rafael por ter ajudado muito, como eu não teria conseguido sem os artigos escritos por ele, estou marcando-o como resposta ao tópico
grande abraço
Caio