Crystal Reports - Erros de acesso a banco de dados I


O Crystal Reports é uma das melhores ferramentas para gerar relatórios ; além de ser fácil de usar , oferecer diversos recursos é multiplataforma. Mas nem tudo é uma mar de rosas. Quem , ao usar o Crystal , não se deparou com mensagens de erros que lhe causaram grandes dores de cabeça. Geralmente a conexão com um banco de dados é o grande vilão das mensagens de erro encontradas ao tentar gerar o seu relatório em tempo de execução.

Esses erros são devido aos seguintes fatores:

  1. Falta de arquivos de dependência ou de arquivos do aplicativo cliente.
  2. Falta de arquivos ou versão atualizada para as DLLs para banco de dados.(Ex: P2sodbc.dll)
  3. Configuração incorreta para o DSN ou falta de configuração ODBC.
  4. Informação de login incorreta
  5. Sintaxe incorreta para a chamada de propriedades ou métodos do banco de dados

Geralmente a primeira coisa que pensamos quando da ocorrência de um erro nestas condições é: Por onde começar ?

Bem , que tal começar pelo começo ? Na verdade a regra básica é a seguinte:

"Tenha completa certeza de que o seu relatário esta rodando corretamente no Crystal report Designer. Se o seu relatório falhar ao tentar a conexão em tempo de desenho sempre vai falhar em tempo de execução na aplicação."

Neste artigo vou abordar os principais erros relacionados com banco de dados usando o Crystal Reports e suas possíveis soluções. Lembre-se que devido a complexidade de cada ambiente nem sempre teremos uma solução que vai servir para todos , mesmo quando o erro parece ser o mesmo.Vamos lá...

Crystal Reports : problemas e possíveis soluções

Devido a diversidade de banco de dados vamos considerar as principais plataformas usadas:

1- Se você estiver usando um banco de dados padrão SQL (Oracle, SQL Server , DB2, Informix,etc..) você deve verificar o seguinte:

  1. O software para banco de dados Cliente esta corretamente instalado ? Geralmente ele precisa estar instalado no driver local.
  2. O diretório padrão de instalação para o software cliente do banco de dados esta corretamente informado no caminho de busca do computador local.(Ex: c:\MSSQL\BIN )
    1. Você pode verificar isto executando o comando : path na linha de comando do DOS.
  3. Você deve ser capaz de se conectar com o banco de dados a partir do seu software de banco de dados fora do ambiente Crystal Reports.

2- Se você estiver usando um banco de dados padrão desktop ( Access, Clipper, Dbase , FoxPro, etc...). Verifique o seguinte:

  1. O banco de dados esta instalado na sua maquina local ?
  2. Você consegue acessar e visualizar todos os dados do banco de dados fora do ambiente do Crystal Reports ?
  3. Você possui as permissões de acesso corretamente configuradas para acessar o banco de dados ?

3- Se você esta usando uma conexão com um driver ODBC .

  1. Faça um teste de conexão usando a ferramenta sqlcon32.zip . Esta ferramenta é disponibilizada pela Seagate Software e permite testar e debugar possíveis problemas com drivers ODBC instalados.
    1. O link para download é : http://support.crystaldecisions.com/communityCS/FilesAndUpdates/sqlcon32.zip.asp

Para verificar se o Crystal esta usando uma conexão ODBC faça o seguinte:

  1. Pdsodbc.dll - indica que a conexão é ODBC
  2. Pdsoledb.dll - indica que a conexão é OLE DB
  3. Pd*.dll - indica que a conexão é nativa.(Acima temos indica na tela esta opção)

Vejamos agora os principais erros relacionados a banco de dados :

  1. 20532 error: 'Cannot find database DLL'
Após instalar a versão 8.x do Crystal Reports ao criar ou abrir um projeto do Visual Basic que utiliza o componente - Crystal Reports ActiveX (OCX) com o Microsoft Data Control quando você tentar visualizar um relatório vinculado irá obter a mensagem de erro : Run-time error: '20532': Cannot find database DLL
Solução:
Este ocorre pois o componente para controle Vinculado ao banco de dados DLL - P2bbnd.dll - não esta incluso com a instalação da versão 8.0 do Crystal Reports. Você vai precisar realizar uma instalação personalizada :
  1. Inicie o setup do Crystal Reports 8.0 novamente
  2. Clique em Add/Remove e na seção : 'Select Features' expanda 'Data Access'
  3. Clique em 'Bound Reporting' e então clique a seguir em : 'Entire feature will be installed on local hard drive'.
  4. Clique em 'Next'.
  5. Clique em 'Next' para instalar o driver e continue com o setup até completar.
  1. -Error detected by database DLL
    -Database DLL is corrupt
    -Incorrect session parameters
