ArrayList no IReport

Olá, estou a fazer um relatório no ireport, que recebe uma lista de Strings vinda diretamente da minha aplicação… porém, não consigo usa-la no ireport. Primeiro tentei usar um campo do tipo Object… já que ArrayList extende de Object… mas tambem não tive sucesso… alguns dias atras estive lendo alguns tutoriais na internet e vi um onde era dito que para se trabalhar com listas (que não venham de querys, claro) era necessário criar um campo Object… que apontasse para um subrelatório, onde estariam os campos da minha lista.
O problema é que quando tento usar o subrelatório, gera-se uma excessão como se o caminho que eu passei pro subrelatório (o arquivo jasper) fosse inválido… alguém conhece uma maneira de resolver esse problema… ou então algum outro metodo de se trabalhar com arraylist em IReport ???


net.sf.jasperreports.engine.JRException: Could not load object from location : /WEB-INF/reports/SubRelatorioEmissaoBoletimInformativo.jasper
	at net.sf.jasperreports.engine.util.JRLoader.loadObjectFromLocation(JRLoader.java:266)
	at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluate(JRFillSubreport.java:303)
	at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:274)
	at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:400)
	at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:1273)
	at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:614)
	at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:209)
	at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:109)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:751)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:679)
	at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:89)
	at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:601)
	at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:582)
	at net.sf.jasperreports.engine.JasperRunManager.runReportToPdfStream(JasperRunManager.java:368)
	at br.com.procempa.lca.ui.jsf.bean.formulario.FormularioComumBean.geraPDF(FormularioComumBean.java:98)
	at br.com.procempa.lca.ui.jsf.bean.formulario.EmissaoBoletimInformativoBean.geraFormulario(EmissaoBoletimInformativoBean.java:58)
	at br.com.procempa.lca.ui.jsf.bean.formulario.EmissaoBoletimInformativoBean.emiteBoletimInformativo(EmissaoBoletimInformativoBean.java:47)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.myfaces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:129)
	at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:63)
	at javax.faces.component.UICommand.broadcast(UICommand.java:106)
	at javax.faces.component.UIViewRoot._broadcastForPhase(UIViewRoot.java:94)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:168)
	at org.apache.myfaces.lifecycle.LifecycleImpl.invokeApplication(LifecycleImpl.java:343)
	at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:86)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:137)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at br.com.procempa.lca.ui.filter.AutorizacaoFiltro.doFilter(AutorizacaoFiltro.java:63)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:118)
	at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:144)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
	at java.lang.Thread.run(Unknown Source)

desde já agradeço

obrigado…

O que você quer fazer exatamente? Se quer imprimir a lista de strings linha a linha, a lista deve ser uma fonte de dados do relatório. Ou então você passa uma string apenas, contendo os valores concatenados, se for o caso de apenas exibir o valor.

Não posso concatenar… preciso exibir linha a linha… mas não entendi como faço isso…

O que é essa tal lista de strings que você quer imprimir?
Veja só: O iReport exibe os valores de acordo com a fonte dos dados, ou DataSource. Você deve especificar essa fonte, que pode ser um banco de dados, uma coleção, um XML. No “detalhe” do relatório, você especifica os campos que serão exibidos, e ele inteligentemente itera a fonte de dados e exibe os valores linha a linha.

Por exemplo:

Se você tem uma classe Pessoa com os campos nome e endereço, pode especificar como fonte de dados uma Collection.

Daí você poderia projetar o relatório da seguinte forma

Cabeçalho:
“Nome” “Endereço”

Detalhe:
$F{nome} $F{endereco}

Rodapé:
“Página + $V{PAGE_NUMBER}”

Eu estou querendo passar uma classe chamada EmissaoBoletimInformativo… q tem alguns campos como Titulo… Subtitulo… que são Strings, mas também tem um campo chamado textoFormulário… que é um ArrayList de Strings…

atualmente o relatório aparece… mas sem nada escrito onde deveria estar a lista… apenas o título e os outros dados que não constam dentro da lista.

Então é suficiente o toString() do ArrayList? Eu acho que ele está recuperando o valor mas não esteja exibindo porque o campo está menor do que o tamanho da string a ser exibida. Nesse caso você pode tentar aumentar o campo dinamicamente, marcando a opção Stretch with Overflow nas propriedades do campo. Além disso, é bom você colocar esse campo embaixo dos outros, ao invés de colocá-lo ao lado. Assim o layout não vai ficar bagunçado.

O problema do toString é q ele não mostra a lista linha a linha para que o IReport possa paginar… creio que fiz alguma bobagem no IReport tambem, pq fiz um segundo relatório onde eu fiz um campo tipo Object apontar para um subrelatório que seria a minha lista… o problema é que não consigo mostrar ou encontrar esse subrelatório… quando coloco o jasper diretamente no c… o relatório é gerado sem a lista… quando mudo o local… ele diz q não encontrou o arquivo no local indicado…

alguem sabe como posso mostrar esse subrelatório na tela??

Consegui resolver parte do problema… … o campo “Texto” na verdade era “texto”… ele paginou… porém restou um problema… ele começa o relatório sempre a partir da segunda pagina… o q pode ser isso?

Jesuskleiton

Como você definiu o DataSource do Subrelatório?

Outra coisa, geralmente quando eu utilizo subrelatórios eu crio dois parametro no relatório pai,
um para receber o endereço do subrelatório e outro para receber um DataSource.

Eu fiz o dataSource do relatorio como um campo Object… o endereço do relatório esta em um atributo do tipo String…

A flag “Divisão Premitida” da banda onde se encontra o subrelatório está acionada?

Uma pergunta meio óbvia: qual a banda que está sendo usada pelo subrelatório?

Atenciosamente.

a Banda do subrelatório é o detalhe… a do cabeçalho é a columnheader… é engraçado… pois estou conseguindo mostrar toda a minha lista no relatório, mas
deixando uma pagina em branco… ai começa a escrever o relatorio na segunda pagina… nem o cabeçalho escreve na primeira folha… o q poderia ser??

ah sim … a flag ta marcada…

Pessoal, consegui resolver o problema da página em branco… bastou desmarcar a propriedade do relatorio “Título a cada pagina” e agora o relatório passou a ser mostrado desde a primeira página…

Quanto ao problema da lista… eis a solução que utilizei… graças a esse ótimo tutorial.

http://furutani.com.br/tutoriais/Tutorial_JasperReports/

Ainda enfrento alguns pequenos problemas… mas como eles fogem do assunto desse tópico abrirei um tópico a parte…

mas fica aí a solução para quem tiver o mesmo problema…

obrigado a todos…