Author Topic: Error generando un report en java  (Read 5672 times)

laura_morgar

  • Full Member
  • ***
  • Posts: 123
  • Karma: 0
    • View Profile
Error generando un report en java
« on: Julio 02, 2008, 05:15:27 pm »
Hola:

Estoy trabajando en la creación de reports con el programa ireport y hago la llamada desde el netbeans en java, pero en el momento de cargar los datos de la base de datos en mysql se queda colgado un rato y luego da el siguiente error en la ejecución:
Code: [Select]
02-jul-2008 10:38:55 net.sf.jasperreports.engine.fill.JRFillSubreport prepare
GRAVE: Fill 24347419: exception
java.lang.OutOfMemoryError: Java heap space
        at java.text.RuleBasedBreakIterator.readTables(RuleBasedBreakIterator.java:410)
        at java.text.RuleBasedBreakIterator.<init>(RuleBasedBreakIterator.java:308)
        at java.text.BreakIterator.createBreakInstance(BreakIterator.java:584)
        at java.text.BreakIterator.getBreakInstance(BreakIterator.java:541)
        at java.text.BreakIterator.getLineInstance(BreakIterator.java:468)
        at java.text.BreakIterator.getLineInstance(BreakIterator.java:455)
        at java.awt.font.LineBreakMeasurer.<init>(LineBreakMeasurer.java:259)
        at net.sf.jasperreports.engine.fill.TextMeasurer.renderParagraph(TextMeasurer.java:330)
        at net.sf.jasperreports.engine.fill.TextMeasurer.measure(TextMeasurer.java:291)
        at net.sf.jasperreports.engine.fill.JRFillTextElement.chopTextElement(JRFillTextElement.java:987)
        at net.sf.jasperreports.engine.fill.JRFillTextField.prepare(JRFillTextField.java:542)
        at net.sf.jasperreports.engine.fill.JRFillElementContainer.prepareElements(JRFillElementContainer.java:344)
        at net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:346)
        at net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:305)
        at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:1382)
        at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:692)
        at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportContent(JRVerticalFiller.java:275)
Mensaje de Error:java.lang.OutOfMemoryError: Java heap space
        at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:117)
Conexión cerrada con éxito
        at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:879)
        at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:782)
        at net.sf.jasperreports.engine.fill.JRFillSubreport.fillSubreport(JRFillSubreport.java:532)
        at net.sf.jasperreports.engine.fill.JRSubreportRunnable.run(JRSubreportRunnable.java:63)
        at net.sf.jasperreports.engine.fill.JRThreadSubreportRunner.run(JRThreadSubreportRunner.java:209)
        at java.lang.Thread.run(Thread.java:619)

Por si les aclara algo les adjunto el código:

Code: [Select]
//imports
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,Company.IdentityCard,Company.FullName,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");
            String cif = rs.getString("IdentityCard");
            String fullname = rs.getString("FullName");
            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("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","ABCDEFG");
           
            try{
 //Preparación del reporte (reporte diseñado con ireport)
           [b]JasperPrint jasperPrint=JasperFillManager.fillReport(masterReport,parameters,con);[/b]
            //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 {
            //hace la conexión a la bbdd
      }

     //Obtiene una conexión con el nombre del driver especificado
    public Connection mkConection() {
        ....
    }

  // Cerrar la conexión.
    public boolean closeConnection() {
       ....
    }
   
}//class cConnection


La línea en negrita es donde salta el error

Muchas gracias

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5468
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Error generando un report en java
« Reply #1 on: Julio 02, 2008, 07:05:54 pm »
Hola:

Es un problema de que no hay memoria bastante. Puede deberse a dos cosas:

- Si un informe muy grande con muchos datos. Para solucionarlo debes arrancar java con la opción -Xmx128M (para 128 Megas) o lo que necesites. En netbeans seguramente hay algún sitio para configurar esto.

- Algún problema en tu código, por ejemplo, llamadas de métodos a si mismos que no acaban nunca, llenar listas de datos sin eliminar nunca ninguno, etc.

Se buena.

 

ey