JasperReport + iReport + DataSource + Sub-Relatório!

Bem…
estou com um “pequeno” problema no desenvolvimento de um relatório… vamos supor em um relatório de Páis que tenha um Sub-Relatório de Estados… Tipo Assim:

Brasil
Pernambuco
Brasilia
São Paulo
Bahia

Estados Unidos
Florida
California

Daí existem o Pais.XML e o Estado.XML e Respectivamente seus DataSource´s DsPais,DsEstado que estão abaixo:

[code]
import dori.jasper.engine.;
import java.sql.
;

public class DsPais implements JRDataSource{

private ResultSet rs    = null;
private Connection con  = null;

public void setConnection(Connection con){
    this.con = con;
}

public DsPais(Connection con){
    this.con = con;
    try{
        Statement st = this.con.createStatement();
        String sql = "SELECT * FROM I_PAIS";
        rs = st.executeQuery(sql);
    } catch (Exception e){
        System.out.println("erro foi no constructor!");
    }
}

public Connection getConnection(){
    return this.con;
}

public boolean next() throws JRException{
    try{
        return rs.next();            
    } catch (Exception e){
        System.out.println("erro foi no next()");
        return false;
    }
}

public Object getFieldValue(JRField jrField) throws JRException{
    String fieldName = null;
    try{
        if( jrField.getName().equalsIgnoreCase("ID_PAIS") ){
            fieldName = rs.getString("ID_PAIS");
        }
        if( jrField.getName().equalsIgnoreCase("CD_PAIS") ){
            fieldName = rs.getString("CD_PAIS");
        }
        if( jrField.getName().equalsIgnoreCase("NM_PAIS") ){
            fieldName = rs.getString("NM_PAIS");
        }
        if( jrField.getName().equalsIgnoreCase("GR_PAIS") ){
            fieldName = rs.getString("GR_PAIS");
        }
    } catch (Exception e) {
        System.out.println("erro foi no getFieldValue()");
    }
    
    return (Object) fieldName;
}

}[/code]


package embrapa;

import dori.jasper.engine.*;
import java.sql.*;


public class DsEstado implements JRDataSource{
    
    private ResultSet rs    = null;
    private Connection con  = null;
    
    public void setConnection(Connection con){
        this.con = con;
    }
    
    public DsEstado(Connection con){
        this.con = con;
        try{
            Statement st = this.con.createStatement();
            String sql = "SELECT * FROM I_ESTADO WHERE ID_PAIS = ????????"
            rs = st.executeQuery(sql);
        } catch (Exception e){
            System.out.println("erro foi no constructor!");
        }
    }
    
    public Connection getConnection(){
        return this.con;
    }
    
    public boolean next() throws JRException{
        try{
            return rs.next();            
        } catch (Exception e){
            System.out.println("erro foi no next()");
            return false;
        }
    }
    
    public Object getFieldValue(JRField jrField) throws JRException{
        String fieldName = null;
        try{
            if( jrField.getName().equalsIgnoreCase("ID_ESTADO") ){
                fieldName = rs.getString("ID_ESTADO");
            }
            if( jrField.getName().equalsIgnoreCase("CD_ESTADO") ){
                fieldName = rs.getString("CD_ESTADO");
            }
            if( jrField.getName().equalsIgnoreCase("NM_ESTADO") ){
                fieldName = rs.getString("NM_ESTADO");
            }
        } catch (Exception e) {
            System.out.println("erro foi no getFieldValue()");
        }
        
        return (Object) fieldName;
    }
    
    
}

é justamente nestes ??? que não sei o que por…
porque se eu nao por o Where no primeiro país do relatório ele mostra todos os estados dele e dos outros países… (pois ta select *)

Se fomos fazer este relatório sem usar DataSource, com a conexão JDBC no próprio iReport… nós jogamos o parametro $P{ID_PAIS} para o sub-relatório… mais o meu problema… nao sei se na lógica ou no conhecimento do jasper… !! Como irei FILTRAR os estados por países??

o JSP que chama os relatórios é este:

[code]
<%@ page import="dori.jasper.engine." %>
<%@ page import="dori.jasper.view.
" %>
<%@ page import="java.util." %>
<%@ page import="java.io.
" %>
<%@ page import="java.sql." %>
<%@ page import="embrapa.
" %>

<jsp:useBean id="dbManager" scope="application" class="mentor.banco.DbManager" />

<%
try{
Connection con = dbManager.getConnection();
File reportFile = new File(application.getRealPath("/reports/pais.jasper"));
DsTesteJasper sourcepais = new DsTesteJasper(con);
DsEstado sourceestado = new DsEstado(con);
Map parameters = new HashMap();
parameters.put("ReportTitle", "Relatório de Países");
parameters.put("BaseDir", reportFile.getParentFile());
parameters.put("DsEstado",sourceestado);

byte&#91;&#93; bytes = 
	JasperRunManager.runReportToPdf&#40;
		reportFile.getPath&#40;&#41;, 
		parameters, 
		sourcepais
		&#41;;

response.setContentType&#40;&quot;application/pdf&quot;&#41;;
response.setContentLength&#40;bytes.length&#41;;
ServletOutputStream ouputStream = response.getOutputStream&#40;&#41;;
ouputStream.write&#40;bytes, 0, bytes.length&#41;;
ouputStream.flush&#40;&#41;;
ouputStream.close&#40;&#41;;
    dbManager.closeConnection&#40;con&#41;;

} catch (Exception e){
e.printStackTrace();
}
%>[/code]

Como perceberam no Pais.xml tem um parametro chamado DsEstado onde recebe o DataSource do Estado…

gente… se tiver alguma coisa errada… ou alguma maneira de eu concertar isso… helpme!! =))

Muitissimooo grato…

Tenta fazer o seguinte:
Continua trazzendo tudo no select de estado, só que, vai em Badns no menu View. Seleciona a banda Detail. Vai em “Print when Expression” e coloca a expressao abaixo:

new Boolean&#40;$F&#123;CD_ESTADO&#125;.equals&#40;&quot;SP&quot;&#41;&#41;

No lugar do local coloca o seu parametro recebido, no caso, o pais.

O que isso faz:
Todo componente do seu relatorio tem uma expressao que permite que ele seja impresso.
O que agente fez ai foi falar pro seu relatorio so imprimir o detalhe quando o valor dõ campo CD_ESTADO naquela linha seja “SP”. Se for diferente , ele nao imprime nada, pulando aquela linha. Percebe que ele espera do um Boolean e nao o boolean, o por isso da conversao.

Blz ?
Abraços,

TIpo… entendi…
resolve aqui…

agora…
como eu faço para que um pagefooter só imprima se for a ultima pagina do relatório???
pois é tipo um contrato que só assina a ultima pagina… Sumarry vem logo depois das detail´s e o page footer no caso viria no final de cada página… como fasso pra que ela só venha no final da página da e apenas ULtima Página???

help!!!