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:
- 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"/>
- 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.