[RESOLVIDO] Jasper Reports - Multiplas collections

Eu pesquisei um pouco e ainda não encontrei uma resposta clara na internet, apenas exemples passando uma collection, mas minha idéia é a seguinte:

Eu tenho um relatório principal com 3 sub relatórios… Em uma classe java eu processo três collections que serão enviadas para o relatório principal.
No relatório principal eu configuro para cada sub relatório o parametro para receber a collection especifica.

É possível?

Enquanto isso vou pesquisar mais…

Ah, estou usando a versão 4.5.1 do jasper reports

sim é possível e bastante utilizado, já fezeste alguma tentativa? exibe algum erro?

Sim, é possível.
Primeiro, passe cada lista como parâmetro pela classe que gera o relatório.
Exemplo:

parameters.put("nomeDo1ParametroNoRelat.", lista1);
parameters.put("nomeDo2ParametroNoRelat.", lista2);
parameters.put("nomeDo3ParametroNoRelat.", lista3);

E no relatório tu clica em cada subrelatório e vai em
Connection Type -> Use a datasource expression

Data Source Expression -> new JRBeanCollectionDataSource($P{lista1, 2 ou 3})

O relatório aparece vazio…
Vou fazer mais uns testes…

Estou tentando fazer o seguinte teste:

package jasperreports;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class ProcessaRelatorio {

	public static void main(String[] args) throws IOException {
		
		List<Usuario> lUsuario = new ArrayList<Usuario>();
		Usuario u = new Usuario();
		u.setNome("João");
		u.setSenha("jo123");
		lUsuario.add(u);
		
		u = new Usuario();
		u.setNome("Mário");
		u.setSenha("ma123");
		lUsuario.add(u);
		
		u = new Usuario();
		u.setNome("Pedro");
		u.setSenha("pe123");
		lUsuario.add(u);
		
		u = new Usuario();
		u.setNome("Joaquim");
		u.setSenha("jq123");
		lUsuario.add(u);
		
		u = new Usuario();
		u.setNome("Mané");
		u.setSenha("mn123");
		lUsuario.add(u);
		
		u = new Usuario();
		u.setNome("Derp");
		u.setSenha("d123");
		lUsuario.add(u);
		
		String arquivo = "/home/ul1sses/workspace/Teste/src/jasperreports/teste.jasper";
		
		String jprint = null;
		
		Map parametros = new HashMap();
		parametros.put("teste", "Paramametro de teste");
		parametros.put("lista", lUsuario);

		try {
			jprint = JasperFillManager.fillReportToFile(arquivo , parametros);
			
		} catch (JRException e) {
			e.printStackTrace();
		}
		
		try {
			JasperExportManager.exportReportToPdfFile(jprint);
		} catch (JRException e) {
			e.printStackTrace();
		}
		
	}

}
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="teste" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
	<property name="ireport.zoom" value="1.0"/>
	<property name="ireport.x" value="0"/>
	<property name="ireport.y" value="0"/>
	<import value="net.sf.jasperreports.engine.data.JRBeanCollectionDataSource"/>
	<parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
		<defaultValueExpression><![CDATA["/home/ul1sses/workspace/Teste/src/jasperreports/"]]></defaultValueExpression>
	</parameter>
	<parameter name="teste" class="java.lang.String" isForPrompting="false"/>
	<parameter name="lista" class="java.util.List"/>
	<background>
		<band splitType="Stretch"/>
	</background>
	<columnHeader>
		<band height="61" splitType="Stretch">
			<textField>
				<reportElement x="127" y="21" width="303" height="20"/>
				<textElement/>
				<textFieldExpression><![CDATA[$P{teste}]]></textFieldExpression>
			</textField>
		</band>
	</columnHeader>
	<detail>
		<band height="47" splitType="Stretch">
			<subreport>
				<reportElement x="11" y="6" width="532" height="32"/>
				<dataSourceExpression><![CDATA[new JRBeanCollectionDataSource($P{lista})]]></dataSourceExpression>
				<subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "teste_subreport.jasper"]]></subreportExpression>
			</subreport>
		</band>
	</detail>
</jasperReport>

Baixei ontem a versão mais atual do ireports e jasper reports e então estou tentando fazer um simples teste de passagem de parametros. Nem isso estou conseguindo. O_O

Não ocorre erro na compilação mas gera PDF vazio… Medic!!!

A única alteração que fiz foi na linha 60 do código que eu postei:

jprint = JasperFillManager.fillReportToFile(arquivo , parametros);

Adicionei o parametro “new JREmptyDataSource()”:

jprint = JasperFillManager.fillReportToFile(arquivo , parametros, new JREmptyDataSource());

Então magicamente o arquivo foi gerado corretamente.

Por que a necessidade de se definir um Empty Data Source se existem métodos que aceitam apenas o caminho do arquivo jasper e o map de parametros?