none
Crystal reports sem ODBC RRS feed

  • Pergunta

  • Olá Pessoal estou com um problema.

    Todos os meus rpt's são com procedure e via código, faço a chamada do relatório e a passagem dos parametros. Utilizo o ODBC para abertura da minha base de Dados.

    Decidimos não utilizar o ODBC para gerenciar a apertura da base de dados.

    Fiz alguns teste com tutoriais encontrado na net, e encontrei uma solução, porém nao funciona para rpt que utiliza procedure. Alguém ja esteve com algum problema deste, pareciso ou que saiba como resolver?

    Desde ja agradeço.

    O código encontrado na net é:

       Dim RptFile As String = "RelTempoSirene.rpt"
       Dim gDatabaseName As String = <NomeBase>            
       Dim gServerUser As String = <UserBase>
       Dim gServerPassword As String = <SenhaBase>
       Dim gServer as String =<NomeServer>
          If System.IO.File.Exists(RptFile) Then
                 Dim crReportDocument As New ReportDocument()
                 crReportDocument.Load(RptFile)
                 Dim param As New CrystalDecisions.Shared.ParameterField
                 param = crReportDocument.ParameterFields("@IdFilial")
                 param.CurrentValues.AddValue("1")
                 param = crReportDocument.ParameterFields("@TipoStatus")
                 param.CurrentValues.AddValue("T")
                 param = crReportDocument.ParameterFields("@StatusPainel")
                 param.CurrentValues.AddValue("T")
                 CrystalReportViewer1.ReportSource = crReportDocument
                 crReportDocument.SetDatabaseLogon(gServerUser, gServerPassword, gDatabaseName, gServer )
            End If
    

     


    Wolney Fernandes
    quinta-feira, 3 de novembro de 2011 12:00

