Olá pessoal estou encontrando difilcudade em fazer um sub-relatorio, o problema é o seguinte:
2 códigos SQL em 2 bancos diferentes:
/*
* 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);
}
}
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??? :D