iReport usando Data source Hibernate
Hola que tal, ya casi no habia molestado aquí en el foro.
Pero tengo un par de problemas que me llevaron todo el dia de ayer y no pude resolverlo.
Estoy usando iReport para un par de reportes, resulta que los reportes maestros me funcionan correctamente
Pero los subreportes (reportes hijos, emebebidos en el reporte maestro) no se ven.
Todos los ejemplos que veo en intener hablan de una conexion jdbc, la diferencia es que yo estoy usando la conexion de hibernate.
Agradecería si alguien tiene algun documento, referencia, libro, howto, que me pueda ayudar a resolver mi problema.
Gracias por ahora.
- jamilMX's blog
- Inicie sesión o regístrese para enviar comentarios
Hola que tal. Tengo entendido
Hola que tal.
Tengo entendido que debes pasarle también a los subreportes hijos tu datasource Hibernate para que puedan hacer las consultas.
Hace unos meses hice un proyecto que hacia esto. Dame una horas para checar en mi viejo código y te paso un ejemplo.
Saludos.
Una duda. ¿Ya le pasaste a tu
Una duda. ¿Ya le pasaste a tu subreporte el parámetro REPORT_CONNECTION desde tu reporte maestro?
REPORT_CONNECTION
debe ser java.sql.Connection?
Hola... Y que sucedio con la solucion???
Hola Saben tengo el mismo problema.. los subreportes no me aparecen.. ya he intentado todo.. pero
los datos de los subreportes no se muestran... y es verdad la unica solucion que encuentro navegando
es con conexion sql... y pues resultaria muy extenso el realizar reportes maestro detalle... dado q mis tablas
tanto del maestro como del detalle se relacionan con algunas tablas.,,. por fa.. si hallan una solución
espero q la publiquen.. al igual si encuentro como lo haré..... GRACIAS
SOLUCIONADO..!!! IREPORT + HIBERNATE + REPORTE + SUBREPORTE
BUENO PARA AQUELLOS PROGRAMADORES QUE TUVIERON EL MISMO PROBLEMA
LA RESPUESTA:
1.- Lo primero que debe tomar en cuenta es la manera como se mapeo el maestro-detalle, Es importante que el maestro tenga
un objeto de tipo detalle que en su defecto pueden ser: un java.util.List o un java.util.Set...., esta lista es de vital importancia para que
se muestre el detalle en nuestro reporte maestro.
En mi caso la consulta HQL de mi reporte maestro es: fromTabContaCabeceraComprobantes la cual viene con un FIELD $F{detalles} de tipo List
que contiene los detalles
2.- En el Reporte Maestro una ves que se coloque el subreporte a la banda detail, se debe dar click sobre el y en las propiedades buscar la opción DATA SOURCE EXPRESSION y en ella digitamos lo siguiente: new JRBeanCollectionDataSource($F{detalles})
donde $F{detalles} es el FIELD de tipo List que contiene todos los detalles y con el cual se llenará el subreporte...
No olviden que el subreporte debe tener la consulta respectiva a la tabla detalle en este caso
la consulta HQL de mi subreporte es: from TabContaDetalleComprobantes
3.- En la código XML del Maestro se debe importar las siguientes librerías:
Las cuales deben estar después de los tags
si es que los tienen
4.- Listo con ello si miran el Preview podrán ver su reporte maestro detalle....
5.- LES ADJUNTO ALGUNAS PARTES ÚTILES DEL CÓDIGO DE UN REPORTE MAESTRO DETALLE QUE HICE
NO PONGO TODO PORQUE ES EXTENSO LO QUE MUESTRA ESTE REPORTE...
las clases y tablas usadas son:
EL MAESTRO ES : TabContaCabeceraComprobantes --> tab_conta_cabecera_comporbantes
EL DETALLE ES: TabContaDetalleComprobantes --> tab_conta_detalle_comporbantes
MAESTRO
DETALLE
El detalle es un reporte común, de la tabla que este siendo usada como detalle, por ello se debe crear el reporte
de esa tabla y en el código anterior del reporte maestro se le debe adjuntar el compilado, si revisan podrán ver que se esta utilizando subRepoComCont.jasper
La llamada desde un JSP es otra historia si esq desean les puedo pasar algo de código danyk_lego@hotmail.com
SALUDOS DESDE ECUADOR...!!!
llamadas de subreportes
hola tengan buen dia, yo soy un programador principiante en java server faces, utilizo hibernate y primefaces y estoy desarrollando un sistema en dicha tecnologia, es la hora de hacer reportes y utilizo ireport 4.6.0 he seguido todos los pasos en este post y el reporte se genera de maravilla pero en ireport, cuando lo mando a llamar desde mi aplicacion me da un error:
Grave: Se ha recibido 'net.sf.jasperreports.engine.fill.JRExpressionEvalException' al invocar la escucha de acción '#{reporteGrupos.PDF1}' para el componente 'submit11'
Grave: net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression :
Source text : new JRBeanCollectionDataSource($F{lineas})
me podrian ayudar a resolverlo por favor, toda la informacion que se me proporcione sera de mucha utilidad
Llamada a reporte con subreporte
QUE TAL!!... SALUDOS AMIGO ALTERNATIVO
Pues segun miro el error se debe a que el reporte no encuentra a el subreporte,
me gustaria mirar el codigo java, que usas para llamar
al reporte para poder ayudarte.....
Dado que existen algunas alternativas de hacer el llamado
que
Si usas Primefaces incluso pudes usar el tag
te ayuda a crear un pdf de un dataTable de manera automatica, de echo se puede formatear este pdf poniendole encabezado y todo lo que
lleva un reporte.....
Bueno espero a que publiques el codigo de la llamada al reporte para revizarlo...
Codigo java para llamada de reportes
muchas gracias por responder lego programer (por tu ayuda), en mi mapeo tengo dos tablas (clases segun hibernate) que estan relacionadas, la clase padre se llama Grupo y la clase hija se llama Linea, grupo contiene una variable privada del tipo set con la cual se conectan e aqui el codigo:
import java.util.HashSet;
import java.util.Set;
/**
* Grupo generated by hbm2java
*/
public class Grupo implements java.io.Serializable {
private String idgrupo;
private String nombreg;
private Set activoses = new HashSet(0);
private Set lineas = new HashSet(0);
public Grupo() {
}
public Grupo(String idgrupo, String nombreg) {
this.idgrupo = idgrupo;
this.nombreg = nombreg;
}
public Grupo(String idgrupo, String nombreg, Set activoses, Set lineas) {
this.idgrupo = idgrupo;
this.nombreg = nombreg;
this.activoses = activoses;
this.lineas = lineas;
}
public String getIdgrupo() {
return this.idgrupo;
}
public void setIdgrupo(String idgrupo) {
this.idgrupo = idgrupo;
}
public String getNombreg() {
return this.nombreg;
}
public void setNombreg(String nombreg) {
this.nombreg = nombreg;
}
public Set getActivoses() {
return this.activoses;
}
public void setActivoses(Set activoses) {
this.activoses = activoses;
}
public Set getLineas() {
return this.lineas;
}
public void setLineas(Set lineas) {
this.lineas = lineas;
}
}
entonces para mi subreporte tengo esa variable lineas con la cual se conecta con el reporte maestro, es justamente lo que tu explicabas anteriortemente, con el siguiente codigo genero mis reportes en los tres formatos que necesito:
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.oasis.JROdtExporter;
import net.sf.jasperreports.engine.export.ooxml.JRDocxExporter;
import net.sf.jasperreports.engine.export.ooxml.JRDocxExporterParameter;
import net.sf.jasperreports.engine.export.ooxml.JRPptxExporter;
import net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter;
import consultas.consultas;
import DAO.Grupo;
/**
*
* @author ramki
*/
@ManagedBean
@SessionScoped
public class ReporteGrupos {
private List listOfGrupo;
consultas grupo= new consultas();
JasperPrint jasperPrint;
public void init1() throws JRException{
listOfGrupo=grupo.getGrupo();
JRBeanCollectionDataSource beanCollectionDataSource=new JRBeanCollectionDataSource(listOfGrupo);
jasperPrint=JasperFillManager.fillReport("C:\\Users\\PROGRAMACION\\Documents\\NetBeansProjects\\distadep\\web\\reportes\\LineasXGrupos.jasper", new HashMap(),beanCollectionDataSource);
}
public void PDF1(ActionEvent actionEvent) throws JRException, IOException{
init1();
HttpServletResponse httpServletResponse=(HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
httpServletResponse.addHeader("Content-disposition", "attachment; filename=LineasGrupos.pdf");
ServletOutputStream servletOutputStream=httpServletResponse.getOutputStream();
JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
FacesContext.getCurrentInstance().responseComplete();
}
public void DOCX1(ActionEvent actionEvent) throws JRException, IOException{
init1();
HttpServletResponse httpServletResponse=(HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
httpServletResponse.addHeader("Content-disposition", "attachment; filename=LineasGrupos.docx");
ServletOutputStream servletOutputStream=httpServletResponse.getOutputStream();
JRDocxExporter docxExporter=new JRDocxExporter();
docxExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
docxExporter.setParameter(JRExporterParameter.OUTPUT_STREAM, servletOutputStream);
docxExporter.setParameter(JRDocxExporterParameter.OUTPUT_STREAM, servletOutputStream);
docxExporter.exportReport();
}
public void XLSX1(ActionEvent actionEvent) throws JRException, IOException{
init1();
HttpServletResponse httpServletResponse=(HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
httpServletResponse.addHeader("Content-disposition", "attachment; filename=LineasGrupos.xlsx");
ServletOutputStream servletOutputStream=httpServletResponse.getOutputStream();
JRXlsxExporter docxExporter=new JRXlsxExporter();
docxExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
docxExporter.setParameter(JRExporterParameter.OUTPUT_STREAM, servletOutputStream);
docxExporter.exportReport();
}
}
y el siguiente codigo son las listas que mando a llamar:
public List getGrupo() {
if (!this.sesion.isOpen()) {
this.sesion = HibernateUtil.getSessionFactory().openSession();
}
List grupoList = null;
try {
org.hibernate.Transaction tx = sesion.beginTransaction();
Query q = sesion.createQuery("from Grupo");
grupoList = (List) q.list();
tx.commit();
sesion.close();
} catch (Exception e) {
e.printStackTrace();
sesion.close();
}
return grupoList;
}
entonces en los reportes solo uso las sentencias hql:
from Grupo (Reporte maestro) y from Linea (subreporte)
ahora bien glassfish me dice que tengo el error aca: new JRBeanCollectionDataSource($F{lineas}), en el comentario anterior esta especificado.
se agradece tu ayuda
Mis observaciones y la forma en que llamo al reporte
QUE TAL AMIGO!!... ME DISCULPAS HE TENIDO ALGO DE TRABAJO ACUMULADO Y NO ME HE DADO TIEMPO DE RESPONDER PRONTO....
MIRA TENGO ALGUNAS OBSERVACIONES A SI RÁPIDAS PARA QUE COMPRUEBES:
1.- El código que utilizas es diferente a lo que hago yo... pero bueno miro que estas utilizando algunas cosas extras, mira mis sospechas
del porque se caen van en esta linea que tu tienes
En mi búsqueda de solución de problemas mire que en este caso de reportes-subreportes es necesario agregarle un parametro false mas a este método, esto a efectos de que se pretende hacer un maestro-detalle
que también use.
Como puedes ver yo uso una clase extra que la llamo ReporteUtil, que contiene variables estaticas las cuales puedo setear y usar desde el servlet
que uso para llamar a mi reporte pdf
En si este
viene de:
2.- Mira otra observación que tengo es la forma en la que llamas al archivo .jaspert, bueno esta bien pero debes ser un poco mas cuidadoso y ordenado con esto:
Mira el metodo que yo uso es algo como este:
Te explico lo que voy haciendo
Todos mis archivos .jasper los puse en una carpeta dentro del proyecto que esta bajo /WEB-INF/reportes/contabilidad/
Esta parte de mi método
Es comprobar que este directorio realmente existe he incluso forma parte de los parametros que envio para la generacion dereportes
como puedes ver con esto me aseguro de que si el archivo no existe salte alguna excepcion explicando que el .jasper no existe, esto es
opcional pero a mi me a ayudado de mucho
Luego en el método puedes ver que sete todos los parámetros que vaya a usar en el reporte los cuales ya declare en el .jasper
Con estos parametros llenos lo unico que hago es llamar a mi clase ReporteUtil y pasarle los parametros a una variable estatica
de esta manera puedo usar el mismo metodo para cualquier reporte que vaya a realizar sin importarme la cantidad de parametros, ni el nombre
de los archivos . jaspert, aqui puedes ver que seteo el parametro false
Entonces mi método equivalente a los métodos que tu tienes quedaría de esta manera
Espero que este codigo sea de gran ayuda para ti y para los demas programadores que tienen el mismo problema....
SALUDOS DESDE ECUADOR!!....
forma de llamar al reporte
diculpa lego programer pero no habia podido ver el sitio porque estoy desarrollando otras paginas web en mi trabajo pero se agradece tu ayuda amigo!!! vere como adecuar mi codigo y seguir tus recomendaciones para generar mis subreportes.... muchas gracias otra vez