Relatórios com iReport e JasperReport JasperR eport em Aplicações Web com NetBeans 6.8 Autor:
Joaquim José Hangalo
[email protected]
Luanda, Outubro de 2009
SUMÁRIO O JASPERREPORTS.......................... JASPERREPORTS................................................. .............................................. ....................................................3 .............................3 DOWNLOAD DO JASPERREPORTS........................... JASPERREPORTS.................................................. ..............................................3 .......................3 O IREPORT.................................... IREPORT........................................................... .............................................. .............................................. ...................................4 ............4 DOWNLOAD E INSTALAÇÃO DO IREPORT......................................................... IREPORT......................................................... 4 ESTRUTURA DE UM RELATORIO........................................ RELATORIO............................................................... ...................................5 ............5 CONFIGURAÇÃO DO IREPORT............................................................................... IREPORT............................................................................... 7 MONTAGEM DO RELATÓRIO................................... RELATÓRIO.......................................................... ...............................................8 ........................8 CONFIGURAÇÃO DO DATA SOURCE....................................... SOURCE.............................................................. ..............................8 .......8 MONTAGEM DE UM RELATÓRIO SIMPLES COM O IREPORT....................11 UTILIZANDO ASSISTENTE............................... ASSISTENTE...................................................... .............................................. ................................11 .........11 EDITANDO O RELATÓRIO.................................... RELATÓRIO........................................................... ..................................................17 ...........................17 COMPILANDO E PRÉ-VISUALIZANDO O RELATÓRIO NO IREPORT........17 ADICIONANDO PARÂMETROS AO RELATÓRIO..................................... RELATÓRIO..............................................19 .........19 ADICIONAR O PARÂMETRO À QUERY..................................... QUERY...............................................................20 ..........................20 CHAMADA DO RELATÓRIO NUMA APLICÇÃO WEB.....................................22 CONFIGURANDO O NETBEANS PARA EXECUTAR O RELATÓRIOS..........22 CONFIGURANDO AS BIBLIOTECAS DO JASPERREPORTS NO NETBEANS. ............................................ ................................................................... .............................................. .............................................. ............................................... ........................ 23 ADICIONANDO AS BIBLIOTECAS AO PROJECTO........................................... PROJECTO........................................... 26 BIBLIOTECAS ADICIONAIS......................................... ADICIONAIS................................................................ ......................................... ....................27 ..27 CRIANDO SERVLETS PARA CHAMAR OS RELATÓRIOS...............................28 RELATÓRIOS...............................28 SERVLET QUE PERMITE GERAR UM GERAR UM RELATÓRIOS SEM PARÂMETROS.............................................29
SERVLET PARA CHAMAR UM RELATÓRIO COM PARÂMETROS..............33 PARÂMETROS..............33 CHAMADA DO SERVLET PARA GERAR O RELATÓRIO COM PARÂMETROS........................... PARÂMETROS.................................................. .............................................. .............................................. ....................................37 .............37 PAGINA SIMPLES PARA PASSAR O PARÂMETRO...........................................37 PARÂMETRO...........................................37
2
O JasperReports O JasperReports é um Framework de código fonte aberto, utilizado para para gerar gerar rel relató atório rioss multip multiplat latafo aforma rma.. Escri Escrita ta em java, java, ess essa a biblio bibliotec teca a aprese apresenta nta grande grande habili habilidde dde na orgniz orgnizaçã ação o e aprese apresenta ntação ção de conteú conteúdo, do, permitindo a geração dinâmica de relatórios em diversos formatos, como PDF, HTML, XLS, CSV e XML, podendo ainde ser utilizada em qualquer aplicação Java, incluindo aplicações desktop, Web e distribuídas. Usando XML, o desenvolvedor pode definir textos estáticos, imagens, linh linhas as,, form formas as geom geomét étri rica cas, s, co como mo rect rectân ângu gulo loss e elip elipse ses, s, e as suas suas localizações dentro do relatório. Quando pronto, esse ficheiro XML deve ser compilado e, então é gerado um ficheiro com a extensão .jasper , contendo a verão compilada do código XML. O proc proces esso so de dese desenvo nvolvi lvime ment nto o de um rela relató tóri rio o co começ meça a co com m a codificação da definição do relatório em XML. Depois é criado um arquivo com a extensão .jrxml (o “template de relatório”), onde é descrita toda a estrutura do relatório: a posição de textos, imagens e formas f ormas geométricas; a forma de recuperação dos dados necessários, a forma de fazer cálculos e tota totali liza zaçõ ções es,, e quai quaiss parâ parâme metr tros os deve devem m se serr pass passad ados os,, entr entre e outr outras as definições.
Download do JasperReports JasperReports O JasperReport está disponível na URL http://sourceforge.net/projects/jasperreports/ http://sourceforge.net/projects/jasperreports/.. A sua configuração será vista mais adiante neste tutorial
3
O IReport
O iReport é uma ferramenta visual que desenha ficheiros XML para o JasperReports. É um IDE de relatórios WYSIWYG. Com iReport podemos definir o design do relatório dentro de um ambiente gráfico, contendo recursos necessários para desenvolver relatórios com os formatos suportados pela biblioteca JasperReports. Este ambiente oferece muitas ferramentas que aceleram o desenvolvimento do relatório, desde a conexão com a base de dados até a atalhos para tarefas de compilação e (pré)-visualização do relatório, dando a possibilidade de realizar ensaios e testes sobre o layout dos relatórios.
Download e Instalação do iReport O iReport está disponível no site http://ireport.sourceforge.net. A s u a instalação é normal…{duplo clique e ‘nexts’}.
4
Estrutura de um Relatorio Um relatório é composto por várias secções. Seccções são paertes de um relatório que contém informações específicas, necessárias para uma boa apresentação. Essas secções podem conter imagens, textos, formas geométricas, ect. Na terminologia do JasperReports, as seccções são chamadas de Bands. Num documento, existem secções com propósictos específicos, onde cada um ercerce um papel na geração do relatório. A seguir são apresentadas as principais seccções existentes para a geração de relatórios.
Secções Title O conteúdo desta secção aparece apenas uma vez no início do relatório. Ex.: Contactos Telefónicos Page Header O conteúdo desta secção aparece no início de cada página. Neste local pode-se colocar a data e hora e/ou o nome ou informações da empresa. Column Header
5
O conteúdo colocado nesta secção aparece apenas no começo de cada coluna. Se o relatório tem uma só coluna definida, então são ignoradas as secções cabeçalhos e rodapés de coluna. Como exemplo, nesta secção podemos ter a lista dos campos escolhidos como : Nome do cliente, Telefone, E-mail.
Detail O conteúdo desta secção se repete enquanto houver linhas para serem colocadas no relatório de acordo com o que existe na base de dados e os parâmetros passados. Column Footer Esta secção aparece abaixo de cada coluna. Vale o mesmo comentário da seccção Column Header. Page Footer Esta secção aparece apenas no fim de cada página. Nesta parte podemos ter informações como o número da página ou o total de paginas encontradas: “1/7”. Last Page Footer Esta seccção substitui o rodapé da página regular na última página do relatório. Summary Esta seccção só parece uma vez no término do relatório. Por exemplo, após ter listado todos os cadastros de clientes no detalhes (detail), pode-se querer expor algum detalhe num gráfico para melhorar a comparação visual.
6
Janela de apresentação do iReport 3.6.11
Configuração do iReport As opções principais de configuração do iReoprt estão disponíveis no menu Tools
1
No dia que terminei a primeira versão destes apontamentos apareceu já disponibilizada a
7
Montagem do relatório O sistema de gestão de bases de dados utilizado neste tutorial é o Mysql.
Antes de criar o relatorio master ou relatório principal, é necessário configurar um data source (fonte de dados).
Configuração do data source Na barra de ferramentas faça clique no botão Report Datasource
8
2.º Na caixa de diálogo que se abre fazer clique em new e escolher o Data Source Type {tipo de origem de dados}. No nosso caso, escolher Database JDBC connection.
… e fazer clique em next. 3.º Na Caixa de diálogo que se abre configurar as propriedades conforme as configurações e parâmetros da base de dados
9
… a seguir faça clique em Test. Se o teste for bem sucedido terá a seguinte mensagem…
… então clique em Save e feche a janela.
Na janela seguinte marque a check box ao lado do nome do Data Source definido para que fique configurada com a conexão activa. E feche a caixa de Diálogo
10
Montagem de um relatório simples com o iReport Podemos montar relatórios com o iReport, essencialmente de duas maneiras: Utilizando o assistente e criar um relatório personalizado.
Utilizando assistente 1.º Aceder ao menu File e escolher New e na janela New File escolher um modelo e fazer clique em Lauch Report Wizard
… na caixa de diálogo a seguir indicar o local onde pretende guardar o relatório. Num projecto Web, crie uma subpasta debaixo da pasta WEB-INF2. Por exemplo uma subpasta chamada relatórios. Na estrutura do projecto web
Existirão, entre outros, os seguintes subdirectórios: •
relatorios para os ficheiros . jrxml e jasper que o irreport gera ao
guardar e compilar o relatorio •
Source Packages para as classes Java; 2
Essa estrutura é importante, sob pena de surgirem muitas dificuldades para visualizar os
11
•
Web Pages para os arquivos .jsp;
•
Web Pages /WEB-INF para o ficheiro web.xml;
•
Libraries para os ficheiros JAR necessários para o projecto funcionar;
… continuando
… e clique em next para prosseguir
12
… na etapa Query, na secção Connections/Data Sources , escolher a conexão. … e clique em next para prosseguir. E para fazer a consulta que fornecerá os dados para o relatório, na caixa de diálogo que aparece a seguir, faça clique sobre o botão Design query
2.º Clique em Design query … na janela que aparece faça duplo clique sobre a tabela(s), a partir da(s) qual(ais) pretende criar o relatório. 3.º Na tabela seleccionada,
13
Marque os campos que pretende ver(visualizar no relatorio) …. E clique em OK. A seguir clique em Next para processguir 4.º Na janela que aparece
… seleccione os campos que pretende no relatório. Pode-se passar um-por-um fazendo clique na seta > ou todos de uma vez, fazendo clique nas setas duplas >>. A seguir faça clique em Next.
14
… Na janela que se segue, estão disponíveis as opções de agrupamento
… para o exemplo actual. Não é necessário escolher nenhuma opção de agrupamento. Faça clique em Next e verá a seguinte mensagem. Faça clique em Finish
15
O relatório base está pronto.
16
Editando o relatório. Trabalhando com o exemplo actual. Um pequeno cuidado deve-se ter em conta. Os campos que aparecem precedidos de um cifrão {$F}, apontam para campos da tabela da base de dados. Não devem ser ‘mexidos’. Os outros são textos estáticos. Podem e devem ser editados. Para tal basta fazer duplo clique sobre o item a editar ou seleccionar o item e depois primir a tecla F2. Com O iReport é possível aplicar variadíssimas formatações ao relatório.
Compilando e pré-visualizando o relatório no iReport Feitas as necessárias formatações e guardado o relatório, na barra de ferramentas do relatório faça clique no botão Compile Report, para compilar
..e depois sobre o botão Preview, para pré-visualizar o relatório.
17
Pré-visualização do relatório
… ao mesmo tempo o iReport 3.6.1 compila o relatório e cria dois ficheiros, no local onde está guardado o relatório. Um com a extansão .jasper e ou com a extensão .jrxml. Estes dois ficheiros são importantes para a visualização do relatório na aplicação. Os dois devem estar na pasta da aplicação de onde vão ser chamados os relatórios.
18
Adicionando Parâmetros ao Relatório Antes de construirmos o aplicativo para chamar o relatório, vamos ver os procedimentos para criar um parâmetro que permitirá, por exemplo mostrar os dados de um determinado Funcionário, ou, por exemplo, de uma determinada Factura. Vamos criar um relatório que envolva um campo de identificação unívoca e depois de todas as formatações e configurações…
No Report Inspector faça clique com o botão direito no mouse sobre Parameters e escolha Add Parameter
…e na caixa Properties escreva o nome do parâmetro, na secção Name, escolha o tipo de dado na secção Parameter Class.
19
No exemplo mostrado temos codigoFuncionario, do tipo Integer.
uma
parâmetro
chamado
Como vamos precisar de testar o relatório, seleccione o item Use as a Prompt. Isso fará com que um promt apareça para que possamos escrever o paramentro solicitado, para teste. Existe também o campo Default Value Expression. É a opção padrão para o valor do prompt.
Adicionar o parâmetro à query Para que o parâmetro venha a ter efeito é necessário adiciona-lo à query. Para tal, na barra de ferramentas clique no botão Report Query e a seguir clique no botão Query Designer . Na caixa de diálogo SQL Query Designer, no quadro à direita, na tabela com o campo que deseja como condição, clique com o botão direito do mouse e no menu de contexto, seleccione o item add where condition.
20
Ao surgir a caixa de diálogo condition.edit, a parte superior estará preenchida com o campo escolhido. Resta apenas manter a condição de igualdade e escrever na parte inferior o parâmetro criado. O formato completo do parâmetro será $P{codigoFuncionario}3, por exemplo. A caixa de diálogo preenchida será parecida com a seguinte.
Após a confirmação, na construção da query, a condição WHERE aparecerá contendo a comparação do campo escolhido com o parâmetro passado.
No caso em construção ao voltar à caixa de diálogo Report query termos a instrução SQL com a condição WHERE contendo o codigoFuncionario comparado com o parâmtro $P{codigoFuncionario}. Executando o relatório. Antes de mostrar o relatório, o IReport mostra um promt chamado Parameter prompt.
3
Este nome será importante para o servlet chamar correctamente o relatório
21
O campo pode vir já preenchido com um valor padrão, esperando que se escreva um novo valor. A baixo aparece o tipo aceite e a descrição, caso se tenha feito, do parâmetro. Mesmo que se apague o parâmetro padrão, se for preciso testar o relatório com este número, basta fazer clique no botão Use default.
Chamada do relatório numa Aplicção Web Pré-Requisitos Conhecimentos de Servlets e JSP.
Configurando o NetBeans para executar o relatórios Para se poder visualizar o relatorio criado é necessário adicionar algumas bibliotecas do JasperReports. Por segurança adicionaremos todas as que começam por common (common collections por exemplo) mais a biblioteca iText. O último passo será implementar a classe que gera o relatório. Depois se ter feito o download da versão mais recente das bibliotecas do JasperReport, deve descomprimir o package baixado e no directório lib
22
seleccionar os seguintes .jar. De preferência, é bom coloca-los numa pasta com um nome sugestivo. commons-beanutils-1.8.0.jar commons-collections-2.1.1.jar commons-digester-1.7.jar commons-javaflow-20060411.jar commons-logging-1.0.4.jar iText-2.1.0.jar jasperreports-javaflow-3.6.1.jar jasperreports-3.6.1.jar jasperreports-fonts-3.6.1.jar
Configurando as Bibliotecas do JasperReports no NetBeans. Para configurar o JasperReports/Ireport e então utili-lo na aplicação, os passos são os seguintes. Aceda ao menu Tools e clique em Libraries
23
2. Na caixa de diálogo Library Manager, clique em New Library... 3. E na caixa de diálogo New Library na secção Library Name:, escrever JasperReports (se desejar colocar a versão… é bastante sugestivo) e em Library Type: escolha Class Libraries. Clique no botão OK para confirmar.
24
4. De volta, na caixa de diálogo Library Manager, clique no botão Add JAR/Folder e adicionar os ficheiros .jar do JasperReport, referidos anteriormente e confirmar.
25
Finalmente os ficheiros configurados estarão disponíveis no campo Library Classpath da aba Classpath.
Adicionando as bibliotecas ao projecto. Na janela Projects, clique com o botão direito do mouse sobre Libraries, com o projecto expandido, seleccione Add Library no menu de contexto. Na caixa de diálogo Add Library, seleccione a livraria JasperReport (criada anteriormente). Confirme clicando no botão Add Library.
26
Ainda pode fazer clique com o botão direito o mouse sobre o projecto e escolher a opção properties.
… nesta caixa de diálogo seleccione a categoria Libraries e na secção Cimple faça clique sobre o botão Add Library…
Bibliotecas adicionais. Além da livraria do JasperReport adicone também as livrarias Spring Framework 2.5 e Groovy 1.5.5. Estas livrarias já vêem incorporadas no NetBeans. Basta adiciona-las ao projecto
27
Criando servlets para chamar os relatórios Para criar um servlet, clique com o botão direito do mouse sobre o modulo Web do projecto e seleccione o item New e clique em Servlet. Escreva RelatorioSemParametros. Na secção Package escrever relatórios…
… clique em next, para prosseguir.
…deixe marcada a opção Add information to descriptor(Web.xml). Clique no botão Finish para completar.
deployment
28
Adicione ao servlet o código mostrado a seguir e guarde as alterações.
Servlet que permite gerar um relatórios sem parâmetros ppublic class RelatorioSemParametros extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, Exception { Connection conn = null;
conn = Conexao.getConnection();
// gera o relatório
ServletContext context = getServletContext();
byte[] bytes = null;
try { // carrega os arquivos jasper JasperReport relatorioJasper = (JasperReport) JRLoader.loadObject( context.getRealPath("/WEBINF/relatorios/ListaFuncionarios.jasper")); // parâmetros, se houver
29
Map parametros = new HashMap(); // direciona a saída do relatório para um stream bytes = JasperRunManager.runReportToPdf(relatorioJasper, parametros, conn); if (bytes != null && bytes.length > 0) { // envia o relatório em formato PDF para o browser response.setContentType("application/pdf"); response.setContentLength(bytes.length); ServletOutputStream ouputStream = response.getOutputStream(); ouputStream.write(bytes, 0, bytes.length); ouputStream.flush(); ouputStream.close(); } } catch (JRException jre) { System.err.println("Errrrrrrrrrrroooooooooooooooooooo" + jre); } }
@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { processRequest(request, response); } catch (Exception ex)
30
{
Logger.getLogger(RelatorioSemParametros.class.getName()).log(Level.SE VERE, null, ex); } }
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { processRequest(request, response); } catch (Exception ex) {
Logger.getLogger(RelatorioSemParametros.class.getName()).log(Level.SE VERE, null, ex); } }
@Override public String getServletInfo() { return "Short description"; } }
31
Para os imports dos objectos encontrados, utilizar o atalho CTRL+SHIFT+I (Fix All Imports).
Pagina JSP que chamará o relatório
Pagina Simples para chamar o servlet e mostrar o relatório
Visuzalização do Relatorio!
Relatorio Sem Parámentos
32
Trabalhando com parâmetros no relatórios. O primeiro exemplo demonstra apenas a chamada ao relatório criado, sem transmitir parâmetros. No segundo exemplo serão adicionados parâmetros ao relatório. Os parâmetros são passados durante o processo de criação do relatório. Ver secção Adicionando Parâmetros ao Relatório .
Servlet para chamar um Relatório com parâmetros Nesta parte será apresentado um exemplo de código de servlet que construi um relatório em função do parâmetro passado. Para começar. Crie um novo servlet com o nome RelatorioComParametros e adicione a ele o código seguinte.
Relatório com parâmetro – 1.º Exemplo de código
public class RelatorioComParametros extends HttpServlet {
33
/** * Processes requests for both HTTP
GET
and
POST
methods. * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, Exception { Connection conn = null; conn = Conexao.getConnection(); // gera o relatório ServletContext context = getServletContext(); byte[] bytes = null; try { // carrega os arquivos jasper JasperReport relatorioJasper = (JasperReport)JRLoader.loadObject( context.getRealPath("/WEBINF/relatorios/listaDadosFuncionario.jasper")); // parâmetros, se houverem Map parametros = new HashMap(); // recebo o valor do formulario e converte-o para inteiro parametros.put("codigoFuncionario", Integer.parseInt(request.getParameter("codigoFuncionario"))); // direcciona a saída do relatório para um stream
bytes = JasperRunManager.runReportToPdf(relatorioJasper,parametros,conn);
34
System.out.println("Certo"); if (bytes != null && bytes.length > 0) { // envia o relatório no formato PDF para o browser response.setContentType("application/pdf"); response.setContentLength(bytes.length); ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
ouputStream.close(); } } catch(JRException jre) { System.err.println("Erro"+jre); } }
//
@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try {
35
processRequest(request, response); } catch (Exception ex) { Logger.getLogger(Relatorio02.class.getName()).log(Level.SEVERE, null, ex); } } /** * Handles the HTTP POST
method. * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { processRequest(request, response); } catch (Exception ex) { Logger.getLogger(Relatorio02.class.getName()).log(Level.SEVERE, null, ex); } }
/** * Returns a short description of the servlet.
36
* @return a String containing servlet description */ @Override public String getServletInfo() { return "Short description"; }//
}
O parâmetro passado é um java.util.HashMap, que define se haverá um ou mais parâmetros. O parâmetro criado no relatório tem um nome, e é este que deve ser utilizado neste HashMap: código (referindo-se a $P{codigoFuncionario}. Como se trata de uma chave do tipo String e de um valor numérico inteiro, graças ao método put(Key, Value), o exemplo capturará o campo chave de cada funcionários e transmitirá ao parâmetro, da seguinte forma: parametros.put("codigoFuncionario", Integer.parseInt(request.getParameter("codigoFuncionario")));
Chamada do servlet para gerar o relatório com parâmetros Crie uma paginas Jsp e adicione um formulário (form). Dentro do form adicione uma inpuText com o name “codigoFuncionario”, ou conforme o caso. Adicione ainda um botão do tipo submit Defina como POST o method do form e no action passe o nome do servlet que receberá o parâmetro. No caso do exemplo “RelatorioComParametros”
Pagina Simples para passar o parâmetro 37
Visuzalização dos Relatorios!
Bom trabalho 38