13 Feb Sincronizar vistas de datos en un formulario sin origen
Interesante la cuestión que planteaba Joaquín Daneri en este post del foro de Velneo V7. Básicamente quería sincronizar vistas de datos dentro de un formulario sin origen.
Aunque mi «padawan» Paco Satué ya ha dado un posible solución al problema planteado (usando vJavaScript) vamos a ver otra alternativa más sencilla sin utilizar vJavaScript.
El resultado final será algo parecido a esto:
Como podéis ver, dentro de un formulario sin origen, tenemos 3 vistas de datos:
- En la primera visualizamos los proyectos.
- Cuando seleccionamos un proyecto, nos aparece a la derecha el formulario con la ficha del proyecto
- En la vista de datos inferior aparecen las tareas del proyecto seleccionado.
Creando las vistas de datos
Para mostrar los registros de la primera vista de datos… nada nuevo. Un proceso con origen ninguno y destino la lista de proyectos… sin ninguna instrucción. Recordad que la carga se realiza en el manejador de evento «Refrescar» (puedes ver un ejemplo de un proceso similar en este post).
A esta primera vista de datos le vamos a llamar «PROYECTOS»
Creando los objetos necesarios
Vamos a ver los objetos que vamos a necesitar para componer nuestras vistas de datos.
Para la vista de datos que muestra el formulario de la ficha seleccionada necesitaremos
- Un Objeto Cesta de la tabla «Proyectos» que será donde dejaremos el registro del proyecto seleccionado para pasárselo a la vista de datos del formulario. La llamaremos «PROYECTOS»
- Un formulario de la tabla «Proyectos» para mostrar los datos de la ficha seleccionada en la primera vista de datos. Le llamaremos «PROYECTO«
- Un proceso con origen ninguno y destino una ficha de la tabla de proyectos (le llamaremos «FICHA_PROYECTO«) para devolver la ficha del proyecto a la vista de datos. En este proceso, procesaremos la cesta «PROYECTO«, seleccionaremos la primera ficha y la devolveremos a la salida para ser mostrada en el formulario:
- Un objeto vista de datos (le llamaremos «FICHA_PROYECTO«) que tendrá como primer objeto el proceso «FICHA_PROYECTO» y como segundo objeto el formulario «PROYECTO»
Para la vista de datos que muestra la lista de tareas del proyecto seleccionado necesitaremos
- Un proceso (vacio) con origen ninguno y destino una lista de la tabla tareas (le llamaremos «TAREAS_EMPTY«) para devolver la lista de las tareas del proyecto seleccionado
- Un proceso con origen ninguno y destino una lista de la tabla tareas (le llamaremos «TAREAS_PROYECTO_3P«) que se ejecutará en el manejador de objeto «CAMBIAR_REGISTRO» y que devolverá la tareas del proyecto seleccionado. En este proceso tendremos que crear una variable local para pasarle el proyecto seleccionado (en este caso numérica):
- Un objeto vista de datos (le llamaremos «TAREAS_PROYECTO«) que tendrá como primer objeto el proceso «TAREAS_EMPTY» y como segundo objeto un alternador o cualquier objeto de tipo lista de la tabla de tareas
Además necesitaremos crear un manejador y una conexión de evento en el formulario sin origen para controlar el cambio del registro seleccionado. Como soy un tío original, ambos objetos se van a llamar «CAMBIAR_REGISTRO«. La conexión de evento estará asociada a la señal «Item: cambio del seleccionado» del control «PROYECTO» (la primera vista de datos)
En este manejador realizamos lo siguiente
- Creamos una cesta local de la tabla tareas
- Leemos la ficha seleccionada por el usuario y guardamos su ID en la variable ‘REG_SELECT‘
- Creamos un manejador de objeto del proceso «TAREAS_PROYECTO»
- Con la instrucción «Set variable local de objeto» le pasamos al proceso que busca las tareas del proyecto el proyecto seleccionado por el usuario
- Disparemos el objeto en tercer plano y guardamos los registros devueltos en una cesta local de tareas (creada al principio del manejador
- Procesamos la lista de tareas del proyecto y le añadimos los registros guardados en la cesta de tareas.
- Limpiamos el objeto cesta «PROYECTOS» por si teníamos algún registro guardado.
- Le agregamos a la cesta la ficha del proyecto seleccionado por el usuario
- Con la instrucción «Interfaz:Recalcular (FICHA_PROYECTO)» forzamos a que se vuelva a ejecutar el proceso «FICHA_PROYECTO con lo que se procesará el contenido del objeto cesta y se devolverá la ficha al formulario.
Quisiera dar las gracias a José Luis López (Pepeto) por iluminarme para la realización de este post
Esto es todo lo que hay que hacer para poder sincronizar vistas de datos en un formulario sin origen. ¿Tienes otra alternativa? ¡Cuéntamelo mas abajo!
Juanjo Gutierrez
Posted at 14:21h, 15 febreroHola Francisco:
Ante todo muchas gracias por tu información, que me ha venido de perlas.
Llevo un montón de tiempo pegándome con lo que creo que debe ser una tontería, pero soy incapaz de resolverlo:
Si en el formulario del proyecto, junto a los botones ACEPTAR y CANCELAR, añado el botón ELIMINAR, tras el borrado de la ficha, ¿ Como puedo refrescar la vista de nuevo ?
No he querido recurrir a variables globales y timers, por supuesto, pero con acciones, señales, etc no lo veo, a no ser que deba recurrir a Javascript.
Muchas gracias y enhorabueno por tu blog y trabajos.
Un saludo, Juanjo Gutiérrez.
Gonzalo Torre
Posted at 16:17h, 15 eneroBuenas tardes Francisco,
Se me ha dado el caso de tener que hacer algo parecido a esto. La única diferencia es que el forumulario donde están las vistas de datos es con origen. He intentado adaptar tu ejemplo modificando el proceso FICHA_PROYECTO poniéndole origen ficha pero no me funciona.
Es como si cuando hago «Cesta: Procesar» no hiciera nada. Supongo que, en principio, debería funcionar igual. ¿Puedo estar haciendo algo mal?
He modificado el sistema utilizando una variable global en memoria en lugar de la cesta para almacenar la ficha en curso, y así funciona.
Un saludo
Gonzalo Torre
Gonzalo Torre
Posted at 16:52h, 15 eneroBuenas tardes de nevo,
Ya he visto el error. resulta que no había asignado ninguna rejilla al definir la cesta y por eso no funcionaba. Curioso, ¿no?