II. Classe Reports
Essa classe tem por objetivo chamar o relatório a partir da sua aplicação, compilando o relatório (aqui neste exemplo, chama-se Clientes.jxml) e apresentando-o no JasperViewer.
Para que isso funcione corretamente, crie o seu relatório usando o iReports (usei a versão 3.0.0 - explicarei mais adiante), e salve-o na mesma pasta do seu projeto, para ser armazenado dentro do arquivo JAR, quando o projeto for compilado.
A unidade de persistência neste exemplo chama-se MechOfficePU, mas basta substituir pela usada na sua aplicação.
O arquivo jxml também pode apresentar alguns problemas com as tags xml, e para isso estou usando uma classe chamada LegacyJasperInputStream, que corrige esse problema. Apresentarei o código mais adiante.
Segue abaixo o código da classe Reports:
public class Reports {
private Cadastro cadastro;
private EntityManager entityManager;
private Query cadastroQuery;
private List cadastroList;
public Reports() {
entityManager = java.beans.Beans.isDesignTime() ? null : javax.persistence.Persistence.createEntityManagerFactory("MechOfficePU").createEntityManager();
}
public void Clientes(){
try{
InputStream rclientes = Reports.class.getResourceAsStream("Clientes.jrxml");
cadastroQuery = java.beans.Beans.isDesignTime() ? null : entityManager.createQuery("SELECT c FROM Cadastro c WHERE c.idpermissao = :idpermissao");
Permissao idpermissao = new Permissao(5);
cadastroQuery.setParameter("idpermissao", idpermissao);
cadastroList = java.beans.Beans.isDesignTime() ? java.util.Collections.emptyList() : cadastroQuery.getResultList();
Map parameters = getParameters(entityManager);
JasperDesign design = JRXmlLoader.load(new LegacyJasperInputStream(rclientes));
JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(cadastroList);
JasperReport compilado = JasperCompileManager.compileReport(design);
JasperPrint jp = JasperFillManager.fillReport(compilado, new HashMap(), ds);
JasperViewer.viewReport(jp, false);
} catch (Exception e) {
System.out.print(e.getMessage());
}
}
}