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?
fasts
Março 15, 2012, 11:20am
#3
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?