André Alves de Lima

Talking about Software Development and more…

Trabalhando com gráficos no Crystal Reports

Uma das melhores maneiras de representar dados estatísticos (se não a melhor) é através de gráficos. Umas semanas atrás eu mostrei para você como trabalhar com gráficos no Report Viewer. Mas, como é que ficam as pessoas que trabalham com o Crystal Reports? Será que a criação de gráficos no Crystal Reports é similar ao Report Viewer? É justamente isso que vamos conferir neste artigo.

Preparando o projeto de exemplo

No artigo sobre gráficos com o Report Viewer, conferimos alguns gráficos estatísticos sobre vendas de produtos. Como eu gosto de sempre variar as áreas de negócios dos exemplos apresentados no site, neste artigo vamos trabalhar com um outro tipo de informação.

Para termos melhor controle da utilização do nosso sistema, normalmente implementamos algum tipo de log de informações. Nesse log temos as informações de qual usuário executou qual funcionalidade. Além disso, normalmente temos também a informação de qual sistema operacional o usuário está utilizando.

Claro que esse processo pode ser muito facilitado ao utilizarmos o Application Insights, como eu já demonstrei no passado. Mas, em alguns casos acabamos preferindo fazer a implementação desse log de forma local.

Com as informações de acesso em mãos, esse acaba sendo um cenário perfeito para desenvolvermos um relatório com gráficos, monstrando as estatísticas de acesso por usuário, quais são as principais funcionalidades que estão sendo utilizadas, qual é a carga diária, etc. Vamos ver como podemos criar gráficos com essas informações no Crystal Reports?

Primeiramente, vamos criar um projeto do tipo “Windows Forms Application“. Nesse projeto, vamos adicionar uma classe chamada “LogFuncionalidade“:

    // C#
    public class LogFuncionalidade
    {
        public string Funcionalidade { get; set; }
        public DateTime DataLog { get; set; }
        public string Usuario { get; set; }
        public string SistemaOperacional { get; set; }

        private static Random _rand = new Random();

        public static LogFuncionalidade GerarExemplo()
        {
            var funcionalidades = new string[] { "Tela de Vendas", "Cadastro de Funcionários", "Dashboard de Vendas", "Cadastro de Clientes", "Relatório Gerencial" };
            var usuarios = new string[] { "André Lima", "Fulano de Tal", "Beltrano da Silva" };
            var sistemasOperacionais = new string[] { "Windows", "iOS", "Android", "Web" };

            return new LogFuncionalidade()
            {
                Funcionalidade = funcionalidades[_rand.Next(5)],
                DataLog = DateTime.Now.AddDays(_rand.Next(30)),
                Usuario = usuarios[_rand.Next(3)],
                SistemaOperacional = sistemasOperacionais[_rand.Next(4)],
            };
        }
    }
' VB.NET
Public Class LogFuncionalidade
    Public Property Funcionalidade As String
    Public Property DataLog As DateTime
    Public Property Usuario As String
    Public Property SistemaOperacional As String

    Private Shared Rand As New Random()

    Public Shared Function GerarExemplo() As LogFuncionalidade
        Dim Funcionalidades = New String() {"Tela de Vendas", "Cadastro de Funcionários", "Dashboard de Vendas", "Cadastro de Clientes", "Relatório Gerencial"}
        Dim Usuarios = New String() {"André Lima", "Fulano de Tal", "Beltrano da Silva"}
        Dim SistemasOperacionais = New String() {"Windows", "iOS", "Android", "Web"}

        Return New LogFuncionalidade() With {
            .Funcionalidade = Funcionalidades(Rand.Next(5)),
            .DataLog = DateTime.Now.AddDays(Rand.Next(30)),
            .Usuario = Usuarios(Rand.Next(3)),
            .SistemaOperacional = SistemasOperacionais(Rand.Next(4))
        }
    End Function
End Class

Como você pode perceber, para criarmos dados fictícios de acessos ao sistema, implementamos o método “GerarExemplo“, que será chamado posteriormente múltiplas vezes para gerarmos múltiplos exemplos de logs.

Agora que já temos a nossa classe, podemos começar a desenvolver o nosso relatório. Adicione um novo relatório do Crystal Reports, dando o nome de “RelatorioUtilizacaoSistema” e escolhendo a opção “Relatório em Branco“:

Com o relatório criado, clicamos com o botão direito em “Database Fields” e escolhemos a opção “Database Expert“:

Na tela do assistente de banco de dados, temos que encontrar e mover a nossa classe “LogFuncionalidade” para a lista do lado direito da tela:

Pronto! Agora que já temos o nosso relatório com a fonte de dados configurada, vamos começar a configurar os nossos gráficos.

Gráfico pizza

O primeiro gráfico que vamos adicionar no relatório é um gráfico de pizza. Se estivéssemos trabalhando com um relatório mais complexo, nós poderíamos adicionar gráficos diferentes para cada agrupamento ou até mesmo para cada linha de detalhe. No nosso caso, como o relatório terá somente uma página sumarizando todos os dados em apenas um bloco, nós vamos esconder todas as áreas do relatório, com exceção do cabeçalho. É justamente no cabeçalho do relatório que vamos adicionar todos os nossos gráficos.

Para adicionar um gráfico no Crystal Reports, clicamos com o botão direito na área onde desejamos adiciona-lo e escolhemos a opção “Insert => Chart“:

