Menu

Cambiar la longitud de un campo cuando cambia el valor de otro campo

Manu
2024-02-21
2024-03-01
  • Manu

    Manu - 2024-02-21

    Buenos días,

    Estas son mis clases TipoDocumento y Propietario:

    @Entity @Getter @Setter
    public class TipoDocumento implements Serializable{ 
        @Id @Hidden
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        @Column
        private int idTipoDocumento;
    
        @Column(length=25, unique=true) @Required
        private String descripcion; 
    }
    
    public class Propietario{
        @ManyToOne(fetch = FetchType.LAZY) @Required @NoCreate @NoModify
        @DescriptionsList
        private TipoDocumento tipo;
    
        @Column(unique=true) @Required 
        private String documento;
    }
    

    Estoy intentando crear un "TipoDocumento" ya sea en Combo o Enum, que en base al "TipoDocumento" que se elija me fije una longitud fija para el campo "documento". Por ejemplo, si elijo un "TipoDocumento" que sea DNI, que en el campo "documento" sea una longitud fija de 9 caracteres. El problema viene que por ejemplo un "Pasaporte" como "TipoDocumento" tiene que ser de longitud variable. Sino haría esto:

    @Column(unique=true) @Length(min=9, max=9) @Required 
        private String documento;
    

    Pero en el caso de que se elija "Pasaporte" quiero que no haya longitud fija, y no se como plasmarlo.

    He revisado la documentación pero no se si hay alguna funcionalidad que me pueda ayudar o como debería proceder.

    Muchas gracias de antemano!

     

    Last edit: Manu 2024-02-21
  • Javier Paniza

    Javier Paniza - 2024-02-23

    Hola Manu:

    A nivel de base de datos tienes que tener una longitud fija, que será la del máximo posible. Entonces mapea la columna con una propiedad persistente y usa propiedades no persistentes (con getter y setter, pero sin atributo) para tener otros puntos de vista, Algo así;

    @Column(length=20) 
    String documento;
    
    @Column(length=9)
    public String getDni() {
        return documento;
    }
    
    @Column(length=9)
    public String setDni(String dni) {
        documento = dni;
    }
    
        @Column(length=10)
    public String getPasaporte() {
        return documento;
    }
    
    @Column(length=10)
    public String setPasaporte(String pasaporte) {
        documento = pasaporte;
    }
    

    En @View pon dni y pasaporte. Después en la acción @OnChange de tipoDocumento usa getView().setHidden() para mostrar una u otra.


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

     
  • Manu

    Manu - 2024-02-27

    Buenos días Javier,

    No consigo dar con la solución, si que me muestra un combo con mis opciones (DNI, NIE, CIF, PASAPORTE) pero cuando me comprueba la longitud de los datos de campo "documento" me salta el error de longitud de DNI, NIE y CIF a la vez, sea del "TipoDocumento" que sea.

    No se muy bien como relacionar la longitud de las 4 opciones en el campo "documento" con la opción seleccionada en "TipoDocumento". Te adjunto captura de lo que te comento de los errores y captura de 4 columnas que me crea en la lista sin yo nombrarlas, y antes no me las mostraba...

    He probado con lo que me sugerias pero algo no estoy haciendo bien y no logro verlo

    el codigo de mi clase "Propietario":

    @Entity @Getter @Setter
    @View(members="tipo, documento;"
                + "nombre;"
                + "domicilio, codigoPostal;"
                + "telefono, telefono2, telefono3;"
                + "correo, sexo;"
                + "animal;"
                + "licencia;")
    public class Propietario{
    
        @Id @Hidden
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        @Column
        private int idPropietario;
    
        enum TipoDocumento { DNI, NIE, CIF, PASAPORTE };
        @OnChange(OnChangeTipoDocumento.class) 
        TipoDocumento tipo;
    
        @Column(unique=true, length=15) @Required 
        String documento;
    
        @Column @Length(min=9, max=9)
        public String getDni() {
            return documento;
        }
    
        @Column @Length(min=9, max=9)
        public String setDni(String dni) {
            return documento = dni;
        }
    
        @Column @Length(min=9, max=9)
        public String getNie() {
            return documento;
        }
    
        @Column @Length(min=9, max=9)
        public String setNie(String nie) {
            return documento = nie;
        }
    
        @Column @Length(min=9, max=9)
        public String getCif() {
            return documento;
        }
    
        @Column @Length(min=9, max=9)
        public String setCif(String cif) {
            return documento = cif;
        }
    
        @Column(length = 12)
        public String getPasaporte() {
            return documento;
        }
    
        @Column(length = 12)
        public String setPasaporte(String pasaporte) {
            return documento = pasaporte;
        }
    

    Y el código de mi clase "OnChangeTipoDocumento":

    public class OnChangeTipoDocumento extends OnChangePropertyBaseAction{
    
        @Id @Hidden
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        @Column
        private int idTipoDocumento;
    
        @Override
        public void execute() throws Exception {
             TipoDocumento descripcion = (TipoDocumento) getNewValue(); 
             if (descripcion == null) return;
             if (descripcion.equals(TipoDocumento.DNI)) {
                 getView().setHidden("propertyNotForDNI", descripcion == TipoDocumento.DNI);
                 System.out.print("HOLA 1");
             }
             else{
                 if (descripcion.equals(TipoDocumento.NIE)) {
                     getView().setHidden("propertyNotForNIE", descripcion == TipoDocumento.NIE);
                     System.out.print("HOLA 2");
                 }
                 else {
                     if (descripcion.equals(TipoDocumento.CIF)) {
                         getView().setHidden("propertyNotForCIF", descripcion == TipoDocumento.CIF);
                         System.out.print("HOLA 3");
                     }else {
                         if (descripcion.equals(TipoDocumento.PASAPORTE)) {
                             getView().setHidden("propertyNotForCIF", descripcion == TipoDocumento.PASAPORTE);
                             System.out.print("HOLA 4");
                         }
                     }
                 }
             }
        }   
    }
    

    Muchas gracias de antemano Javier!

     

    Last edit: Manu 2024-02-27
  • Javier Paniza

    Javier Paniza - 2024-02-29

    Hola Manu:

    La solución que te propuse es a nivel visual, no tiene en cuenta las validaciones. Claro, las propiedades ocultas siguen existiendo y al grabar no se cumple su validación.

    Te propongo dos alternativas. La primera sería cambiar el uso @Length por @Mask. Mira la documentación de @Mask aquí:
    https://www.openxava.org/OpenXavaDoc/docs/model_es.html#mascaras

    La segundo alternativa es quitar todos los @Lengh y poner un @PropertyValidator propio en documento o poner una validación a nivel de entidad en un método @PrePersist. Esta validación propia para la longitud tendría en cuenta el tipo de documento para validar de una forma u otra.
    Mira más sobre las opciones validación:
    https://www.openxava.org/OpenXavaDoc/docs/validation-alternatives_es.html


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

     
  • Manu

    Manu - 2024-03-01

    Buenos días Javier!

    Lo he conseguido solucionar con la segunda alternativa que me comentabas, haciendo un validador y poniéndole yo las condiciones para cada caso.

    Muchisimas gracias por tu ayuda!

     

Log in to post a comment.