Quando uma aplicação usando a versão 4.6 (Crystl32.ocx) do CR estiver acessando a versão 97 do Microsoft Access. Após a instalação do Access 2000 as mensagens de erros acima podem aparecer.
Solução:
Existem 3 fatores que podem gerar este erro:

1. A versão 4.6 da OCX Crystl32.ocx
      - Irá falhar ao tentar se conectar com o banco de dados Microsoft Access 2000.
      - Irá falhar ao tentar se conectar com o banco de dados Microsoft Access 97 através do arquivos de runtime do Microsoft Access 2000.

2. A versão dos arquivos de runtime do Microsoft Access instaladas na maquina do cliente :
       - Dao360.dll pode se conectar com o Microsoft Access 2000 e com o Microsoft Access 97.
       - Dao360.dll irá causar uma falha na conexão para a OCX - Crystl32.ocx.
       - Dao350.dll precisa estar instalada para que a ocx -Crystl32.ocx - consiga a conexão.

3. A versão dos drivers Crystal para o Microsoft Access :
P2bdao.dll, P2irdao.dll, and P2ctdao.dll.
      - Versão 7.0.100.2 e superior dos drivers do Crystal para o Microsoft Access irão usar a versão mais recente da DAO para se conectar com o banco de dados.
      - Se ambas as dlls ,
Dao360.dll e Dao350.dll , estiverem na máquina do cliente . A Dao360.dll será usada para se conectar com o Microsoft Access 97.

Se a versão 2000 do Microsoft Access estiver instalada na maquina as condições abaixo irão permitir que a crystl32.0cx faça a conexão com o Microsoft Access 97:
 
- O banco de dados deverá ser a versão Microsoft Access 97.
  - Os arquivos de runtime para o Microsoft Access 97 devem estar instalados na mquina do cliente.
  - Os drivers do Crystal para Microsoft Access drivers não podem ser da versão 7.0.100.2 ou superior.
  1. Error: 20500 "Not Enough Memory For Operation"
    Error: 20534 "Error detected by database DLL"
Na máquina do cliente , quando uma aplicação Visual Basic tenta imprimir um relatório feito no Crystal Reports versão 8.x diretamente para a impressora , podemos ter o seguinte erro:
Error: 20500 "Not Enough Memory For Operation"
Solução
A causa do erro 20500 é devido ao banco de dados. Se o relatório for enviado para visualização podemos ter o seguinte erro: Error: 20534 "Error detected by database DLL"

Isto pode ocorrer quando o relatório esta se conectando ao banco de dados Access 97 com senha , porem o Crystal esta apontando para um arquivo System.mdw incorreto.(Este arquivo possui as informações de segurança sobre os usuários.)

Uma forma de resolver a questão é usar o utilitário - Crystal Decisions - Sysdb32.zip, para apontar o Crystal e para o arquivo System.mdw correto de forma que a entrada no registro do windows coincida com a informação do Crystal.

O downloado do arquivo pode ser feito no link : http://support.crystaldecisions.com/downloads. Arquivo Sysdb32.zip.

  1. Error "20534: Error detected by database DLL"
Este erro pode ocorrer quando você usa o Crystal com um driver ODBC para se conectar a arquivos textos e tenta visualizar o relatório.

Detalhando a mensagem de erro temos:

Run time error '-2147467259 (80004005)' : [Microsoft][ODBC Text Driver]Selected collating sequence not supported by the operating system

Erros similares a este ocorrem com outras ferramentas de desenvolvimento Crystal Reports:
-
O Automation Server.
- A chamada a API do motor de impressão.
- O Report Designer Component

Solução
Este problema esta relacionado com o ambiente de desenvolvimento integrado do Visual Basic (IDE) para o service pack 3 ou superior. Veja o artigo da microsoft : Q246167 em http://msdn.microsoft.com
 

O código a seguir é uma maneira de você contornar o problema:

#Const fDebug = true
Dim logon as integer

On Error GoTo traperror:

With CrystalReport1
.ReportFileName = <caminho para arquivo rpt>
logon = .LogOnServer("pdsodbc.dll","<Seu DSN>","","","")
.Action = 1
End With

Traperror:

#If fDebug = true then
         If Err.Number = 20534 Then
CrystalReport1.Action = 1
         End If
