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:
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:
2- Se você estiver usando um banco de dados padrão desktop ( Access, Clipper, Dbase , FoxPro, etc...). Verifique o seguinte:
3- Se você esta usando uma conexão com um driver ODBC .
Para verificar se o Crystal esta usando uma conexão ODBC faça o seguinte:
- Abra o relatório no Crystal Report e no menu - Database - selecione a opção - Convert Database Driver -
- Observe o nome não selecionado na frente de From:
- Pdsodbc.dll - indica que a conexão é ODBC
- Pdsoledb.dll - indica que a conexão é OLE DB
- 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 :
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 :
|
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. |
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. |
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. |
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.
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