André Alves de Lima

Talking about Software Development and more…

Trabalhando com o Crystal Reports no WPF

Ao contrário do Report Viewer (que não possui um viewer específico para WPF), a SAP disponibiliza um controle visualizador para os relatórios do Crystal Reports no WPF. Entretanto, o viewer não é adicionado automaticamente na caixa de ferramentas do Visual Studio e nem temos muitos exemplos em português abordando esse tema. E é justamente devido a esses motivos que eu vou explicar para você no artigo de hoje como trabalhar com o Crystal Reports no WPF.

Criando o projeto e relatório de exemplo

Primeiramente, vamos começar criando um projeto do tipo “WPF Application“. Nesse projeto, vamos adicionar um DataSet de exemplo, chamado “DataSetExemplo“. Dentro do DataSet, adicione uma DataTable chamada “DataTableExemplo“, com as colunas “ColunaExemplo1” e “ColunaExemplo2“:

Feito isso, vamos adicionar no projeto um novo item do tipo “Crystal Reports“, dando o nome de “SeuCrystalReport“:

Nota: se você não estiver encontrando o item “Crystal Reports”, provavelmente você não instalou a biblioteca correta. Caso você esteja com essa dificuldade, confira o meu artigo sobre a instalação do Crystal Reports no Visual Studio para maiores detalhes.

Vamos criar um relatório bem simples, uma vez que o foco do artigo não é a criação do relatório, mas sim, a sua utilização no WPF. Se você quiser conferir um exemplo de relatório mais elaborado, confira o artigo onde eu mostrei como criar relatórios mestre/detalhe com o Crystal Reports e Entity Framework.

Dito isso, no relatório em branco, vamos executar o “Database Expert” para adicionarmos a fonte de dados para o nosso relatório:

Dentro do “Database Expert“, encontre o DataSet que criamos anteriormente e mova-o para o lado direito:

Feito isso, ajuste o layout do relatório, adicionando um título e arrastando as duas colunas para a área de detalhes do relatório, de forma que ele fique parecido com a imagem abaixo:

Pronto! Agora que temos o nosso relatório de exemplo preparado, vamos conferir como podemos exibi-lo na nossa Window.

Adicionando o viewer do WPF na ToolBox

Em primeiro lugar, temos que adicionar o controle visualizador do Crystal Reports na caixa de ferramentas do Visual Studio. O viewer do Windows Forms é adicionado automaticamente na Toolbox durante a instalação, mas, o viewer do WPF não é adicionado automaticamente (vai entender).

Para isso, temos que clicar com o botão direito na caixa de ferramentas e escolher a opção “Choose Items“:

Dentro da tela “Choose Toolbox Items“, encontre o item CrystalReportsViewer dentro da categoria “WPF Components” e marque a caixa de opções para que ele seja mostrado na ToolBox:

Clique em “OK” e você verá que o item do Crystal Reports será adicionado à categoria “General” da caixa de ferramentas:

Configurando o viewer no WPF

Com o controle visualizador adicionado à caixa de ferramentas, vamos arrastá-lo para dentro da nossa Window, mais especificamente, para dentro do Grid. Note que, ao arrastarmos o controle para dentro da Window, uma nova declaração de namespace é adicionada (xmlns:Viewer). Para conseguirmos manipular o viewer do code-behind, temos que definir um nome para o controle (x:Name). Dessa forma, dê o nome de “CrystalReportsViewer” para o controle:

<Window xmlns:Viewer="clr-namespace:SAPBusinessObjects.WPF.Viewer;assembly=SAPBusinessObjects.WPF.Viewer"  
        x:Class="CrystalReportsWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Viewer:CrystalReportsViewer x:Name="CrystalReportsViewer"/>
    </Grid>
</Window>

Note que, como no Windows Forms ou Web Forms, podemos definir diversas outras propriedades do controle do Crystal Reports diretamente na janela de propriedades:

