Usar Array como fonte de dados no IReport

Como faço para pegar no IReport um Array que vou passar da minha classe ?
Tenho q criar uma variavel no IReport?

Olá,

Você não passa um array, mas uma coleção, tipo List ( não tenho certeza do que acabei de dizer ).

  1. Observe a necessidade de um Data Source do tipo BeanCollection.
  2. Passe parâmetros (como o título do relatório ) na forma de um MAP
  3. Visualize o resultado
		JRBeanCollectionDataSource jr = new JRBeanCollectionDataSource(beans);
		JasperPrint impressao;
		try {
			Map parametros = new HashMap();
			parametros.put("razaoSocial","EMPRESA DE TECNOLOGIA DO CASCÃO");
	        
	                JasperPrint resultado = JasperFillManager.fillReport( "nomeDoRelatorio.jasper", parametros, jr );
	                JasperViewer.viewReport( resultado, false );

		} catch (JRException e) {
			e.printStackTrace();
		} catch (Exception e){
			System.out.println(e);
		}

Tem tutotial ( artigo ) aqui no GUJ muito bom ( pra variar ).

Abraços,

Márcio

Estou passando um Arraylist para o IReport

JRDataSource jrds = new JRBeanArrayDataSource(Fita.toArray()); JasperPrint jprint = JasperManager.fillReport("Prog.jasper", null, jrds); JasperViewer.viewReport(jprint,false);

Não sei exatamente, ms acho q se eu usar um Map pra passar o ArrayList todo não dá certo

Consegui passar o Arraylist, mas to com outro problema agora

Ta aparecendo todo os dados da list na mesma linha, e a quantidade de vezes dos dados, tipo

13:00 - 1, 17:00 - 1, 21:00 - 1
13:00 - 1, 17:00 - 1, 21:00 - 1
13:00 - 1, 17:00 - 1, 21:00 - 1

quando era para aparecer

13:00 - 1
17:00 - 1
21:00 - 1

Como vc consegiu passar o ArrayList?

[quote=dribeiro12]Estou passando um Arraylist para o IReport

JRDataSource jrds = new JRBeanArrayDataSource(Fita.toArray()); JasperPrint jprint = JasperManager.fillReport("Prog.jasper", null, jrds); JasperViewer.viewReport(jprint,false);

Não sei exatamente, ms acho q se eu usar um Map pra passar o ArrayList todo não dá certo[/quote]

Caros,

Estou recebendo o seguinte exception ao tentar passar um array pro Jasper:

“Incompatible java.util.ArrayList value assigned to parameter vetor in the Guia_Pagto_Eventos_Contingenciais dataset.”

Alguém sabe explicar o porque dessa msg???

Oi felipe, seja bem vindo.

Esse tópico é de 2005. Quando você tiver uma dúvida e o tópico for muito velho, crie um tópico novo ok?
Existem vários tipos de data sources no Jasper.

Para uma coleção, vc usa o JRBeanCollectionDataSource.

JRDataSource jrds = new JRBeanCollectionDataSource(suaColecaoAqui);

Para um array, vc usa o JRBeanArrayDataSource.

JRDataSource jrds = new JRBeanArrayDataSource(seuArrayAqui);

[]´s

David,

Muito obrigado pela atenção cara!!! Acompanho seus tutoriais de Java com Flex e quando vi que vc estava nesse fórum aqui tbm resolvi perguntar por isso o fiz em cima de um tópico tão antigo.

Já estou usando o JRDataSource vou colocar uma parte do meu código aqui pra vc ver não posso posta-lo todo pq desenvolvo pra CEF e ha certos problemas aqui quanto a isso rsrsrsr. Tenho outra duvida dentro do IReport eu devo colocar como field ou como parâmetro e se for parametro qual o tipo que devo colocar??? Grato pela sua atenção desde já!!!

        JRDataSource vetor = new JRBeanArrayDataSource(listaBoleto.toArray());
        /*Monta os parametros utilizados na tela*/
        Map < String, Object > parametros = new HashMap < String, Object > ();
        
        parametros.put("numGuia", numGuia);
        parametros.put("pvEmissor", pvEmissor);
        parametros.put("dataEmissao", dataEmissao);
        parametros.put("dataValidade", dataValidade);
        parametros.put("controle", controle);
        parametros.put("nis", nis);            
        parametros.put("tpSegurado", tpSegurado);
        parametros.put("nomeSegurado", nomeSegurado);
        parametros.put("dataNascimento", dataNascimento);
        parametros.put("nomeMae", nomeMae);
        parametros.put("nuRequerimento", requerimento);
        //parametros.put("vetor", new String[] {listaBoleto[]});
        parametros.put("vetor", vetor);

Oi Felipe,

