Subrelatório no iReport

Por favor alguém poderia me explicar como fazer um subrelatório no iReport? Esse subrelatório que estou tentendo fazer é de um relatório que quando uma usuário clica em um link o pdf do relatório é gerado. Esse relatório faz parte de uma aplicação web que estou desenvolvendo com Java e JavaScript. Para compilar o xml do meu relatório principal tenho um arquivo chamado RunReport que complia o xml e gera um arquvio .jasper. só que já fui no site do iReport para ver como se faz e achei um vídeo que explica mas só que não consegui fazer pelo modo que o cideo explica. No meu relatório principal esse subrelatório fica dentro de um grupo , esse subrelatório contém uma lista de mensagem, só não coloco essa lista na banda detail porque na detail já tenho uma tabela que lista uma sequência de datas e o único modo que achei para resolver esse problema é usando um subrelatório. Essas mensagens que o meu subrelatório terá seram passadas pelo relatório principal, só que até agora não consegui fazer esse subrelatório. Será que alguém pode me ajudar urgentemente? :roll:

O subrelatório está ao lado do botão F

Corrijam se estiver errado. :wink:

Cara o botão no iReport onde se localiza o subrelatório eu sei onde fica, eu só quero que alguém possa me explicar os passos que eu tenho que fazer para criar um subrelatório no iReport.

Veja se isso ajuda
http://ireport.sourceforge.net/swf/Subreport_viewlet_swf.htm

Eu já entrei nesse site para ver se ele me ajudava em alguma coisa, só que eu não consigo fazer com que a conexão do relatório principal com o subrelatório dê certo e também não consigo fazer com que um parâmetro que são as mensagens de observação sejem passadas do relatório principal para o subrelatório. Será que alguém pode me explicar isso, por favor?

Tb estou com o mesmo problema…
alguem poderia ajudar…?

olá pessoal,

A lógica é bem simples, no iReport vc adiciona o sub relatorio na posição desejada, depois vc cria um parametro no relatorio principal que vai ser de um tipo especifico para o sub relatorio, Na sequencia, vc cria um novo relatorio no ireport, que será seu subreport e devera ser passado pelo parametro. Na sua aplicação, vc cria o subreport e passa por este parametro. 

Não tenho aqui os fontes de exemplo, quando chegar em casa eu posto aqui tudo explicadinho…

Abraço,

Rodrigo.

opa, eu de novo.

Nas propriedades do relatorio principal, vá na aba Sub-relatorio (Outro) e escolha a classe de expressão igual a net.sf.jasperreports.engine.JasperReport e coloque no campo abaixo o nome do parametro que vc ainda vai criar. Ex.: $P{subRelatorio}
Depois vá em Visualizar e Parametros, crie o parametro com o nome que vc deu nas propriedades do sub-relatorio, e com o mesmo tipo.
No seu codigo fonte faça +/- assim:

JasperReport relatorioJasper = (JasperReport)JRLoader.loadObject("RelatorioPrincipal.jasper");                
JasperReport subrelatorioJasper = (JasperReport)JRLoader.loadObject("subRelatorio.jasper");
//alimente os parametros que vai passar para o relatorio aqui, incluindo o subrelatorio
Map parametros = new HashMap();                
parametros.put("subRelatorio", subrelatorioJasper);              
                
//caminho pega a pasta do projeto/relatorio                
JasperFillManager.fillReportToFile(relatorioJasper,"RelatorioPrincipal.jrprint",parametros,jrRs);
JasperViewer.viewReport("RelatorioPrincipal.jrprint", false, false, true);

Espero ter ajudado, qualquer dúvida posta aí,

Rodrigo

[quote=rdantas] olá pessoal,

A lógica é bem simples, no iReport vc adiciona o sub relatorio na posição desejada, depois vc cria um parametro no relatorio principal que vai ser de um tipo especifico para o sub relatorio, Na sequencia, vc cria um novo relatorio no ireport, que será seu subreport e devera ser passado pelo parametro. Na sua aplicação, vc cria o subreport e passa por este parametro. 

Não tenho aqui os fontes de exemplo, quando chegar em casa eu posto aqui tudo explicadinho…

Abraço,

Rodrigo.[/quote]
oi Rodrigo,

kara eu to fazendo assim:

crio 1 sub-relatório no iReport 2.0, colocando os campos como fields e faço o seguinte select no próprio iReport:
SELECT PROTOCOLO,NUMCONTA,CODLACTO,DTLACTO,DESCRICAO,VALOR,IMPRESSO
FROM LANCAMENTO
WHERE CODUSUARIO = $P{USUARIO}

crio um parametro xamado USUARIO do tipo java.lang.String e seto o valor default como new String(“1”)