#End If


O código somente vai rodar se a variável fDebug for igual a True. Quando você compilar sua aplicação para distribuição aos seus clientes defina fDebug como False , assim o VB não irá compilar ou rodar o código no arquivo executável.
  1. Error detected by database DLL
    Database DLL is corrupt
    Incorrect session parameters
Se você estiver usando a versão 4.6 do Crystal para acessar um banco de dados Access versão 97 e converter o banco de dados para a versão Access 2000 vai obter as mensagens acima.
Solução
A versão 4.6 do Crystal reports foi criada em 1996 e é imcompatível com o formato da versão 2000 do Access. Se você precisar usar a versão Access 2000 vai ter que atualizar a versão do seu Crystal Reports para versão 7.0 Maintenance Release 1 our superior. Esta versão é compativel já vem com os drivers compatíveis com o Access 2000. ( Os drivers são : P2bdao.dll, P2irdao.dll e P2ctdao.dll. )

O download destes drivers pode ser feito no link : www.crystaldecisions.com arquivo : access2000drivers.zip

Vejamos agora algumas situações que podem causar muitas dores de cabeça se você não estiver atento.

1 - Quais os arquivos devo distribuir para o cliente poder rodar os relatórios feitos no Crystal Reports ?

Aposto que você já se fez esta pergunta ! A resposta esta no próprio Crystal. Toda versão do Crystal possui em seu Help uma relação dos arquivos que deverão ser distribuídos para rodar os relatórios. Abra o Help e procure por : Runtime File Requirements.

Bingo !!! Você vai achar a relação dos arquivos. Abaixo temos a relação para a versão 4.6 do Crystal.

CRPE32.DLL
Interface para o motor de impressão 32 bit
MSVCRT20.DLL
Microsoft VC++ Run time Library
CRXLAT32.DLL
Somente se estiver usando a função - ToWords()
CO2C40??.DLL
Código de Linguagem
P2BBND.DLL
Incluir somente se estiver vinculando o CR ao Visual Basic Data Control
CTL3D32.DLL
Versão 2 para controles 3d.(deve estar no diretorio : windows/system32) 
PG32.DLL
Incluir somente se você estiver usando gráficos no seu relatório
CRYSTLxx.OCX
Estiver usando o arquivo:  Crystal ActiveX  ( XX representa 16 ou 32)
PG.DLL
Somente se estiver usando gráficos
CO2C40EN.DLL	
Somente se estiver usando objetos OLE nos relatórios (32 bit)
CRXLATE.DLL
Se estiver usando a função ToWords (x, # of places)
P2BBND.DLL
Se estiver vinculando o relatório ao um controle Data Control (32bit)

2- O que fazer com o seu relatório se o banco de dados mudou de localização ou foi renomeado ?

Se o banco de dados foi renomeado ou mudou de localização você vai receber uma mensagem de erro ao tentar rodar o relatório já existente ( Database Error ). Neste caso a solução é redefinir no relatório a nova localização ou o novo nome do banco de dados.

Use o comando Set Location para alterar a localização do banco de dados. Além disto o comando Set Location converte automaticamente o driver do banco de dados para a fonte de dados que você tiver escolhido. Assim você pode converter um acesso nativo para um acesso ODBC. Set Location não move fisicamente o banco de dados , apenas redireciona o Crystal Reports para localizar o banco de dados.

  1. No menu Database , selecione a opção - Set Location
  2. Clique no botão - Set Location ...
  3. Informe a localização do banco de dados na janela - Choose Database File

Para definir a localização do banco de dados para a localização do relatório ativo clique no botão - Same as Report.

Obs: Apos terminar de usar o Set Location use a opção - Verify Database no menu Database para atualizar qualquer mudança de estrutura feita no banco de dados.

Você pode redefinir a localização do banco de dados no seu código usando a propriedade - DataFiles. A sintaxe é a seguinte:

[form.]Report.DataFiles(ArrayIndex)[= Location$]

Você deve informar o nome e a localização para cada banco de dados ou tabela para a qual deseja alterar a localização. Vejamos um exemplo:

Report1.DataFiles(0) = "c:\teste\primeiro.mdb"
Report1.DataFiles(1) = "c:\teste\segundo.mdb"

Você pode definir um caminho relativo para o banco de dados e a seguir atribuí-lo a uma variável que será usada junto a propriedade DataFiles: Ex: Report1.DataFiles(0) = caminho

Por ora é só , voltaremos ao assunto em breve ...


José Carlos Macoratti