Jump to content
D3POD

Dúvida iReports

Recommended Posts

D3POD

Olá a todos, estou a criar um programa para um centro de reparações.

O programa para já é muito simples e consiste no registo dos equipamentos quando dão entrada na loja e estou a preparar o programa de maneira a que os técnicos possam registar por exemplo quando o equipamento está pronto ou se não tem reparação e ainda se está a aguardar algum componente.

A ideia é nesta primeira fase criar apenas o essencial e com o tempo introduzir novas funcionalidades.

Bem mas isto para explicar que irei precisar de fazer pelo menos 2 tipos de impressões.

Uma quando o cliente entrega o equipamento para servir de comprovativo de entrega e outra quando o processo termina para dar um relatório do que aconteceu na reparação.

Já tenho tudo criado, estou a tratar neste momento da DB, mas entretanto comecei já a ver a situação de imprimir esses relatórios.

Encontrei alguma informação sobre o ireports e tenho algumas duvidas pois os exemplos que encontro explicam muito bem a parte de conectar o ireports com o java, mas não muito bem a parte de enviar a ordem de impressão.

Alguém me pode ajudar explicando como posso fazer para imprimir a informação?

O ireports vai buscar a informação directamente à DB? ou vai aos jtextfield que eu expecificar?

Como posso indicar um "processo de reparação" pelo ID desse processo, ou seja, se o processo for o numero 230 como é que eu dou a ordem de impressão para esse processo?

Estou um pouco baralhado pois não estou a perceber esta parte, os exemplos que vejo, são muito vagos no que toca ao código introduzido no java.

Cumprimentos

Share this post


Link to post
Share on other sites
Rui Carlos

O iReports não é mais ou menos o mesmo que o JasperReports?

Se bem me lembro, tens a opção de abrir o relatório gerado numa nova janela, onde tens um botão para imprimir (assim como mais ). Não é exactamente imprimir directamente, mas quase. O processo seria indicar o ID, abrir o relatório, e clicar no botão de imprimir.

É provável que também dê para imprimir directamente, mas nunca fiz isso. Estive agora a ver a documentação, e tens esta classe: http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/JasperPrintManager.html

Eu costumava usar as classes equivalentes para gerar PDFs (JasperExportManager) e abrir o visualizador (JasperViewer). Por isso, também deves conseguir imprimir directamente.

Share this post


Link to post
Share on other sites
saca-rolhas

Boas C3PO,

se queres gerar PDFs com a tua aplicação Java e que faça não depender de softwares externos a apenas de um .jar eu recomendo o iTextPdf porem desde já informo que é uma biblioteca complexa e configuração de documentos muito detalhados pode ser demorada, porem é sólida e versátil, pois permite fazeres tudo o que tu quiseres em PDF.

Vai a http://itextpdf.com/ para sacares o jar e a http://itextpdf.com/examples/ para veres exemplos práticos e se calhar construíres algo a partir deles para a tua solução.

Sobre o iReports já tinha ouvido falar, e constatei que é uma ferramenta espectacular que tem o layout do NetBeans que é um IDE a que estou familiarizado, recomendo.

Agora dos 10 minutos que estive a configurar uma ligação JDBC a uma base de dados MSSQL onde tive de colocar bibliotecas externas ao programa e a gerar um report através dum template pré-feito pergunto-me.

Como posso integrar isto numa aplicação de maneira a que fornecendo um Result Set dum query e um template XML feito através deste programa posso fazer o mesmo que se vê no preview, onde posso encontrar as bibliotecas necessárias para fazer isto acontecer?

Edited by saca-rolhas

The worst part of censorship is ****

Share this post


Link to post
Share on other sites
Rui Carlos

Sobre o iReports já tinha ouvido falar, e constatei que é uma ferramenta espectacular que tem o layout do NetBeans que é um IDE a que estou familiarizado, recomendo.

Agora dos 10 minutos que estive a configurar uma ligação JDBC a uma base de dados MSSQL onde tive de colocar bibliotecas externas ao programa e a gerar um report através dum template pré-feito pergunto-me.

Como posso integrar isto numa aplicação de maneira a que fornecendo um Result Set dum query e um template XML feito através deste programa posso fazer o mesmo que se vê no preview, onde posso encontrar as bibliotecas necessárias para fazer isto acontecer?

