Gerando relatórios com o Crystal Reports

O Crystal Reports é um componente que permite a criação de relatórios personalizados de alto nível. Em substituto de relatórios em HTML puro, ele fornece uma assistência inovadora desde a criação até exportação. Para quem utiliza Java, há também uma versão específica para a linguagem. Mostraremos abaixo como gerar um simples relatório buscando dados de uma tabela em banco usando C#.

Abra/Crie um projeto do tipo Web Site no Visual Studio e no Solution Explorer clique com o direito no diretório onde deseja criar o relatório. Escolha Add New Item e opte pelo template Crystal Reports (note que a extensão de relatório do Crystal é .rtp). Nessa primeira tela escolha a primeira opção conforme a figura abaixo:


Clique em OK. Expanda o nó do Create New Connection e novamente expanda o OLE DB (ADO) para configuração de conexão (essa é a primeira conexão com o banco para início, depois mostraremos como usar para outro banco). Na configuração do ADO, escolha o tipo de provider a ser utilizado (no caso optei pelo SQL Server, então SQL Native Client) e dê Next.


Agora, em Connection Information, informe os dados de conexão.


Clique em Next e na última tela revise os dados. Se estiver tudo certo, clique em Finish. Você voltará à tela anterior já com a configuração realizada e o banco estará apto a selecionar os objetos. Procure qual objeto irá ser manipulado e exibido seus dados, podendo ser: uma tabela, um schema, uma view ou stored procedure. Clique no objeto desejado e, em seguida, clique no botão com a seta para direita conforme figura abaixo:


Clique em Next. Agora informe quais campos irão ser exibidos e escolha Next.


Na próxima tela, se precisar agrupar alguns campos, informe quais são. Se não precisar dê apenas Next. Se o Crystal identificar que está trabalhando com números, ele cria um passo adicional que é a opção de inserir gráficos. Outra tela que é exibida é a de Filtros. Se for ter filtros, informe-os. Caso contrário dê apenas Next. Ou seja, as duas últimas telas são parâmetros opcionais logo, se não desejar configurá-los, dê Next duas vezes. O último passo é escolher o estilo. Opte pelo mais parecido que quer e dê Finish.


Basicamente seu relatório está pronto, bastando ajustes da posição dos campos, design, cabeçalho, etc. Em Field Explorer, contêm as principais funcionalidades para fórmulas e cálculos avançados bem como a adição de novos campos. Como estamos elaborando um relatório simples, vamos parar por aí. Para ver um preview de como estará seu relatório com os dados, clique em Main Report Preview. Agora vamos ver como chamar pelo ASP.NET (C#).
Adicione uma página Impressao.aspx e nele adicione um objeto CrystalReportViewer que automaticamente irá ser registrado o assembly na página (puxando do ToolBox ele insere automaticamente). Se preferível configure alguns atributos do objeto como remoção da logo da BO, tema, etc. No code-behind, adicione os seguintes namespaces:

using CrystalDecisions.ReportSource;
using CrystalDecisions.Shared;
using CrystalDecisions.CrystalReports.Engine;
 
E para exibir os dados do relatório utilize o seguinte código:
 
DataSet ds = new DataSet();
// Antes, faço uma consulta no banco e jogo no DataSet para ser usado logo abaixo
ReportDocument relatorio = new ReportDocument();
relatorio.Load(Server.MapPath("Relatorio.rpt"));
relatorio.Database.Tables[0].SetDataSource(ds.Tables[0]);
// Esse é Viewer que puxamos antes
CrystalReportViewerRelatorio.ReportSource = relatorio;
CrystalReportViewerRelatorio.DataBind();
 
Pronto! Seu relatório será exibido...
 
 
Agora vamos aos problemas:
 
1) Fiz todo o processo mas ao exibir o relatório está pedindo login e senha do SQL Server
 
Se estiver usando DataSet, veja que só pude passar uma tabela por vez usando ds.Tables[0] e não apenas ds. Se quiser passar várias tabelas crie um DataSet tipado no App_Code ou informe uma a uma no atributo Database.
 
2) As imagens dos botões do relatório não estão aparecendo e ao clicar não funciona nada
 