Uma vez definido um nome para o controle, vamos para o code-behind da nossa Window para fazermos o carregamento do relatório. No construtor da janela, logo depois da chamada de “InitializeComponents” (ou no evento “Loaded” da Window, caso você esteja trabalhando com o VB.NET), vamos adicionar o código para fazer o carregamento:

        // C#
        public MainWindow()
        {
            InitializeComponent();

            var dataSet = new DataSetExemplo();
            dataSet.DataTableExemplo.AddDataTableExemploRow("Linha 1.1", "Linha 1.2");
            dataSet.DataTableExemplo.AddDataTableExemploRow("Linha 2.1", "Linha 2.2");
            dataSet.DataTableExemplo.AddDataTableExemploRow("Linha 3.1", "Linha 3.2");
            dataSet.DataTableExemplo.AddDataTableExemploRow("Linha 4.1", "Linha 4.2");
            dataSet.DataTableExemplo.AddDataTableExemploRow("Linha 5.1", "Linha 5.2");

            var reportDocument = new SeuCrystalReport();
            reportDocument.SetDataSource(dataSet);

            CrystalReportsViewer.ViewerCore.ReportSource = reportDocument;
        }
    ' VB.NET
    Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs)
        Dim dataSet As New DataSetExemplo()
        dataSet.DataTableExemplo.AddDataTableExemploRow("Linha 1.1", "Linha 1.2")
        dataSet.DataTableExemplo.AddDataTableExemploRow("Linha 2.1", "Linha 2.2")
        dataSet.DataTableExemplo.AddDataTableExemploRow("Linha 3.1", "Linha 3.2")
        dataSet.DataTableExemplo.AddDataTableExemploRow("Linha 4.1", "Linha 4.2")
        dataSet.DataTableExemplo.AddDataTableExemploRow("Linha 5.1", "Linha 5.2")

        Dim reportDocument As New SeuCrystalReport()
        reportDocument.SetDataSource(dataSet)

        CrystalReportsViewer.ViewerCore.ReportSource = reportDocument
    End Sub

Pronto! Execute o aplicativo e veja o belo erro que vamos receber:

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\win32_x86\dotnet1\crdb_adoplus.dll’ or one of its dependencies. The system cannot find the file specified.

Esse é um erro clássico do Crystal Reports em aplicações que utilizam o .NET Framework 4 ou superior. Corrigi-lo é muito fácil. Basta adicionarmos o elemento “useLegacyV2RuntimeActivationPolicy” com o valor “true” na tag “startup” do nosso arquivo app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true"> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>

Agora sim, ao executarmos o aplicativo, veremos o relatório sendo exibido corretamente:

Uma coisa que poderíamos ter feito diferente é fazer o carregamento do relatório a partir de um arquivo em disco (e não a partir de um relatório atachado ao próprio projeto, como fizemos anteriormente). Para isso, ao invés de criarmos o “reportDocument” como uma instância de “SeuCrystalReports“, temos que criar uma instância genérica de “ReportDocument” e, logo em seguida, chamamos o método “Load” passando o caminho do arquivo rpt em disco:

            // C#
            var reportDocument = new CrystalDecisions.CrystalReports.Engine.ReportDocument();
            reportDocument.Load("caminhoDoSeuRelatorio.rpt");
            reportDocument.SetDataSource(dataSet);
        ' VB.NET
        Dim reportDocument As New CrystalDecisions.CrystalReports.Engine.ReportDocument()
        reportDocument.Load("caminhoDoSeuRelatorio.rpt")
        reportDocument.SetDataSource(dataSet)

Concluindo

Não é difícil exibirmos relatórios do Crystal Reports no WPF, uma vez que a biblioteca disponibilizada pela SAP (atual mantenedora do Crystal Reports) possui um controle visualizador do Crystal Reports para o WPF. Nesse artigo você conferiu como adicionar esse controle na caixa de ferramentas do Visual Studio e como utilizá-lo para exibir o seu primeiro relatório.

