Inquiridor
Tratando o relatório feito com Microsoft Reporting como uma classe

Pergunta
-
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 -
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 -
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 -
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 -
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 -
Henrique,Fiz um post explicando no meu blog http://egomesbrandao.blogspot.com/2009/05/usando-relatorios-embedded-resource-com.html[]'s
Brandão .NET Developer