Soy nueva en esto de la creación de reportes con ireports, yo genero un reporte con un subreporte y cuando lo ejecuto se repiten los datos del subreport hasta llenarme 152 hojas cuando solo es necesaria una y me pasa lo mismo cuando hago la llamada desde netbeans.
No se como solucionarlo, adjunto el código por si facilita las cosas:
Código:
import java.util.*;
import java.sql.*;
import java.sql.Date;
import java.awt.event.*;
import java.net.URL;
import java.net.URLClassLoader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.lang.String;
/*Librerías necesarias para Jasper Reports*/
import org.apache.commons.beanutils.*;
import org.apache.commons.collections.*;
import org.apache.commons.digester.*;
import org.apache.commons.logging.*;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.view.*;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.engine.JRException;
public class Report1 extends Thread {
cConnection conexion;
public void run () {
try
{
String urlMaestro = "C:/Archivos de programa/JasperSoft/iReport-3.0.0/Reporte modelo3005_version4.jasper";
String urlSubreporte = "C:/Archivos de programa/JasperSoft/iReport-3.0.0/Reporte modelo3005_version4_subreport0.jasper";
//URL urlMaestro = this.getClass().getResource("C:/Archivos de programa/JasperSoft/iReport-3.0.0/Reporte modelo3005_version4.jasper");
//URL urlSubreporte = this.getClass().getResource("C:/Archivos de programa/JasperSoft/iReport-3.0.0/Reporte modelo3005_version4_subreport0.jasper");
if (urlMaestro == null) {
System.out.println("No encuentro el archivo del reporte maestro.");
System.exit(2);
}
if (urlSubreporte == null) {
System.out.println("No encuentro el archivo del subreporte.");
System.exit(2);
}
JasperReport masterReport = null;
try {
masterReport = (JasperReport) JRLoader.loadObject(urlMaestro);
} catch (JRException e) {
System.out.println("Error cargando el reporte maestro: " + e.getMessage());
System.exit(3);
}
JasperReport subReport = null;
try {
subReport = (JasperReport) JRLoader.loadObject(urlSubreporte);
} catch (JRException e) {
System.out.println("Error cargando el subreporte: " + e.getMessage());
System.exit(3);
}
//Ruta del archivo jasper
// String fileName = "C:/Archivos de programa/JasperSoft/iReport-3.0.0/Reporte modelo3005_version4.jasper";
//Obtener una conexion a la base de datos
conexion = new cConnection();
Connection con = conexion.mkConection();
ResultSet rs = null;
Statement stm = con.createStatement();
String strSQL = "SELECT Budget.Project,Budget.Date,Company.IdentityCard,Company.Name,Expenditures.Budget," +
"Expenditures.Hito,Expenditures.Description,Expenditures.UnitCost,Expenditures.Units,Expenditures.Quota," +
"Project.Code,Project.Acronym,Project.Title,Project.Company FROM Budget,Company,Expenditures,Project " +
"WHERE Budget.Project=\'ABCDEFG\' AND Budget.Date=\'2008-01-01\';";
//Ejecuta la consulta SQL
rs = stm.executeQuery(strSQL);
rs.next();
String budgetProject = rs.getString("Project");
java.sql.Date fecha = new java.sql.Date(0);
fecha = rs.getDate("Date");
String cif = rs.getString("IdentityCard");
String name = rs.getString("Name");
int budgetexpenditures = rs.getInt("Budget");
int hito = rs.getInt("Hito");
String descripcion = rs.getString("Description");
double unitcost = rs.getDouble("UnitCost");
double units = rs.getDouble("Units");
double quota = rs.getDouble("Quota");
String codigo = rs.getString("Code");
String acronimo = rs.getString("Acronym");
String titulo = rs.getString("Title");
int comp = rs.getInt("Company");
System.out.println("Titulo: "+titulo+" Comp: "+comp);
//Trabajar con el result set…
strSQL = "SELECT FullName FROM Company WHERE EN="+comp+";";
rs = stm.executeQuery(strSQL);
rs.next();
String company = rs.getString("FullName");
//Cerrar todo
rs.close();
stm.close();
//Pasamos parametros al reporte
Map parameters=new HashMap();
parameters.put("Project",budgetProject);
parameters.put("Date",fecha);
parameters.put("IdentityCard",cif);
parameters.put("Name",name);
parameters.put("Budget",budgetexpenditures);
parameters.put("Hito",hito);
parameters.put("Descripction",descripcion);
parameters.put("UnitCost",unitcost);
parameters.put("Units",units);
parameters.put("Quota",quota);
parameters.put("FullName",company);
parameters.put("Code",codigo);
parameters.put("Acronym",acronimo);
parameters.put("Title",titulo);
parameters.put("Company",comp);
parameters.put("SUBREPORT",subReport);
parameters.put("CODE",codigo);
parameters.put("DATE",fecha);
try{
//Preparación del reporte (reporte diseñado con ireport)
JasperPrint jasperPrint=JasperFillManager.fillReport(masterReport,parameters,con);
//Se lanza el viewer de jasper, no termina la aplicación al salir
JasperExportManager.exportReportToPdfFile(jasperPrint, "H:/reportes/Reportes en pdf/Reporte.pdf");
//Se lanza el Viewer de Jasper, no termina aplicación al salir
JasperViewer jviewer = new JasperViewer(jasperPrint,false);
jviewer.setVisible(true);
//jviewer.show();
}catch (JRException e) {
System.out.println("Error llenando el reporte maestro: " + e.getMessage());
try {
con.close();
} catch (SQLException e1) {
}
System.exit(5);
}
}catch(Exception j)
{
System.out.println("Mensaje de Error:"+j.getMessage());
}
finally{
conexion.closeConnection();
}
}
public static void main(String[] args){
Report1 thread_exp = new Report1();
thread_exp.run();
}
}
class cConnection {
/*Atributos*/
private String url = "";
private String usr = "";
private String pswd = "";
private Connection con;
/*Constructor, carga puente JDBC-ODBC*/
public cConnection() {
loadDriver();
}
/**
* Carga el driver de la conexión a la base de datos
*/
private void loadDriver() {
try {
//Instancía de una nueva clase para el puente
//sun.jdbc.odbc.JdbcOdbcDriver
//El puente sirve entre la aplicación y el driver.
Class.forName( "" );
} catch(ClassNotFoundException e) {
System.out.println("Error al crear el puente JDBC-ODBC");
}
}
/**
* Obtiene una conexión con el nombre del driver especificado
* @param driverName Nombre del driver de la base de datos
* @return
*/
public Connection mkConection() {
//url = url + driver;
System.out.println("Estableciendo conexión con " + url);
try {
//Obtiene la conexión
con = DriverManager.getConnection( url,usr,pswd);
} catch(SQLException sqle) {
System.out.println("No se pudo establecer la conexión");
return null;
}
System.out.println("Conexión establecida con: " + url);
//Regresa la conexión
return con;
}
/* Cerrar la conexión.
*/
public boolean closeConnection() {
try {
con.close();
} catch(SQLException sqle) {
System.out.println("No se cerro la conexión");
return false;
}
System.out.println("Conexión cerrada con éxito ");
return true;
}
}
//class cConnection
muchas gracias