E você? Já tinha utilizado esse controle no WPF? Tem alguma observação importante? Nos conte mais detalhes logo ali embaixo na caixa de comentários!

Por fim, convido você a inscrever-se na minha newsletter. Ao fazer isso, você receberá um e-mail toda semana sobre o artigo publicado e ficará sabendo também em primeira mão sobre o artigo da próxima semana, além de receber dicas “bônus” que eu só compartilho por e-mail. Inscreva-se utilizando o formulário logo abaixo.

Até a próxima!

André Lima

Newsletter do André Lima

* indicates required



Powered by MailChimp

12 thoughts on “Trabalhando com o Crystal Reports no WPF

  • Lucas Ribeiro Carneiro disse:

    Olá André,

    Primeiramente parabéns pelo post! Este artigo e os demais tem me ajudado muito.

    Estou trabalhando em um projeto WPF e utilizo o framework MVVM Ligth Toolkit para agilizar o processo de criação. Gostaria de empregar o Crystal Reports para implementar os relatórios deste sistema, mas estou encontrando dificuldades para realizar o Binding do DocumentReport com o ReportSource do CrystalReportsViewer.

    Por acaso você já implementou relatórios com o CrystalReports fazendo uso do design pattern MVVM?

    Agradeço desde já pela atenção.

    • andrealveslima disse:

      Olá Lucas, obrigado pelo comentário!

      Eu só trabalhei com o Crystal Reports + WPF dessa forma que eu mostrei no artigo.. Já utilizei MVVM em projetos WPF, mas, não em conjunto com o Crystal Reports (somente em telas de cadastro e coisas do tipo)..

      De qualquer forma, esse seria um belo tema para um outro artigo.. Já anotei aqui e, assim que eu conseguir pesquisar e escrever sobre esse tópico, eu te aviso.. Enquanto isso, parece que nesta thread no fórum da SAP um outro usuário conseguiu implementar dessa maneira:

      Binding Report Source on WPF Crystal Report Viewer Solution

      Abraço!
      André Lima

      • Lucas Ribeiro Carneiro disse:

        Olá André,

        A solução demonstrada no link é exatamente o que eu preciso. Acredito que vá funcionar perfeitamente em meu projeto.

        Muito obrigado pela atenção!!

        • andrealveslima disse:

          Olá Lucas!

          Perfeito! Quando você conseguir testar, me avisa depois se funcionou ou não..

          Abraço!
          André Lima

        • andrealveslima disse:

          Olá Lucas!

          Só para deixar registrado aqui, eu escrevi um artigo aqui no meu site detalhando a utilizaçao do Crystal Reports com WPF + MVVM. Fica aqui o link para referências futuras:

          Utilizando o Crystal Reports com MVVM no WPF

          Abraço!
          André Lima

          • Lucas Ribeiro Carneiro disse:

            Olá André,

            Parabéns por este novo artigo, ele está fantástico!

            A solução que você adotou está muito parecida com a forma que eu implementei em meu projeto. Apenas alguns pontos eu precisei fazer diferente devido a utilização do MVVM Ligth Toolkit e também da aplicação de IoC que faço em minhas ViewModels.

            Novamente, muito obrigado pela atenção!!

          • andrealveslima disse:

            Maravilha, Lucas! Fico feliz que você tenha gostado do artigo.. Qualquer coisa é só entrar em contato..

            Abraço!
            André Lima

  • Albert Santos disse:

    Olá André,
    Meu nome é Albert e estou com uma grande dúvida é gostaria de saber se você pode me ajudar. Vamos ao contexto: Em conjunto com um amigo o mesmo deu a idéia se fazermos um sistema para um ramo comercial, então logo de cara já pensei em todos os detalhes da aplicação sendo ela web. Porém ele me disse que teríamos que ter também uma aplicação desktop porque nem todos dispunham de Internet, então fiquei na dúvida se faço essa aplicação usando Windows form ou wpf, o problema é que dei uma pesquisada e ambas parecem estar obsoletas então queria saber se pode me dar uma sugestão sobre esse meu problema?

    Desde já obrigado
    Att
    Albert Santos

    • andrealveslima disse:

      Olá Albert, tudo tranquilo?

      Eu respondi essa pergunta essa semana mesmo para um outro leitor aqui do site.. Vou copiar e colar a resposta que eu dei para ele.. Veja se te ajuda, OK?

      Se as suas aplicações são simples aplicativos de negócios focando só na plataforma desktop, o Windows Forms dá conta do recado sem problema algum.. Como você mesmo constatou, existe muito mais conteúdo voltado para Windows Forms do que para WPF, além da curva de aprendizado ser BEM menor..

      Eu só recomendaria WPF caso você esteja pensando em desenvolver, além do aplicativo desktop, aplicativos móveis também (utilizando a mesma base de código).. Então, imagina que você tenha uma aplicação que deve rodar no Windows e, além disso, você também vai implementar alguns clientes móveis mais simplificados para iOS e Android utilizando Xamarin..

      Nesse caso, dependendo da quantidade de código que seria compartilhado entre as diferentes plataformas, talvez valeria a pena desenvolver o aplicativo desktop em WPF.. Se o aplicativo for bem arquitetado, você conseguiria utilizar uma boa parte do código das ViewModels no projeto como um todo..

      Outro cenário onde o WPF se tornaria mais interessante que o Windows Forms é ao trabalhar com interfaces ricas, 3D, manipulação de arquivos de mídia, etc..

      Uma coisa que eu realmente prestaria atenção ao utilizar WPF é não sair programando no estilo Windows Forms (orientado a eventos).. Se for para utilizar o WPF é muito importante escolher uma arquitetura onde a camada de apresentação e camada de negócios estejam bem separadas (por isso que o padrão MVVM é bastante utilizado em conjunto com o WPF).. Se for para utilizar o WPF que nem o Windows Forms (por exemplo, dando duplo clique no botão e implementando o código ali mesmo ao invés de utilizar a estrutura de binding de comandos), aí você estará deixando o seu código mais complexo sem ganhar nenhuma vantagem com o que o WPF pode te oferecer..

      Na empresa onde eu trabalho nós estávamos começando um projeto bem grande logo quando eu me mudei aqui para a Alemanha (4 anos e meio atrás) e surgiu justamente essa dúvida: Windows Forms ou WPF? Na época fizemos um experimento por uns dois meses começando a aplicação em WPF, mas, como o nível de produtividade, reuso de telas, herança visual, etc deixou a desejar, resolvemos seguir com o Windows Forms mesmo.. O grande ponto é que, se tivéssemos optado por WPF, a aplicação teria ficado exatamente com a mesma cara, só que o código mais complicado e o tempo de desenvolvimento seria bem maior.. Ou seja, o WPF nesse caso só traria desvantagens..

      Enfim, no final das contas tudo depende do cenário da sua aplicação.. Às vezes vai compensar fazer em WPF e, na maioria das vezes, para aplicativos de negócios, o Windows Forms dá e sobra.. Pelo menos essa é a minha opinião..

      Abraço!
      André Lima

  • […] Nota: se você não está encontrando o controle do Crystal Reports na caixa de ferramentas do seu projeto WPF, é porque você tem que adicioná-lo manualmente. Confira a explicação detalhada desse processo no artigo: Trabalhando com o Crystal Reports no WPF. […]

  • […] Nota: se você receber uma “FileNotFoundException” vindo do controle do Crystal Reports ao executar o projeto, isso quer dizer que falta uma configuração no seu arquivo app.config. Eu mostrei como fazer essa configuração no artigo: Trabalhando com o Crystal Reports no WPF. […]

  • […] Nota: se você receber uma “FileNotFoundException” vindo do controle do Crystal Reports ao executar o projeto, isso quer dizer que falta uma configuração no seu arquivo app.config. Eu mostrei como fazer essa configuração no artigo: Trabalhando com o Crystal Reports no WPF. […]

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *