none
Como chamar dinâmicamente um relatório ?

    Pergunta

  • 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:

     

      Dim relatorio1 As New rptRelA
      Dim relatorio2 as New rptRelB
    
    e ai poderia utilizar esses objetos (relatórios).

     

    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
    segunda-feira, 5 de setembro de 2011 17:01

Respostas

  • 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
    terça-feira, 6 de setembro de 2011 14:45

Todas as Respostas

  • 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:15
  • 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:31
  • 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
    terça-feira, 6 de setembro de 2011 14:45