Olá pessoal estou encontrando difilcudade em fazer um sub-relatorio, o problema é o seguinte:
2 códigos SQL em 2 bancos diferentes:
[code]/*
- To change this template, choose Tools | Templates
- and open the template in the editor.
*/
package relatorios;
import avaliacao.Conexao;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.view.JasperViewer;
/**
*
-
@author rribeiro
*/
public class Query {private PreparedStatement queryMaster;
private PreparedStatement queryDestalhe;
private Connection conn;
private String id;public ResultSet consultaRelatorio() {
ResultSet rsRel = null; try { conn = Conexao.getConnection(); queryMaster = conn.prepareStatement("SELECT prova.idfunc, SUM(pontuacao.valorpontuacao) " + "AS pontuacao FROM prova INNER JOIN pontuacao ON prova.idpontuacao = pontuacao.idpontuacao " + "WHERE (prova.ano = '2008') group by idfunc"); rsRel = queryMaster.executeQuery(); while(rsRel.next()){ this.id = rsRel.getString("idfunc"); } } catch (SQLException ex) { ex.printStackTrace(); } finally { Conexao.close(conn, queryMaster); } return rsRel;
}
public ResultSet consultaSubRelatorio() {
ResultSet rsSub = null; try { conn = Conexao.getConnectionRM(); queryDestalhe = conn.prepareStatement("select nome from pfunc where chapa = ?"); queryDestalhe.setString(1, this.id); rsSub = queryDestalhe.executeQuery(); } catch (SQLException ex) { ex.printStackTrace(); } finally { Conexao.close(conn, queryDestalhe); } return rsSub;
}
public void geraRelatorio(ResultSet rs, String reportName, ResultSet subRs) {
try { /**Passei os dois, rs e subRs, pelos parâmetros do método. *Executei em outra classe as querys e passei os ResultSet's pra frente*/ JRResultSetDataSource dataSource = new JRResultSetDataSource(rs); JRResultSetDataSource subDataSource = new JRResultSetDataSource(subRs); InputStream relatorio = getClass().getResourceAsStream(reportName);//path absoluto Map parametros = new HashMap(); parametros.put("RS", subDataSource); JasperPrint print = JasperFillManager.fillReport(relatorio, parametros, dataSource); JasperViewer jv = new JasperViewer(print, false); jv.setVisible(true); } catch (Exception ex) { ex.printStackTrace(); }
}
public static void main(String args[]) {
Query q = new Query(); ResultSet relatorio, subrelatorio; String local = null; relatorio = q.consultaRelatorio(); subrelatorio = q.consultaSubRelatorio(); local = "Relatorio1.jasper"; q.geraRelatorio(relatorio, local, subrelatorio);
}
}
[/code]
gera esse erro:
net.sf.jasperreports.engine.JRException: Unable to get next record.
at net.sf.jasperreports.engine.JRResultSetDataSource.next(JRResultSetDataSource.java:99)
at net.sf.jasperreports.engine.fill.JRFillDataset.advanceDataSource(JRFillDataset.java:842)
at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:760)
Eu estou fazendo certo? nao teria algo mais facil na propria interface do ireport? Pq desse erro???