no meu relatório principal eu faço o seguinte select:
SELECT DISTINCT CODUSUARIO,USUARIO
FROM USUARIO

ele me gera 2 fields ($F{CODUSUARIO} E $F{USUARIO}) ambos do tipo java.lang.String
ai eu xamo o sub-relatorio, seto o parametro USUARIO do sub-relatorio pra receber o valor do field
$F{CODUSUARIO}

o problema é q eu compilo os 2 e gero os 2 relatórios separadamente sem problemas… + quando eu tento juntar os 2… ele da o seguinte erro:

Erro ao preencher impressão … net.sf.jasperreports.engine.JRException: Error executing SQL statement for : subRelatorioConsultaProtocoloGeralPorUsuarios
net.sf.jasperreports.engine.JRRuntimeException:
net.sf.jasperreports.engine.JRException: Error executing SQL statement for : subRelatorioConsultaProtocoloGeralPorUsuarios
at net.sf.jasperreports.engine.fill.JRFillSubreport.prepare(JRFillSubreport.java:625)
at net.sf.jasperreports.engine.fill.JRFillElementContainer.prepareElements(JRFillElementContainer.java:343)
at net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:323)
at net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:282)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:1348)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:662)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:232)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:113)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:763)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:669)
at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:63)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:402)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:234)
at it.businesslogic.ireport.IReportCompiler.run(IReportCompiler.java:942)
at java.lang.Thread.run(Unknown Source)

Caused by: net.sf.jasperreports.engine.JRException: Error executing SQL statement for : subRelatorioConsultaProtocoloGeralPorUsuarios
at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createDatasource (JRJdbcQueryExecuter.java:141)
at net.sf.jasperreports.engine.fill.JRFillDataset.createQueryDatasource(JRFillDataset.java:682)
at net.sf.jasperreports.engine.fill.JRFillDataset.initDatasource(JRFillDataset.java:614)
at net.sf.jasperreports.engine.fill.JRBaseFiller.setParameters(JRBaseFiller.java:892)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:716)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:669)
at net.sf.jasperreports.engine.fill.JRFillSubreport.fillSubreport(JRFillSubreport.java:522)
at net.sf.jasperreports.engine.fill.JRSubreportRunnable.run(JRSubreportRunnable.java:63)
at net.sf.jasperreports.engine.fill.JRThreadSubreportRunner.run(JRThreadSubreportRunner.java:209) … 1 more

Caused by: java.sql.SQLException: [Microsoft][ODBC SQL Server Driver]Conexão ocupada com os resultados de outro HSTMT
at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.SQLExecute(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.execute(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.executeQuery(Unknown Source)
at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createDatasource(JRJdbcQueryExecuter.java:135) … 9 more
Impressão não foi preenchida. Tente utilizar uma Fonte de Dados Vazia …

alguem…!?
socorro…

OBS… Alem do que nosso amigo RDANTAS disse, não se esqueçam de colocar o tipo do parametro SUBRELATORIO como do tipo Object, senão… pau na buneca…

Eu ja prefiro fazer usando o arquivo jrxml e utilizo a versao 3.0.0 do ireport e pego eles( os jrxml ) dentro do meu .jar.

try
    {
        jasperReport = JasperCompileManager.compileReport(this.getClass().getResourceAsStream("/rgencomendas/relatorios/manifesto.jrxml"));
        jasperReportSub = JasperCompileManager.compileReport(this.getClass().getResourceAsStream("/rgencomendas/relatorios/manifesto_subreport0.jrxml"));
        parametros = new HashMap();
        parametros.put("SUBREPORT_DIR", jasperReportSub);
        jasperPrint = JasperFillManager.fillReport(jasperReport, parametros, HibernateUtil.getConnection());
        jasperViewer = new JasperViewer(jasperPrint, false );
        jasperViewer.setDefaultCloseOperation(JasperViewer.DISPOSE_ON_CLOSE);
        jasperViewer.setTitle("MANIFESTO");
        jasperViewer.setVisible(true);
    }
    catch (JRException ex)
    {
        log.error(ex.getMessage())
    }

Estou com um problema na geração do relatório, na minha maqui(localhost), funciona perfeito, com subrelatórios …, mais, quando exporto meu servlet e faço deploy no datacenter, essa mensagem aparece:
Erro ao gerar o relatório: net.sf.jasperreports.engine.JRException: Error executing SQL statement for : procTramit

Já acompanhei pelo jetty, vejo que os dados chegam no servlet, mais, nada de relatório, inclusive, verifico que a conexão com o banco de dados(MySQL), retorna verdadeira…, o que pode ser?

abraços,

Emerson Mota.

Olá,

Problema resolvido, o problema foi que comi mosca, os relatórios, tinham como fonte de dados, uma vista, não tinha criado essa vista no datacenter, criei, funfou.

abraços,