Fórum Impressão de Relatórios com Parametros no JSF usando iReport #10173
20/10/2009
0
Estou desenvolvendo uma aplicação web com JSF,Spring,JPA e RichFaces, e neste momento estou com dificuldades de imprimir meu relatorio através de um parametro que possui no Relatorio e que por sua vez possui um sub_relatorio.
O que preciso é atraves de um link na web eu possa imprimir este relatorio em PDF passando um paramentro do codigo do pedido.
Em anexo o codigo. no disco Virtual.
Victor Lima
Curtir tópico
+ 0Posts
21/10/2009
Dyego Carmo
Sua duvida está em como passar um parametro para iReport ?
Ou como imprimir este PDF ?
Gostei + 0
21/10/2009
Dyego Carmo
ex: voce criou lá um parametro chamado "codigo" ,
Ai antes de mandar gerar via JASPERREPORTS voce envia este parametro da seguinte forma:
HashMap<String, String> parameterMap = new HashMap<String, String>();
parameterMap.put("codigo","22");
jp = JasperFillManager.fillReport(arquivoDoRelatorio, parameterMap, banco.getConection());
LEMBRANCA MUITO IMPORTANTE: Voce deve criar este parametro utilizando o iReport antes , senao o JASPER nao vai conseguir encontra-lo !
Gostei + 0
21/10/2009
Victor Lima
Boa tarde Dyego,
Eu ja fiz exatamente isso mas nao deu certo, o que não estou entendendo é :
Criei um Parametro no iReport chamado PEDIDOID,esse parametro esta como java.lang.Long , esta no relatório de Mestre Detalhe.
No SubReport tambem tem esse parametro PEDIDOID java.lang.Long, quando executo esse relatorio diretamente no iReport ele me retorna o relatório normalmente, abre uma caixa do prompt onde digito o codigo e mostra o Mestre detalhe e o subrelatorio.
O que não estou conseguindo é chamar esse relatório dentro da web que criei. Muitos exemplos so mostra com um relatório normal que nao tem subrelatório.
veja o que estou fazendo no código : dessa forma esta vindo em branco o relatório nao tem dados.
public void executarRelatorio() throws java.text.ParseException, ParseException, SQLException {
FacesContext context = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
//pega o caminho do arquivo .jasper da aplicação
InputStream reportStream = context.getExternalContext().getResourceAsStream("/reporter/pedidos/picking_SubReporte.jasper");
//envia a resposta com o MIME Type PDF
response.setContentType("application/pdf");
try {
Connection connection = getConnection();
ServletOutputStream servletOutputStream = response.getOutputStream();
// HashMap<String,Integer> parametros = new HashMap<String,Integer>();
// parametros.put("PEDIDOID", 127 );
HashMap map = new HashMap();
// map.put("PEDIDOID", 127); // testei mas nao funcionou
map.put("SUBREPORT_DIR","/reporter/pedidos/Itens_picking.jasper");
//envia para o navegador o PDF gerado
JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream, map,connection);
// }
servletOutputStream.flush();
servletOutputStream.close();
connection.close();
} catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
//evita erro do JSF após completar
//a geração do relatório
//avisando o FacesContext que a resposta está completa
context.responseComplete();
}
}
Gostei + 0
21/10/2009
Victor Lima
Para mim usando somente uma lista é bem mais fácil jogar o resultado em uma lista e depois passar os dados para o iReport. agora usando subreport nao tenho ideia, tentei algumas coisas mas não deu certo.
Eu gostaria de fazer como esse exemplo abaixo: mas o problema é que com metre detalhe nao funciona, teria que implementar algo a mais que eu novato nao estou conseguindo. veja:
Eu consegui fazer a query normamente, retornando os dados na lista , jogando na tela uma previa tudo ok.
//separa a pesquisa do total encontrado
//possibilitando a utilização também no relatório
private List<?> todosResultsPesq(){
Map<String, Object> params = new HashMap<String, Object>();
params.put("data1", new Timestamp(data1.getTime()));
params.put("data2", new Timestamp(dataConvertida()));
return usuarioDao.listPesqParam(consultaComprados(),params);
}
public void executarRelatorio(ActionEvent action) throws ParseException{
FacesContext context = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) context.
getExternalContext().getResponse();
//pega o caminho do arquivo .jasper da aplicação
InputStream reportStream = context.getExternalContext()
.getResourceAsStream("/relatorios/relatorio.jasper");
//envia a resposta com o MIME Type PDF
response.setContentType("application/pdf");
/*for�a a abertura de download
response.setHeader("Content-disposition",
"attachment;filename=relatorio.pdf");
*/
try {
ServletOutputStream servletOutputStream = response.getOutputStream();
//envia o título para o relatório, usando o parâmetro criado
Map<String, String> parametros = new HashMap<String, String>();
parametros.put("TITULO", "Relat�rio de Compras Efetuadas no Site");
List dados = new ArrayList();
Map record = null;
//varre a consulta e separa os objetos
for (Iterator iterator = todosResultsPesq().iterator();
iterator.hasNext();) {
Object[] o = (Object[]) iterator.next();
record = new HashMap();
//coloca em um Map cada um dos campos criados
//manualmente pelo relatório
record.put("pedido", Integer.parseInt(o[0].toString()));
record.put("nome", o[1].toString());
record.put("data", this.convertTimestamp(o[2].toString()));
record.put("qtd", Integer.parseInt(o[3].toString()));
record.put("total", Double.parseDouble(o[4].toString()));
//adiciona o List dados
dados.add(record);
}
//cria uma fonte de dados para cole��es
JRBeanCollectionDataSource fonteDados =
new JRBeanCollectionDataSource(dados);
//envia para o navegador o PDF gerado
JasperRunManager.runReportToPdfStream(reportStream,
servletOutputStream, parametros,fonteDados);
servletOutputStream.flush();
servletOutputStream.close();
} catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
//evita erro do JSF após completar
//a geração do relatório
//avisando o FacesContext que a resposta está completa
context.responseComplete();
}
}
Gostei + 0
21/10/2009
Victor Lima
Valeu pela força, funcinou a impressão, postei outro chamado porque preciso de varias paginas.
obrigado fica com Deus.
Gostei + 0
22/10/2009
Dyego Carmo
Estou fechando o chamado !
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)