Seguinte, tenho um relatório que chama um subrelatório. Visualizando pelo iReport, ele consegue chamar o subrelatório, porém no java não.
Tenho um jar adicionado na minha app. que possui os .jasper. Aí busco eles assim:
InputStream pathRelGeral = getClass().getClassLoader().getResourceAsStream("RelatorioGeral.jasper");
InputStream pathSubRel = getClass().getClassLoader().getResourceAsStream("SubrelPausasDetalhe.jasper");
Passo como parâmetro para o relatório principal o subrelatório assim:
Map<String, Object> paramsRelGeral = new HashMap<String, Object>();
paramsRelGeral.put("SUBREPORT_DIR", pathSubRel);
E o parâmetro SUBREPORT_DIR do relatório principal no iReport está configurado assim (Isso na aba Sub-relatório):
$P{SUBREPORT_DIR} + "SubrelPausasDetalhe.jasper"
Pensei que pudesse ser algum problema relacionado ao tipo das variáveis pathRelGeral e pathSubRel que são do tipo InputStream. Porém já alterei no ireport passando o tipo de SUBREPORT_DIR que é atualmente Object para InputStream e mesmo assim a exceção abaixo é lançada:
net.sf.jasperreports.engine.JRException: Could not load object from location : sun.net.www.protocol.jar.JarURLConnection$JarURLInputStream@19a19fdSubrelPausasDetalhe.jasper
Bruno, você conseguiu matar esse problema?
Eu fui criar um main de testes aqui:
try{
String caminhoRelatorio = "./WEB-INF/report/Principal.jasper";
String caminhoSubRelatorio = "./WEB-INF/report/Auxiliar.jasper";
JasperReport relatorio = (JasperReport) JRLoader.loadObject(caminhoRelatorio);
JasperReport subRelatorio = (JasperReport) JRLoader.loadObject(caminhoSubRelatorio);
Map<String, Serializable> parameters = new HashMap<String, Serializable>();
parameters.put("subrelatorio", caminhoSubRelatorio);
...demais dados...
}catch(JRException e){
e.printStackTrace();
}
catch(Exception e){
e.printStackTrace();
}
E sempre recebo uma stack: net.sf.jasperreports.engine.JRException: Could not load object from location : ./Auxiliar.jasper
Isso só ocorre com o subrelatório, que no relatório principal tá apontado assim:
Tentei usar o getClass()…getClassLoader().getResourceAsStream(…) e também não obtive sucesso.
Eu não entendi direito a sua afirmação.Sim, eu posso dar um:new File("/report").getCanonicalPath() e descobrir o caminho,mas num servidor(por exemplo) não se tem essa facilidade.Pode-se mudar de Diretório(do E para o G por exemplo) e vc nem fica sabendo.
Aliás, eu tô com o mesmo problema com a exibição do meu banner pelo IReport.o Caminho completo “C:…” sempre funciona, mas o relativo nunca. :evil:
Funciona para os reports, mas não sei pq não funciona para o Logo!Tipo:"./WEB-INF/report/Logo.jpg"; nunca acha o logotipo do relatório! [/quote]
Olá…
Cara, depois de penar um tempo sobre a melhor estratégia de passar os caminhos necessários para gerar os relatórios (inclusive as imagens) fiz assim:
Quando a aplicação sobre no tomcat, tenho uma Listener que é chamado e é responsável por setar o caminho fisíco da aplicação:
Então, quando eu preciso informar o caminho dos relatórios, apenas faço:
também estou com um problema similar.
tenho um relatorio com alguns sub-relatorios.
estou usando o netbeans… minha aplicação é em swing.
quando executo pelo netbeans, funciona normal…
mas quando vou executar o .jar da distribuição, ele não acha o sub_relatorio.jasper…
estou passando o parametro SUBREPORT_DIR com a url completa…
tipo: file:…/…/Aplicacao.jar?/…/…/relatorios/
ou algo parecido… sei que é o mesmo caminho que uso para achar o inputstream do relatorio principal…
acabei de ler aqui na intenet que, se vc passar o parametro SUBREPORT_DIR como “” (string vazia),
o jasper usa o mesmo diretorio do relatorio raiz…