none
Report Viewer - Problema com SubReport - Itens relacionados de uma tabela RRS feed

  • 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 


     

    sexta-feira, 3 de fevereiro de 2012 18:52

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

    www.rafaelzaccanini.net

    • Marcado como Resposta Caio S Freitas quinta-feira, 9 de fevereiro de 2012 16:44
    sexta-feira, 3 de fevereiro de 2012 20:20
  • 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
    terça-feira, 7 de fevereiro de 2012 16:07

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

    www.rafaelzaccanini.net

    • Marcado como Resposta Caio S Freitas quinta-feira, 9 de fevereiro de 2012 16:44
    sexta-feira, 3 de fevereiro de 2012 20:20
  • 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:

    http://rafaelzaccanini.net/2011/05/19/criando-relatorios-report-viewer-em-aplicacoes-asp-net-mvc-parte-2-criando-um-sub-relatorio

    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

     

    segunda-feira, 6 de fevereiro de 2012 19:27
  • 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
    terça-feira, 7 de fevereiro de 2012 16:07
  • 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

    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 !!

    ...

    terça-feira, 7 de fevereiro de 2012 19:20
  • 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

    quinta-feira, 9 de fevereiro de 2012 16:44