Fontes de dados de relatório

Fontes de dados são contêineres de dados estruturados. Ao gerar o relatório, o mecanismo JasperReports obtém dados das fontes de dados. Os dados podem ser obtidos em bancos de dados, arquivos XML, matrizes de objetos e coleção de objetos. Vimos no capítulo Preenchendo Relatórios , o método fillReportXXX () espera receber uma fonte de dados do relatório, que deve ser preenchida, na forma denet.sf.jasperreports.engine.JRDataSource objeto ou um java.sql.Connection (quando os dados do relatório são encontrados em um banco de dados relacional).

A interface JRDataSource possui apenas dois métodos, que devem ser implementados -

  • public boolean next () lança JRException;

    • No momento do preenchimento do relatório, este método é chamado no objeto da fonte de dados pelo mecanismo de relatório ao iterar os dados.

  • public Object getFieldValue (JRField jrField) lança JRException;

    • Este método fornece o valor para cada campo de relatório no registro da fonte de dados atual.

A única maneira de recuperar dados da fonte de dados é usando os campos do relatório. Existem várias implementações padrão da interface JRDataSource, dependendo da forma como os registros na fonte de dados são adquiridos.

Implementações de fonte de dados

A tabela abaixo resume as fontes de dados e suas classes de implementação -

Fonte de dados Classe de Implementação
JDBC net.sf.jasperreports.engine.JRResultSetDataSource
JavaBean net.sf.jasperreports.engine.data.JRBeanCollectionDataSource, net.sf.jasperreports.engine.data.JRBeanArrayDataSource
Baseado em mapa net.sf.jasperreports.engine.data.JRMapArrayDataSource, net.sf.jasperreports.engine.data.JRMapCollectionDataSource
TableModel net.sf.jasperreports.engine.data.JRTableModelDataSource
XML net.sf.jasperreports.engine.data.JRXmlDataSource
CSV net.sf.jasperreports.engine.data.JRCsvDataSource
XLS net.sf.jasperreports.engine.data.JRXlsDataSource
Vazio net.sf.jasperreports.engine.JREmptyDataSource

Fontes de dados JDBC

Classe JRResultSetDataSourcecraps um objeto java.sql.ResultSet . Esta é a implementação de fonte de dados mais comumente usada quando os dados do relatório são extraídos de um banco de dados relacional. Se um java.sql.Connection for passado para o mecanismo, ele executará primeiro a consulta relacionada e armazenará o objeto java.sql.ResultSet retornado em uma instância JRResultSetDataSource.

Fontes de dados JavaBean

Aulas JRBeanArrayDataSource e JRBeanCollectionDataSourcerepresentam implementações que podem envolver matrizes e coleções de objetos JavaBean. Cada objeto dentro da matriz ou coleção será visto como um registro neste tipo de fonte de dados. O mapeamento entre uma propriedade JavaBean específica e o campo de relatório correspondente é feito por convenções de nomenclatura. O nome do campo do relatório deve ser igual ao nome da propriedade JavaBean conforme especificado pelas especificações JavaBeans.

Em todos os exemplos deste tutorial, usamos JRBeanCollectionDataSource.

Fontes de dados baseadas em mapa

As classes de implementação JRMapArrayDataSource e JRMapCollectionDataSourcesão úteis se o aplicativo pai já armazena os dados de relatório disponíveis na memória como objetos java.util.Map . Cada objeto Map na matriz ou coleção empacotada é considerado um registro virtual na fonte de dados e o valor de cada campo de relatório é extraído do mapa usando o campo de relatório nomeado como a chave.

Fontes de dados TableModel

Em muitos aplicativos do lado do cliente, os dados são exibidos em formato tabular. Um requisito comum em muitos aplicativos é permitir que o usuário imprima este formato tabular como um relatório. Classe de implementaçãoJRTableModelDataSourcetorna a tarefa de gerar relatórios em formato tabular trivial para aplicativos Swing. Esta classe envolve um objeto javax.swing.table.TableModel. As colunas no objeto TableModel empacotado podem ser acessadas por seus nomes ou por seus índices baseados em 0.

Fontes de dados XML

Classe JRXmlDataSourceé uma implementação de fonte de dados baseada em DOM, que usa expressões XPath para selecionar dados do documento XML. Os registros na origem de dados XML são representados por elementos de nó selecionados por meio da expressão XPath. Os valores de campo são recuperados de cada registro usando a expressão XPath fornecida pela descrição do campo (elemento <fieldDescription> em JRXML).

XPath é uma linguagem usada para navegar pelos atributos e elementos de um documento XML. Mais informações sobre XPath podem ser encontradas emhttp://www.w3.org/TR/xpath.

Fontes de dados CSV

JRCsvDataSourcerepresenta uma implementação para fontes de dados, que recuperam seus dados de arquivos de texto estruturados; geralmente CSVs. Os valores de campo são recuperados usando seu índice de coluna.

Fontes de dados XLS

JRXlsDataSourcerepresenta uma implementação para fontes de dados, que recuperam seus dados de documentos do Excel. O mapeamento do campo de relatório para esta implementação de fonte de dados também é baseado no índice da coluna do campo.

Fontes de dados vazias

A classe JREmptyDataSource, simula uma fonte de dados com um determinado número de registros vazios virtuais dentro. É usado pelas ferramentas da IU para oferecer funcionalidade básica de visualização de relatório ou em modelos de relatório especiais ou para fins de teste e depuração.

Fontes de dados rebobináveis

o net.sf.jasperreports.engine.JRRewindableDataSourceestende a interface JRDataSource básica . Ele adiciona apenas um método, denominado moveFirst (), à interface. Este método tem como objetivo mover o cursor para o primeiro elemento na fonte de dados.

As fontes de dados rebobináveis ​​são úteis ao trabalhar com sub-relatórios colocados dentro de uma banda que não pode ser dividida devido à configuração isSplitAllowed = "false" e não há espaço suficiente na página atual para o sub-relatório a ser renderizado.

Todas as implementações de fonte de dados acima são rebobináveis, exceto para o JRResultSetDataSource, uma vez que não suporta mover o ponteiro do registro para trás. Isso representa um problema apenas se essa fonte de dados for usada manualmente para agrupar um java.sql.ResultSet antes de passá-lo para o sub-relatório. Não há problema, se a consulta SQL residir no modelo de sub-relatório, pois o mecanismo irá executá-lo novamente ao reiniciar o sub-relatório na próxima página.

Provedores de fonte de dados

A biblioteca JasperReports tem uma interface net.sf.jasperreports.engine.JRDataSourceProvider. Isso ajuda a criar e descartar objetos de fonte de dados. Ao criar um modelo de relatório usando ferramentas GUI, uma ferramenta especial para personalizar a fonte de dados do relatório é necessária. JRDataSourceProvider é a maneira padrão de conectar fontes de dados customizadas em uma ferramenta de design. Uma implementação personalizada desta interface deve implementar os seguintes métodos que permitem criar e descartar objetos de fonte de dados e também métodos para listar os campos de relatório disponíveis dentro da fonte de dados, se possível -

public boolean supportsGetFieldsOperation();

public JRField[] getFields(JasperReport report)
   throws JRException, UnsupportedOperationException;

public JRDataSource create(JasperReport report) throws JRException;

public void dispose(JRDataSource dataSource) throws JRException;