Como queremos adicionar um gráfico de pizza, temos que primeiramente escolher a opção “Gráfico de setores” na aba “Tipo“:

Feito isso, vamos até a aba “Dados” e adicionamos o campo “Usuario” tanto na parte de agrupamento (lista superior) quanto na parte de valores (lista inferior):

Note que a operação de sumarização escolhida por padrão pelo Crystal Reports foi a contagem de registros (porque o campo “Usuario” não é numérico). Caso quiséssemos alterar a operação de sumarização, nós só precisaríamos clicar no botão “Definir Operação de Resumo“:

Por fim, para configurarmos um texto customizado para o título do gráfico, vamos até a aba “Texto“, desmarcamos a opção “Texto Automático” do título e daremos o título de “Ações por Usuário” para esse gráfico de pizza:

Gráfico de funil

O próximo gráfico que vamos adicionar no relatório é um gráfico mostrando as “top funcionalidades“, ou seja, as funcionalidades mais utilizadas no sistema. Não existe gráfico melhor para exibir esse tipo de informação do que o gráfico de funil.

Para criarmos um gráfico de funil, escolhemos o tipo:

E adicionamos o campo “Funcionalidade” nas duas listas da aba “Dados“:

Gráfico de linha

Em seguida, vamos criar um gráfico de linhas mostrando a carga do sistema, ou seja, um gráfico que mostra a utilização do sistema por dia:

Gráfico de barras empilhadas

Por fim, vamos adicionar um gráfico mostrando o nível de utilização das funcionalidades por usuário. Para essa informação, utilizaremos um gráfico de barras empilhadas:

Nesse caso, temos que adicionar as colunas “Funcionalidade” e “Usuario” na lista superior e qualquer uma dessas duas colunas na lista inferior:

Exibindo o relatório

Agora que já temos o nosso relatório com os gráficos propriamente ajustados, vamos configurar o nosso formulário para exibi-lo. Para isso, vamos adicionar um controle visualizador do Crystal Reports e vamos escolher o relatório que acabamos de criar:

Feito isso, vamos até o code-behind do formulário para criarmos uma lista de logs fictícios. Essa lista servirá como fonte de dados para o relatório:

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

            var listaLog = new List<LogFuncionalidade>();
            for (int contador = 0; contador < 200; contador++)
                listaLog.Add(LogFuncionalidade.GerarExemplo());
            RelatorioUtilizacaoSistema1.SetDataSource(listaLog);
            crystalReportViewer1.RefreshReport();
        }
    ' VB.NET
    Private Sub FormRelatorio_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim ListaLog As New List(Of LogFuncionalidade)
        For contador As Integer = 0 To 200
            ListaLog.Add(LogFuncionalidade.GerarExemplo())
        Next
        RelatorioUtilizacaoSistema1.SetDataSource(ListaLog)
        CrystalReportViewer1.RefreshReport()
    End Sub

Pronto! Execute o projeto e veja o resultado:

Nota: não esqueça de configurar o elemento “useLegacyV2RuntimeActivationPolicy” como “true” no arquivo app.config. Caso contrário você receberá um erro ao executar o projeto.

Conclusão

Como você conferiu neste artigo, não é difícil adicionarmos gráficos nos nossos relatórios do Crystal Reports. Da mesma maneira que o Report Viewer, o Crystal Reports suporta os mais diversos tipos de gráficos. Porém, na minha opinião, os gráficos do Report Viewer são mais bonitos do que os gráficos do Crystal Reports. Portanto, caso os seus relatórios contenham muitos gráficos, eu recomendo que você considere a utilização do Report Viewer.

Você já trabalhou com gráficos no Crystal Reports? Se sim, quais tipos de gráficos você utilizou? Encontrou dificuldades no processo? Fico aguardando as suas observações na caixa de comentários logo abaixo.

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

Image by Pixabay used under Creative Commons
https://pixabay.com/en/business-risk-luck-chart-arrow-163501/

Newsletter do André Lima

* indicates required



Powered by MailChimp

4 thoughts on “Trabalhando com gráficos no Crystal Reports

  • Ronaldo disse:

    Bom dia André, tudo bem?

    Gostaria de saber como implementar isto em ASP MVC, numa View de Relatórios semanais para contabilizar informações como ‘likes’, ‘perguntas’, etc?

    Grato,

    Ronaldo Peres

  • Vitor de Oliveira Abreu disse:

    Olá André,
    Excelente explicação, gostei muito de sua página. Mas tenho um problema e gostaria de saber se pode me ajudar: a legenda do meu gráfico são de anos (2017, etc.), mas quando carrega do gráfico a legenda de ano no gráfico aparece com casas decimais (tipo: 2017,00). Apresentar assim fica muito feio. Sabe me dizer onde posso formatar o valor número quando estes são usados na legenda do gráfico?

    • andrealveslima disse:

      Olá Vitor!

      Desculpe a demora em responder a sua mensagem.. É que estou de férias e só consegui tirar um tempinho para responder as coisas atrasadas agora..

      Eu não estou com um computador com Crystal Reports instalado aqui, mas pelo que eu me lembre, você consegue alterar essas coisas nas opções de formatação do Data Label.. Você já deu uma pesquisada sobre isso?

      Abraço!
      André Lima

Deixe uma resposta

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