Saudações,
Estou procurando por exemplos, tutoriais, guias, qualquer material que me ajude a usar [color=red]JRJpaDataSource da API do JasperReports[/color]. Fiz uma boa busca e so encontrei exemplos onde se usa JRJpaDataSource para passar o EntityManager para o Jasper como um parâmetro e no template se faz a query e preenche o relatório.
O que quero é que toda a lógica de criação seja feita pela aplicação, ou seja todo o datasource, da Query via JPA ao Banco, passando pela criação do JRDataSource que seria passado ao relatório para o preenchar através do método JasperFillManager.fillReport(JasperReport, Map, JRDataSource).
Agradeço demais a ajuda isto está empacando a minha tarefa a dias.
Estou a disposição para qualquer perguntas. [alessandro.moreira@gmail.com]
Um abraço a todos.
Não encontrei exemplo de uso do JRJpaDataSource, onde este fornece um datasource ao relatório. Resalto que o que encontrei foi exemplo que forneciam a conexão ao banco via EntityManager.
Mas bem, estou postando a solução que implementei. Dentro da API do JasperReports não encontrei solução senão fazer uma especialização.
Criei uma especialização do JRDataSource. Veja o código abaixo.
public class JRArrayDataSource implements JRDataSource {
private Iterator<Object[]> iterator;
private Object[] cursor;
private int indice;
public JRArrayDataSource(List<Object[]> array) {
super();
iterator = array.iterator();
}
public Object getFieldValue(JRField jrField) throws JRException {
indice++;
if (indice < cursor.length) {
return cursor[indice];
}
return null;
}
public boolean next() throws JRException {
boolean retorno = iterator.hasNext();
if (retorno) {
cursor = iterator.next();
indice = -1;
}
return retorno;
}
}
O que faço aki é iterar a Lista e depois passar ir lendo o array e retornando o valor.
O importante é observar a sequencia dos campos no relatório. A ordem de criação deve bater com a ordem dos elementos no array, aí o mapeamente é feito sem problemas.
Veja o código da geração do relatório abaixo:
public static void gerarRelatorio() throws JRException {
List<Object[]> array = new ArrayList<Object[]>();
array.add(new Object[]{new Integer(1), "Alessandro Moreira", "Caldeirão Furado, 13", "32321010"});
array.add(new Object[]{new Integer(2), "Wolverine", "Escola Xavier, X", "55551234"});
JRArrayDataSource arrayDataSource = new JRArrayDataSource(array);
JasperPrint print = JasperFillManager.fillReport("relatorio/relatorioCliente.jasper", new HashMap<Object, Object>(), arrayDataSource);
JasperViewer view = new JasperViewer(print);
view.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
view.setSize(500, 600);
view.setLocationRelativeTo(null);
view.setVisible(true);
}
Espero que seja útil e bom Java para todos.