IndexOutOfBoundsExceptio no JasperReport

1 resposta
marcosbrandao

E ai galera do Guj.

To com um problema aqui ja faz 2 dias e não consigo achar a solução.

Tenho um relatório no jasperReports que esta causando a Excepiton IndexOutOfBoundsExceptio.
Eu tenho um relatório com um sub-relatório na banda detail. este sub-relatório imprime varias tabelas separadas por área.
Cada tabela que imprime vem de uma query executada de acordo com os parâmetros que vem do relatório pai.
Eu utilizo Datasource para passar os valores para o relatorio.
A classe que gera este erro é uma classe que implementa JRDataSource no método sobrescrito next().

O meu problema é o seguinte:

Quando uma tabela não conseguir imprimer toda em uma pagina, esta tabela não pode quebrar e deve imprimir inteira na outra pagina(Esta tabela pode ter no máximo dez linhas, então isto pode acontecer varias vezes no relatório). Para que isto aconteça eu seto na banda detail do relatório pai split allowed como false. Mas isso me gera dois problemas:

1 - Se a linha da tabela onde deveria acontecer a quebra é a ultima da banda detail do sub-relatório, IndexOutOfBoundsExceptio é gerada. Consegui resolvi esse problema com a implementação no método sobrescrito next();
2 - Quando a linha em que acontece a quebra esta não eh a ultima ( com ou sem o problema do Exception citada acima), simplesmente não imprime a tabela em que deveria ter acontecido a quebra. Acontece quando a 1 situação quando resolvida também.

Se eu marcar split allowed como true todas as tabelas imprimem normalmente mas com quebra.

Não sei se alguém já passou, ou viu algo parecido, mas procurei bastante pela web e não encontrei nada.

Se alguém puder me dar uma luz do que fazer, eu agradeço. Porque pra mim o fim do tunel parece estar bem longe :shock:

1 Resposta

marcosbrandao

E ai galera.

Depois de muito tempo tentando achar a solução, finalmente consegui. Então vou postar aqui caso alguem mais tenha esse problema.

Descobri que o que estava acontecendo era que quando acontecia a quebra a engine do jasper nao voltava para o primeiro registro, entao a tabela nao era impressa, sendo que o registro da quebra era o ultimo.

Como eu havia dito acima, eu estendia JRDataSource e implementava o metodo next() para passar para o proximo registro. Então encontrei uma outra classe "JRRewindableDataSource"que estende JRDatasource e implementa um moveFirst(). Com esse metodo eu posso posicionar o registro na primeira linha novamanete, e quando a quebra na pagina a engine verifica se o DataSource eh um rewindable, se for entao ele chama o metodo moveFirst, e a tabela eh impressa no relatorio.

Criado 9 de outubro de 2007
Ultima resposta 11 de out. de 2007
Respostas 1
Participantes 1