# Refrescar vista de datos desde pestaña de separador de formularios

**URL:** <https://foros.velneo.com/t/refrescar-vista-de-datos-desde-pestana-de-separador-de-formularios/7836>\
**Category:** Velneo\
**Created:** [26 Febrero, 2015 13:32 UTC](https://foros.velneo.com/t/refrescar-vista-de-datos-desde-pestana-de-separador-de-formularios/7836 "2015-02-26T13:32:32Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![gontorre](https://yyz1.discourse-cdn.com/flex035/user_avatar/foros.velneo.com/gontorre/32/5728_2.png) [@gontorre](https://foros.velneo.com/u/gontorre)\
**Post date:** [26 Febrero, 2015 13:32 UTC](https://foros.velneo.com/t/refrescar-vista-de-datos-desde-pestana-de-separador-de-formularios/7836/1 "2015-02-26T13:32:32Z")

</div>

Os cuento el siguiente problema a ver si me podéis orientar.

Tengo un formulario maestro-detalle con origen DOCUMENTO. En el formulario tengo un separador de formulario con los campos de DOCUMENTO y una vista de datos con DETALLE.

Tengo un manejador de eventos en una de las pestañas del formulario que me carga las líneas de detalle desde una hoja de Excel. El problema que se me plantea es que la vista de datos no se actualiza después de cargar las líneas y desde el separador de formulario no tengo acceso a la vista de datos para hacer un Interfaz: Recalcular. Las líneas se cargan bien porque si cierro la ficha y la vuelvo a abrir me aparecen las líneas.

¿Hay alguna forma de hacer ese refresco de la vista de datos desde el separador de formularios?

Gracias y un saludo

Gonzalo Torre

---

<div class="post-metadata">

**Author:** ![pacosatu](https://yyz1.discourse-cdn.com/flex035/user_avatar/foros.velneo.com/pacosatu/32/5131_2.png) [@pacosatu](https://foros.velneo.com/u/pacosatu)\
**Post date:** [26 Febrero, 2015 23:34 UTC](https://foros.velneo.com/t/refrescar-vista-de-datos-desde-pestana-de-separador-de-formularios/7836/2 "2015-02-26T23:34:45Z")

</div>

Hola Gonzalo.

Por la forma en que está construido Velneo solo podemos acceder al Separador de formularios desde el Formulario principal.

Te voy a proponer una solución que utiliza un mínimo de JavaScript y está basado en considerar que la carga del Detalle está diferida en el tiempo. Usaremos para ello el Timer de los formularios.

Necesitamos lo siguiente:

- Un proceso en 2º plano PRO\_CREAR\_DETALLE\_2P que en tu caso lee los datos desde Excel.
- Una variable Global G\_REFRESCAR que se pondrá a 1 cuando PRO\_CREAR\_DETALLE\_2P termine. Recuerda que a los procesos en 2P no podemos pasarles parámetros ni fijar ni obtener Variables locales.

Tenemos 3 formularios: FRM\_PRINCIPAL con un separador de 2 formularios FRM\_DATOS y FRM\_DETALLE

- FRM\_DATOS contiene la lógica que lanza el proceso en 2P PRO\_CREAR\_DETALLE\_2P
- FRM\_DETALLE contiene la Vista de Datos del Detalle que inicialmente estará vacio
- Solo podemos rellenar la Vista de datos de FRM\_DETALLE desde el formulario principal FRM\_PRINCIPAL

Empezamos:  
Para iniciar y parar los Timer usaremos la función del API startTimer() y stopTimer().  
Añadimos 2 manejadores de evento a FRM\_DATOS

```auto

   // Manejador START_TIMER_JS
   theRoot.dataView().startTimer(200)

   // Manejador STOP_TIMER_JS
   theRoot.dataView().stoptTimer()

```

- En FRM\_DATOS usamos el siguiente código Velneo  
Manejador POS\_INI (evento post-inicializado)

```auto

Rem ( Ejecutamos el proceso en 2P. Al terminar pondrá la Variable Global G_REFRESCAR a 1 )
Ejecutar proceso ( PRO_CREAR_DETALLE_2P@0PS_Ejercicios_app, 2º plano: Local multitarea (asíncrono), LOK, , )
Interfaz: Ejecutar manejador de evento ( START_TIMER_JS, )

```

Manejador ON\_TIMER (evento Timer)

```auto

Rem ( Este evento se ejecuta antes que el del formulario principal )
Rem ( Comprueba si $REFRESCAR = 1 y si es cierto detiene el Timer )
Set ( LCOMPLETADO, $REFRESCAR@0PS_Ejercicios_dat.dat )
If ( LCOMPLETADO )
   // Paramos el Timer una vez completado el proceso en 2P
   Interfaz: Ejecutar manejador de evento ( STOP_TIMER_JS, )

```

- En FRM\_PRINCIPAL usamos el siguiente código Velneo  
Manejador ON\_TIMER\_PESTAÑA (evento Timer del subcontrol SEPARADOR.PESTAÑA1)

```auto

// Este Manejador captura el evento Timer de la pestaña FRM_DATOS
// Este Manejador se ejecuta después del manejador ON_TIMER de la pestaña FRM_DATOS
// Obtenemos el valor de la variable local LCOMPLETADO de la pestaña FRM_DATOS
Interfaz: Get variable local de vista de datos ( SEPARADOR.PESTAÑA1, LCOMPLETADO, LCOMPLETADO )
If ( LCOMPLETADO )
   // Cargamos el detalle
   Cesta: Crear cesta local ( LINEAS@0PS_Ejercicios_dat, oCes )
   Cargar plurales ( LINEAS_CABECERAS )
      Cesta: Agregar lista a la cesta ( oCes )
   Interfaz: Procesar ( SEPARADOR.PESTAÑA2.REJILLA, Todas )
      Cortar lista ( 0, )
      Cesta: Agregar a la lista en curso ( oCes )
   Interfaz: Activar subcontrol del contenedor de formularios ( SEPARADOR, PESTAÑA2 )

```

Con esto consigues demorar la carga del detalle en la Rejilla de la pestaña FRM\_DETALLE.

En este ejemplo iniciamos el proceso en 2P desde el post-ini de FRM\_DATOS pero puede hacerse en cualquier momento, incluso que lo lanze un botón. Recuerda siempre poner en marcha el Timer.

Hay otra forma de hacerlo mediante el API pero eso ya es otro tema.

Saludos  
Paco Satué

---

<div class="post-metadata">

**Author:** ![gontorre](https://yyz1.discourse-cdn.com/flex035/user_avatar/foros.velneo.com/gontorre/32/5728_2.png) [@gontorre](https://foros.velneo.com/u/gontorre)\
**Post date:** [27 Febrero, 2015 13:04 UTC](https://foros.velneo.com/t/refrescar-vista-de-datos-desde-pestana-de-separador-de-formularios/7836/3 "2015-02-27T13:04:00Z")

</div>

Gracias Paco,

Funciona de fábula.

Lo del lanzar el proceso en 2º plano supongo que lo haces por si la carga es de muchos datos. En mi caso son ficheros muy pequeños porque se trata de carga las líneas de un pedido. Serán a lo sumo 15 0 20 líneas. Lo hago en primer plano y es instantáneo.

De nuevo gracias y un saludo

Gonzalo Torre

---

<div class="post-metadata">

**Author:** ![pacosatu](https://yyz1.discourse-cdn.com/flex035/user_avatar/foros.velneo.com/pacosatu/32/5131_2.png) [@pacosatu](https://foros.velneo.com/u/pacosatu)\
**Post date:** [27 Febrero, 2015 13:21 UTC](https://foros.velneo.com/t/refrescar-vista-de-datos-desde-pestana-de-separador-de-formularios/7836/4 "2015-02-27T13:21:24Z")

</div>

Hola Gonzalo.

Sí efectivamente, el proceso se ejecuta en 2º plano porque de lo contrario se congelaría la visualización del formulario y quedaría un efecto poco estético. Solo es necesario para procesos largos o en redes lentas. En tu caso, para un proceso corto y en primer plano el Timer solo nos servirá para lanzar el evento ON\_TIMER\_PESTAÑA en el formulario principal. Puedes poner el valor de Timer tan pequeño como quieras (por ejem 10mseg).

Me alegro que haya funcionado.  
Saludos  
Paco Satué

---

<div class="post-metadata">

**Author:** ![tic-software](https://avatars.discourse-cdn.com/v4/letter/t/c4cdca/32.png) [@tic-software](https://foros.velneo.com/u/tic-software)\
**Post date:** [27 Febrero, 2015 16:49 UTC](https://foros.velneo.com/t/refrescar-vista-de-datos-desde-pestana-de-separador-de-formularios/7836/5 "2015-02-27T16:49:00Z")

</div>

No sé si lo he entendido bien, lo que quieres es refrescar una rejilla que está en otro subformulario de un separador.

Si es eso, yo a veces lo he hecho de forma guarrilla en js.

Si como dice Paco tenemos FRM\_PRINCIPAL con un separador de 2 formularios FRM\_DATOS y FRM\_DETALLE al que llamamos SEPARADOR

FRM\_DETALLE tiene la rejilla, que llamamos REJILLA.  
FRM\_DATOS tiene el manejador que carga desde excel.

En FRM\_DETALLE:

1. Creamos un manejador V7 llamado REFRESCA\_REJILLA

Interfaz: Recalcular(REJILLA)

1. Creamos un botón llamado BTN\_REFRESCAR invisible (con condición de visible 0) que ejecuta el manejador anterior

En FRM\_DATOS:

1. Creamos un manejador JS llamado REFRESCAR\_DETALLE

theMainWindow.currentView().centralWidget().control(“SEPARADOR”).form(“FRM\_DETALLE”).control(“BTN\_REFRESCAR”).click();

Cuando quieras refrescar la rejilla del otro subformulario simplemente llamas a ese manejador.

---

<div class="post-metadata">

**Author:** ![pacosatu](https://yyz1.discourse-cdn.com/flex035/user_avatar/foros.velneo.com/pacosatu/32/5131_2.png) [@pacosatu](https://foros.velneo.com/u/pacosatu)\
**Post date:** [27 Febrero, 2015 17:26 UTC](https://foros.velneo.com/t/refrescar-vista-de-datos-desde-pestana-de-separador-de-formularios/7836/6 "2015-02-27T17:26:10Z")

</div>

Hola info()

OK, esa sería la forma de hacerlo mediante el API.  
Yo quería exponer una forma puramente Velneo (a excepción de Iniciar/Parar el Timer).

De todas formas, ¡¡OJO!!  
La función theMainWindow.currentView() solo es operativa para formularios en modo Vista. Cuando FRM\_PRINCIPAL es un formulario en modo Diálogo ya no podemos acceder a él desde el objeto theMainWindow.

Está claro que debe mejorar mucho el Gestor de eventos de Velneo para que este tipo de cosas sea algo trivial.

Saludos  
Paco Satué

---

<div class="post-metadata">

**Author:** ![tic-software](https://avatars.discourse-cdn.com/v4/letter/t/c4cdca/32.png) [@tic-software](https://foros.velneo.com/u/tic-software)\
**Post date:** [27 Febrero, 2015 19:03 UTC](https://foros.velneo.com/t/refrescar-vista-de-datos-desde-pestana-de-separador-de-formularios/7836/7 "2015-02-27T19:03:55Z")

</div>

Cierto, en modal se fastidiará el invento. ¿Se te ocurre con qué objeto acceder al formulario modal en curso ?

---

<div class="post-metadata">

**Author:** ![pacosatu](https://yyz1.discourse-cdn.com/flex035/user_avatar/foros.velneo.com/pacosatu/32/5131_2.png) [@pacosatu](https://foros.velneo.com/u/pacosatu)\
**Post date:** [1 Marzo, 2015 22:38 UTC](https://foros.velneo.com/t/refrescar-vista-de-datos-desde-pestana-de-separador-de-formularios/7836/8 "2015-03-01T22:38:18Z")

</div>

Hola info.

En realidad, no creo que necesitemos nunca acceder a un formulario modal desde fuera de éste, ya que el resto de la Aplicación queda a la expectativa de que confirmemos el formulario modal.  
Lo que sí necesitaremos es interactuar entre los subobjetos contenidos dentro del formulario modal.

Para ello tenemos las funciones VFormDataView.mainForm() que devuelve el Formulario principal desde cualquier subFormulario y la función VAbstractDataView.parentDataView() que devolverá el objeto Contenedor del subObjeto actual.

Así, el ejemplo que nos ocupa, usando el API quedaría:  
theRoot.dataView().mainForm().control(“SEPARADOR”).form(“FRM\_DETALLE”).control(“BTN\_REFRESCAR”).click()

Saludos  
Paco Satué

---

<div class="post-metadata">

**Author:** ![ramiroperezacebo](https://avatars.discourse-cdn.com/v4/letter/r/50afbb/32.png) [@ramiroperezacebo](https://foros.velneo.com/u/ramiroperezacebo)\
**Post date:** [2 Marzo, 2015 18:03 UTC](https://foros.velneo.com/t/refrescar-vista-de-datos-desde-pestana-de-separador-de-formularios/7836/9 "2015-03-02T18:03:27Z")

</div>

Buenas:

El problema de este problema es que la solución (JavaScript) no es una solución…

Mientras la estructura interna no permita que un hijo (pestaña de formulario, formulario de una pila, etc) acceda con código nativo V7 a las propiedades y eventos de sus hermanos (otras pestañas, otros formularios de la pila, etc) a través del formulario padre, estaremos a los pies de los caballos.

JavaScript no refactoriza y la documentación del API es horrenda. Malos mimbres…

El problema del problema es que no parece que vaya a tener solución… Life is soft.

Saludos. Ramiro

---

<div class="post-metadata">

**Author:** ![tic-software](https://avatars.discourse-cdn.com/v4/letter/t/c4cdca/32.png) [@tic-software](https://foros.velneo.com/u/tic-software)\
**Post date:** [3 Marzo, 2015 09:05 UTC](https://foros.velneo.com/t/refrescar-vista-de-datos-desde-pestana-de-separador-de-formularios/7836/10 "2015-03-03T09:05:30Z")

</div>

Es cierto Ramiro, js da muchas posibilidades, pero que no refactorice y no de errores de “compilación” hace que sea delicado usarlo para muchos menesteres.

Gracias Paco, no me había dado cuenta de mainForm(), con eso lo solucionas.
