Olá desenvolvedores, estou com dificuldades em manipular parâmetros (filtros) nos meus relatórios do iReport.
Eu passo os fields a seerm preechidos via HashMap e então queria saber como passo parâmetros também. Abaixo segue um exemplo dos códigos usados para gerar o relatorio:
Classe relatório, para simplificar repetição de código
public class Relatorio {
public void toPDF(JRDataSource jrDataSource, String jrxmlFile) {
try {
InputStream input = new FileInputStream(new File(jrxmlFile));
JasperReport jasperReport = JasperCompileManager.compileReport(input);
JasperPrint jasperPrint = JasperFillManager.fillReport(
jasperReport, null, jrDataSource);
HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance()
.getExternalContext().getResponse();
httpServletResponse.addHeader("contentType", "application/pdf");
ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
FacesContext.getCurrentInstance().responseComplete();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Classe responsável por criar/enviar os campos da entidade para o relatório:
public class PragaReport {
private PragaDAO pragaDao = new PragaDAO();
private Object id;
public List<Map<String, ?>> listarReport() {
List<Map<String, ?>> result = new ArrayList<>();
try {
for (Praga p : pragaDao.read()) {
Map<String, Object> m = new HashMap<>();
m.put("id", p.getId());
m.put("nome", p.getNome());
m.put("porcentagemBaixa", p.getPorcentagemBaixa());
m.put("porcentagemAlta", p.getPorcentagemAlta());
m.put("id_usuario", p.getUsuario().getNomeUsuario());
m.put("filtroID", "id");//essa linha não funciona
result.add(m);
}
return result;
} catch (Exception e) {
return null;
}
} /*Getters e Setters omitidos*/
Método da classe PragaController que chama os métodos das classes acima e gera o relatório:
public void gerarRelatorio() {
Relatorio relatorio = new Relatorio();
PragaReport pr = new PragaReport();
JRDataSource jrDataSource = new JRBeanCollectionDataSource(pr.listarReport());
String jrxmlFile = FacesContext.getCurrentInstance()
.getExternalContext().getRealPath("/reports/pragaReport.jrxml");
relatorio.toPDF(jrDataSource, jrxmlFile);
}
Botão para chamar o método:
<p:commandButton value="PDF" action="#{pragaController.gerarRelatorio()}"
onclick="this.form.target='_blank'" ajax="false"
class="btn btn-default btn-sm" style="margin-bottom: 7px;" />
Se alguém puder me mostrar o caminho para criar filtros para o usuário preencher como intervalo de datas, filtro por id(que é oq tentei no exemplo) ficaria muito grato. Meu projeto ta parado por conta disso.
PS: um fato que acho curioso é que na maioria dos posts sobre iReport vejo o pessoal tratando o arquivo .jasper, e no meu caso eu apenas manipulo o .jrxml o .jasper sequer é gerado e o relatório funciona.
Segue também foto de como ta a hierarquia das classes, local onde o .jrxml é armazenado e layout do form.
Grato

