Olá,
No Jasper tem como eu fazer um relatório usando um ArraList dentro de outro ArrayList? pode ser também um arraylist como atributo do VO.
O que eu quero fazer é o seguinte: cada página vai ser de um cliente, cada cliente vai ter uma lista de informações a serem mostradas.
Não consigo fazer isso :( O que eu consegui fazer até agora foi:
ArrayList resultado = new ArrayList();
Licenca licenca = new Licenca();
licenca = new Licenca();
licenca.setSenha("AASSA1234");
licenca.setSistema("Folha de Pagamento 2");
resultado.add(licenca);
licenca = new Licenca();
licenca.setSenha("12434FGDF");
licenca.setSistema("Contabilidade");
resultado.add(licenca);
licenca = new Licenca();
licenca.setSenha("54HGF2345");
licenca.setSistema("Folha de Pagamento");
resultado.add(licenca);
Map parametros = new HashMap();
parametros.put("nomecliente","José João da Silva Sauro");
JasperPrint impressao = JasperFillManager.fillReport(
getClass().getResourceAsStream(layout),
parametros, new JRBeanCollectionDataSource(resultado));
Cria uma classe extendendo do JRDataSource. Dai vc implementa os metodos next e gelValue ( eu acho que sao esses os nomes, mas verifica ) que vc consegue criar realtorios de qualquer fonte de dados… hehehe
F
furutani
Pois é… eu vou ter que criar um DataSource personalizado.
Eu tenho uma classe Cliente que tem os atributos nome e um ArrayList de Licenca, e Licenca tem os atributos sistema e senha ambos são string;
no método next() eu só posso retornar true quando eu quiser ir para o próximo cliente certo?
já no método getFieldValue() eu não estou conseguindo assimilar como eu posso pegar o List do Cliente e pra cada posição do List criar uma linha na relatório.
O método getFieldValue() é chamado infinitamente até o next() ser falso?
B
brlima
Ele chama o getFieldValue para pegar o valor de um campo que esta no relatorio. Quando vc cria um campo no relatorio, vc da a ele um nome. Esse nome é uma propriedade do objeto que vc recebe como parametro no getFieldValue.
Portanto, vc tem o nome do campo que tão pedidndo no metodo getFieldValue. Vc tem que retornar o valor desse campo no tipo pedido, por exemplo: se teu campo no relatorio tá como String, vc deve retornar uma String, se for Double, retrna Double, e assim por diante.
Agora cabe a vc saber o que vai querer retornar pra cada campo
F
furutani
B. R. Lima,
O que eu quero fazer é mais ou menos isso:
Eu tenho três campos no relatório: nome do cliente (aparece uma vez), e as licenças com o nome do sistema e o serial. Sendo que cada cliente deve ocupar uma página do relatório.
Eu passo pro JRDataSource um List (A) com os VOs Cliente:
public class Cliente {
private String nome;
private List listaLicenca;
// métodos get/set
}
No VO Cliente tem uma List (B) de Licençapublic class Licenca {
private String sistema;
private String serial;
// métodos get/set
Pra mim percorrer a List (A) é fácil, o problema é a List (B).
O método getFieldValue() é chamado apenas uma vez pra os campos sistema e serial e volta para o next() . Eu precisava que ele voltasse a pedir os campos sistema e serial até acabar o List (B)
Grato
F
furutani
Eu estou tentando resolver isso com um subreport.
No subrelatorio eu preciso passar um JRBeanCollectionDataSource(List ). Como que eu faço isso apartir do DataSource do relatorio principal?
Eu envio ele como se fosse um field?
B
brlima
Vc nao poderia fazer uma quebra por cliente ( aka group ) ?
Dai era so percorrer o seu vo de clienter, e pra cada cliente percorrer as licensas.
Algo assim, claro, tem muito mais coisas aqui pra tratar, mas a ideia seria essa, e no final vc retornaria todo mundo. E o reltorio faria a quebra de cliente por pagina.
Parabéns pela iniciativa … se você quiser vale pegar o modelo do word, passar seu tutorial para PDF e mandar pro GUJ.
F
furutani
Smota,
onde está esse modelo?
não tem pra OpenOffice.org? é que eu não tenho word aqui na firma.
E
eagnes
Roberto, depois que vi o teu tutorial resolvi testar os subreports… mas achei ruim ter que criar um novo JRDataSource para o report. Eu fiz uns testes e funcionou legal também sem a criação deste DataSource. Então eu teria 2 dicas para adicionar no teu tutorial:
Para não precisar criar um novo JRDataSource, basta colocar em “use datasource expression”: new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource((List) $F{ListaDisciplinas}) ao invés $F{ListaDisciplinas} apenas. Também não seria necessário colocar listaDisciplinas como parametro do report (Subreport (Other)), pois a lista está sendo passada via datasource.
Para utilizar os atributos de um bean que é propriedade do bean (nested beans): ((pacote.Classe)$F{bean}).getAtributo()
Onde bean deve ser declarado com Object em Fields…
Até!
F
furutani
Muito obrigado Eagnes!!! Assim que for possivel irei melhorar o tutorial com suas dicas.
D
danieltamiosso
Olá,
Estou com um problema:
Tenho um relatório com o seguinte layout:
Dados Gerais do registro
SubRelatório - Dados Contato
SubRelatorio - Dados Bancarios
Eu passo três listas pra eles, e as duas listas dos subrelatorios funcionam normalmente, só não consigo manipular a lista que vai no relatorio master, pois a mesma exibe tudo como null. Fiz o relatório me baseando no tutorial do Celso Fernandes de Oliveira Junior. Gostaria de saber se eu posso passar duas listas para um subrelatorio.
Alguem tenou fazer a lelhoria que Eagnes sugere (Para nao ter que criar um DataSource)?
Porque eu tentei mas ele nao reconhece a lista de produtos…
M
marciobarroso
hehehehe
J
jckgomescruz
Bom dia Furutani.
Gostei muito desse tutorial, mas tenho uma dúvida.
Tem como vc trazer as disciplinas para o relatório principal sem usar o subrelatório. Pensei em algo como um Bean genérico para todas as classes, é possível.
Se puder passar algum exemplo agradeço.
T
thiefofwisdom
Olá Pessoal… estou revivendo esse topico… lol
Estou tentando fazer um relatorio usando o JasperReports… meu problema era que eu nao sabia que era possivel passar um ArrayList nos parametros do Jasper… agora ja sei que dá! lol…
Estou com um result Set, vou passa-lo para um array (ou outra collection qualquer) e depois jogar isso no iReports…
Li o tutorial, mas nao entendi algumas coisas…
1- Nao entendi como funciona a implementacao dos metodos next e getNextValue…
vc passa um arrayList pro construtor da classe que vai implementar o JRDataSource… blza… mas oq eu passo como parametro pros metodos next e getNextValue?
2- A classe JRDataSource pode receber qualquer tipo de collection? Ow só array list?