Olá.
Estou tentando gerar um relatorio que contem um subreport, e dentro do subreport outros subreports(a principio ainda nao estou fazendo os subs dentro dos subs).
estou obtendo os dados do relatorio atraves de uma coleção(List); e dentro de cada elemento da coleção tem outra lista que deve ser a base de dados do subrelatorio.
O problema que estou tendo, é que: o relatorio é gerado sem exibir o subrelatorio. (apesar da coleção está populada, acho que o subreport nãio está conseguindo obter os seus dados)
Como eu fiz os relatórios:
- criei o relatório principal no iReport, adicionei os CAMPOS SIMPLES, e um campo PROGRAMASDETRABALHO que se referencia a uma lista do objeto principal e esse campo deverá popular o subreport
- adicionei o subrelatorio através EDITAR->INSERIR ELEMENTO -> SUBRELATORIO
- selecionei a opção: Usuando um relatorio já existente (anteriormente fiz o relatorio do subreport), em seguida, marquei a opção UTILIZANDO UMA EXPRESSÃO JRDATASOURCE, e preenchi com a expressão $F{programasTrabalho} criada no item 1. E deixei marcado: Armazenar nome do diretorio em um parametro $P{SUBREPORT_DIR} + …
após a criação do subreport, dou um duplo clique no mesmo e obtenho os seguintes campos preenchidos:
- SUBRELATORIO: usar a conexão do relátorio $P{REPORT_CONNECTION}
- Sub-Relátorio (outro): $P{SUBREPORT_DIR} + “programa.jasper”
pronto, foi assim que criei os relatorios e o sub (É preciso fazer algo mais no ireport?)
agora o processo de geração do relátorio:
String pathArquivo = servletContext.getRealPath("/rel/planejamento.jasper");
String pathDiretorio = servletContext.getRealPath("/rel/");
//parametros
Map<String, Object> parametros = new HashMap<String, Object>();
parametros.put("SUBREPORT_DIR", pathDiretorio+"/");
//lista contendo o conteúdo dos relatórios
List<PlanejamentoOrcamentario> lista = getPlanejamentosOrcamentarios();
JRDataSource jrds = new JRBeanCollectionDataSource(lista);
try {
if(lista !=null && lista.size() > 0){
JasperPrint print = JasperFillManager.fillReport(pathArquivo, parametros, jrds);
byte[] bytes = JasperExportManager.exportReportToPdf(print);
writeBytesAsAttachedTextFile(bytes, "PlanejamentoOrçamentário.pdf");
}
} catch (Exception e) {
e.printStackTrace();
}
OBS. Os objetos PlanejamentoOrcamentario possui o metodo getProgramasTrabalho() que retorna list() populada que deverá preencher o subreport!
a unica associação do atributo programasTrabalho de PlanejamentoOrçamentario com o relatorio é somente na criação de um campo programasTrabalho do tipo objeto, isso no ireport? ou tem mais alguma associação no método de geração do relatorio?
Att. Dirceu Sobrinho