Jasper

Galera, estou fazendo um sub relatorio em um Relatorio só que ele ta gerando a seguinte exceção:
net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression : Source text : $P{SubRelatorio}

Através desse parametro eu passo um JRBeanCollectionDataSource onde uma variavel do tipo Object recebe esse objeto (Este objeto que eu estou passando contem os dados que devem popular o sub relatorio)
os meus códigos são os seguites.

list.add(modeloRelatorio);
       Object ds1=new JRBeanCollectionDataSource(modeloSubRelatorio);

                InputStream relJasper = getClass().getResourceAsStream(caminhoRelJasper);
               JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(list);
                String subrel="/tabDanfe.jasper";
                Map map = new HashMap();

                map.put("pathSubSubRel",subrel);
                map.put("SubRelatorio", ds1);


                JasperPrint impressao = JasperFillManager.fillReport(relJasper, map, ds);

                    JasperViewer viewer = new JasperViewer(impressao, false);
                    viewer.setDefaultCloseOperation(JasperViewer.HIDE_ON_CLOSE);
                    viewer.setTitle("Faturamento");
                    viewer.setVisible(true);

Anteriormente eu estava setando o JRBeanCollectionDataSource do SubRelatorio dentro de um Object que ficava junto com os elementos do Relatorio Principal, mas também não estava dando certo.
Gera o mesmo erro só que ao invés de P{SubRelatorio}
era F{SubRelatorio}

PS: não são os dados do SubRel incorretos, pois se eu mandar ele executar somente o subrel ele executa perfeitamente.
:
iai? o que fazer?

Agradeço a todos!

Não há ninguém aqui que saiba???

Acho bom você mandar também partes do .jrxml assim se pode comparar o que está sendo enviado com o que está no .japser.

Eu tenho vários subrelatórios funcionando perfeitamente e eu uso japser 2.0.4 ainda.

$P{} é parâmetro. Você tem de ter o parametro SubRelatorio corretamente cadastrado no relatório para usa-lo internamente.

E Assim ele está!!

Olá amigo! Esse arquivo que vc enviou está compilando normalmente. É outro arquivo que está com erro?

Provavelmente o arquivo tabDanfe.jrxml é o que está com erro. É ele que você deve enviar.

Perdão caros amigos!!
Pensei que havia enviado os 2!

Vai no Danfe6.jrxml. Então vai nas propriedades do subrelatorio. Na aba “Subreport (Other)”, onde vc passa os parâmetros para o subrelatorio. Perceba que vc está passando o valor de $P{SubRelatorio} para um parâmetro que deve existir no subrelatório chamado subRelatorio.

Mas ai vc vai no tabDanfe.jrxml e olha os parâmetros que vc criou pra nele. Não tem nenhum subRelatorio, só tem um SubRelatorio (presta atenção na primeira letra!!!).

Provavelmente é esse o problema, qdo vc chama o subrelatorio sozinho funciona (pq não precisa passar por isso ai). Qdo vc chama pelo relatório principal dá erro pq ele não encontra o parâmetro pra passar o valor.

Confere ai!

Renata eu relmente não tinha atentado para este detalhe, então fui ao tabDanfe.jrxml e modifiquei o nome do parâmetro para o nome subRelatorio.
Mesmo assim o erro ainda continua.
:shock:

Exatamente a msma msg de erro?

É meio complicado aqui pra nós pq não temos como executar seu jrxml, e o erro dá durante a execução pelo que entendi.

To vendo aqui que qdo vc chama o relatório, vc chama passando a variável ds1 pra SubRelatorio (com S e não s). No final das contas, qual vc deixou? O SubRelatorio ou subRelatorio? (com maiúscula ou minúscula?) Pq se vc deixou com minúscula, tem que mudar ai na passagem tb.

