Learn how easy it is to sync an existing GitHub or Google Code repo to a SourceForge project! See Demo

Close

Reporte Personalizado "ISubfamilia2"

2013-01-30
2013-04-03
  • Mario Perdomo
    Mario Perdomo
    2013-01-30

    Hola, buenas tardes, antes que nada agradezco la gran labor que realizar, es impresionante como nos facilitan la vida. Estoy recién iniciando en este mundo de Openxava y me ha encantado. Ahora estoy entrando a la etapa de la creación de los reportes para nuestro modelo de negocios, y aunque estoy guiándome de la Wiki, no se que carajo es: "ISubfamilia2" ¿es una clase que no he importado o que tengo que crear? Perdón por mi ignorancia :/

    import java.util.*;

    import net.sf.jasperreports.engine.;
    import net.sf.jasperreports.engine.data.
    ;

    import org.openxava.actions.;
    import org.openxava.model.
    ;
    import org.openxava.test.model.;
    import org.openxava.util.
    ;
    import org.openxava.validators.*;

    /
    * Informe de productos de la subfamilia seleccionada.



    * Usa JasperReports.


    * @author Javier Paniza
    */
    public class InformeProductosDeFamiliaAction extends JasperReportBaseAction { // 1

    private ISubfamilia2 subfamilia;
    
    public Map getParameters() throws Exception  {                             // 2
        Messages errores =
            MapFacade.validate("FiltroPorSubfamilia", getView().getValues());
        if (errores.contains()) throw new ValidationException(errores);        // 3
        Map parametros = new HashMap();
        parametros.put("familia", getSubfamilia().getFamilia().getDescripcion());
        parametros.put("subfamilia", getSubfamilia().getDescripcion());
        return parametros;
    }
    
    protected JRDataSource getDataSource() throws Exception {                  // 4
        return new JRBeanCollectionDataSource(
            getSubfamilia().getProductosValues());
    }
    
    protected String getJRXML() {                                              // 5
        return "Productos.jrxml"; // Para leer del classpath
        //return "/home/javi/Products.jrxml"; // Para leer del sistema de ficheros
    }
    
    private ISubfamilia2 getSubfamilia() throws Exception {
        if (subfamilia == null) {
            int codigoSubfamilia = getView().getValueInt("subfamilia.codigo");
            // Usando Hibernate, lo más típico
            subfamilia = (ISubfamilia2)
                 XHibernate.getSession().get(
                    Subfamilia2.class, new Integer(codigoSubfamilia));
            // Usando EJB
            // subfamilia = Subfamilia2Util.getHome().
            //    findByPrimaryKey(new Subfamilia2Key(codigoSubfamilia));
        }
        return subfamilia;
    }
    

    }

    Muchas Gracias ;D

     
  • Javier Paniza
    Javier Paniza
    2013-02-01

    Hola Mario,

    ISubfamily2 es una clase del ejemplo, que se utiliza como base para sacar los datos. Tu debes usar las clases de tu propio modelo y sacar de ellas los datos que quieras sacar en el informe.


    Ayuda a otros en este foro como yo te ayudo a ti.
    Antes de poner una pregunta busca en este mismo foro la respuesta
    y lee la documentación de OpenXava en openxava.org.

     
  • Hola Javier, he diseñado un jrxml usando jasperreport y estoy tratando de modificar este action como Ud indica. Me está escamando una cosa, tengo que hacer una interfaz de un pojo? lo digo por lo de ISubFamilia.

    Podrias mostrar como esta clase?

    Actualmente tengo esta clase, que le falta cosas por pulir:

    Donde ViviendasConDeudas es un pojo hijo de otras dos entidades, (adjunto las 3 clases).

    Si el informe que tengo que sacar involucra a las 3 entidades, significa que aqui en esta clase tengo que usar hibernate para traerme esta información? entonces para que tengo que añadir el fichero jrxml? Lo digo pq para generar ese fichero he tenido que hacer una consulta sql que involucra a las 3 entidades.

    Otra cosa es como inicializar getDataSource, el objeto JRBeanCollecionDataSource espera una coleccion de objetos, por que? si yo necesito hacer un informe de un solo objeto! siempre podre crear una colección con un solo objeto, claro...

    Como pueden ver estoy un poco liado, podrian ayudarme? gracias

    public class InformeViviendasConDeudas extends JasperReportBaseAction {

    private ViviendasConDeudas viviendas;
    
    @Override
    protected JRDataSource getDataSource() throws Exception {
        // TODO Auto-generated method stub
        return new JRBeanCollectionDataSource(getViviendas());
    }
    
    @Override
    protected String getJRXML() throws Exception {
                return "/Users/alonso/JaspersoftWorkspace/MyReports/TemplateBlank_A4.jrxml";
    }
    
    @Override
    protected Map getParameters() throws Exception {
        // preguntar que es FiltroPorSubfamilia...
    
        Messages errores = MapFacade.validate("FiltroPorSubfamilia", getView().getValues());
        if (errores.contains())
            throw new ValidationException(errores); // 3
    
        Map<String, Object> parametros = new HashMap<String, Object>();
        parametros.put("descripcion", getViviendas().getDescripcion());
        parametros.put("montante", getViviendas().getMontante());
        parametros.put("letra", getViviendas().getLetra());
        parametros.put("fecha_crea", getViviendas().getFechaCertificacion());
        parametros.put("tipo_vivienda", getViviendas().getTipo());
    
        return parametros;
    }
    
    /*
     * Tiene que ir a bbdd para sacar los datos de la vivienda con deudas de la cual quiero 
     * hacer el informe para el abogado
     */
    public ViviendasConDeudas getViviendas() throws Exception{
    
        Long idDeuda = null;
        if (viviendas == null){
            idDeuda = (Long) getView().getValue("idDeuda");
            if (idDeuda!=null){
                viviendas = (ViviendasConDeudas) XHibernate.getSession().get(ViviendasConDeudas.class, idDeuda);
            }
        }
    
        return viviendas;
    }
    

    }

     
    Attachments
  • Javier Paniza
    Javier Paniza
    2013-02-22

    Hola Alonso,

    tengo que hacer una interfaz de un pojo? lo digo por lo de ISubFamilia.

    No, ni mucho menos. Esa interfaz tiene una pequeña historia. El ejemplo del wiki está sacado de OpenXavaTest y con OpenXavaTest se prueba OpenXava con POJOS + JPA, pero OpenXava también se puede usar como un generador de código a partir de espicificaciones XML y OpenXavaTest también se utiliza para probar esta funcionalidad. El generador de código de OpenXava genera los POJOs e interfaces para los POJOs, esto era útil porque hasta OX3 también se generaba código EJB2 con EntityBeans CMP, así al generar interfaces también para la versión EJB, podiamos escribir acciones que fueran iguales para la versión EJB y la versión POJO+Hibernate. Pero claro si usas OpenXava con entidades JPA y tienes que escribir tu el código, escribir una interfaz para cada entidad es derrochar tiempo inutilmente.

    significa que aqui en esta clase tengo que usar hibernate para traerme esta información?

    Sí. Aunque muchas veces la información se puede obtener simplemente accediendo las colecciones y referencias de una entidad raiz.

    entonces para que tengo que añadir el fichero jrxml?

    No entiendo. Ese fichero tiene el diseño de tu informe. ¿Cómo vas a prescindir de él?

    Lo digo pq para generar ese fichero he tenido que hacer una consulta sql que > involucra a las 3 entidades.

    Puedes optar porque el mismo informe obtenga los datos por SQL y no enviarle nada desde OX.

    el objeto JRBeanCollecionDataSource espera una coleccion de objetos, por que?

    Esa colección de objeto contiene las líneas que van a aparecer en el informe. Si es un informe que no tiene líneas puedes devolver una JREmptyDataSource y obtener los datos directamente con SQL del informe o de los parametros.

    He visto que has puesto el código, pero ¿qué es lo que ocurre? ¿funciona? ¿produce alguna excepción?


    Ayuda a otros en este foro como yo te ayudo a ti.
    Antes de poner una pregunta busca en este mismo foro la respuesta
    y lee la documentación de OpenXava en openxava.org.

     
  • Hola Javier, al final me pude poner con este informe personalizado. Te comento, he diseñado un informe personalizado usando el jasperReport y he seguido las instrucciones de http://openxava.wikispaces.com/controllers_es#Cap%C3%ADtulo%207:%20Controladores-Generar%20un%20informe%20propio%20con%20JasperReports

    para ello he puesto en el fichero controladores.xml el siguiente contenido:

    <controlador nombre="InformeCertificadoDeuda"> <accion nombre="getViviendas" clase="com.openxava.gestion.acciones.InformeViviendasConDeudas"> <usa-objeto nombre="xava_view"/> </accion> </controlador>

    el fichero aplicacion.xml es como sigue:

    <aplicacion nombre="Gestion">

    <modulo nombre="ViviendasConDeudas">
        <modelo nombre="ViviendasConDeudas"/>
        <controlador nombre="Typical"/>
        <controlador nombre="InformeCertificadoDeuda"/>
    </modulo>
    <!--
    Un módulo por defecto se asume para cada
    controlador en <modulo-defecto/> 
    -->
    <modulo-defecto>          
        <controlador nombre="Typical"/>
        <modo-controlador>DetailOnly</modo-controlador>     
    </modulo-defecto>
    

    </aplicacion>

    El controlador tiene este código:

    public class InformeViviendasConDeudas extends JasperReportBaseAction {

    private ViviendasConDeudas viviendas;
    
    @Override
    protected JRDataSource getDataSource() throws Exception {
    
        Collection <ViviendasConDeudas> colecctionViviendas= new ArrayList<ViviendasConDeudas>();
        colecctionViviendas.add(getViviendas());
    
        return new JRBeanCollectionDataSource(colecctionViviendas);
    }
    /***
     * OJITO con esto que tendras que quitar la referencia dura al fichero
     */
    @Override
    protected String getJRXML() throws Exception {
        // return "Productos.jrxml"; // Para leer del classpath
        // /Users/alonso/JaspersoftWorkspace/MyReports/TemplateBlank_A4.jrxml
        return "/Users/alonso/JaspersoftWorkspace/MyReports/templateCertificadoDeuda.jrxml";
    }
    
    @Override
    protected Map getParameters() throws Exception {
    
        Messages errores = MapFacade.validate("ViviendasConDeudas", getView().getValues());
        if (errores.contains()){
            System.out.println("HA HABIDO ERRORES AL RECOJER EL PARAMETRO PARA GENERAR EL PDF PERSONALIZADO...");
            throw new ValidationException(errores); // 3
        }
        Map<String, Object> parametros = new HashMap<String, Object>();
        parametros.put("IDDEUDA", getViviendas().getIdDeuda());
        return parametros;
    }
    
    /*
     * Tiene que ir a bbdd para sacar los datos de la vivienda con deudas de la cual quiero 
     * hacer el informe para el abogado, tendras que hacer una sentencia hql, me parece a mi
     * Si es asi, para que cojones necesito cargar con una plantilla hecha con jasper?
     */
    public ViviendasConDeudas getViviendas() throws Exception{
    
        Long idDeuda = null;
        if (viviendas == null){
            idDeuda = (Long) getView().getValue("idDeuda");
            if (idDeuda!=null){
                viviendas = (ViviendasConDeudas) XHibernate.getSession().get(ViviendasConDeudas.class, idDeuda);
            }
        }
    
        return viviendas;
    }
    

    }

    El caso es a la hora de desplegar no hay problema, pero cuando voy a la entidad ViviendasConDeudas deberia salir el icono del informe personalizado y no me sale, que he mal? podrias ayudarme?

    Gracias por todo

     
  • cagonto, ya se lo que ocurre, no habia puesto en el fichero controladores.xml la etiqueta <controladores>. Ahora me sale el botoncito con el nombre de la accion a ejecutar. No me funciona, pero eso es otra cosa, pq creo que involucra la version actual de jasperreport.