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[] 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();
}
%>[/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…