Ao ser colocado em produção, verifique se o Crystal Reports está instalado corretamente na máquina. Veja se a pasta wwwroot\aspnet_client\system_web\ contêm a pasta CrystalReportWebFormViewer (depois da pasta system_web vem a versão do framework - exemplo 2_0_50727 - e em seguida vem ela). Copie a pasta aspnet_client e adicione na raiz de sua aplicação.
 
3) Ao exibir o relatório está aparecendo o erro: Não foi possível carregar arquivo ou assembly 'System.Web.Extensions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' ou uma de suas dependências. A definição do manifesto do assembly localizado não corresponde à referência do assembly. (Exceção de HRESULT: 0x80131040)
 
Faça os procedimentos informados nesse post.
 
4) Depois que é exibido o relatório, ao clicar no botão de imprimir ou exportar ou qualquer outro botão, não executa nenhum dos processos que deveria fazer
 
Se estiver usando ASP.NET AJAX e o CrystalReportViewer estiver dentro de um UpdatePanel, remova-o. Pois, ao clicar em desses botões, é feito um PostBack na página (além de tentar abrir uma janela pop-up) e o Crystal não funciona adequadamente quando utiliza o AJAX.
 
5) Ao tentar exibir o relatório, ocorre o seguinte erro: O inicializador de tipo de 'CrystalDecisions.CrystalReports.Engine.ReportDocument' acionou uma exceção
 
Reinstale o Crystal Reports ou tente as soluções sugeridas nesse post.
 
6) Minhas imagens e/ou gráficos não estão aparendo ao exibir o relatório (fica aquele X de imagem não carregada) ou ficam distorcidas/baixa resolução
 
Se for uma imagem que está sendo inserida do disco (que você tem no computador e está inserindo através de Insert > Picture) verifique o formato dessa imagem (preferível JPG ou BMP) e as cores utilizadas bem como efeitos (fundo transparente, camadas). Quanto mais simples a imagem for, melhor será sua visualização. Se apesar de tudo ainda não estiver aparecendo, verifique no web.config se há as seguintes entradas:
  1. Em system.web > httpHandlers:

    <add verb="GET" path="CrystalImageHandler.aspx" type="CrystalDecisions.Web.CrystalImageHandler, CrystalDecisions.Web, Version=10.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
    <add verb="*" path="GenerateImage.ashx" type="GenerateDynamicImage"/>
     
  2. E em system.webServer > handlers:

    <add name="CrystalImageHandler.aspx_GET" verb="GET" path="CrystalImageHandler.aspx" type="CrystalDecisions.Web.CrystalImageHandler, CrystalDecisions.Web, Version=10.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" preCondition="integratedMode"/>
7) Meu relatório tem mais de 2 páginas mas só fica exibindo 2/2+ quando clico em avançar

Coloque todo o processo de geração do relatório dentro de Page_Init ou invés de Page_Load.

8) Meu relatório não exibe, a princípio, a quantidade total de páginas. Fica exibindo 1/1+...

O Crystal faz isso para não ter de renderizar todo o relatório e sobrecarregar, então faça o seguinte artifício depois de dar o Bind():

CrystalReportViewerRelatorio.ShowLastPage();
CrystalReportViewerRelatorio.ShowFirstPage();

Ou seja, vou rapidamente para a última página e volto apenas para o Crystal renderizar a última página e saber quantas temos ao todo.

5 comentários:

Anônimo disse...

7) Meu relatório tem mais de 2 páginas mas só fica exibindo 2/2+ quando clico em avançar

Coloque todo o processo de geração do relatório dentro de Page_Init ou invés de Page_Load.

Fiz o descrito, porem ele pede pra Inserir Valores, e depois Pede dados da conexão,
informando a senha, como não fazer aparecer isso?

Fabricio Mendes disse...

Olá, parabéns pelo artigo, e se eu quiser fazer OLE DB para o driver mysql como eu faço

Thiago Marçal disse...

Você pode criar um objeto DataSet com uma tabela e seus campos para ser usado na geração do relatório. Depois que terminado a elaboração você pode enviar os dados via OLEDB mesmo que não tem problema.

Thiago Marçal disse...

Anônimo, use DataTable ao invés de DataSet e quanto à página, após o Load do relatório, avance para a última página e volte à primeira para ser contabilizado a quantidade total. É um bug do Crystal Report, mas funciona.

Alfredo Rodrigues disse...

Muito legal o material. Simples e direto. Me ajudou bastante. Parabens pelo material e obrigado por compartilhar suas experiencias

Postar um comentário