none
Tratando o relatório feito com Microsoft Reporting como uma classe RRS feed

  • Pergunta

  • Pessoa,

    Nunca usei o MS Reporting, por isso quero saber se é possível tratá-lo como uma classe como no Crystal Reports.


    Brandão .NET Developer
    quarta-feira, 6 de maio de 2009 18:50

Todas as Respostas

  • Olá Brandão

    Nao trabalho com Crystal, por isso não sei se entendi bem, mas vamos lá.

    Voce pode criar um objeto ReportViewer via codigo e definir tudo que voce precisa:

    // instancia
    ReportViewer rv = new ReportViewer();

    // define o arquivo rdlc
    rv.LocalReport.ReportEmbededResource = "relatorio.rdlc";

    E assim por diante......
    O arquivo RDLC é o seu relatorio propriamente dito (da mesma forma que voce monta no Crystal) e constitui uma classe.

    []s


    Robson Castilho - Desenvolvedor C# - MCTS .Net 2.0 Windows Applications
    quarta-feira, 6 de maio de 2009 23:45
  • Robson,

    É mais ou menos isso... Só que o meu arquivo de relatório está em um assembly diferente da camada de apresentação, que é onde eu tenho o ReportViewer.
    No Crystal, eu posso instanciar o relatório, pois ele é uma classe, e passá-lo pelas camadas da aplicação para fazer a visualiação. No seu exemplo você esta indicando apenas o nome do arquivo, como se fosse um arquivo externo.
    Brandão .NET Developer
    quinta-feira, 7 de maio de 2009 17:53
  • Olá,

    (Correcao: Na ultima frase do post anterior, eu quis dizer "e NAO constitui uma classe").

    Vamos lá...

    "Como se fosse um arquivo externo", mas na verdade nao é... Ele esta embutido na aplicacao, portanto pode estar embutido em sua classe, inclusive em outro assembly, sem problemas.

    Se o problema é apenas "ocultar" o "relatorio.rdlc" da camada de apresentacao, voce cria uma classe para retorna-lo na mesma camada onde esta o .rdlc. E na camada de apresentacao, voce configura seu controle ReportViewer de acordo com essa classe, mais ou menos assim:

    // CAMADA DE APRESENTACAO
    // arquivo
    rv.LocalReport.ReportEmbededResource = ClasseRelatorio.ArquivoRDLC ;

    // data source
    ReportDataSource rptDataSource = new ReportDataSource(ClasseRelatorio.DataSourceName , ClasseRelatorio.DataSourceValue );
    rv.LocalReport.DataSources.Add(rptDataSource);

    Em negrito, sua ClasseRelatorio (aqui no exemplo, é estatica) devolvendo o nome do arquivo rdlc, o nome do datasource e o datasource propriamente dito (com os dados).

    Não sei se "viajei"...Qualquer coisa, poste um trecho do seu codigo, da maneira que voce faz com o Crystal, que fica mais facil pra entender.

    []s

    Robson Castilho - Desenvolvedor C# - MCTS .Net 2.0 Windows Applications
    sexta-feira, 8 de maio de 2009 03:36
  • Robson,

    No Crystal Reports eu tenho um form com o componente de viewer dele, o código é assim:

    rptDoc.SetDataSource(Me._ds)
    Me.rptViewer.ReportSource = RptDoc
    A classe rptDoc é um relatório, no CR o relatório é uma classe, e não um XML como é o caso do RDLC. Então eu instâncio essa classe do relatório, passo através das camas, defino a fonte, no código acima é um DataSet, e depois é só passar para o componente visual para renderizar o relatório.

    Eu não entendi ainda como fazer isso, pois eu não consegui atribuir um relatório para o componente de viewer do MS Reporting.

    Eu estou fazendo assim:

    this.reportViewer.LocalReport.ReportEmbeddedResource = "SLP.Model.Reports.rptTeste.rdlc";
    this.reportViewer.RefreshReport();
    E dá a seguinte mensagem de erro: The source of report definition has not been specified.
    Mas eu não estou colocando fonte de dados nenhuma no meu relatório, no momento, só estou fazendo um teste, para ver se abre o arquivo do relatório.
    Mas essa abordagem já me traz um problema, a camada que tem o ReportViewer não pode conhecer a camada onde esta o arquivo do relatório, eu quero montar baseado na classe Microsoft.Reporting.WinForms.Report e passar para o ReportViewer.

    Brandão .NET Developer
    sexta-feira, 8 de maio de 2009 17:40
  • Boa noite,

    Também estou precisando de instanciar  como objetos os arquivos rdlc, localizados em outro assembly.

    O que me incomoda é que o reportSource do ReportViewer é uma String, isso está me deixando confuso.

    Tentei fazer desta forma, mas não funcionou:

    'Na assembly que contém os rdlc:
    Imports Microsoft.Reporting.WinForms
    
    Public Class SetRpt
    
    #Region "Enums"
    
        Enum eReport
            Nenhum
            PlanoDeContasSimples
            PlanoDeContasCompleto
        End Enum
    
    #End Region
    
    #Region "Properties"
    
        Private _rpt As String
        Public Property CurrentReport() As String
            Get
                Return _rpt
            End Get
            Set(ByVal value As String)
                _rpt = value
            End Set
        End Property
    
        Public Function SetReport(ByVal rpt As eReport) As String
            Select Case rpt
                Case eReport.PlanoDeContasCompleto
                    Return "EfContRpt.rpt_planocontasC.rdlc"
                Case eReport.PlanoDeContasSimples
                    Return "EfContRpt.rpt_planocontas.rdlc"
                Case Else
                    Return Nothing
            End Select
        End Function
    
    #End Region
    
    End Class
    
    'Na assembly do aplicativo:
    Dim rpt As New EfContRpt.SetRpt

    'ReportViewer1.LocalReport.ReportEmbeddedResource = rpt.SetReport(EfContRpt.SetRpt.eReport.PlanoDeContasSimples)

    ReportViewer1.LocalReport.ReportPath = rpt.SetReport(EfContRpt.SetRpt.eReport.PlanoDeContasSimples)

    Estou começando a achar que não há outra forma senão deixar os rdlc em uma pasta "Relatórios" à parte, pois dentro de uma assembly separada nao está dando certo. Isso seria seguro?


    Henrique Clausing
    terça-feira, 19 de maio de 2009 23:32
  • Henrique,


    []'s

    Brandão .NET Developer
    quarta-feira, 20 de maio de 2009 17:55