Penso que aquilo que precisas é a biblioteca JasperReports, que te permite pegar no ficheiro de configuração XML do relatório, e gerar relatórios, permitindo também que os relatórios seja populados com um ResultSet.

Tenho aqui um projecto onde usei um código semelhante a este:

	public void viewReport(ResultSet rs, Map<String,Object> parameters, String path) throws JRException
{
	// Compilar o ficheiro JRXML que contém a definição do relatório, e que pode ser gerado pelo iReport
	JasperReport report = JasperCompileManager.compileReport(path);

	// Preencher o relatório com dados
	JasperPrint print =
			JasperFillManager.fillReport(
					report,
					parameters,  // Parâmetros a serem usados no preenchimento do relatório
					new JRResultSetDataSource(rs) // ResultSet a ser usado no preenchimento do relatório
			);

	// Visualizar o relatório
	// Pode ser facilmente adaptado para em vez de abrir um visualizador, gerar um PDF, e imprimir o relatório
	JasperViewer.viewReport(print, false);
}

Edited by Rui Carlos
Corrigido erro no código (String -> Object).

Share this post


Link to post
Share on other sites
saca-rolhas

Penso que aquilo que precisas é a biblioteca JasperReports, que te permite pegar no ficheiro de configuração XML do relatório, e gerar relatórios, permitindo também que os relatórios seja populados com um ResultSet.

Tenho aqui um projecto onde usei um código semelhante a este:

	public void viewReport(ResultSet rs, Map<String,String> parameters, String path) throws JRException
{
	// Compilar o ficheiro JRXML que contém a definição do relatório, e que pode ser gerado pelo iReport
	JasperReport report = JasperCompileManager.compileReport(path);

	// Preencher o relatório com dados
	JasperPrint print =
			JasperFillManager.fillReport(
					report,
					parameters,  // Parâmetros a serem usados no preenchimento do relatório
					new JRResultSetDataSource(rs) // ResultSet a ser usado no preenchimento do relatório
			);

	// Visualizar o relatório
	// Pode ser facilmente adaptado para em vez de abrir um visualizador, gerar um PDF, e imprimir o relatório
	JasperViewer.viewReport(print, false);
}

Boas,

Sobre o IReports e esse metodo tenho 2 questões.

1ª- Que informação se deve passar através dessa variável parameters e em que parte aplico o jrxml para aplicar os templates e formatos que criei no iReport Designer?

2ª- Li o THE JASPERREPORTS ULTIMATE GUIDE e com base no que li cheguei à conclusão que as bibliotecas a ser carregadas para a aplicação para que possa gerar reports em PDF e carregar dados de uma base de dados MSSQL são: jcommon, jtds, itextpdf e jasperreports contudo no metodo que forneceste o JasperFillManager acusa erro nos parâmetros declarados, alguma sugestão?


The worst part of censorship is ****

Share this post


Link to post
Share on other sites
Rui Carlos

1ª- Que informação se deve passar através dessa variável parameters e em que parte aplico o jrxml para aplicar os templates e formatos que criei no iReport Designer?

O parameters contém os valores para os parâmetros existentes no JRXML.

A localização do JRXML é especificada na variável path (a primeira coisa que é feita é compilar esse ficheiro).

2ª- Li o THE JASPERREPORTS ULTIMATE GUIDE e com base no que li cheguei à conclusão que as bibliotecas a ser carregadas para a aplicação para que possa gerar reports em PDF e carregar dados de uma base de dados MSSQL são: jcommon, jtds, itextpdf e jasperreports contudo no metodo que forneceste o JasperFillManager acusa erro nos parâmetros declarados, alguma sugestão?

Qual é o erro que dá? O código que apresentei já tem alguns anos, e é possível que a API tenha mudado entretanto.

Share this post


Link to post
Share on other sites
saca-rolhas

Basicamente diz que o método invocado não possui aqueles parâmetros ou seja o típico "no suitable method found"


The worst part of censorship is ****

Share this post


Link to post
Share on other sites
saca-rolhas

Eu tenho o jasperreports-5.2.0.jar


The worst part of censorship is ****

Share this post


Link to post
Share on other sites
Rui Carlos

Experimenta trocar

public void viewReport(ResultSet rs, Map<String,String> parameters, String path)

