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:
selectnomefrompfuncwherechapa='$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)??
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:
publicvoidgeraRelatorio(ResultSetrs,StringreportName,ResultSetsubRs){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*/JRResultSetDataSourcedataSource=newJRResultSetDataSource(rs);JRResultSetDataSourcesubDataSource=newJRResultSetDataSource(subRs);InputStreamrelatorio=this.getClass().getClassLoader().getResourceAsStream(reportName);//path absolutoMapparametros=newHashMap();parametros.put("RS",subDataSource);JasperPrintprint=JasperFillManager.fillReport(relatorio,parametros,dataSource);JasperViewerjv=newJasperViewer(print,false);jv.setVisible(true);}catch(Exceptionex){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. */packagerelatorios;importavaliacao.Conexao;importjava.io.InputStream;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.util.HashMap;importjava.util.Map;importjava.util.logging.Level;importjava.util.logging.Logger;importnet.sf.jasperreports.engine.JRResultSetDataSource;importnet.sf.jasperreports.engine.JasperFillManager;importnet.sf.jasperreports.engine.JasperPrint;importnet.sf.jasperreports.view.JasperViewer;/** * * @author rribeiro */publicclassQuery{privatePreparedStatementqueryMaster;privatePreparedStatementqueryDestalhe;privateConnectionconn;privateStringid;publicResultSetconsultaRelatorio(){ResultSetrsRel=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(SQLExceptionex){ex.printStackTrace();}finally{Conexao.close(conn,queryMaster);}returnrsRel;}publicResultSetconsultaSubRelatorio(){ResultSetrsSub=null;try{conn=Conexao.getConnectionRM();queryDestalhe=conn.prepareStatement("select nome from pfunc where chapa = ?");queryDestalhe.setString(1,this.id);rsSub=queryDestalhe.executeQuery();}catch(SQLExceptionex){ex.printStackTrace();}finally{Conexao.close(conn,queryDestalhe);}returnrsSub;}publicvoidgeraRelatorio(ResultSetrs,StringreportName,ResultSetsubRs){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*/JRResultSetDataSourcedataSource=newJRResultSetDataSource(rs);JRResultSetDataSourcesubDataSource=newJRResultSetDataSource(subRs);InputStreamrelatorio=getClass().getResourceAsStream(reportName);//path absolutoMapparametros=newHashMap();parametros.put("RS",subDataSource);JasperPrintprint=JasperFillManager.fillReport(relatorio,parametros,dataSource);JasperViewerjv=newJasperViewer(print,false);jv.setVisible(true);}catch(Exceptionex){ex.printStackTrace();}}publicstaticvoidmain(Stringargs[]){Queryq=newQuery();ResultSetrelatorio,subrelatorio;Stringlocal=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:
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:
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.