Umas semanas atrás eu escrevi um artigo mostrando como alimentar relatórios do Report Viewer com o Entity Framework. Aí eu parei e pensei: será que dá para utilizar o Entity Framework com o Crystal Reports também? Depois de pesquisar um pouco e fazer uns testes, cheguei à conclusão que sim, é possível! Prepare-se para aprender com este artigo, como gerar relatórios do Crystal Reports com Entity Framework.
Criando o modelo de dados
A utilização das entidades do Entity Framework em relatórios criados com o Crystal Reports no Visual Studio é até mais tranquilo que o Report Viewer. Antigamente era preciso fazer uma gambiarra, convertendo as entidades em DataSet, porém, hoje em dia o Crystal Reports suporta as entidades do Entity Framework de forma nativa. Para demonstrar essa possibilidade, vamos utilizar um projeto do tipo “Windows Forms Application” e o mesmo modelo de dados do artigo sobre o Entity Framework com Report Viewer:
Não vou repetir todo o procedimento novamente neste artigo. Para saber como criar o modelo de dados que será utilizado neste artigo, confira a seção “Criando o modelo de dados” do artigo sobre Entity Framework com Report Viewer.
Desenhando o relatório
Uma vez criado o modelo de dados, vamos adicionar um novo relatório ao nosso projeto, dando o nome de “RelatorioPedido“. Os relatórios do Crystal Reports estão disponíveis dentro da categoria “Reporting“:
Quando o Crystal Reports perguntar o tipo de relatório que queremos criar, escolha a opção “relatório em branco“:
Assim que o relatório em branco tiver sido criado, vá até a aba “Field Explorer“, clique com o botão direito sobre “Database Fields” e escolha a opção “Database Expert“:
É justamente na janela “Database Expert” que vamos configurar a fonte de dados para o nosso relatório. No caso do Report Viewer, nós criamos uma classe que representava os dados do relatório. Nós poderíamos fazer o mesmo com o Crystal Reports, mas, isso não é obrigatoriamente necessário, uma vez que o Crystal Reports permite que nós adicionemos várias tabelas em um único relatório, desde que nós especifiquemos os relacionamentos entre elas.
Dito isso, encontre os objetos do nosso modelo (Cliente, ItemPedido, Pedido e Produto) dentro da seção “Project Data / .NET Objects” e adicione-os na parte de “Selected Tables“:
Em seguida, temos que ir até a aba “Links” para ajustarmos os relacionamentos entre as tabelas. Como o Crystal Reports cria os relacionamentos entre as tabelas ItemPedido e Pedido e entre as tabelas Pedido e Cliente com a direção errada, temos que recriá-los, conforme você pode conferir neste gif animado:
Agora que já temos a fonte de dados devidamente configurada, vamos criar um novo agrupamento no nosso relatório. Como você pode observar no diagrama do modelo, teremos informações dos pedidos na parte “mestre” do relatório e informações dos itens de pedido na parte “detalhe” do relatório. Portanto, temos que agrupar os dados pelo ID do Pedido. Para isso, clique com o botão direito sobre “Group Name Fields” e escolha a opção “Group Expert“:
Na janela de criação do grupo, escolha o campo “PedidoId” da tabela “Pedido“:
Antes de confirmar a criação do grupo, vá até a aba “Options” e configure a paginação do grupo (de forma que cada pedido seja impresso em uma página separada):
Agora é só desenhar o relatório com os dados do pedido no cabeçalho do agrupamento e os dados dos itens do pedido na área de detalhes. O resultado deve ficar parecido com a imagem abaixo:
Como nós não utilizamos o cabeçalho e o rodapé do relatório, nós podemos desabilita-los escolhendo a opção “Suppress” nas regiões “Report Header” e “Report Footer“:
Criando o formulário para a exibição do relatório
Com o relatório criado, agora só falta ajustarmos o formulário que fará a exibição do relatório. A primeira coisa que temos que fazer é adicionarmos o controle de exibição do Crystal Reports (disponível dentro da categoria “Reporting” da caixa de ferramentas). Feito isso, clique em “Choose a Crystal Report” e escolha o relatório que criamos anteriormente:
Não esqueça de alterar o nome do componente do relatório de “RelatorioPedido1” para “RelatorioPedido” (sem o “1” no final):
Vamos agora até o code-behind para passarmos os dados para o nosso relatório, o que é muito tranquilo de ser feito. Basta criarmos uma instância do nosso contexto do Entity Framework e chamarmos o método “SetDataSource” em cada uma das tabelas do nosso relatório, passando cada um dos DbSets do nosso contexto, só que convertidos para lista (método ToList):
public FormCrystalComEF() { InitializeComponent(); PopularBancoDeDadosSeNecessario(); using (var contexto = new Contexto()) { RelatorioPedido.Database.Tables["CrystalReportsEF_Models_Cliente"].SetDataSource(contexto.Clientes.ToList()); RelatorioPedido.Database.Tables["CrystalReportsEF_Models_Produto"].SetDataSource(contexto.Produtos.ToList()); RelatorioPedido.Database.Tables["CrystalReportsEF_Models_Pedido"].SetDataSource(contexto.Pedidos.ToList()); RelatorioPedido.Database.Tables["CrystalReportsEF_Models_ItemPedido"].SetDataSource(contexto.ItensPedido.ToList()); } }
Você encontra os nomes das tabelas na janela “Field Explorer” do relatório:
Muito tranquilo, não é mesmo? Vamos executar o projeto para ver se funciona? É claro que nunca funciona da primeira vez!
An unhandled exception of type ‘System.IO.FileNotFoundException’ occurred in mscorlib.dll
Additional information: Could not load file or assembly ‘file:///C:\Program Files (x86)\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Common\SAP BusinessObjects Enterprise XI 4.0\win64_x64\dotnet1\crdb_adoplus.dll’ or one of its dependencies. The system cannot find the file specified.
Essa exceção não tem nada a ver com a utilização do Crystal Reports com o Entity Framework. Ela acontece também com outros tipos de fontes de dados. O problema é, na verdade, com o .NET Framework 4.5. Para conseguirmos utilizar essa versão do .NET Framework com o Crystal Reports, temos que adicionar um atributo na tag “startup” do nosso app.config:
Dessa forma, abra o arquivo app.config do projeto onde o controle do Crystal Reports está sendo utilizado e ajuste a tag startup desta maneira:
<startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup>
Mais informações sobre este erro você encontra nesta thread do StackOverflow.
Pronto! Execute a aplicação novamente e veja o resultado, conforme esperado:
Concluindo
Alimentar relatórios do Crystal Reports com entidades do Entity Framework é muito tranquilo, até mais tranquilo do que com o Report Viewer, uma vez que não precisamos criar uma classe especial com os dados de todas as tabelas. Neste artigo você viu como criar um relatório mestre/detalhe no Crystal Reports baseado em quatro entidades do Entity Framework.
Você utiliza o Crystal Reports como ferramenta de relatórios nos seus projetos? Como você alimenta os seus relatórios? Com DataSets? Você sabia que dava para passar as entidades do Entity Framework diretamente para o seu relatório do Crystal Reports? Conte-nos a sua experiência nos comentários.
Antes de me despedir, convido você a inscrever-se na minha newsletter. Ao fazer isso, você receberá um e-mail toda semana sobre o artigo publicado, ficará sabendo em primeira mão sobre o artigo da próxima semana e receberá também dicas “bônus” que eu só compartilho por e-mail. Além disso, você já deve ter percebido que eu recebo muitas sugestões de temas e eu costumo dar prioridade às sugestões vindas de inscritos da minha newsletter. Inscreva-se utilizando o formulário logo abaixo.
Até a próxima!
André Lima
Image by Pixabay used under Creative Commons
https://pixabay.com/en/tax-forms-income-business-468440/
The post Gerando relatórios do Crystal Reports com Entity Framework appeared first on André Alves de Lima.