refresco, formulario, updatecontrols


([N4] victorgt) #1

Hola a todos. Otra de refrescos, y ya van…

No me funciona theRoot.dataView().updateControls()

Lo de los refrescos ya me esta hartando un poco… A ver si alguien me ilumina…

Tengo un formulario sin origen, con unos cuantos controles que recogen parametros en variables locales… un par de fechas y un numerico. Nada del otro mundo… Lo abro como cuadro de dialogo…

Con esos parametros, y dentro de un MANEJADOR DE EVENTO Velneo, hago un proceso de exportacion a ficheros dbf, usando DB: Conectar (bases externas). Se supone que lo que haga el manejador es lo de menos…

Bueno, pues quiero ir mostrando al usuario el progreso de la exportacion, con mensajes, pero puestos en un control caja de texto. La idea es que salgan los mensajes en el control segun avanze el proceso.

Pues no hay manera. Haga lo que haga siempre, me actualiza la caja de texto al final, cuando termina el manejador. Y muestra de golpe todos los mensajes, no uno a uno cuando llega al punton en cuestion, que es lo que yo quiero.

Cree un manejador JS llamado REFRESH_SCREEN, que solo contiene una linea
theRoot.dataView().updateControls();

Lo llamo desde dentro del manejador de la exportacion, justo despues de actualizar la variable con los mensajes (la que muestro en la caja de texto) pero como si lloviese… ni caso…

Alguien me puede iluminar? Alguna estupidez mia en la que no caigo?

He estado probando a usar una variable global en memoria, e incluso un campo alfa de una tabla en memoria para guardar los mensajes, con la esperanza de que eso si lo refrescase, pero nada. Hace siempre lo mismo.
Muestra todos los mensajes de golpe al final.

Saludos y gracias.


([N1] wikan) #2

Y los mensajes como los obtienes??
Con Get variable objeto??
Dónde se ejecuta la exportación? cliente o servidor?


([N4] victorgt) #3

Toda la tarea se ejecuta en primer plano, desde un manejador de evento del formulario.
Los mensajes los creo yo mismo, en el manejador de evento. En concreto, la exportacion tiene
6 pasos, y quiero mostrar un mensaje al finalizar cada paso… Los mensajes los concateno en
una variable local, la cual muestro en una caja de texto.

Para la exportacion uso ODBC en el cliente, en primer plano todo…

Supongo que lo que haga el evento es lo de menos. Podria simularse muy facil usando 6 Espera(2000), por ejemplo.
O sea, seis etapas de dos segundos… Ni a tiros consigo sacar el mensaje cada dos segundos… Todos al final de golpe.

Uso Velneo 15.2

Saludos.


([N1] wikan) #4

Si te entiendo bien, todo el proceso se hace desde un solo manejador de eventos del formulario. Es muy posible que el valor de la variable no veas que cambie por que hasta que termine el proceso no se “refresquen” los controles aunque lo pongas dentro del propio manejador. O quizás más probable, el valor de la variable no es devuelto.

No se si te funciona dividir los 6 pasos en 6 manejadores y tener otro que sea el que vaya llamando a los 6. Puede que intercalando el modificar la variable en medio de cada llamada te funcione.

Son todos supociones, habría que probarlo.


([N4] victorgt) #5

Gracias Manuel. Si. Lo has entendido bien. Todo se hace en un mismo manejador de evento del formulario.

Lo de dividir la tarea en 6 eventos y llamarlos desde uno principal, seguro que ayuda, pero no estoy por la labor, al menos ahora…

Seguramente no consigo que refresque por uno de los motivos que tu citas. Tienen “algo” de sentido…

Pa soporte, que para eso esta… Necesito tener esto claro y no perder mas tiempo con los puñeteros refrescos.

Saludos.


([N1] wikan) #6

Hombre, ellos te dirán mejor yo. Yo solo te digo de intuición.


([N3] pacosatu) #7

Hola Manuel, Víctor.

Tenéis razón.
Los manejadores de Velneo se ejecutan siempre en 1P y toman el control del hilo principal de ejecución del formulario, quedando la parte gráfica congelada. Por lo tanto todo lo que se haga en el manejador queda en una cola de eventos que se ejecutan cuando termina el manejador.

Tienes que plantear el problema de otra forma:

Ejecuta un proceso PRO_LANZADOR que ejecuta lo sigueinte:

  • Un proceso en 2P llamado PRO_PROCESO_2P
  • A continuacion muestra un formulario modal con las barras o valores de progreso. FRM_ENTRETENEDOR

El proceso PRO_PROCESO_2P irá ejecutando la exportación en 2P y guardará el progreso de ejecución en una o varias variables globales GPRO_POR1, GPRO_POR2, … Cuando termine la exportación tendrás también que indicarlo en otra variable global GPRO_END y lo mismo con un error GPRO_ERROR.

El formulario modal FRM_ENTRETENEDOR tendrá un Timer (200msg aunque habrá que ajustarlo) que ejecuta un manejador de evento para actualizar la barra o los valores de progreso que obtendrás leyendo las variables globales.
Observa que el Timer lanza un manejador y en este caso sí funciona el refresco.
Una vez que GPRO_END = 1 ya puedes cerrar FRM_ENTRETENEDOR y seguir con otra cosa.

De todas formas esto es algo parecido (aunque mucho más simple) a cuando muestras la Ventana de procesos en 2P en VClient.

Yo ya me enfrenté con algo mucho más rebuscado y tienes una muestra en:
vatp://pruebas:pruebas@v7cloud6.velneo.com:8894/0PS_Varios_iapp (Porcesos en 3P - pulsa Ctrl+F1 para ver ayuda).

Si no te quieres liar mucho puedes simplemente usar los comandos de Velneo “Cambiar título de la transacción” y “Cambiar porcentaje realizado del proceso”. Lo haces por cada exportación y queda bastante bien funcionando perfectamente en 1P.

Saludos
Paco Satué


([N1] wikan) #8

Buenas, nunca he sabido cuando usar esto.

En la clase VApp esta el método processEvents no si quizás en de updateControls usas este…

Quizás es la situación en la que se usa. Y aquí es donde le doy toda la razón a Paco, cero documentación o un ejemplo de código debajo de cada método.


([N3] pacosatu) #9

Hola Manuel.

Esa es precisamente la función que necesitamos theApp.processEvents(), si funciona, claro.
Seguramente funciona en procesos pero NO en los manejadores de un formulario para refrescar variables locales.
Por lo tanto habrá que probarlo guardando los valores del progreso de porcentaje en Variables Globales y asignarlas a controles del formulario. Así probablemente funcionará porque las Variables Globales son objetos de theApp.

Como siempre a prueba y error.
Saludos
Paco Satué


([N4] victorgt) #10

Gracias, Manuel, Paco.

Voy a esperar a ver que me dice soporte. Despues hare algunas puebas mas y os cuento.

Saludos.


([N4] victorgt) #11

Bueno, os cuento…

Segun soporte de velneo, y esto si lo pone la documentacion, “durante la ejecucion de un manejador de evento de un formulario, NO SE REFRESCA EL INTERFACE”. Asi de facil…

PERO… utilizando la informacion de Paco…

Si añado theApp.processEvents() a mi evento de refresco, funciona OK incluso con variable locales…

Mi evento MEV_REFRESH_SCREEN ahora queda asi:
theRoot.dataView().updateControls();
theApp.processEvents();

Primero probe con una variable global alfa en memoria para los mensajes. Y funciono OK a la primera. Despues cambie a una variable local alfa, y tambien funciona.

Saludos.