Menu

Errores trabajando con marcos

JOSE ELIAS
2014-08-07
2014-08-25
  • JOSE ELIAS

    JOSE ELIAS - 2014-08-07

    Hola, a ver si le sucede a alguien más esto..
    1.-
    Tengo un referencia marcada con @NoFrame, y al cargar la entidad de inicio se ve bien, pero cuando se carga la referencia, pone el marco????

    2.-
    Tengo un grupo con propiedades de sólo lectura y no puedo cerrarlo como los demás, tengo que pulsar F5 para verlo cerrado o abierto después de pulsar la flechita. Con el resto de marcos no sucede.

    3.-
    No pueden existir dos grupos que se llamen igual, los confunde la interfaz de usuario y pinta lo de uno de ellos en todos los grupos que se llamen igual, aunque las propiedades definidas en la vista sean otras

     

    Last edit: JOSE ELIAS 2014-08-07
  • Javier Paniza

    Javier Paniza - 2014-08-11

    Hola José,

    ¿Qué versión de OpenXava o XavaPro estás usando?

    He probado los puntos 1 y 2 y a mi no me falla, ¿podrías poner el código?

    No pueden existir dos grupos que se llamen igual

    Normal, ¿no? Si en Java intentas poner dos propiedades con el mismo nombre te da error de compilación. Yo lo veo normal. El nombre del grupo lo identifica, no puedes repetirlo. Permitir nombre de grupo repetidos sería dificil de implementar en OpenXava, pero también sería confuso para el programador, por ejemplo si quisieras ocultar unos de los dos grupos que se llaman igual, ¿qué nombre tendrías que poner en el setHidden()? Permitir nombres duplicados no tiene sentido.

    Si quieres que de cara al usuario tengan la misma etiqueta modifica los archivos i18n.


    Ayuda a otros en este foro como yo te ayudo a ti.

     
  • JOSE ELIAS

    JOSE ELIAS - 2014-08-11

    Estoy usando XavaPro 5.0.

    Claro el 3º punto, OK. Respecto de los otros dos: En esta misma entidad pasa las dos cosas:

    Mira la imagen, activo tiene marco y mira su declaración:

    package com.openxava.oxsigo.modelo;

    import java.io.;
    import java.math.
    ;
    import java.util.*;

    import javax.persistence.*;

    import org.hibernate.validator.;
    import org.openxava.annotations.
    ;
    import org.openxava.jpa.;
    import org.openxava.model.
    ;

    import com.openxava.oxsigo.acciones.;
    import com.openxava.oxsigo.calculadores.
    ;
    import com.openxava.oxsigo.validadores.*;

    /*
    * @fecha 07082014
    * @author José Elías
    * @description Registro de facturas recibidas.
    /

    @Entity
    @Views({
    @View(members="Datos de Registro[creado, creadoPor, modificado, modificadoPor];"
    + "oid, numeroFr, contabilizacionPrevia, fichero;"
    + "Factura{ fechaFactura, fechaVencimiento;"
    + "empresa, seccion;"
    + "activo, sitio;"
    + "Proveedor[proveedor, conceptoAsociado];"
    + "DetalleFactura[tipoGasto, tipoIva; conceptos]}"
    + "DocumentoContable{fechaContable, fechaDocumento;"
    + "numero, clase; textoCabecera;"
    + "Detalle[saldoPosiciones; posiciones]}"),
    @View(name="ConSitio", members="oid, numeroFr, contabilizacionPrevia, fichero;"
    + "Factura{ fechaFactura, fechaVencimiento;"
    + "empresa, seccion;"
    + "sitio;"
    + "Proveedor[proveedor, conceptoAsociado];"
    + "DetalleFactura[tipoGasto, tipoIva; conceptos]}"
    + "DocumentoContable{fechaContable, fechaDocumento;"
    + "numero, clase; textoCabecera;"
    + "Detalle[saldoPosiciones; posiciones]}"),
    @View(name="ConActivo", members="oid, numeroFr, contabilizacionPrevia, fichero;"
    + "Factura{ fechaFactura, fechaVencimiento;"
    + "empresa, seccion;"
    + "activo;"
    + "Proveedor[proveedor, conceptoAsociado];"
    + "DetalleFactura[tipoGasto, tipoIva; conceptos]}"
    + "DocumentoContable{fechaContable, fechaDocumento;"
    + "numero, clase; textoCabecera;"
    + "Detalle[saldoPosiciones; posiciones]}"),
    @View(name="SinSitioyActivo", members="oid, numeroFr, contabilizacionPrevia, fichero;"
    + "Factura{ fechaFactura, fechaVencimiento;"
    + "empresa, seccion;"
    + "Proveedor[proveedor, conceptoAsociado];"
    + "DetalleFactura[tipoGasto, tipoIva; conceptos]}"
    + "DocumentoContable{fechaContable, fechaDocumento;"
    + "numero, clase; textoCabecera;"
    + "Detalle[saldoPosiciones; posiciones]}")
    })
    @Tab(properties="oid, fechaDocumento, fechaContable, empresa.abreviatura, textoCabecera, contabilizacionPrevia")
    @EntityValidator( value=ValidadorDocumentoContable.class, // Clase con la lógica de validación
    properties={@PropertyValue(name="empresa"),
    @PropertyValue(name="fechaContable"),
    @PropertyValue(name="saldoPosiciones"),
    @PropertyValue(name="posiciones"),
    @PropertyValue(name="contabilizacionPrevia")
    }
    )
    public class FacturaRecibida extends DocumentoContable implements Serializable {

    @Stereotype("FECHA")
    @Required
    @OnChange(AlCambiarFechaFactura.class)
    private Date fechaFactura;
    
    @Stereotype("FECHA")
    @Required
    private Date fechaVencimiento;
    
    @Column(length=25)
    private String numeroFr;        //número de factura de proveedor
    
    @ManyToOne(fetch=FetchType.LAZY)
    @ReferenceView("Simple")
    @NoFrame
    private Activo activo;
    
    @ManyToOne(fetch=FetchType.LAZY)
    @ReferenceView("Simple")
    @NoFrame
    private Sitio sitio;
    
    @ManyToOne
    @ReferenceView("Simple")
    @NoFrame
    @OnChange(AlCambiarProveedorEnFactura.class)
    private Proveedor proveedor;
    
    @ManyToOne
    @ReferenceView("Simple")
    @DescriptionsList( descriptionProperties="nombre", condition="esconpro=true")
    private ConceptoRecaudacion conceptoAsociado;       //conceptos asociados a proveedor.
    
    @ManyToOne
    @ReferenceView("Simple")
    @DescriptionsLists({
        @DescriptionsList(forViews="DEFAULT", condition="cuenta like '6%'" ),
        @DescriptionsList(forViews="ConActivo", condition="esgaacti=true" ),
        @DescriptionsList(forViews="ConSitio", condition="esgasiti=true" ),
        @DescriptionsList(forViews="SinSitioyActivo", condition="cuenta like '6%' and esgaacti=false and esgasiti=false" )
    })
    private ConceptoRecaudacion tipoGasto;
    
    @ManyToOne
    @ReferenceView("Simple")
    @DescriptionsList(descriptionProperties="nombre", condition="esconiva=true" )
    private ConceptoRecaudacion tipoIva;
    
    @OneToMany(mappedBy="factura",  cascade=CascadeType.ALL)
    @ListProperties("oid,concepto, importe, cantidad, iva, cuota, total")
    private Collection<DetalleFacturaRecibida> conceptos;
    
    ////////unión con las partidas contables
    @ManyToOne
    private DetalleDocumentoContable lineaGasto;
    
    @ManyToOne
    private DetalleDocumentoContable lineaIva;
    
    @ManyToOne
    private DetalleDocumentoContable lineaTotal;
    

    ///////////propiedades calculadas //////////////////////////////////////////////

    //para tener el total del importe de la factura
    @Stereotype("DINERO")
    public BigDecimal getSumaImporte(){
    
        BigDecimal suma = new BigDecimal(0.00);     
        if( this.getConceptos() != null ){              
            for(DetalleFacturaRecibida pos: this.getConceptos() )       
                suma = suma.add(pos.getImporte());              
        }
        return suma;
    
    }//end--getSumaImporte
    
    //para tener el total de la cuota de iva
    @Stereotype("DINERO")
    public BigDecimal getSumaCuota(){
    
        BigDecimal suma = new BigDecimal(0.00);     
        if( this.getConceptos() != null ){              
            for(DetalleFacturaRecibida pos: this.getConceptos() )       
                suma = suma.add(pos.getCuota());                
        }
        return suma;
    
    }//end--getSumaCuota
    
    //para tener el total de la factura
    @Stereotype("DINERO")
    public BigDecimal getSumaTotal(){
    
        BigDecimal suma = new BigDecimal(0.00);     
        if( this.getConceptos() != null ){              
            for(DetalleFacturaRecibida pos: this.getConceptos() )       
                suma = suma.add(pos.getTotal());                
        }
        return suma;
    
    }//end--getSumaTotal
    

    ////////métodos de retrollamada////////////////////////////////////////////////////////////////////

    //actualizar las partidas del documento contable
    @PostPersist @PostUpdate 
    public void actualizarPartidasContables(){      
        System.out.println(getClass().getName() + "::actualizarPartidasContables");
    

    //////////////////////////1.-GASTO
    System.out.println("Importe de gasto:" + getSumaImporte().toString());
    if( getSumaImporte().compareTo(BigDecimal.ZERO) != 0){ //si tiene valos distinto de 0

            System.out.println("Generando partida contable de línea de GASTO...");
    
            if ( getLineaGasto() == null)   //si no hay línea de gasto registrada la creamos
                setLineaGasto(new DetalleDocumentoContable());      //la asociamos a la factura
    
            getLineaGasto().setDocumento(this);
            getLineaGasto().setConcepto(getTipoGasto());
            getLineaGasto().setNombre(getTipoGasto().getNombre());
            getLineaGasto().setImporte(getSumaImporte().abs());         //el importe contable siempre en positivo
            getLineaGasto().setFechaVencimiento(getFechaContable());
    
            if( getSumaImporte().compareTo(BigDecimal.ZERO) >= 0 )      //si es positivo                
                getLineaGasto().setClavePosicion(DetalleDocumentoContable.Posiciones.D);            
            else    //importe en negativo, es un abono
                getLineaGasto().setClavePosicion(DetalleDocumentoContable.Posiciones.H);
    
            //si no están creadas las posiciones las creamos
            if ( getPosiciones() == null)   
                setPosiciones(new ArrayList<DetalleDocumentoContable>());
            //incluir como partida contable la línea de gasto generada
            getPosiciones().add(getLineaGasto());
    
        }//endif-getSumaImporte
        else{   //no funciona quitar la línea automáticamente
                setLineaGasto(null);    //quitar la FK de factura                                       
        }
    

    /////////////////////////2.-CUOTA DE IVA DE LA FACTURA
    System.out.println("Importe de IVA de factura:" + getSumaCuota().toString());
    if( getSumaCuota().compareTo(BigDecimal.ZERO) != 0){ //si tiene valos distinto de 0

        System.out.println("Generando partida contable de línea de IVA...");
    
        if ( getLineaIva() == null) //si no hay línea de gasto registrada la creamos
            setLineaIva(new DetalleDocumentoContable());        //la asociamos a la factura
    
        getLineaIva().setDocumento(this);
        getLineaIva().setConcepto(getTipoIva());
        getLineaIva().setNombre(getTipoIva().getNombre());
        getLineaIva().setImporte(getSumaCuota().abs());         //el importe contable siempre en positivo
        getLineaIva().setFechaVencimiento(getFechaContable());
    
        if( getSumaCuota().compareTo(BigDecimal.ZERO) >= 0 )        //si es positivo                
            getLineaIva().setClavePosicion(DetalleDocumentoContable.Posiciones.D);          
        else    //importe en negativo, es un abono
            getLineaIva().setClavePosicion(DetalleDocumentoContable.Posiciones.H);
    
        //incluir como partida contable la línea de gasto generada
        getPosiciones().add(getLineaIva());
    
        }//endif-getSumaImporte
        else{   //no funciona quitar la línea automáticamente
            setLineaIva(null);  //quitar la FK de factura
        }
    

    /////////////////////////3.-TOTAL, PARTE PTE DE PAGO AL PROVEEDOR
    System.out.println("Importe de total de factura:" + getSumaTotal().toString());
    if( getSumaTotal().compareTo(BigDecimal.ZERO) != 0){ //si tiene valos distinto de 0

            System.out.println("Generando partida contable de línea de TOTAL...");
    
            if ( getLineaTotal() == null)   //si no hay línea de gasto registrada la creamos
                setLineaTotal(new DetalleDocumentoContable());      //la asociamos a la factura
    
            getLineaTotal().setDocumento(this);
            getLineaTotal().setConcepto(getConceptoAsociado());
            getLineaTotal().setNombre(getConceptoAsociado().getNombre());
            getLineaTotal().setImporte(getSumaTotal().abs());           //el importe contable siempre en positivo
            getLineaTotal().setPersona(getProveedor());
            getLineaTotal().setFechaVencimiento(getFechaVencimiento());
    
            if( getSumaTotal().compareTo(BigDecimal.ZERO) >= 0 )        //si es positivo                
                getLineaTotal().setClavePosicion(DetalleDocumentoContable.Posiciones.H);            
            else    //importe en negativo, es un abono
                getLineaTotal().setClavePosicion(DetalleDocumentoContable.Posiciones.D);
    
            //incluir como partida contable la línea de gasto generada
            getPosiciones().add(getLineaTotal());
    
        }//endif-getSumaImporte
        else{   //no funciona quitar la línea automáticamente
                setLineaTotal(null);    //quitar la FK de factura                                       
        }
    
    }//end-actualizarPartidasContables
    

    ////////buscadores /////////////////////////////////////////////////////////////////////////////////

    public static FacturaRecibida findByCodigo(int codigo) throws NoResultException {
    
         Query query = XPersistence.getManager().createQuery(
                            "from FacturaRecibida as o where o.oid = :codigo");
         query.setParameter("codigo", codigo);  
         return (FacturaRecibida) query.getSingleResult();
    
    }//end-findByCodigo
    

    ////////// getter + setter //////////////////////////////

    public Date getFechaVencimiento() {
        return fechaVencimiento;
    }
    
    public void setFechaVencimiento(Date fechaVencimiento) {
        this.fechaVencimiento = fechaVencimiento;
    }
    
    public String getNumeroFr() {
        return numeroFr;
    }
    
    public void setNumeroFr(String numeroFr) {
        this.numeroFr = numeroFr;
    }
    
    public Activo getActivo() {
        return activo;
    }
    
    public void setActivo(Activo activo) {
        this.activo = activo;
    }
    
    public Sitio getSitio() {
        return sitio;
    }
    
    public void setSitio(Sitio sitio) {
        this.sitio = sitio;
    }
    
    public Proveedor getProveedor() {
        return proveedor;
    }
    
    public void setProveedor(Proveedor proveedor) {
        this.proveedor = proveedor;
    }
    
    public ConceptoRecaudacion getConceptoAsociado() {
        return conceptoAsociado;
    }
    
    public void setConceptoAsociado(ConceptoRecaudacion conceptoAsociado) {
        this.conceptoAsociado = conceptoAsociado;
    }
    
    public ConceptoRecaudacion getTipoGasto() {
        return tipoGasto;
    }
    
    public void setTipoGasto(ConceptoRecaudacion tipoGasto) {
        this.tipoGasto = tipoGasto;
    }
    
    public Collection<DetalleFacturaRecibida> getConceptos() {
        return conceptos;
    }
    
    public void setConceptos(Collection<DetalleFacturaRecibida> conceptos) {
        this.conceptos = conceptos;
    }
    
    public DetalleDocumentoContable getLineaGasto() {
        return lineaGasto;
    }
    
    public void setLineaGasto(DetalleDocumentoContable lineaGasto) {
        this.lineaGasto = lineaGasto;
    }
    
    public DetalleDocumentoContable getLineaIva() {
        return lineaIva;
    }
    
    public void setLineaIva(DetalleDocumentoContable lineaIva) {
        this.lineaIva = lineaIva;
    }
    
    public DetalleDocumentoContable getLineaTotal() {
        return lineaTotal;
    }
    
    public void setLineaTotal(DetalleDocumentoContable lineaTotal) {
        this.lineaTotal = lineaTotal;
    }
    
    public ConceptoRecaudacion getTipoIva() {
        return tipoIva;
    }
    
    public void setTipoIva(ConceptoRecaudacion tipoIva) {
        this.tipoIva = tipoIva;
    }
    
    public Date getFechaFactura() {
        return fechaFactura;
    }
    
    public void setFechaFactura(Date fechaFactura) {
        this.fechaFactura = fechaFactura;
    }
    

    }//endclass

     
  • JOSE ELIAS

    JOSE ELIAS - 2014-08-11

    Respecto del punto 2: que no se cierran los marcos hasta que se pulsa "F5"

    package com.openxava.oxsigo.modelo;

    import java.util.;
    import javax.persistence.
    ;

    import org.openxava.annotations.;
    import org.openxava.util.
    ;

    //clase mapeada para usarse como clave autogenerada donde se requiera
    @MappedSuperclass
    @View(members="Datos de Registro[creado, creadoPor, modificado, modificadoPor, bloqueado];")
    public class Identificable {

    @Id
    @Column(length=4)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer oid;
    
    @Column(length=15)
    @Stereotype("FECHAHORA")
    @ReadOnly
    private Date creado;
    
    @ReadOnly
    @Column(length=15)
    private String creadoPor;
    
    @Column(length=15)
    @Stereotype("FECHAHORA")
    @ReadOnly
    private Date modificado;
    
    @ReadOnly
    @Column(length=15)
    private String modificadoPor;
    
    private Boolean bloqueado;      //xa bloquear una entidad(maestra)
    
    private Boolean eliminado;      //para marcar una entidad como eliminada
    
    @Column(length=50)
    @ReadOnly(forViews="Establecimiento")
    private String nombre;          //literal para todas las entidades
    

    //////////// getter y setter ////////////////////////////////
    public Integer getOid() {
    return oid;
    }

    public void setOid(Integer oid) {
        this.oid = oid;
    }
    
    public Date getCreado() {
        return creado;
    }
    
    public void setCreado(Date creado) {
        this.creado = creado;
    }
    
    public String getCreadoPor() {
        return creadoPor;
    }
    
    public void setCreadoPor(String creadoPor) {
        this.creadoPor = creadoPor;
    }
    
    public Date getModificado() {
        return modificado;
    }
    
    public void setModificado(Date modificado) {
        this.modificado = modificado;
    }
    
    public String getModificadoPor() {
        return modificadoPor;
    }
    
    public void setModificadoPor(String modificadoPor) {
        this.modificadoPor = modificadoPor;
    }
    
    public Boolean getEliminado() {
        return eliminado;
    }
    
    public void setEliminado(Boolean eliminado) {
        if(eliminado==null)
            this.eliminado=false;
        else
            this.eliminado = eliminado;
    }
    
    public Boolean getBloqueado() {
        return bloqueado;
    }
    
    public void setBloqueado(Boolean bloqueado) {
        if(bloqueado==null)
            this.bloqueado=false;
        else    
            this.bloqueado = bloqueado;
    }
    
    public String getNombre() {
        return nombre;
    }
    
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    
    /**********Métodos de retrollamada JPA*********************************************************************/
    /* En la primera grabación, Admin, quitar los @Pre */
    //en la primera grabación, empleado que realiza la grabación
    @PrePersist
    public void registraCreado() throws Exception {
    
        //recuperar el empleado - usuario conectado
        String usuario;
        usuario = Users.getCurrent();
    
        //si no es la creacion del propio administrador
        this.setCreadoPor(usuario);
        this.setCreado(new java.util.Date());
        if( this.getBloqueado() == null)
            this.setBloqueado(false);
        if( this.getEliminado() == null)
            this.setEliminado(false);
    
    }//registraCreado
    
    //actualización de modificado en cada grabación
    @PreUpdate
    @PreDelete
    public void registraModificado() throws Exception {
    
        //recuperar el empleado - usuario conectado
        String usuario;
        usuario = Users.getCurrent();
    
        this.setModificadoPor(usuario);
        this.setModificado(new java.util.Date());
        if( this.getBloqueado() == null)
            this.setBloqueado(false);
        if( this.getEliminado() == null)
            this.setEliminado(false);
    
    }//registraModificado*/
    

    }//endclass

     
  • Javier Paniza

    Javier Paniza - 2014-08-11

    Hola José,

    antes de nada actualizate a XavaPro 5.0.1, porque en él están corregidos muchos bugs relacionados con el nuevo renderer y es fácil que se arregle tu problema.

     
  • JOSE ELIAS

    JOSE ELIAS - 2014-08-12

    Estuve de vacaciones con la publicación e intenté la descarga pero tuve muchos problemas de conexión y he perdido, por tiempo, la posibilidad de descargarlo. No sé si es posible recuperar el link de descarga.

     
  • Javier Paniza

    Javier Paniza - 2014-08-12

    Hola José,

    acabo de reenviarte el vínvulo para que te descargues XavaPro Enterprise. Si tienes algún problema con la descarga o instalación no dudes en decirlo.

     
  • JOSE ELIAS

    JOSE ELIAS - 2014-08-19

    Hola Javier,
    el problema con los marcos no se ha resuelto. No he comentado que el problema viene con las propiedades de clases heredadas visualizadas en la clase que extiende.

     
  • Javier Paniza

    Javier Paniza - 2014-08-19

    Hola José,

    necesito un código lo suficientemente sencillo para que lo pueda copiar y pegar en mi entorno y reproducirlo, el código que adjuntas tienes demasiadas referencias. Si al menos supiera porque es podria hacerme yo mismo el ejemplo, pero todos los casos que he probado me funcionan bien.

    Crea un pequeño proyecto nuevo y pega en él tu clase. Después simplifícala lo más posible, si es posible quitando todas las referencias a las demás clases. Comprueba que con ese código te sigue dando el problema y adjunta aquí las clases de ese proyecto (idealmente una, aunque pudieran ser más). Lo probaré.


    Ayuda a otros en este foro como yo te ayudo a ti.

     
  • JOSE ELIAS

    JOSE ELIAS - 2014-08-20

    Hola Javier, aquí está la clase más simple, verás como el marco no cierra hasta que se pulsa F5. (Son dos clases, identificable y marco)


    package com.openxava.oxsigo.modelo;

    import java.util.;
    import javax.persistence.
    ;

    import org.openxava.annotations.;
    import org.openxava.util.
    ;

    //clase mapeada para usarse como clave autogenerada donde se requiera
    @MappedSuperclass
    @View(members="Datos de Registro[creado, creadoPor, modificado, modificadoPor, bloqueado];")
    public class Identificable {

    @Id
    @Column(length=4)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer oid;
    
    @Column(length=15)
    @Stereotype("FECHAHORA")
    @ReadOnly
    private Date creado;
    
    @ReadOnly
    @Column(length=15)
    private String creadoPor;
    
    @Column(length=15)
    @Stereotype("FECHAHORA")
    @ReadOnly
    private Date modificado;
    
    @ReadOnly
    @Column(length=15)
    private String modificadoPor;
    
    private Boolean bloqueado;      //xa bloquear una entidad(maestra)
    
    private Boolean eliminado;      //para marcar una entidad como eliminada
    
    @Column(length=50)
    private String nombre;          //literal para todas las entidades
    

    //////////// getter y setter ////////////////////////////////
    public Integer getOid() {
    return oid;
    }

    public void setOid(Integer oid) {
        this.oid = oid;
    }
    
    public Date getCreado() {
        return creado;
    }
    
    public void setCreado(Date creado) {
        this.creado = creado;
    }
    
    public String getCreadoPor() {
        return creadoPor;
    }
    
    public void setCreadoPor(String creadoPor) {
        this.creadoPor = creadoPor;
    }
    
    public Date getModificado() {
        return modificado;
    }
    
    public void setModificado(Date modificado) {
        this.modificado = modificado;
    }
    
    public String getModificadoPor() {
        return modificadoPor;
    }
    
    public void setModificadoPor(String modificadoPor) {
        this.modificadoPor = modificadoPor;
    }
    
    public Boolean getEliminado() {
        return eliminado;
    }
    
    public void setEliminado(Boolean eliminado) {
        if(eliminado==null)
            this.eliminado=false;
        else
            this.eliminado = eliminado;
    }
    
    public Boolean getBloqueado() {
        return bloqueado;
    }
    
    public void setBloqueado(Boolean bloqueado) {
        if(bloqueado==null)
            this.bloqueado=false;
        else    
            this.bloqueado = bloqueado;
    }
    
    public String getNombre() {
        return nombre;
    }
    
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    
    /**********Métodos de retrollamada JPA*********************************************************************/
    /* En la primera grabación, Admin, quitar los @Pre */
    //en la primera grabación, empleado que realiza la grabación
    @PrePersist
    public void registraCreado() throws Exception {
    
        //recuperar el empleado - usuario conectado
        String usuario;
        usuario = Users.getCurrent();
    
        //si no es la creacion del propio administrador
        this.setCreadoPor(usuario);
        this.setCreado(new java.util.Date());
        if( this.getBloqueado() == null)
            this.setBloqueado(false);
        if( this.getEliminado() == null)
            this.setEliminado(false);
    
    }//registraCreado
    
    //actualización de modificado en cada grabación
    @PreUpdate
    @PreDelete
    public void registraModificado() throws Exception {
    
        //recuperar el empleado - usuario conectado
        String usuario;
        usuario = Users.getCurrent();
    
        this.setModificadoPor(usuario);
        this.setModificado(new java.util.Date());
        if( this.getBloqueado() == null)
            this.setBloqueado(false);
        if( this.getEliminado() == null)
            this.setEliminado(false);
    
    }//registraModificado*/
    

    }//endclass


    package com.openxava.oxsigo.modelo;

    import javax.persistence.*;

    import org.openxava.annotations.*;

    /
    * marco - clase de prueba para fallo de cierre de marcos
    * @author jegomez

    /
    @Entity
    @View(extendsView = "super.DEFAULT",members="; oid, nombre")
    public class marco extends Identificable {

    }

     
  • Javier Paniza

    Javier Paniza - 2014-08-22

    Hola José,

    para que tu ejemplo funcione has de cambiar:

    @View(members="Datos de Registro[creado, creadoPor, modificado, modificadoPor, bloqueado];")
    

    por

    @View(members="datosDeRegistro[creado, creadoPor, modificado, modificadoPor, bloqueado];")
    

    y ya funcionará.

    Se supone que el nombre de grupo debería ser un identificador válido de Java y por ende no tener espacios. Pero parece que eso no es tan obvio como yo pensaba.

    Realmente no es un bug, pero añadelo como tal para que piense en una solución para que no volvamos a perder tiempo otra vez por algo así.


    Ayuda a otros en este foro como yo te ayudo a ti.

     
  • JOSE ELIAS

    JOSE ELIAS - 2014-08-22

    Mi humilde opinión es mantenerlo cómo está y "aprender lo que hay que aprender" que para eso está. Pero si quieres lo añado a bugs.

     
  • Javier Paniza

    Javier Paniza - 2014-08-25

    Hola Jose,

    Mi humilde opinión es mantenerlo cómo está y "aprender lo que hay que aprender" que para eso está.

    Estoy de acuerdo en no soportar el espacio como nombre de identificador. Lo que quiero evitar es que otros programadores en el futuro tengan que perder varias depurando, como nos ha tocado hacer ahora a nosotros. Quizás una excepción diciendo "Blancos no permitidos como nombres de módulos" o simpemente un mensaje de advertencia en el log podría ayudar bastante.

    Sí, añadelo como bug, veré como lo puedo mejorar.

     

Log in to post a comment.