Marcar multiselección desde JS en rejilla


([N2] pnogueira) #1

Muy buenas.

Estoy haciendo pruebas intentando que en una rejilla, después de ejecutar un proceso, me deje seleccionadas o marcadas varias líneas. Probando con JS (porque no vi manera de hacerlo en nativo) las pruebas más básicas no me funcionan. He estado recorriendome la documentación y los foros buscando ejemplos y probando pero no he conseguido algo tan sencillo como marcar una línea:

// Ejemplo 1
var obj = theRoot.dataView();
obj.setCurrentSelect( 1 );

// Ejemplo 2
var obj = theRoot.dataView();
var registro = new VRegister(theRoot);
registro.setTable( "velneo_verp_2_dat/VTA_PRE_LIN_G" );
registro.readRegister( "ID", [theRoot.varToInt("ID")], VRegister.SearchThis );
obj.addToMultiSelection( registro );

Seguro que estoy metiendo la pata en algo, pero no soy capaz de verlo. :-/


([N3] pacosatu) #2

Hola pnogueira.

Se puede hacer en nativo aunque no es muy intuitivo.
Debes usar el comando Interfaz: Añadir ficha a la multi-selección ( ObjetoRejilla, ManejadorFicha ).

Para que funcione debes tener la Ficha de la multiselección disponible en Memoria mediante un manejador.
En el siguiente ejemplo se seleccionan todas las filas de la Rejilla, para ello se copian a memoria para inmediatamente después añadirlas a la multiselección.

Interfaz: Procesar ( GRD_LISTA, Todas )
   Recorrer lista solo lectura
      Crear copia de ficha en memoria ( hFicha )
      Interfaz: Añadir ficha a la multi-selección ( GRD_LISTA, hFicha )

En este caso Velneo hace uso de un Manejador de Ficha, lo que nos recuerda el gran potencial desaprovechado y que podríamos tener en Velneo. Imagina copiar una Ficha en memoria para poder acceder a los valores de los Campos desde otros comandos sin necesidad de usar Variables locales intermedias.

Saludos
Paco Satué


([N2] pnogueira) #3

Hola paco, muchas gracias por tu respuesta.

He probado en un proceso en nativo. El problema es que lo lanzo desde una toolbar de la propia rejilla, y entonces en el comando “Interfaz: Procesar()” no me deja seleccionar ningún control. Entiendo que en este caso el comando utiliza automáticamente la rejilla, ya que si cuento el número de fichas lo hace bien. Lo que sigue sin hacer es marcarme las líneas.

El código que he puesto es el siguiente:

Interfaz: Procesar ( , Todas )
   Recorrer lista solo lectura
      Crear copia de ficha en memoria ( hFicha )
      Interfaz: Añadir ficha a la multi-selección ( , hFicha )

Decir que la rejilla carga los contenidos desde un proceso del formulario, ¿puede influir esto?


([N3] pacosatu) #4

Hola pnogueira.

Debería de funcionar, de hecho lo he probado y va correcto.

Saludos
Paco Satué


([N2] pnogueira) #5

Hola paco.

Voy a explicar un poco lo que trato de hacer:
Estoy trabajando con el formulario de presupuestos de vERP, y lo que necesito es que el usuario pueda reordenar las líneas. Para ello en el toolbar de la rejilla de las líneas de presupuesto he añadido dos botones: subir y bajar, que lo que hacen respectivamente es decrementar e incrementar en 1 el valor del campo “Nº línea” de las líneas seleccionadas.

Hasta ahí bien, lo que ocurre es que como la rejilla se rellena con un proceso que carga las vistas, si quiero que los cambios en el orden de las líneas se reflejen al momento, tengo que llamar de nuevo a dicho proceso de carga, con lo que obviamente se pierde la selección de las líneas, por lo que mi intención era de alguna manera guardar las lineas seleccionadas antes de llamar al proceso de carga, para después volver a seleccionarlas, y es en este punto donde me he atascado.

