Menu

TAB se deselecciona solo si hay manytoone en diálogo

JOSE ELIAS
2021-10-16
2025-11-27
  • JOSE ELIAS

    JOSE ELIAS - 2021-10-16

    Hola JP, si desde un TAB seleccionas un registro y levantas un diálogo para hacer alguna acción con este registro, y este diálogo tiene un ManyToOne para escoger y lo usas, el tab anterior se deselecciona solo dejando al diálogo sin poder ejecutar la acción.

    Te detallo el código y las imágenes para poder reproducirlo.
    En el caso de registrar propiedades planas, como es el caso de texto o fecha, funciona perfectamente, pero en cuanto se usa la referencia ceco para buscar un valor, tab.getSelectedKeys() no devuelve nada.

    ACCIÓN PARA ABRIR EL DIÁLOGO
    public class AbrirModificacionMasivaPartidas extends ViewBaseAction {

    private static final Logger logger = Logger.getLogger(AbrirModificacionMasivaPartidas.class);
    
    @Inject
    private Tab tab;
    
    @Override
    public void execute() throws Exception {
        logger.info("---");
        if (validarSeleccion()) {
            try {
                showDialog();
                getView().setModelName("ModificacionMasivaPartidas");
                getView().setEditable(true);
                setControllers("ModificacionMasivaPartidas");
                inicializarInterfaz();
            }
            catch (ObjectNotFoundException ex) {
                getView().clear();
                addError("object_not_found");
            }
            catch (Exception ex) {
                ex.printStackTrace();
                addError("system_error");
            }
        }   
    }
    
    private boolean validarSeleccion() {
        return true;
    }
    
    /**
     * Inicializa la pantalla
     */
    private void inicializarInterfaz() {
        getView().setValue("partidasSeleccionadas",tab.getSelectedKeys().length);
    }
    

    }

    **ACCION MODIFICAR DEL DIALOGO: si se selecciona ceco, tab.getSelectedKeys() no devuelve nada
    **
    public class ModificarPartidasDesdeModificacionMasivaPartidas extends ViewBaseAction {

    private static final Logger logger =    Logger.getLogger(ModificarPartidasDesdeModificacionMasivaPartidas.class);
    
    @Inject
    private Tab tab;
    
    @Override
    public void execute() throws Exception {
        logger.info("---");
        Map[] partSelec = tab.getSelectedKeys();        
        String textoLinea = getView().getValueString("textoLinea");     
        Date fechaVencimiento = (Date)getView().getValue("fechaVencimiento");
        Ceco ceco = getView().getValueInt("ceco.oid") > 0 ? Ceco.findByCodigo(getView().getValueInt("ceco.oid")) : null;        
        for (int i = 0; i < partSelec.length; i++) {
            DetalleDocumentoContable ddc = (DetalleDocumentoContable)MapFacade.findEntity("DetalleDocumentoContable", partSelec[i]);
            logger.info("---ddc:" + ddc.getOid());
            ddc.modificarTerminado(textoLinea, fechaVencimiento, ceco);
        }
        this.executeAction("CerrarDialogoSinRefrescar.cerrar");
    }
    

    }

    ACCION DE MODIFICACIÓN DE LOS FREGISTROS
    public void modificarTerminado(String textoLinea, Date fechaVencimiento2, Ceco ceco2) {
    logger.info("---textoLinea:" + ("".equals(textoLinea) ? "null" : textoLinea)
    + ", fechaVencimiento:" + (fechaVencimiento2 == null ? "null" : Utilidades.formatearFecha(fechaVencimiento2, "dd/MM/yyyy"))
    + ", ceco:" + (ceco2 == null ? "null" : ceco2.getAbreviatura()));
    if (!"".equals(textoLinea) && textoLinea != null) {
    this.setNombre(textoLinea);
    }
    if (fechaVencimiento2 != null) {
    this.setFechaVencimiento(fechaVencimiento2);
    }
    if (ceco2 != null) {
    this.setCeco(ceco2);
    }
    XPersistence.getManager().persist(this);
    }

     

    Last edit: JOSE ELIAS 2021-10-16
  • Javier Paniza

    Javier Paniza - 2021-10-18

    Hola José:

    La lista de la referencia usa el mismo código que la de la lista principal, cogiendo los datos desde el objeto de sesión xava_tab, que cambiamos en la acción de búsqueda. Por eso tenemos que restaurar el tab principal antes de sacar la lista de nuevo, y eso hace que se pierdan los selecciandos.

    Aunque es así por como lo tenemos implementado, sigue siendo un bug. Así que añádelo con un vínculo a este hilo para que busquemos alguna forma de arreglar este caso.

    Mientras tanto, puede obtener los tab.getSelectedKeys() antes de llamar a la acción y después de cerrar el diálogo los vuelves a poner en el tab con tab.setAllSelectedKeys().


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

     
  • Javier Paniza

    Javier Paniza - 2025-11-27

    Hola JE:

    Este bug ya está arreglado y el arreglo se incluirá en OpenXava 7.6.3, disponible en unas pocas semanas.

     

Log in to post a comment.