Como chamar dinâmicamente um relatório ?
-
segunda-feira, 5 de setembro de 2011 17:01
Olá Pessoal,
Estou utilizando o Visual Studio 2010 (VB.NET) e o Crystal Reports (SAP Crystal Reports version for Visual Studio 2010).
Tenho vários relatórios, mas gostaria de instancia-los dinamicamente, onde o nome do relatório estaria em uma variável:
Por exemplo, tenho dois relatorios criados no meu projeto, rptRelA.rpt e rptRelB.rpt
Para utiliza-los deveria declarar 2 variáveis:
e ai poderia utilizar esses objetos (relatórios).Dim relatorio1 As New rptRelA Dim relatorio2 as New rptRelB
Como eu faço para declarar apenas uma variável e posteriormente definir qual é o relatório. Tentei fazer o seguinte:
Dim nomerel As String nomerel = "rptRelA" Dim reportType As Type reportType = Type.GetType(nomerel, True, True) Dim rpt As CrystalDecisions.CrystalReports.Engine.ReportClass rpt = Activator.CreateInstance(reportType) 'aqui exporto para PDF, apenas para testar que funcionou o relatório rpt.ExportToDisk(ExportFormatType.PortableDocFormat,"C:\testerel.pdf")
Pensei em utilizar a classe ReportClass e depois atribuir o valor com o "Activator.CreateInstance", mas não funcionou. Alguém já precisou fazer algo parecido ?Desde já, obrigado pela atenção,
att,
Eli Candido Jr
ECJ
Todas as Respostas
-
terça-feira, 6 de setembro de 2011 14:15
Eli, não sei se lhe ajuda mas, usando o Report Viewer para carregar dinamicamente um determinado relatório escolhido pelo usuário, faço desta forma:
Public Sub lsubCarregaRelatorio(ByVal lobjValorParametros() As Object, ByVal lstrNomeParametros() As String, ByVal lstrNomeProcedure As String) Dim lrptRelatorio As New ReportDocument Dim lstrCaminho As String = "C:\MeuSistema\" Dim lconInfo As New ConnectionInfo Dim ltblInfo As New TableLogOnInfo Dim lparParametro As ParameterFieldDefinition Dim lfilCampo As ParameterFieldDefinitions Dim ldisDiscrete As ParameterDiscreteValue Dim lvalValor As ParameterValues Dim lstrTexto As String ' Passa os dados para conexão do relatório com o banco lconInfo.DatabaseName = "meuBanco" lconInfo.ServerName = "meuServidor" lconInfo.UserID = "meuUsuario" lconInfo.Password = "minhaSenha" ' Carrega os relatórios de acordo com o nome ' mstrNomeRelatorio é uma propriedade que recebeu o nome do relatório que será visualizado If mstrNomeRelatorio = "relA" Then ' Carrega o arquivo rpt lrptRelatorio.Load(lstrCaminho + "Relatorios\relA.rpt") ElseIf mstrNomeRelatorio = "relB" Then ' Carrega o arquivo rpt lrptRelatorio.Load(lstrCaminho + "Relatorios\relB.rpt") End If ' Realiza a conexão das tabelas do relatório ' Para cada tabela do seu relatório no Crystal, é necessário a validação de login e senha For Each ltblTable As Table In lrptRelatorio.Database.Tables ltblInfo.ConnectionInfo = lconInfo ltblTable.ApplyLogOnInfo(ltblInfo) Next ' Recebe os parâmetros existentes no rpt lfilCampo = lrptRelatorio.DataDefinition.ParameterFields ' Loop que irá configurar cada parâmetro For lintContador As Integer = 0 To UBound(lobjValorParametros) lparParametro = lfilCampo.Item(lstrNomeParametros(lintContador)) lvalValor = lparParametro.CurrentValues ldisDiscrete = New ParameterDiscreteValue ' Verifica o tipo de dado para passar o valor correto If IsDate(lobjValorParametros(lintContador)) Then ldisDiscrete.Value = IIf(lobjValorParametros(lintContador) = "00:00:00" Or lobjValorParametros(lintContador) = "0001-01-01 00:00:00", "1899-12-30", lobjValorParametros(lintContador)) ElseIf IsNumeric(lobjValorParametros(lintContador)) Then ldisDiscrete.Value = lobjValorParametros(lintContador) Else ldisDiscrete.Value = IIf(Trim(lobjValorParametros(lintContador)) = "NULL", DBNull.Value, Trim(lobjValorParametros(lintContador))) End If ' Adiciona e confirma os valores lvalValor.Add(ldisDiscrete) lparParametro.ApplyCurrentValues(lvalValor) Next crvVisualizador.ReportSource = lrptRelatorio crvVisualizador.Refresh() End Sub
Lembrando que aqui é um exemplo mais completo. Todos meus relatórios são baseados em StoredProcedures. Sendo assim, lobjValorParametros e lstrNomeParametros são recebidos com a lista (vetor) de parâmetros (na mesma ordem dos parâmetros do relatório no Crystal).
Leonardo Borges 'Xis'
"Mas a persistência é o que leva a perfeição."
Se a resposta for útil, marque-a. Poderá ser útil para outros desenvolvedores. -
terça-feira, 6 de setembro de 2011 14:31
Olá Leonardo ! muito obrigado pela resposta,
mas o problema é que no meu caso o relatório (.rpt) está incluso no projeto e não separado. No seu exemplo você passa o caminho físico do arquivo: C:\MeuSistema\Relatorios\relA.rpt
Eu não posso, pois ao compilar o programa o rpt ficará incluso na dll do projeto e não o arquivo isolado.
Existe outra alternativa ?
De qlqr forma mais uma vez, muito obrigado.
ECJ -
terça-feira, 6 de setembro de 2011 14:45
Eli, quando pesquisava uma forma de fazer essa exibição dinamicamente, me deparei com esse seu problema. Usei esse link como referência, mas optei por carregá-lo de um diretório mesmo.
Leonardo Borges 'Xis'
"Mas a persistência é o que leva a perfeição."
Se a resposta for útil, marque-a. Poderá ser útil para outros desenvolvedores.- Marcado como Resposta Eli Candido Jr terça-feira, 6 de setembro de 2011 16:41

