SubRelatorio Ireport

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??? :smiley:

Ja tentou criar um unico objeto e passá-lo para o iReport, com seus respectivos sub-relatórios.

Velho, como que faz issso? voce entendeu o meu problema??.. teria como me explicar?

Bom resolvi em parte eu eliminei as linhas :

  Conexao.close(conn, queryDestalhe);  [/code] e a [code] Conexao.close(conn, queryMaster); 

agora surge outro problema…

Aparece a seguinte mensagem…

Pois bem, deixa eu ver se realmente entendi?

Vc tem um data source, que passa para o seu relatorio uma lista que seja, esta lista tem um objeto dentro dela (acredito eu) e este objeto deve ter uma lista de outro objeto, se for isso e facil resolver se não, acredito que seria mais facil dar uma olhada na sua estrutura .

Se possível posta a estrutura do sql por favor.

Vlw

a estrutura é o codigo que esta ai em cima…

estou passando 2 arquivos a query.java e o Relatorio.jrxml, abaixo

cara, se sao de bancos diferentes, não rola fazer o relatório de objetos?
vc passa os dados para os objetos e eles preenchem o relatório. acho que daria mais controle pra vc, não acha?

voce diz ter um arrayList do 2 bancos?.. eu ja pensei algo parecido… mas acho pouco pratico… busco algo mais rapido … vai ser minha ultima opção… no Delphi é tao facil fazer.

Veja se isso ajuda:

Ironlynx me passou esse tutorial, http://www.furutani.eti.br/tutoriais/Tutorial_Sub_Relatorio_ArrayList.pdf