SubRelatorio Ireport

8 respostas
rodrigodsw2005

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);


    }
}
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??? :D

8 Respostas

fernei

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

rodrigodsw2005

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

rodrigodsw2005

Bom resolvi em parte eu eliminei as linhas :

Conexao.close(conn, queryDestalhe);
e a
Conexao.close(conn, queryMaster);

agora surge outro problema...

Aparece a seguinte mensagem....

O documento não contem páginas
fernei

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

rodrigodsw2005

a estrutura é o codigo que esta ai em cima…

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

J

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?

rodrigodsw2005

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.

viniciuspadua

Veja se isso ajuda:

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

Criado 8 de janeiro de 2009
Ultima resposta 9 de jan. de 2009
Respostas 8
Participantes 4