 Crystal Reports - Erros de
acesso a banco de dados I
 Crystal Reports - Erros de
acesso a banco de dados IO 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:
 ? 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