Entendo!
Vou tentar ser o mais claro possivel!
:slight_smile:
Seguinte:
Nas propriedades do subRel na tab other eu não modifiquei nada. Eu apenas fui ao arquivo tabDanfe.jrxml(Cujo o qual é o meu SUB-RELATORIO) e modifiquei o nome do parametro que era “SubRelatorio” (Maiúsculo)para “subRelatorio”(minúsculo).
Desta maneira o nome do parametro fica igual ao que eu estou passando do relatorio principal para o sub relatorio.

Feito isso tentei executar, mas gerou o mesmo erro.

Tendo isso em vista tentei deixar o nome do parametro do relatorio principal igual ao do relatorio filho.
Por exemplo:

Eu anteriormente tinha o Seguinte nas propriedades do meu sub Relatorio:

Parâmetro Expressão
subRelatorio $P{SubRelatorio}

onde $P{SubRelatorio} é o nome do Parametro que eu estou recebendo os dados do meu subRel no relatorio pai.

você me atentou para o meu erro, pois no meu relatorio filho eu não tinha um parametro com o nome de “subRelatorio” e sim “SubRelatorio”. Como expliquei anteriormente efetuei a correção, mas o erro ainda persistiu. Então eu tentei da seguinte maneira:

No meu relatorio filho eu retornei a modificar o nome do parametro para “SubRelatorio”(Maiúsculo), e nas propriedades do relatorio filho no relatorio pai eu deixei assim:

Parâmetro Expressão
SubRelatorio $P{SubRelatorio}

(Maiúsculo também)

mesmo assim a mesma exceção esta sendo gerada!

Consegui ser claro dessa vez?
:smiley:

Bom, então agora está em todos os lugares como “SubRelatorio”, né?

Deixa assim, todos de um mesmo jeito.

Não estou conseguindo entender… por favor, manda o trecho todo onde vc faz a chamada do relatório, pra eu simular aqui, ver se consigo causar o erro aqui no meu PC.

Grata,
Renata

Seguindo os novos arquivos…


list.add(modeloRelatorio);
       Object SubRelatorio=new JRBeanCollectionDataSource(modeloSubRelatorio);

                InputStream relJasper = getClass().getResourceAsStream(caminhoRelJasper);
               JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(list);
             String subrel="/tabDanfe.jasper";
                Map map = new HashMap();
             map.put("pathSubSubRel",subrel);
                map.put("SubRelatorio", SubRelatorio);

                 JasperPrint impressao = JasperFillManager.fillReport(relJasper, map, ds);
             
                    JasperViewer viewer = new JasperViewer(impressao, false);
                    viewer.setDefaultCloseOperation(JasperViewer.HIDE_ON_CLOSE);
                    viewer.setTitle("Faturamento");
                    viewer.setVisible(true);





o arquivo filho

Ok… por favor, quem são suas variáveis list, modeloRelatorio e modeloSubRelatorio?

Não entendi pq pra criar o JRBeanCollectionDataSource do sub-relatório vc apenas usa o modeloSubRelatorio, mas pra criar o JRBeanCollectionDataSource do relatório principal vc adiciona o modeloRelatorio dentro do tal list e depois passa ele pro JRBeanCollectionDataSource.

Então Renata…
a variavel list é um ArrayList comum.
a modeloRelatorio, é um objeto que contem as variaveis com os respectivos nomes dos fields do relatorio principal.
a modeloSubRelatorio é a mesma coisa só que para o Sub Relatorio.

Em relação ao JRBeanCollectionDataSource eu o criava e o setava em um objeto do tipo object dentro do modelo da classe do rel principal…mas gera o tal erro…então resolvi fazer separado…

Como já falei anteriormente, não conheço muito bem a ferramenta…então não sei nem se minha lógica esta correta…

Tem como vc passar a classe toda que faz a chamada pra eu tentar fazer aqui? Não to conseguindo achar onde vc tá errando…

Renata Mandei pro seu mail…

Ninguem mais arrisca uma dica?

Nada mesmo???