Usuário com melhor resposta
Crystal reports sem ODBC

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
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
-
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
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
-
-
-
-
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. -
-
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
-
-
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. -