Fico feliz de saber que você acompanha os tutoriais do meu Blog e que por isso você se cadastrou aqui no GUJ.
O GUJ tem muita gente competente que pode lhe ajudar nas suas dúvidas!
Novamente, seja bem vindo, espero que goste da comunidade :wink:

Antes de mais nada, dê uma olhada aqui para você aprender como postar código fonte no fórum beleza?

Quanto a sua dúvida.
Você quer usar os dados do array no relatório ao invés de fazer uma query certo?

Se for isso, esse array não deve ser passado como parâmetro no Map, mas sim como parâmetro no método fillReport.
Seu código ficaria assim:

[code]JRDataSource vetor = new JRBeanArrayDataSource(listaBoleto.toArray());
Map < String, Object > parametros = new HashMap < String, Object > ();

parametros.put(“numGuia”, numGuia);
parametros.put(“pvEmissor”, pvEmissor);
parametros.put(“dataEmissao”, dataEmissao);
parametros.put(“dataValidade”, dataValidade);
parametros.put(“controle”, controle);
parametros.put(“nis”, nis);
parametros.put(“tpSegurado”, tpSegurado);
parametros.put(“nomeSegurado”, nomeSegurado);
parametros.put(“dataNascimento”, dataNascimento);
parametros.put(“nomeMae”, nomeMae);
parametros.put(“nuRequerimento”, requerimento);

JasperPrint jasperPrint = JasperFillManager.fillReport( seu jasper aqui, parametros, vetor );[/code]

E dentro do relatório, vc obtém os dados dos objetos passados no array ou na coleção como se estivesse usando campos.
Tente ai e diga se deu certo :wink:

[] s

David,

Vou colocar aqui todas as classes que estou usando pra que vc tenha uma idéia de como esta sendo feita essa geração de relatório. Pois não to conseguindo com a estrutura que já usavamos aqui. Estou colocando no IReport como campo em uma aba DETAIL!!!

[code] try {
LOGGER.error("====== ENTROU EM: ContaSuprimentoConsultarAction NO METODO: execute ======");
/Cria formulário./

        final EventosContingenciaisActionForm formulario = (EventosContingenciaisActionForm) form;
        
        
        
        final GeradorRelatorio geradorRelatorio = new GeradorRelatorio(response);
        final RelatorioDTO relatorioDTO         = new RelatorioDTO();
        

        final String numGuia         = formulario.getOuNuGuia();        
        final String pvEmissor       = formulario.getInCodigoPv();
        final String dataEmissao     = formulario.getOuDtEmissao();
        final String dataValidade    = formulario.getOuDtEmissao();
        final String nis             = formulario.getNumeroNis();
        final String tpSegurado      = formulario.getOuDescTpSegurado();
        final String nomeSegurado    = formulario.getOuNomeTrab();
        final String dataNascimento  = formulario.getOuDtNascimento();
        final String nomeMae         = formulario.getOuNomeMae();
        final String controle        = formulario.getOuControle();
        final String requerimento    = formulario.getNuRequerimento();
        final String lista           = formulario.getInListaBoletoPagto();
        final String regSelecionados = formulario.getTotRegistrosSelec();
        
        List<String> listaBoleto = new ArrayList<String>();
        
        int selecionados = Integer.parseInt(regSelecionados);
        
        for (int i = 0, j=0; i < selecionados; i++, j+=48) {
            
            listaBoleto.add(i, lista.substring(j, j+48));
            
        }
        relatorioDTO.setDownload(true);
        
        
        LOGGER.debug("######################VAI CRIAR O DAO#################");
        /*Cria e executa o dao*/

        final EventosContingenciaisDAO eventosContingenciaisDAO = 
            new EventosContingenciaisDAO(request, this.getServlet().getServletContext());
        
        //Configura o endereço IP no formulário.
        formulario.configurarEnderecoIP(request);
        
        /*Executa a chamada ao programa SEDPO611.*/
        eventosContingenciaisDAO.detalharEventosDisponiveisEmissaoContingencial(formulario);
        
        /*Configura a lista no formulário.*/
        //formulario.setListaEventosContingenciais((Collection < EventosContingenciaisDTO >  )
        //request.getAttribute("br.gov.caixa.sised.dto.pagamento.eventos.contingenciais.EventosContingenciaisDTO_collection"));        
        
        //request.setAttribute("registros", formulario.getListaEventosContingenciais());

        //relatorioDTO.setListaDados(formulario.getListaEventosContingenciais());
        
         JRDataSource vetor = new JRBeanArrayDataSource(listaBoleto.toArray());
        //JRDataSource vetor = new JRBeanCollectionDataSource(listaBoleto);
        
        /*Monta os parametros utilizados na tela*/
        Map < String, Object > parametros = new HashMap < String, Object > ();
        
        parametros.put("numGuia", numGuia);
        parametros.put("pvEmissor", pvEmissor);
        parametros.put("dataEmissao", dataEmissao);
        parametros.put("dataValidade", dataValidade);
        parametros.put("controle", controle);
        parametros.put("nis", nis);            
        parametros.put("tpSegurado", tpSegurado);
        parametros.put("nomeSegurado", nomeSegurado);
        parametros.put("dataNascimento", dataNascimento);
        parametros.put("nomeMae", nomeMae);
        parametros.put("nuRequerimento", requerimento);
        //parametros.put("vetor", new String[] {listaBoleto[]});
        parametros.put("vetor", vetor);
        
        
        relatorioDTO.setListaParamentos(parametros);
        
        /*Configura a página de retorno de acordo.*/
        this.forward = ConstantesDePaginas.EXIBIR_PAGINA_SUCESSO;
        
        LOGGER.error("====== INICIA TRATAMENTO DO CODIGO DE ERRO ======");
        this.tratamentoDeErro(request);

        /*Essas próximas linhas usam as classes que criei para tratar os relatórios.*/
        relatorioDTO.setNomeArquivoJasper("/WEB-INF/relatorios/Guia_Pagto_Eventos_Contingenciais.jasper");
        relatorioDTO.setNomeArquivoGerado("relatorio");

        relatorioDTO.setTipoRelatorio(RelatorioDTO.TipoRelatorio.PDF);
        //relatorioDTO.setListaDados(listaBoleto);

        /*Gera o relatório.*/
        geradorRelatorio.gerarRelatorio(relatorioDTO, 
                getServlet().getServletContext().getResourceAsStream(relatorioDTO.getNomeArquivoJasper()));

        /*Configura a página de retorno de acordo.*/
        //this.forward = null;
        


    } catch (Exception e) {
        LOGGER.error("Erro durante a execucao do metodo -> ContaSuprimentoConsultarAction.execute(....) - " + e.toString());
        definirMensagemErro(request, ERRO_RUNTIME);
        this.forward = ConstantesDePaginas.EXIBIR_PAGINA_ERRO;
    }
    return mapping.findForward(this.forward);
}    

}[/code]