Puede que el problema sea que para llamar desde la rejilla al proceso de carga (que se encuentra en el formulario) lo que he hecho es crear un botón oculto en el formulario que llama al manejador de evento CAR_VIS, y a dicho botón lo llamo desde un proceso JS de la rejilla con

theMainWindow.currentView().centralWidget().control("SEP").form(0).control("BTN_RECALC").click();

¿Puede que me esté complicando la vida para algo que se podría hacer de forma más sencilla? Empiezo a pensar que sí. :slight_smile:

Gracias y un saludo.


([N3] pacosatu) #6

Hola pnogueira.

Efectívamente, creo que la estás liando.
Ten en cuenta que en Velneo, no sé si es bueno o malo, si te sales de las 4 reglas que están predeterminadas, la programación empieza a emborronarse y acaba siendo una pesadilla.

Todos hemos caído en los mismos errores y siempre viene bien para aprender.

  • Ya te habrás dado cuenta que ejecutar código desde un manejador de la Rejilla es un incordio. Si tienes que recargar la Rejilla debes recurrir al API y además de ser poco mantenible es una pequeña chapucilla. Por lo tanto, deja en la rejilla solo el código que no dependa del exterior (encapsula) y maneja los eventos de la rejilla desde los manejadores del formulario.
  • De todas formas en este caso no es necesario recargar la rejilla, con que Ordenes por la columna de Nº Linea es suficiente.

Yo probaría lo siguiente:

  • Antes de ordenar por Nº Linea pasas la Multiseleccion a una Cesta (Interfaz:Obtener la multiseleccion)
  • Borras la Multiseleccion (Interfaz:Limpiar la multiseleccion)
  • Ordenas la columna Nº Linea (Ordenar)
  • Cargas la multiseleccion desde la Cesta

Pruébalo
Saludos
Paco Satué


([N2] pnogueira) #7

Hola paco.

Desde luego tu ayuda es impagable. :slight_smile:

He probado lo que me has dicho, y primero hice una prueba desde la rejilla, por si acaso. Funciona todo bien salvo el que vuelva a marcar la multiselección:

Cesta: Crear cesta local ( VTA_PRE_LIN_G@vERP_2_dat, cesta_vta_pre_lin_g )
Interfaz: Obtener la multi-selección ( )
    If ( sysListSize )
        Cesta: Agregar lista a la cesta ( cesta_vta_pre_lin_g )
        Recorrer lista lectura/escritura
            Modificar campo ( NUM_LIN, choose( #NUM_LIN, #NUM_LIN - 1, 0) )
Interfaz: Limpiar la multi-selección ( )
Ordenar lista ( #NUM_LIN, , , , , )
Interfaz: Procesar ( , Todas )
    Recorrer lista solo lectura
        Cesta: ¿Está la ficha en la cesta? ( cesta_vta_pre_lin_g, NUM_POS )
        If ( NUM_POS ! 0 )
            Crear copia de ficha en memoria ( Ficha )
            Interfaz: Añadir ficha a la multi-selección ( , Ficha )

He hecho lo mismo desde unos botones en el formulario padre, y aunque no queda tan bien estéticamente el funcionamiento es el que deseaba. :smiley:

Como dato curioso, he estado haciendo pruebas, y si desde un botón de una toolbar de una rejilla ejecutas una acción que envía una señal, da igual lo que hagas que la multiselección la va a perder. Si lanzas otro tipo de acción no pasa esto. He probado a ejecutar un proceso sin comandos y borra siempre la selección.

Bueno, lo dicho, muchas gracias de nuevo por tu ayuda.

Un saludo,
Pablo Nogueira


([N3] pacosatu) #8

Hola pnogueira.

En otros lenguajes también ocurre, pero con Velneo es el pan de cada día, un continuo y fustrante “prueba y error”. Sobre todo lo referente a la gestión de eventos en el interface de los formularios.

En fin, me alegro que vayan saliendo las cosas. Y procura siempre hacerlo en nativo si es posible y dejar el API para casos extremos, tu estado mental te lo agradecerá.

Saludos
Paco Satué