Ola vou explicar como ficou minha solucao. Primeiro eu fiz o select no iReport sem passar as condicoes para eu poder montar o relatorio se nao ele nao carrega os fields. Depois de montado o leiaute as condicoes ficam assim:
//Observar a exclamalçao depois do $P
select numeroNota,serieNota,dataEmissao, dataRecebimento from notafiscal where loja=$P{loja} $P!{fornecedor} $P!{categoria} $P!{tiponota}
Quando coloca essa exclamação ele para de carregar os campos automaticamente e sem a exclamacao o iReport nao compila o relatorio. Por isso montei primeiro sem where para depois coloca-lo. Agora no codigo do programa o metodo que chama o relatorio ficou assim:
public String imprimirRelatorioNotaFiscalAnalitico() {
InputStream relatorioStream = getClass().getClassLoader().getResourceAsStream("caminho_do_relatorio/notaFiscalAnalitico.jasper");
HashMap parametros = new HashMap();
parametros.put("loja", loja.getCodigo());
parametros.put("fornecedor", "");
parametros.put("categoria", "");
parametros.put("tipoNota", "");
if (fornecedor != null) {
parametros.put("fornecedor", "and n.idfornecedor=" + fornecedor.getID());
}
if (categoria != null) {
parametros.put("categoria", "and categoria=" + categoria.getID());
}
if (!tipoNota.equals("A")) {
parametros.put("tipoNota", "and tiponota=\'" + tipoNota.trim() + "\'");
}
RelatorioUtil.imprimirRelatorio(relatorioStream, parametros, Database.getInstance().getConnection(), "notaFiscal.pdf");
return null;
}
Abaixo o metodo da classe que faz a geracao do pdf.
public static void imprimirRelatorio(InputStream relatorioStream, HashMap parametros, Connection conexao, String nomeArquivo) {
FacesContext context = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
String header = "inline);filename=";
try {
JasperPrint print = JasperFillManager.fillReport(relatorioStream, parametros, conexao);
byte[] dados = JasperExportManager.exportReportToPdf(print);
response.setContentType("application/pdf");
response.setHeader("Content-disposition", header + nomeArquivo);
OutputStream output = context.getExternalContext().getResponseOutputStream();
output.write(dados);
output.flush();
output.close();
response.getCharacterEncoding();
context.responseComplete();
} catch (JRException ex) {
Logger.getLogger(RelatorioUtil.class.getName()).log(Level.SEVERE, null, ex);
ex.printStackTrace();
} catch (IOException ex) {
Logger.getLogger(RelatorioUtil.class.getName()).log(Level.SEVERE, null, ex);
ex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
}
Funcionou igual quando fazemos os IFs no codigo fonte para ir construindo os selects concatenando as strings.
[]'s