AQUI ABAIXO OU OUTROS MÉTODOS USADOS POR ESSA CLASSE!!!

[code] public void gerarRelatorio(final RelatorioDTO relatorioDTO, InputStream arqTemplate) throws Exception {
try {
/Obtendo os parâmetros do relatório/
final Map < String, Object > parametros = relatorioDTO.getListaParamentos();
LOGGER.error(“Obtendo parâmetros do relatório:” + parametros);

        /*Populando o relatório*/
        final Collection < ? > listaDados = relatorioDTO.getListaDados();
        final JasperPrint jasperPrint =    
            JasperFillManager.fillReport(arqTemplate, parametros, new JRBeanCollectionDataSource(listaDados));
        LOGGER.error("Teste jasperPrint:" + jasperPrint);

        if (relatorioDTO.getTipoRelatorio() == RelatorioDTO.TipoRelatorio.PDF) {
            geraRelatorioPDF(relatorioDTO, jasperPrint, relatorioDTO.isDownload());
        } else if (relatorioDTO.getTipoRelatorio() == RelatorioDTO.TipoRelatorio.XLS) {
            LOGGER.error("------ Relatório XLS -------");
            geraRelatorioXLS(relatorioDTO, jasperPrint, relatorioDTO.isDownload());
        }

    } catch (Exception e) {
        LOGGER.error("Erro durante a execucao do metodo -> GeradorRelatorio.gerarRelatorio(.) - " + e.toString());
        throw e;
    }

}

[/code]

E AQUI O DTO QUE TBM É USADO NA CLASSE!!!


public class RelatorioDTO implements Serializable {
	/**
	 * Atributo ID.
	 */
	private static final long serialVersionUID = -5338624836222015742L;

	/**Atributo que define se será feito download do relatório.*/
	private boolean download = false;
	/**
	 * Enumeration que define quais são os tipos possíveis de geração de
	 * relatório.
	 */
	public enum TipoRelatorio {
		/**Tipode de relatórios.*/
		PDF, HTML, XLS, CSV, RTF, ODF
	}
	/**
	 * Atributo que conterá o nome do arquivo físico gerado para o relatório
	 */
	private String nomeArquivoGerado;

	/**
	 * Atributo que contém o nome do arquivo Jasper do relatório
	 */
	private String nomeArquivoJasper;

	/**
	 * Atributo que conterá os parâmetros para o relatório
	 */
	private Map < String, Object > listaParamentos = new HashMap < String, Object > ();