Respostas

  • Wolney, estão faltando alguns elementos ai. Segue um método que criei e uso para carregar rpts que usam um Stored Procedure:

    Public Sub lsubCarregaRelatorio(ByVal lobjValorParametros() As Object, ByVal lstrNomeParametros() As String)
            Dim lrptRelatorio As New ReportDocument
            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
    
            '# Verifica o acesso ao arquivo .rpt
            If (System.IO.File.Exists("CaminhoRelatorios\NomeRelatorio) = False) Then
                MessageBox.Show("Não foi possível acessar o relatório." & vbCrLf & _
                                "Se o erro persistir, entre em contato com o Administrador.", "Sistema", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                Exit Sub
            End If
    
            '# Passa os dados para conexão
            lconInfo.DatabaseName = "Banco"
            lconInfo.ServerName = "Servidor"
            lconInfo.UserID = "Usuario"
            lconInfo.Password = "Senha"
    
            '# Carrega o arquivo rpt
            lrptRelatorio.Load("CaminhoRelatorios\Relatorio.rpt")
    
            '# Realiza a conexão das tabelas do relatório
            For Each ltblTable As Table In lrptRelatorio.Database.Tables
                ltblInfo.ConnectionInfo = lconInfo
                ltblTable.ApplyLogOnInfo(ltblInfo)
            Next
    
            '# Conexão das tabelas dos subrelatórios (CASO EXISTA)
            For lintContador = 1 To lrptRelatorio.Subreports.Count
                For Each ltblTable As Table In lrptRelatorio.Subreports(lintContador - 1).Database.Tables
                    ltblInfo.ConnectionInfo = lconInfo
                    ltblTable.ApplyLogOnInfo(ltblInfo)
                Next
            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 é meu objeto CrystalReportViewer
            crvVisualizador.ReportSource = lrptRelatorio
            crvVisualizador.Refresh()
    
        End Sub
    

    Sendo que lobjValorParametros é um vetor contendo os valores dos parâmetros e lstrNomeParametros é um vetor contendo os nomes dos parâmetros, na mesma ordem do outro vetor. Por exemplo, se @IdFilial está na posição zero do lstrNomeParametros, 1 está na posição zero do vetor lobjValorParametros, correspondendo assim ao mesmo campo.


    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.
    • Sugerido como Resposta Leonardo Borges 'Xis' quinta-feira, 3 de novembro de 2011 17:19
    • Marcado como Resposta Wolneyaf quinta-feira, 3 de novembro de 2011 18:07
    quinta-feira, 3 de novembro de 2011 13:01
  • Desculpe, achei que era pra web. Mudou o tipo de conexão no relatório? Ele deve estar como ODBC.

    De qualquer forma, esse erro é complicado. Tive ele desenvolvendo alguns relatórios e a solução era diferente em algumas ocasiões. Mas normalmente tinham a ver com o ambiente (instância do banco, portas, etc), e não com o código em si.


    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.
    • Sugerido como Resposta Leonardo Borges 'Xis' quinta-feira, 3 de novembro de 2011 17:19
    • Marcado como Resposta Wolneyaf quinta-feira, 3 de novembro de 2011 18:07
    quinta-feira, 3 de novembro de 2011 17:02

Todas as Respostas

  • Wolney, estão faltando alguns elementos ai. Segue um método que criei e uso para carregar rpts que usam um Stored Procedure:

    Public Sub lsubCarregaRelatorio(ByVal lobjValorParametros() As Object, ByVal lstrNomeParametros() As String)
            Dim lrptRelatorio As New ReportDocument
            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
    
            '# Verifica o acesso ao arquivo .rpt
            If (System.IO.File.Exists("CaminhoRelatorios\NomeRelatorio) = False) Then
                MessageBox.Show("Não foi possível acessar o relatório." & vbCrLf & _
                                "Se o erro persistir, entre em contato com o Administrador.", "Sistema", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                Exit Sub
            End If
    
            '# Passa os dados para conexão
            lconInfo.DatabaseName = "Banco"
            lconInfo.ServerName = "Servidor"
            lconInfo.UserID = "Usuario"
            lconInfo.Password = "Senha"
    
            '# Carrega o arquivo rpt
            lrptRelatorio.Load("CaminhoRelatorios\Relatorio.rpt")
    
            '# Realiza a conexão das tabelas do relatório
            For Each ltblTable As Table In lrptRelatorio.Database.Tables
                ltblInfo.ConnectionInfo = lconInfo
                ltblTable.ApplyLogOnInfo(ltblInfo)
            Next
    
            '# Conexão das tabelas dos subrelatórios (CASO EXISTA)
            For lintContador = 1 To lrptRelatorio.Subreports.Count
                For Each ltblTable As Table In lrptRelatorio.Subreports(lintContador - 1).Database.Tables
                    ltblInfo.ConnectionInfo = lconInfo
                    ltblTable.ApplyLogOnInfo(ltblInfo)
                Next
            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 é meu objeto CrystalReportViewer
            crvVisualizador.ReportSource = lrptRelatorio
            crvVisualizador.Refresh()
    
        End Sub
    

    Sendo que lobjValorParametros é um vetor contendo os valores dos parâmetros e lstrNomeParametros é um vetor contendo os nomes dos parâmetros, na mesma ordem do outro vetor. Por exemplo, se @IdFilial está na posição zero do lstrNomeParametros, 1 está na posição zero do vetor lobjValorParametros, correspondendo assim ao mesmo campo.


    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.
    • Sugerido como Resposta Leonardo Borges 'Xis' quinta-feira, 3 de novembro de 2011 17:19
    • Marcado como Resposta Wolneyaf quinta-feira, 3 de novembro de 2011 18:07
    quinta-feira, 3 de novembro de 2011 13:01
  • Gostei da Rotina bem dinamica, mas esta dando um erro.

    Falha ao abrir a conexao
    Falha ao abrir a conexao
    <o meu rpt>{1E7D852C-7667-46CB-95E8-8UY766778U7}.rpt


    Wolney Fernandes
    quinta-feira, 3 de novembro de 2011 14:00
  • Em que momento ocorre isso? Existe mais detalhes sobre o erro?
    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.
    quinta-feira, 3 de novembro de 2011 14:07
  • Não tem detalhe, este erro acontece qdo está carregando o rpt, não gera nenhuma excessao no código.

    No rpt tem alguma configuração que preciso fazer?


    Wolney Fernandes

    • Editado Wolneyaf quinta-feira, 3 de novembro de 2011 14:31
    quinta-feira, 3 de novembro de 2011 14:28
  • No CrystalReportViewer1, marque a opção EnableDatabaseLogonPromp para True e verifique se passando os dados "na mão" vai funcionar. Lembre-se de comentar as linhas que fazem a conexão no código (lconInfo e For Each's).

    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.
    quinta-feira, 3 de novembro de 2011 15:05
  • Mas nao tem esta propriedade no CrystalReportViewer1.
    Wolney Fernandes
    quinta-feira, 3 de novembro de 2011 16:27
  • Desculpe, achei que era pra web. Mudou o tipo de conexão no relatório? Ele deve estar como ODBC.

    De qualquer forma, esse erro é complicado. Tive ele desenvolvendo alguns relatórios e a solução era diferente em algumas ocasiões. Mas normalmente tinham a ver com o ambiente (instância do banco, portas, etc), e não com o código em si.


    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.
    • Sugerido como Resposta Leonardo Borges 'Xis' quinta-feira, 3 de novembro de 2011 17:19
    • Marcado como Resposta Wolneyaf quinta-feira, 3 de novembro de 2011 18:07
    quinta-feira, 3 de novembro de 2011 17:02
  • Ok mudei  para ADO, deu certo!

    Valeu cara.

    Notei que o cristal tem como passar uma connection string você tem algum exemplo usando uma connection string?

    Agradeço pela ajuda!


    Wolney Fernandes
    quinta-feira, 3 de novembro de 2011 17:10
  • Nunca usei, pois como passo os dados pelo ConnectionInfo (lconInfo), acho que fica mais organizado manter toda essas informações de parâmetros e conexão na mesma classe. Deve ter algo, mas como nunca usei, não vou dar um suporte sem ter certeza.
    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.
    quinta-feira, 3 de novembro de 2011 17:19
  • Ok, vc me ajudou bastante. Obrigadao!
    Wolney Fernandes
    quinta-feira, 3 de novembro de 2011 18:07