Jasper Reports: Relatórios com Java | Alura Cursos Online
Primeiras aulas do curso Jasper Reports: Relatórios com Java
Jasper Reports: Relatórios com Java
Instalação e o primeiro relatório com iReport - Instalação e o primeiro relatório
Você pode baixar a versão utilizada do iReport nesse link. Também vamos usar um banco de dados no treinamento. Para facilitar a importação dos dados preparamos um arquivo SQL disponível nesse link: financas.sql
Case queira usar a versão mais atual do iReport segue o link da Jaspersoft.
Relatórios em HTML e seus problemas
Qualquer aplicação de negócio tem que se preocupar com a apresentação de dados. O usuário final quer gerar relatórios com dados agrupados e bem formatados e tirar conclusões sobre o que é apresentado.
A forma mais comum é o desenvolvedor gerar uma página HTML, por exemplo, com uma tabela, formatando-a através de CSS. O problema é que isso nem sempre tem a qualidade e precisão desejada após a impressão. Como, por exemplo, paginar este relatório?
Outra questão: o que fazer se a aplicação não é uma aplicação web? E se ainda desejarmos numa aplicação web outras saídas, não só HTML com CSS, como também PDF? Muitas vezes misturamos dados do relatório com sua visualização, sendo necessário rescrever parte do código para outras saídas.
Isso também significa que estamos dependentes do desenvolvedor para criar um relatório. Queremos uma abordagem mais simples, uma abordagem que permita criar relatórios sofisticados sem termos que conhecer detalhes técnicos a fundo.
Report engine: JasperReports e iReport
Para resolver essas questões foram criadas ferramentas específicas para a geração de relatórios, que também são chamadas de report engines: são eles que assumem a responsabilidade pela formatação e geração.
Uma ferramenta famosa do mundo Java é o iReport. Ele nos fornece uma interface gráfica bem elaborada para definirmos o relatório e para exportá-lo em vários formatos como PDF, PPT, OpenDocument, etc.
O iReport é apenas o report designer, a ferramenta que ajuda na construção de relatórios. A definição é salva dentro de um XML com terminação jrxml. Este XML é independente da saída concreta.
O responsável pela leitura do XML é o JasperReports - o report engine, que preenche o relatório com os dados exportando-o para a saída desejada.
Vamos começar a utilizar o report designer iReport com JasperReports, acessando a página community.jaspersoft.com.
Existem outros projetos relacionados ao JasperReports, mas o que nos interessa é o report designer. Podemos baixar o programa clicando no link. Há um download para cada sistema operacional específico (Windows, Mac e Linux) e também um ZIP genérico para qualquer plataforma, inclusive há um plugin para o Netbeans.
Utilizaremos o ZIP genérico. Ao baixar o ZIP, será pedido um login e senha, basta clicar no link logo abaixo que pulará esta etapa. Assim, chegamos na página de download.
Agora com o ZIP baixado, vamos extraí-lo. Temos a distribuição genérica do iReport com os arquivos, plugin para Netbeans e uma pasta bin com os arquivos de inicialização do iReport. Cada um dos arquivos destina-se a uma plataforma diferente (Windows, Mac e Linux).
Definição da conexão e template
Temos a página inicial da ferramenta na qual podemos ver um assistente para criarmos nosso primeiro relatório. Primeiro definiremos de onde virão nossos dados. A nossa aplicação com iReport utilizará o MySQL. Nele teremos um banco já configurado chamado finanças. Neste banco teremos uma tabela chamada movimentações e selecionaremos todos os seus dados.
Dentro do iReport definiremos uma conexão com o nosso banco de dados (jdbc connection) que se chamará finanças. O driver é mysql e a nossa URL será finanças. O login será root, sem senha. Após configurar, salvaremos e testaremos a conexão.
O próximo passo é selecionar através do assistente o layout, o template do nosso relatório. Existem templates pré-definidos. Utilizaremos o template simple blue. Podemos fazer um zoom para vermos mais detalhes sobre este template. Após inicializar, chamaremos o relatório de finanças. No menu file, na parte admin, criaremos um arquivo chamado financas.jrxml. Utilizaremos nosso datasource recém criado. Nossa query será um select * from movimentacoes. Ele já fez o select, analisou nossa query e mostrou todos esses fields. Adicionaremos o id, a data, a descrição e o tipo da movimentação, como também o valor. O id da categoria e da conta não importam neste relatório. Na próxima tela não agruparemos dados.
Organização do iReport
Estamos vendo a tela do nosso relatório e no centro o Designer.
O iReport criou colunas para nossos campos e logo abaixo de cada um deles uma espécie de expression language, para indicar que teremos os valores.
No lado esquerdo temos o Report inspector, que mostra a estrutura do nosso relatório e também as variáveis mais importantes como os parâmetros, os fields e as variáveis. Em fields aparecem os campos que selecionamos no momento de criação do nosso relatório.
No lado direito temos as propriedades que mudam sempre quando selecionamos um elemento dentro do relatório.
Visualizando o primeiro relatório
O primeiro passo é alterar o relatório, mas já podemos pré-visualizá-lo clicando em Preview. O que o iReport faz é usar nosso relatório, acessar o banco de dados, gerando um PDF com essas duas informações.
Várias páginas foram geradas com os dados das movimentações, mas como podemos perceber, a data mostra um horário que não queremos apresentar. Voltando ao Designer e selecionando a data, podemos, no lado direito, adicionar um pattern (dd/MM/yyyy) manualmente ou utilizar um assistente de data. Vamos formatar a data mostrando-a sem horário.
Adicionaremos o título, movimentações, mudaremos o tamanho, apagaremos a descrição e também colocaremos em maiúsculo o cabeçalho. Fazendo o preview novamente, podemos ver o nosso atalho e também a data bem formatada.
Importante: Utilizar JDK 7.
Organização do relatório com iReport - Organização do relatório com iReport
Relatório sem template
Para esta aula veremos como o iReport organiza nosso relatório. Criaremos um novo relatório, mas desta vez sem template, utilizaremos um blank letter, ou seja, um relatório sem formatação. Este relatório ficará dentro da pasta relatório e terá o nome gastos_por_mes. O próximo passo é definir a query através da nossa conexão com MySQL que se chama financas.
Buscas customizadas com Query Designer
O iReport oferece um designer, uma maneira visual para criação de query. Ele já detecta as tabelas do nosso banco. Temos a tabela categorias que esta ligada à tabela movimentacoes, que por sua vez liga-se à tabela contas. Os joins das tabelas são representados visualmente através de links. Do lado esquerdo há o select automaticamente gerado pelo iReport. Para cada tabela, selecionamos apenas os campos de interesse. De categorias, queremos apenas o campo nome, de movimentacoes ignoramos as chaves estrangeiras e de contas, apenas selecionamos o titular.
Além disso precisamos ordenar pelo titular e pela data da movimentação. Será necessário filtrar a query, porque apenas saídas devem ser consideradas, isto é, estamos interessados apenas nos gastos das movimentações. Simplificaremos o nome de alguns campos e como resultado teremos: id, data, descricao, tipo, valor e categoria.
Com a query definida, o próximo passo é indicar os fields que utilizaremos, neste caso, todos. Em seguida, agruparemos os dados pelo titular da conta. Após a finalização, teremos como resultado a definição do relatório.
Seções e componentes de um relatório
No lado esquerdo do report inspector, podemos ver as variáveis mais importantes da estrutura do relatório. Por exemplo, temos os campos que definimos em nossa query. Baseados nesses campos, criaremos o nosso relatório. O próximo passo agora é escolhermos uma seção do nosso relatório para arrastarmos estes campos.
Podemos ver uma seção chamada detail. Este é o lugar onde ficam os dados que o iReport utilizará, sendo assim, os campos do report inspector serão arrastados para esta área. O iReport, além de criar automaticamente este campos, também adiciona o cabeçalho para cada um deles.
Ao gerar o relatório, visualizamos os campos e seus cabeçalhos, mas com uma formatação que deixa a desejar. O espaço da página é pouco utilizado, algo que pode ser resolvido pelo próprio designer. Por ele, ajustaremos o espaço de cada dado e linha. A mesma coisa para os cabeçalhos das colunas. Por uma questão estética, os cabeçalhos ficarão em negrito. A visualização mostra um relatório mais apresentável.
Existem mais opções no relatório. Por exemplo, no cabeçalho da página, abrindo a paleta com os componentes disponíveis, vamos utilizar o texto estático arrastando-o para a seção page header definindo seu valor com Gastos por Contas. Ao visualizar novamente o relatório, veremos o texto sendo repetido em cada página, mas queremos que ele seja impresso apenas uma vez. Para isto, basta arrastá-lo para a seção title acima da seção na qual ele se encontra. Além disso, ele será colocado em negrito e será impresso apenas no início do relatório.
Ainda é possível mostrar no page footer, nosso rodapé, o número total de páginas, inclusive a data atual. Basta visualizar mais uma vez para ver o resultado.
Agrupando e somando os gastos da conta
Vamos também utilizar o rodapé da coluna e para isso arrastaremos o campo valor para a seção column footer da coluna valor. Com esta ação, o iReport nos mostrará duas opções: apenas manter o valor do campo ou aplicar uma função de soma. Com a opção de soma selecionada, o iReport calculará o valor total das movimentações por página.
Faremos a mesma coisa para a seção summary, nosso sumário. Novamente iremos selecionar a opção soma para mostrar no final do relatório o valor total dos gastos. Visualizando novamente o relatório vemos o total por página e no final o valor total de todos os gastos.
Apesar do resultado, queremos saber os gastos por contas e uma conta em nosso relatório é identificada através de um titular. Por isso agrupamos os dados no início do relatório e olhando no report inspector temos um group header e um group footer para titular, falta adicioná-los no relatório. Da mesma maneira que podemos adicionar seções, podemos apagá-las do relatório. Apagaremos o column footer, porque não faz sentido para o nosso relatório.
O processo é bem semelhante ao que já fizemos: arrastamos o campo, selecionamos a função de soma e posicionamos o campo dentro do relatório. Verificando o resultado, vemos que há o total de todos os gastos do titular João Souza e logo abaixo dele vem as informações de outro titular.
Adicionando novos grupos ao relatório
Queremos ver também a soma total de todos os gastos por mês. Por isso adicionaremos um novo report group. Vamos chamá-lo de por_mes. Precisamos selecionar data, mas excluiremos o dia e ano pois queremos apenas o seu mês. Utilizaremos novamente um filtro por meio de uma expressão usando a data, mas agora selecionando apenas o mês. Agora falta apenas posicioná-lo no rodapé.
Temos o nosso por_mes group footer. Nele adicionaremos o valor, realizaremos a soma e apagaremos o que não estamos utilizando. Finalmente, temos um agrupamento do mês de janeiro e mais a frente um agrupamento do mês de maio.
Formatação e ajustes de visualização do relatório - Formatação e ajustes de visualização do relatório
Melhorar o design do relatório
Olá! Vamos continuar com o nosso relatório Gastos por conta. Ele é funcional, mas ao visualizá-lo, é possível perceber que está mal formatado. Vamos melhorar o seu design e aumentar o zoom nos ajudará. Atacaremos inicialmente a primeira seção, o title. Podemos selecionar o elemento diretamente no Designer ou navegar através do Report inspector.
A primeira coisa que faremos é selecionar um retângulo que servirá como background e escolher uma cor para ele nas propriedades do componente. Ele não terá um traço e será adaptado levando em consideração o tamanho do seu parent, a seção no qual ele está incluído. Para tal, usaremos os Formatting Tools - adapt to parent. Agora só falta colocar o componente para trás com send to back e centralizar o elemento dentro da seção title.
Nosso próximo passo é deixar todos os cabeçalhos com letra maiúscula. Depois disso vamos alinhar os nomes do cabeçalho, bastando selecionar todos ao mesmo tempo e aplicar alinhamento pelo centro. Já podemos visualizar o resultado pelo iReport.
Formatar e concatenar campos de texto
Ainda falta trabalhar a parte do titular do relatório, pois queremos ele também em letra maiúscula. O problema é que o titular é um campo que veio do banco de dados, fora do padrão desejado. O campo dentro do relatório é uma expressão apresentada através do ${}. Podemos manipular essa expressão através do Expression Editor. Repare que o tipo do campo é java.lang.String, sendo assim, utilizaremos os próprios recursos desta classe para colocarmos a informação em letra maiúscula. No editor da expressão, na lista de métodos, aparece o método toUpperCase(). Além disso, queremos concatenar a informação CONTA DE com o titular usando o operador + da linguagem Java.
O tamanho do campo não é suficiente, sendo necessário adaptá-lo ao seu parent, como fizemos com nosso background. Na visualização, vemos a nova informação e tudo centralizado, mas ainda falta o background na cor azul. Voltando ao Designer, ao selecionar o componente de texto com o titular, podemos alterar a cor de fundo nas propriedades dos componentes.
Formatando a data e os valores numéricos
A próxima etapa é formatar os dados das colunas valor e data. Com o campo valor selecionado, na opção field pattern, escolhemos a opção currency, para apresentar o valor monetário. A mesma coisa será feita com o campo data, usando a opção field pattern, mas escolheremos a opção date, mostrando apenas a data(sem a hora).
Resultados condicionais
As modificações são aplicadas, mas ao visualizarmos mais uma vez o relatório, vemos que em alguns casos o campo descrição não se posiciona conforme o esperado quando o mesmo não existe. É apresentado o valor null, que não faz sentido para o leitor do relatório.
Para resolvermos este problema, basta selecionar o campo descricao e marcar a opção Blank When Null. Com a opção marcada e visualizando, vemos que o resultado ainda não é o esperado. Mais uma vez sobre o campo, marcamos a opção Stretch with overflow. Esta opção organizará a informação mesmo quando não há espaço disponível, sempre mostrando todas as informações do campo.
Diminuir o campo de texto
Há situações onde é necessário diminuir o tamanho da coluna, por exemplo, mostrar apenas a letra S, para indicar que a movimentação é de SAÍDA. Com o campo selecionado e editando a expressão, podemos recorrer ao método substring() e selecionar apenas a primeira letra. Por fim, centralizaremos alguns campos. Agora é só visualizar. Aparece apenas a letra S na coluna Tipo .
Mais formatações
Falta ainda lidar com os campos ou variáveis que agrupam o valor total do mês e da conta. Primeiro, alinharemos o resultado e cada grupo à direita e definiremos o pattern currency para eles. Depois do pattern definido, criaremos outro retângulo na cor azul que ocupará todo o espaço de seu parent, produzindo um efeito que já fizemos.
No lugar de criarmos mais um retângulo, o copiaremos para o próximo grupo. Por fim, jogaremos os retângulos para trás com send to back. Visualizando outra vez, vemos o resultado esperado. Os agrupamentos aparecem na cor azul para se destacarem no relatório.
Mas ainda há um problema: o texto do número da página está em inglês. Editando o elemento e selecionando a expressão, podemos modificar o texto original page para página. Novamente visualizando para verificar o resultado. Em cada página aparece o rodapé em português. Por último, trocaremos a cor de todos os retângulos de azul para cinza, basta selecionar todos os retângulos com control + shift e mudar o background color para cinza. Agora, em nosso relatório, as seções serão apresentadas em cinza.
Passando parâmetros para o relatório
Temos um total de 33 páginas, que pode ser demais para quem deseja retirar alguma informação do relatório. Para o usuário final seria mais fácil se ele pudesse filtrar os gastos. Por exemplo, pela data, selecionando um período. A ideia é renderizar apenas os gastos entre duas datas definidas.
Para esta situação, o iReport oferece parâmetros. Os parâmetros são valores passados da aplicação para o JasperReport, o responsável pela renderização do relatório. Já existem parâmetros pré-definidos, por exemplo, de localização visível no Report Inspector. Podemos adicionar nossos parâmetros através do menu, e uma vez feito isso, podemos alterar as suas propriedades pelo editor. O nome do nosso parâmetro será DATA_INI e seu tipo java.util.Date. Criaremos outro parâmetro que representa a data final, novamente no Report Inspector. O nome dele será DATA_FIM, também do tipo Date.
Filtrando o relatório pelos parâmetros
Como resultado, temos os dois parâmetros disponíveis para usar dentro do Report Inspector. Podemos agora utilizá-los arrastando para o nosso relatório, mas não faremos isto porque modificaremos nossa query com base nestes parâmetros.
Ao abrir o editor da query, alteraremos a cláusula where utilizando a data e filtrando-a pelos dois parâmetros que podem ser arrastados para a query. A data da movimentação deve estar entre DATA_INI e DATA_FIM. Vamos confirmar o diálogo e pré-visualizar o relatório. Quando o relatório for renderizado, o iReport mostrará automaticamente um prompt solicitando um valor, pois as datas são necessárias para executar a query. Vamos filtrar as movimentações pelo mês de agosto. O relatório mostrará apenas as movimentações desse mês.
Para não termos que definir toda vez a data, podemos definir um valor padrão. Nos parâmetros criados, desmarcamos a opção Use as a prompt e editamos Default Value Expression. Utilizaremos a classe SimpleDateFormat, que receberá um pattern com o formato da data desejada e que realizará um parse da 01/08/2012.
new java.text.SimpleDateFormat("dd/MM/yyyy").parse("01/08/2012");
Faremos a mesma coisa para DATA_FIM, desabilitando o prompt e alterando o valor que sofrerá o parse, neste caso, final de agosto. Renderizando novamente, percebemos que o prompt não aparece mais e mesmo assim tivemos nosso relatório filtrado.
Sobre o curso Jasper Reports: Relatórios com Java
O curso Jasper Reports: Relatórios com Java possui 63 minutos de vídeos, em um total de 58 atividades. Gostou? Conheça nossos outros cursos de Java em Programação, ou leia nossos artigos de Programação.