Estou há um tempo procurando uma solução e não a encontro.
É o seguinte, tenho um arquivo .jasper e quando este é executado no iReport ele funciona corretamente (os dados do relatório são preenchidos através de um arquivo XML).
Mas quando carrego o mesmo arquivo .jasper no Java, o relatório não é preenchido por inteiro. Só são preenchidos os campos em que não é utilizado o caminho relativo.
Segue abaixo o código (é um applet e a idéia é imprimir o relatório, a questão é que este relatório, como eu disse, não é preenchido corretamente):
public class AppletImprimirNF extends JApplet {
/* INICIA APPLET */
public void init() {
printNF();
}
private void printNF() {
try {
JasperReport relatorio = (JasperReport) JRLoader.loadObject(getClass().getResource("relatorio.jasper"));
try {
URL url = new URL(getParameter("PROTOCOL"), getParameter("HOST"), Integer.valueOf(getParameter("PORT")), getParameter("DADOS"));
JRXmlDataSource xml = new JRXmlDataSource(url.openStream());
JasperPrint impressao = JasperFillManager.fillReport(relatorio, new HashMap<String, Integer>(), xml);
JasperPrintManager.printReport(impressao, true);
} catch(MalformedURLException e) {
System.out.println("\nUrl mal formada:\n" + e.getMessage());
} catch(Exception e) {
System.out.println("Erro:\n"+e.getMessage()+"\n\nStack Trace:\n"+e.getStackTrace());
}
} catch(Exception ex){
System.out.println("\nInforme o seguinte erro ao suporte:\n" + " Mensagem: " + ex.getMessage() + "\n Causa: " + ex.getCause());
}
}
}
Bom dia amigo!
Deixa eu ver se entendi…
Vc esta rodando um relatorio que contem um subrelatorio, via Applet?
Se for isso, um caminho absoluto nao ira funcionar a não ser que seja local, não seria mais simples salvar o subrelatorio no mesmo local que o relatorio principal e acessá-lo via “subreport.jasper”?
Aliás por estar em um browser, uma sugestão: pq vc não coloca os arquivos diretamente em um jar?
A ta… vc quis dizer do jar??? pq se o cara precisar alterar algo no relatorio tem que compilar de novo!!! se ele colocar o caminho relativo de uma pasta no mesmo nível é só substituir o relatório =)
Particularmente… eu não concordo com o fato de uma applet processando os dados, pra mim o mais adequado seria o servidor processar tudo e cuspir um pdf… Mas … cada um na sua rsss
Compilar… eu não vejo como nenhum problema, pelo contrario…vejo como um ‘pacote’ contendo o necessário para o usuario rodar o programa… e que é carregado apenas uma vez.
Já quanto a localização do .jasper no servidor… o mesmo devera ser carregado por url… e levando-se em consideração o tamanho dos arquivos .jasper (aqui onde trabalho eles chegam a ter mais de 1 mega) a cada acesso pode haver uma demora bem grande entre localizar o recurso no servidor… e baixa-lo na maquina cliente… e isso vai ocorrer apos o browser startar a busca pra montar o relatorio…ou seja será mais demorado para o usuario.
Outra questão que eu levantaria é se haverá cache desse arquivo (do stream) se não houver, pelo menos durante a sessão… aí fica complicado (a documentação do getURLInputStream não diz nada)
Mas uma coisa é fato o usuario já esta recebendo os jars, de qualquer forma… então eu não vejo como uma abordagem ““errada”” ou desaconselhavel
PS:
Imagine se esse relatorio for executado 100 vezes em um dia durante um mes interio.
1MB x 100 x 30 …
A rede com certeza nao ira agradecer =)
Não gosto de compilar o jasper junto pois trabalho com versionamento de software para clientes diferentes. Eu mando um pacote com um .jasper e alguns .properties e com um interface bunitinha la o cara mesmo importa pro sistema… ele nem ve como foi feito… na verdade soh substitui os arquivos… não sei como ficaria dentro do jar… não vejo uma saida…
Desculpa a demora pra responder, estava de férias =).
Mas voltando ao assunto, primeiro peço desculpas ao Vinicius, não havia procurado antes se já havia resposta pro meu problema.
Quanto ao applet, tbm não sou fã da idéia, como disse o Cristian, mas a principio essa foi a solução encontrada =)
Estarei dando uma olhada no tópico que o Vinicius mandou e qq coisa eu volto.