por

public void viewReport(ResultSet rs, Map<String,Object> parameters, String path)

Share this post


Link to post
Share on other sites
saca-rolhas

Realmente assim ele come, já tinha visto na documentação da biblioteca que ele levava com Map<String,Object> mas não vejo o mal de levar com Map<String,String> uma vez que String herda de Object.

Obrigado


The worst part of censorship is ****

Share this post


Link to post
Share on other sites
saca-rolhas

Aqui vai o resultado da minha pesquisa.

package reports;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.view.JasperViewer;

public class Reports {
public static final String MSSQL = "net.sourceforge.jtds.jdbc.Driver";
public static final String PATH = "jdbc:jtds:sqlserver://aserver:1433;databaseName=Adatabase";
public static final String SQL_USER = "auser";
public static final String SQL_PWD = "apw";
public static void main(String[] args) throws ClassNotFoundException {

	Class.forName(MSSQL);
	String fileName = "compiledReport.jasper";
	String outFileName = "apdf.pdf";
	HashMap hm = new HashMap();
	String query = "SELECT * from table";
	ResultSet rs = null;
	try {
		rs = getQueryResultSet(query, new LinkedList<String>());
	} catch (SQLException ex) {
		Logger.getLogger(Reports.class.getName()).log(Level.SEVERE, null, ex);
	}
	createPDFReport(fileName, outFileName, hm, rs);
}
public void viewReport(ResultSet rs, Map<String, Object> parameters, String path) throws JRException {
	// Compilar o ficheiro JRXML que contém a definição do relatório, e que pode ser gerado pelo iReport
	JasperReport report = JasperCompileManager.compileReport(path);
	// Preencher o relatório com dados
	JasperPrint print = JasperFillManager.fillReport(report, parameters, new JRResultSetDataSource(rs));
	// Visualizar o relatório
	// Pode ser facilmente adaptado para em vez de abrir um visualizador, gerar um PDF, e imprimir o relatório
	JasperViewer.viewReport(print, false);
}
public static void createPDFReport(String fileName, String outFileName, HashMap hm, ResultSet rs) {
	try {
		JasperPrint print = JasperFillManager.fillReport(fileName, hm, new JRResultSetDataSource(rs));
		JRExporter exporter = new net.sf.jasperreports.engine.export.JRPdfExporter();
		exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, outFileName);
		exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
		exporter.exportReport();
		System.out.println("Created file: " + outFileName);
	} catch (JRException e) {
		e.printStackTrace();
		System.exit(1);
	} catch (Exception e) {
		e.printStackTrace();
		System.exit(1);
	}
}
public static ResultSet getQueryResultSet(String query, LinkedList<String> values) throws SQLException {
	Connection conn = DriverManager.getConnection(PATH, SQL_USER, SQL_PWD);
	PreparedStatement ps = conn.prepareStatement(query);
	if (values.size() != 0) {
		for (int i = 0; i < values.size(); i++) {
			ps.setString(i + 1, values.get(i));
		}
	}
	return ps.executeQuery();
}
}

com este bocado de código consigo converter o .jasper em pdf e creio que uma vez que importei todas as bibliotecas contidas na biblioteca de jasperreports-5.2.0 mais a de JTDS (MSSQL) consigo exportar para mais formatos.

Espero que seja útil para alguém que queira ver a vida facilitada em criar relatórios.

Edited by saca-rolhas
  • Vote 1

The worst part of censorship is ****

Share this post


Link to post
Share on other sites
Rui Carlos

Eu para exportar para PDF costumava usar a seguinte linha no final do método que apresentei anteriormente:

JasperExportManager.exportReportToPdfFile(print, "ficheiro_de_output.pdf");

(Não sei se ainda funciona nas versões mais recentes.)

Share this post


Link to post
Share on other sites
saca-rolhas

Eu para exportar para PDF costumava usar a seguinte linha no final do método que apresentei anteriormente:

JasperExportManager.exportReportToPdfFile(print, "ficheiro_de_output.pdf");

(Não sei se ainda funciona nas versões mais recentes.)

Os métodos que encontrei para gerar os ficheiros são todo do genero JR+ tipo do ficheiro+Exporter();

Como por exemplo: JRPdfExporter(); JRXlsExporter();...


The worst part of censorship is ****

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.