Olá amigo, axo que não adiantaria postar o código, pois o que estou querendo resolver e a respeito da execução do relatório, e não a respeito de código java. Mas vou explicar agora e axo que vc vai entender…
Imagine que se tenha varios produtos e várias compras desses produtos armazenadas no banco, e se quer gerar um relatório que mostra todas as compras de produto, mas separadas por produto . Tudo bem, é só fazer um relatório que busca todos os produtos, e um subrelatório que mostra as compras de acordo com cada produto do relatório.
Pra fazer isso usando JRBeanCollectionDataSource, é só criar uma Collection de beans de produtos com todos os produtos, e outra com todas compras de todos os produtos, com beans de todas as compras pra ser mais claro, após isso criar uma JRBeanCollectionDataSource passando a Collection de produtos:
new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource(produtos), e passar a Collection de compras de produtos como parametro para o rel, com o parametro do tipo Collection como vc sugeriu. E após isso mandar gerar o relatório. Logicamente, tudo isso em código Java.
Na criação do rel se colocaria o relatorio para percorrer o JRBeanCollectionDataSource de produtos e criaria um subrelatório na banda detail, ou seja, pra cada produto se chama esse subrelatorio e imprime as compras dele.
Então, onde se especifica o DataSource do subrelatorio, se coloca o DataSource de compras, como voce sugeriu: new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource(compras).
Ok, vai funcionar… E visualmente não vai se ver problema, como você não viu. Na verdade a questão que estou querendo resolver é em questão de desempenho.
Mas você percebeu que criou um objeto net.sf.jasperreports.engine.data.JRBeanCollectionDataSource idêntico para cada produto do relatorio? Cada vez que se chama o subrelatorio se cria o net.sf.jasperreports.engine.data.JRBeanCollectionDataSource passando a Collection de compras, mas a Collection de compras não é sempre a mesma? Então eu posso usar somente uma net.sf.jasperreports.engine.data.JRBeanCollectionDataSource(compras) pra todos os subrelatorios…
Imagine se tiver 1000 produtos, 1000 objetos idênticos na memória… E se gerar esse relatório 3 vezes seguidas? 3000… haja memória e serviço pro garbage collector.
Mas se ao invés de eu passar new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource(compras) pro subrelatorio, eu criar essa DataSource no codigo java e passar ela como parametro pro
relatorio (tem que ser do tipo Object), e pro subrelatorio eu já passar a DataSource direto, ou seja, a mesma DataSource (objeto) com todas as compras pra todos os subrelatorios.
Acontece que só percorre essa DataSource pro primeiro produto, pq essa DataSource chega ao fim, e a partir do segundo produto nao mostra mais as compras, pq a DataSource está na sua última posição, pq está usando O MESMO objeto e não criando um novo pra cada subrelatório…
Solução: Voltar a DataSource a posição inicial após a chamada a cada subrelatório… O que estou querendo aprender a fazer é isso.
Como eu já disse a classe net.sf.jasperreports.engine.data.JRBeanCollectionDataSource implementa a Interface net.sf.jasperreports.engine.JRRewindableDataSource que tem um método moveFirst(),
que faz isso : “Moves back to the first element in the data source”.
A questão é, como chamar esse método após a chamada ou execução de cada subrelatório? Como colocar isso no Ireport?
Axo que agora vc deve ter entendido…
Grato.