Para desenvolver este exemplo, será necessário termos uma estrutura de tabelas como mostrado abaixo ou a estrutura que você desejar, desde que possa ser utilizada como Master/Detail. Esta estrutura foi criada e testada em uma base Oracle 9i, então ajuste os tipos para a base que você utilizar. VENDAS ID_VENDA DATAVENDA COMPRADOR NUMBER(4,0) DATE VARCHAR2(60) DETALHE ID_DETALHE NUMBER(4,0) DESCRICAO VARCHAR2(60) QTD NUMBER(2,0) VALORUNT NUMBER(15,2) FID_VENDA NUMBER(4,0) Se você decidir utilizar a estrutura acima, preencha as tabela como abaixo. VENDAS 253 01/04/2003 JJ Comércio de Massas 254 02/04/2003 Almeida & Almeida Secos e Molhados 255 02/04/2003 Angélica Derivados 256 05/04/2003 Mercearia Pais e Filhos DETALHE 300 Feijão 10 2,25 253 301 Arroz 5 5,32 253 302 Óleo 20 1,20 253 303 Feijão 15 2,25 254 304 Macarrão 50 0,90 255 305 Margarina 12 2,33 255 306 Margarina 25 2,33 256 Com as tabelas preenchidas abra execute agora o ireport, pressione CRTL+N ou vá ao menu File>> New. Salve o arquivo como RelatorioVendas.xml. Agora vamos definir para o relatório qual é a sua origem, ou seja, qual é o comando SELECT que irá gerar os dados deste relatório. Para isso vá ao menu Database >> Report query e preencha como mostrado abaixo. Após informar a conexão e o SELECT clique em Read Fields para capturar os campos, Register Fields to report para 1
termos acessos a estes campos no relatório e finalmente em Save to report para salvar o SQL no arquivo.xml gerado. Feche a janela. Agora monte o design do relatório mestre à sua maneira ou utilize o exemplo abaixo: Este é o elemento para o sub-relatório Agora vá ao menu View >> Values form, clique na guia Parameters, pois aqui iremos adicionar um parâmetro que irá apontar para o arquivo do sub-relatório. Clique no botão New e preencha os campos como mostrado abaixo. Depois clique em Ok e feche a janela de Values form. 2
É necessário aqui informar o caminho completo de localização do sub-relatório, ou seja, o nome do arquivo.xml compilado. Neste caso o subrelatório irá se chamar SubRelDetalheVenda. Agora selecione o elemento do sub-relatório e mostre suas propriedades, temos as guias Subreport 1 e Subreport 2. Na guia Subreport 1 informamos para que na exibição do sub-relatório seja utilizado a mesma conexão do relatório mestre. Na guia Subreport 2 informamos o parâmetro de localização do sub-relatório e ainda qual será o valor a ser passa para o sub-relatório, neste nosso caso iremos passar para o sub-relatório o código da venda. Aqui temos o nome do parâmetro definido em Values form. Clique com o botão direito do mouse nesta área e escolha Add parameter. E preencha como mostrado na imagem abaixo. Terminamos aqui a definição do relatório mestre, basta que você compile agora o mesmo, vá em Tools >> ireportercompiler. 3
Inicie agora um novo relatório, menu File >> New. Configure-o como mostrado abaixo. Aqui estamos apenas configurando a área do relatório um pouco menor que o padrão, pois não corremos o risco de ter o sub-relatório cortado na hora da geração do relatório. Agora iremos definir a origem dos dados deste relatório, para isso vá em Database >> Report query. A princípio você deve construir a cláusula SQL para que traga os campos necessários e assim registra-los ao relatório. Após ter os campos registrados você irá refazer a cláusula SQL de modo que na condição WHERE da mesma seja utilizado o parâmetro que será passado pelo relatório mestre. Após reconstruir a cláusula SQL não esqueça de salva-la no relatório (Save to report). 4
Monte agora o sub-relatório como mostrado abaixo ou à sua maneira. Depois de montado o relatório vamos informar para o relatório o parâmetro que é utilizado na cláusula SQL, para isso vá ao menu View >> Values form, clique na guia parameters e depois clique em New. Basta preenche como mostrado abaixo. Salve o relatório e compile o mesmo. Está pronto a geração de sub-relatório utilizando o JasperReports. Se tudo der certo teremos um relatório como mostrado abaixo. 5
Para testa-lo realmente será necessário criar uma classe Java ou então no caso da criação deste manual foi utilizado o servidor Tomcat e para isso criou-se o seguinte código: <%@ page import="dori.jasper.engine.*" %> <%@ page import="dori.jasper.engine.util.*" %> <%@ page import="dori.jasper.engine.export.*" %> <%@ page import="java.util.*" %> <%@ page import="java.sql.*" %> <%@ page import="java.io.*" %> <% String vardriver = "<driver de conexão>"; String varlink = "<link para o banco de dados>"; String varusuario = "<nome do usuário>"; String varsenha = "<senha do usuário>"; File reportfile = new File(application.getRealPath("/subrel/RelatorioVendas.jasper")); Map parameters = new HashMap(); parameters.put("reporttitle", "Relatório de Vendas"); parameters.put("basedir", reportfile.getparentfile()); Class.forName(varDriver); Connection varconexao = DriverManager.getConnection(varLink,varUsuario,varSenha); byte[] bytes = JasperRunManager.runReportToPdf(reportFile.getPath(),parameters,varConexao); response.setcontenttype("application/pdf"); response.setcontentlength(bytes.length); ServletOutputStream ouputstream = response.getoutputstream(); ouputstream.write(bytes, 0, bytes.length); ouputstream.flush(); 6
ouputstream.close(); %> Espero que este pequeno manual ajude a quem está começando. Aqueles que tiverem alguma dúvida ou dica para melhora-lo podem entrar em contato: rogério_macedo@netpar.com.br ou espero_linux@yahoo.com.br. Este manual é de livre distribuição, mesmo que não coloque o nome do autor original. Rogério Ribeiro Macêdo JColtro Consultoria, Treinamento e Desenvolvimento Ituiutaba-MG / Curitiba-PR Para cada povo o seu idioma, para todos os povos o Esperanto. 7