	/**
	 * Atributo que conterá a lista dos beans que serão exibidos/manipulados no
	 * relatório
	 */
	private Collection < ? > listaDados;

	/**
	 * Atributo que define qual é a ação a ser executada sobre o relatório.
	 * (Exportação ou Visualização padrão do Jasper ou Impressão com janela
	 * padrão de impressão ou Impressão sem janela padrão de impressão)
	 */
	private int acaoRelatorio;

	/**
	 * Atributo que indicará qual é o tipo de relatório que será gerado. Será
	 * definido através do enumeration definido na classe. Os tipos possíveis
	 * para o relatório são PDF, HTML, XLS, CSV, RTF e ODF
	 */
	private TipoRelatorio tipoRelatorio;

// Gets e Sets

Oi Felipe,

Qual o erro? Pode postar o stack trace p/ eu dar uma olhada?

Ola David,

Se eu estiver atrapalhando pode falar cara… rsrsr

Agora não esta mais dando erro o meu console fica como vou mostrar abaixo:


2010-01-05 05:01 [ERROR] - Obtendo parâmetros do relatório:{nomeMae=ARMANDINA PACHECO MUCIDA                , numGuia=000001, vetor=net.sf.jasperreports.engine.data.JRBeanArrayDataSource@e26640, nomeSegurado=ALBERTO MUCIDA                          , dataEmissao=05/10/2010, nuRequerimento=9111121327-7, nis=1080000208-0, dataValidade=05/10/2010, dataNascimento=17/04/1943, tpSegurado=Doméstico, pvEmissor=0257, controle=01}
2010-01-05 05:01 [DEBUG] - Fill 11330298: created for Guia_Pagto_Eventos_Contingenciais
2010-01-05 05:01 [DEBUG] - Fill 11330298: filling report
2010-01-05 05:01 [DEBUG] - Fill 11330298: no data
2010-01-05 05:01 [DEBUG] - Fill 11330298: all sections
2010-01-05 05:01 [DEBUG] - Fill 11330298: adding page 1
2010-01-05 05:01 [DEBUG] - Fill 11330298: page header
2010-01-05 05:01 [DEBUG] - Fill 11330298: page footer
2010-01-05 05:01 [DEBUG] - Fill 11330298: ended
2010-01-05 05:01 [ERROR] - Teste jasperPrint:net.sf.jasperreports.engine.JasperPrint@165e672
2010-01-05 05:01 [DEBUG] - processForwardConfig(ForwardConfig[name=erro,path=/_comuns/_jsp/mensagem.jsp,redirect=false,contextRelative=false,module=null])
2010-01-05 05:01 [ERROR] - Cannot forward after response has been committed

Porém meu pdf abre mas não mostra o vetor!!! :?

Coloquei como campo com o nome vetor, na aba details e com o tipo como String mas simplesmente não aparece nada. Ele popula todos os outros campos menos o campo vetor.

Oi Felipe,

Não está atrapalhando não :wink:

A solução é fácil, mas preciso saber se vc está usando o IReport standalone ou o plugin do NetBeans?

É Standalone cara, não uso o netbeans aqui na empresa não só o eclipse.

Tah,

Então, vc precisa configurar o classpath do IReport para ele enxergar as classes do seu projeto e então carregar os campos da entidade que você quer (o tipo que está sendo passado na coleção).
O parte do classpath, estou mostrando de dentro do plugin do NetBeans, mas no standalone não é difícil de encontrar. Acho que é nas preferências do IReport.

Veja as duas imagens abaixo.
Se não conseguir resolver, me avisa :wink:

Coloquei uma tarja preta em cima dos caminhos aqui, pq é um sistema q estou desenvolvendo e preciso manter sigilo até do nome do sistema :S

iReport1.png é a primeira, iReport2.png é a segunda.

[]´s




David,

Já resolvi consegui fazendo um bean pra passar os dados pela Data Source!!! Obrigado pela atenção e pela ajuda, agora vou implementar o código de barras no boleto!!! Abração!!!

Beleza então Felipe!

Abraço!

Perdão por reabrir o tópico.
Estou fazendo esse processo de imprimir do java, fiz o procedimento abaixo, mas tenho uma dúvida:
Os parâmetros que são passados são os campos que vão aparecer na tela?
E, se no caso, eu tenho digamos, um nº (um id) que serve como comparativo? Como eu passo esse dado?
Eu tenho que tirar a sql que eu fiz no jasper?
Por que meu caso é assim:
Tenho uma tela, onde vou vazer uma busca, onde poderei selecionar uma ou várias Expedições. O que preciso mandar para o relatório é a Organização(empresa), o nº da nota e a série, e esses campos estão todos na minha tela. Como eu faço pra imprimir somente os que eu tenho selecionado?

Desde já agradeço. :slight_smile: