Ireport - netbeans

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:

Codigo 1:

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
Codigo 2:

select nome from pfunc where chapa = '$X{xxxxx}'

Qual é o procedimento de para o “idfunc” ir para o “xxxxx” e me trazer os nomes(codigo 2) e as pontuações(codigo 1)??

Obg

8 Respostas

jj_df

Você cria o relatório master com a primeira query e passa ela (ResultSet ou Collection) no contrutor do método fillReport.

A segunda query vc cria dentro do relatório master um parâmetro do tipo Object e a sua segunda query como esse parâmetro.

Mais ou menos assim:

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 = this.getClass().getClassLoader().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();
        }
}

O “idfunc” que vc falu vc usa ele na query e já passa pronto o ResulSet.

Qualquer dúvida fala, quebrei cabeça uns dois dias sem achar nada específico nos tópicos.

rodrigodsw2005
/*
 * 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);


    }
}

jj_df , seria isso que voce disse???.. nao teria algo mais pratico na propria interface o ireport ???? alem disso gerou um 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)

teria como vc explicar melhor, eu teria que fazer a query na propria interface do ireport depois conectar com a classe? como seria isso? etc..... ou se tiver um exemplo para me mandar.... ficaria grato :D

jj_df

É mais ou menos por aí da forma que eu apliquei.

Acredito que tenha várias formas de fazer, mas assim que eu consegui fazer fucionar o toquei o projeto pra frente pois estou com pressa em termina-lo.

O erro que você levou é pq vc passou por todas as posições do rsRel (while(RsRel.next())) aí ele foi pro final do ResultSet, por isso não conseguiu passar por nenhum registro, observe o erro:

net.sf.jasperreports.engine.JRException: Unable to get next record.

Se mesmo assim não conseguir ou não achar outra forma melhor de fazer me add no msn q te dou um help…

[email removido]

rodrigodsw2005

ok … vou te add

jj_df

No msn, por enquanto, só tô entrando a noite, se precisar de help durante o dia gtalk: [email removido]

ElimarcosAlles

Cara, estou tendo o mesmo problema. A diferença é que estou usando beans. Tem como vc me dá um help???

jj_df

Elimarcos, eu sempre usei o ireport com Result Set mas o amigo que também postou fez passando a conexão e construindo a query dentro do ireport.

Eu sei que ele tb funciona com Collection e outras opções tais como hibernate.

Tem como vc passar valores direto pra dentro do formulário tb, através de parâmetros.

Num devo ter ajudar a resolver o problema mas esclareci um pouco como funciona. Se postar mais sobre o que quer fazer talvez poderei ajudá-lo.

[]'s
J.J.

ElimarcosAlles

jj_df:
Elimarcos, eu sempre usei o ireport com Result Set mas o amigo que também postou fez passando a conexão e construindo a query dentro do ireport.

Eu sei que ele tb funciona com Collection e outras opções tais como hibernate.

Tem como vc passar valores direto pra dentro do formulário tb, através de parâmetros.

Num devo ter ajudar a resolver o problema mas esclareci um pouco como funciona. Se postar mais sobre o que quer fazer talvez poderei ajudá-lo.

[]'s
J.J.

Problema resolvido!!!

Eu usei três beans ‘A, B e C’. B e C para representar minhas collections e A para representar meu datasource. Crieu uma collection de A, add as outras duas collections, B e C e passei o objeto principal, A, em um JRBeanCollectionDataSource. No iReport eu criei um relatório principal e dois subrelatórios, onde setei no subrelatório, do principal, “usar um datasource” e instanciei um JRBeanCollectionDataSource, passando como parametro os fields que representavão minhas colletions. :wink:

Criado 7 de janeiro de 2009
Ultima resposta 28 de mai. de 2009
Respostas 8
Participantes 3