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

2 respostas
G

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:

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;
    }
    
    
}
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:
<%@ 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[] bytes = 
		JasperRunManager.runReportToPdf(
			reportFile.getPath(), 
			parameters, 
			sourcepais
			);
	
	response.setContentType("application/pdf");
	response.setContentLength(bytes.length);
	ServletOutputStream ouputStream = response.getOutputStream();
	ouputStream.write(bytes, 0, bytes.length);
	ouputStream.flush();
	ouputStream.close();
        dbManager.closeConnection(con);
   } catch (Exception e){ 
        e.printStackTrace();
   }
%>

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...

2 Respostas

brlima

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($F{CD_ESTADO}.equals("SP"))

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,

G

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!!!

Criado 14 de abril de 2004
Ultima resposta 15 de abr. de 2004
Respostas 2
Participantes 2