Formulario sin origen, dos rejillas y una ficha

Buenas, tengo un formulario sin origen con una búsqueda y una rejilla con el listado de usuarios, lo que necesito es dentro del mismo formulario a la derecha poder ver la ficha según el registro en la cual estoy posicionado de la rejilla y ademas debajo ver otra rejilla con las tareas de ese usuario.

El multivista me muestra exáctamente lo que necesito, pero no me permite ubicar una rejilla y la ficha correspondiente en el margen superior y otra rejilla en todo el margen inferior, ya que solo maneja modo horizontal o vertical.

Como puedo resolver esto?, no quiero poner separador de formularios porque necesito que se visualice todo en una misma pantalla.

Agradezco sus comentarios
Saludos
Joaquín Daneri

Buenas, te comento hasta lo que sé.
Supongo que todo se soluciona con vista de datos, de tal manera que ahora tendras el formulario sin origen y dos vistas de datos con las rejillas, ahora lo que necesitas es otra vista de datos con un formulario de ficha.
He llegado a la conclusión que solo en las vistas de datos se visualizan listas.
Por lo tanto la única solución que encuentro es en esta vista de datos visualizar un casillero con una única casilla, en la cual visualizas la ficha habiendo obtenido previamente una lista con el único elemento que quieres visualizar.
Espero que no haya sido tedioso.

Si entiendo, bueno veo como lo puedo organizar, gracias Ramón

Hola Joaquín.

Estuve haciendo un ejercicio sobre este tema, que parece sencillo, pero como muchas cosas en Velneo, se complica bastante si no tienes los conceptos claros.

Te cuento mi solución:
Tenemos 2 tablas: Cabeceras CAB y Líneas LIN.

  • Queremos ver la Rejilla de las Cabeceras GRD_CAB (todas o por búsqueda).
  • Queremos ver la Rejilla de las Líneas GRD_LIN que son plurales de la Cabecera seleccionada en la Rejilla GRD_CAB.
  • Queremos ver la Ficha FRM_CAB de la Cabecera seleccionada en GRD_CAB y además que esta Ficha sea editable.
  • La idea del Casillero es buena y más sencilla. Lo voy a complicar con el formulario y así se puede editar directamente.
  • Tenemos entonces 3 Vistas de Datos colocadas en el formulario principal (Sin origen) de la siguiente manera: GRD_CAB y FRM_CAB arriba y GRD_LIN abajo.

Las 3 Vistas de datos se alimentan por proceso de la forma habitual, GRD_CAB a partir de una búsqueda, GRD_LIN se alimenta con una Lista vacía y FRM_CAB de forma dinámica a partir de la Ficha obtenida mediante JavaScript.

Para llenar las Vistas de datos, ejecutamos el manejador de evento VER_DATOS que por un lado, llena GRD_LIN con los plurales y por otro, recalcula FRM_CAB.

Manejador de evento VER_DATOS


// Creamos 2 Cestas para guardar la Cabecera seleccionda y las Líneas
Cesta: Crear cesta local ( CABECERAS@0PS_Ejercicios_dat, Cabecera )
Cesta: Crear cesta local ( LINEAS@0PS_Ejercicios_dat, Lineas )
// Obtenemos la Ficha seleccionada en la Rejilla
Interfaz: Procesar ( GRD_LISTA, Todas )
_Leer ficha seleccionada
__Set ( FICHA_NOMBRE, #NAME )
__Set ( FICHA_ID, #ID )
// Guardamos la Ficha seleccionada y los Plurales
__Cesta: Agregar ficha a la cesta ( Cabecera )
__Cargar plurales ( LINEAS_ID )
____Cesta: Agregar lista a la cesta ( Lineas )
// Añadimos las Líneas a la Rejilla
Interfaz: Procesar ( GRD_LIN, Todas )
__Cortar lista ( 0, )
__Cesta: Agregar a la lista en curso ( Lineas )
// La Ficha seleccionada en la Cesta Cabecera no se cómo añadirla a FRM_CAB
// No quiero usar una Variable Global que guarde #ID
// Usamos código dinámico con JS en el proceso de la Vista de Datos RM_CAB
Interfaz: Recalcular ( FRM_CAB )
// Otra opción es ejecutar el Manejedor de evento y alimentar FRM_CAB con una Ficha vacía
// Ejecutar manejador de evento (FRM_CAB_ACTUALIZA)


El manejedor de evento VER_DATOS se dispara con el evento “Item: cambio de seleccionado” de GRD_CAB

El proceso JS que alimenta FRM_CAB es el siguiente:


// Se obtiene la vista en curso
var oVista = theMainWindow.currentView();
if (oVista)
// Cuando se crea FRM_CAB el objeto oVista no existe todavía
{
// Cogemos el objeto “root” de la vista
var oRoot = oVista.root();
if (oRoot)
{
// Formulario principal
var oForm = oRoot.dataView();
// Objeto Lista
var oLista = new VRegisterList(theRoot);
// Asignamos la Tabla asociada a la Lista
oLista.setTable(“0PS_Ejercicios_dat/CABECERAS”);
// Ejecutamos la búsqueda del ID
oLista.load(“ID”,[oRoot.varToInt(“FICHA_ID”)]);
if (oLista.size() > 0)
{
var oRegistro = oLista.readAt(0);
// Le pasamos la Ficha al formulario
theRegisterOut.copyFrom(oRegistro)
}}}


También podemos hacer esto anterior desde un Manejador de Evento JS:
Menejador de evento FRM_CAB_ACTUALIZA


// Formulario principal
var oForm = theRoot.dataView();
// Objeto Lista
var oLista = new VRegisterList(theRoot);
// Asignamos la Tabla asociada a la Lista
oLista.setTable(“0PS_Ejercicios_dat/CABECERAS”);
// Ejecutamos la búsqueda del ID
oLista.load(“ID”,[theRoot.varToInt(“FICHA_ID”)]);
if (oLista.size() > 0)
{
var oRegistro = oLista.readAt(0);
// Referencia al control Vista de datos del subformulario
var oSubForm = oForm.control(“FRM_CABECERA”);
if (oSubForm)
{
oSubForm.setRegister(oRegistro);
}}

Bueno, me ha quedado un poco largo, pero creo que se ven varios conceptos que aclaran el uso de JS con Fichas y Listas. Este código no está en producción, así que hay que probarlo con calma.

Saludos
Paco Satué

Muchas gracias Paco por la dedicación para ejemplificar el caso. lo voy a poner en práctica.

Saludos
Joaquín Daneri

Hola:

Aquí tenéis mi aportación.

Un saludo

Hola Vila.

He tenido que buscar en la Wikipedia lo de “padawan” porque en mi pueblo no sé cómo se lo tomarían.

Fuera bromas, la consulta de Joaquin era un buen ejemplo de ejercicio con Velneo, que ni de lejos se ve en los cursos y seminarios de Velneo.

El problema está en cómo refrescar la Vista de datos Formulario.

Mi reto era resolver el problema sin tener que usar objetos globales para resolver cosas concretas. No tiene nada de malo, pero me cuesta “cambiar el chip” en estas cuestiones. Yo había rechazado la opción de usar el objeto Variable Global $ID_TEMP@0PS_Ejercicios_dat para almacenar el ID de la cabecera seleccionada. Tú has elegido usar una Cesta Global PROYECTO@GTDenlanube para guardar la Ficha del proyecto seleccionado.

En un principio, parece que los objetos globales $ID_TEMP@0PS_Ejercicios_dat y la Cesta PROYECTO@GTDenlanube guardan cosas distintas, pues no, los dos guardan exactamente lo mismo: el puntero de la tabla Cabeceras correspondiente al ID seleccionado (creo que esto es así).

Si me apuras, usar la Cesta Global es más costoso en este caso, porque tendrás que definir tantas Cestas Globales como Rejillas quieras usar de esta manera. Con un solo $ID_TEMP te sirve para todos los casos.

Ahora viene la pregunta del millón y va a crear chorros de tinta, ¿qué es más óptimo?: crear muchos objetos globales en el proyecto para usos concretos al estilo de Velneo o crear scripts para usar el API de Velneo y tener más abstracción.

Que nos lo digan en Life is Soft.
Yo ya tengo la respueta …

Saludos
Paco Satué

Hola Paco:

En este ejemplo lo más lógico sería usar un multivista para las dos primeras vistas de datos (la principal y el formulario) y sincronizar en el proceso con la tercera vista de datos.

Simplemente quise realizar un ejemplo con los parámetros que había indicado Joaquín.

Un saludo

Una pregunta, que ocurre cuando en una vista de datos ponemos…
Proceso salida de ficha ( sin devolver nada )
Formulario

En el formulario tenemos una variable ID, que en la conexión pre|pos del formulario carga el registro que queremos y lo muestra en este formulario ( por vJavascript )

Cuando cambiamos en la rejilla de proyecto de item seleccionado, “seteamos” esa variable en la vista de datos hacemos un recálculo de la vista del formulario.

¿Se recálcula?

Y si no, de está manera, al cambiar el item seleccionado en la rejilla de proyectos, cargar por ID, y por media de javascript coger el control que contiene el formulario y hacerle un setRegister…

Estoy buscando la manera de no usar objetos globales

Hola Vila.

Sí por supuesto, lo más lógico es la Multivista que para eso está y además sincroniza de forma nativa, sin usar ni JS ni objetos globales.

Y ¿ Lo que hemos aprendido ?

Un abrazo. Nos vemos en la carretera de Valencia.
Paco Satué

Hola, que bueno que se ponga interesante un hilo del foro, la verdad es que no pensé en recibir tanta info, agradezco a todos. La solución brindada por Paco, creo que es muy válida pero en mi caso no tengo conocimientos de JS, y por el momento solo me remito a cortar y pegar, por lo que voy a probar la solución que aportó Vila. En principio lo había solucionado con un multivista que muestre dos columnas (lista de proyecto y ficha del proyecto) y dentro del formulario ficha proyecto le agregué en la parte inferior la lista de tareas, siendo un plural de la ficha proyecto. Así me funciona, pero no es exactamente lo que quería. Ahora voy por lo propuesto por Vila que está ejemplificado como lo necesito.
Saludos a todos.

Joaquín Daneri

Buenas Joaquín

Si he entendido lo que quieres hacer, si lo quieres hacer con multivistas, puedes:

Te creas un multivista de orientación horizontal de la tabla Usuarios donde:
1.- El primer objeto sea una rejilla de usuarios.
2.- El proceso sincronizador de Origen y Destino la ficha de Usuarios. En ese proceso pones la instrucción de añadir ficha a la salida.
3.- El Objeto 2 será el formulario de usuarios.

Ahora te creas un segundo multivista de orientación vertical de la tabla de Usuarios:
1.- El primer objeto de ese multivista será el multivista que te has creado antes.
2.- El proceso sincronizador será de Origen la ficha del usuario y de Destino la salida de tareas. En ese procesoa cargarás el plural y añadirás la lista a la salida.
3.- El objeto 2 de este multivista será tu rejilla de tareas.

En tu formulario sólo debes crear una vista de datos con tu búsqueda de usuarios y el segundo multivista creado

Con esto ya consigues tener en un primer multivista la lista de usuarios y la ficha del seleccionado y debajo una lista de las tareas del usuario seleccionado.

Espero haberme explicado bien.

Un saludo.

Hola Velasco.

Lo del Multivista con Estilo Vertical me había pasado desapercibido, y eso que está documentado.
¿Cuál es la diferencia entre una Propiedad del objeto y el Estilo del mismo?

Una solución totalmente Velneo.
Gracias Velasco.

Saludos
Paco Satué

Gracias Velasco, al igual que Paco no me di cuenta de enlazar dos multivista. Por el momento dejo la solución que aportó Francisco, ya la tengo 100% operativa, pero lo propuesto por vos lo tendré muy en cuenta.

Saludos
Joaquín Daneri

Hola y gracias a todos por las aportaciones.
Muy interesante este hilo.
Mis conclusiones son que con javascript el formulario ficha lo podemos colocar a nuestro antojo, sin embargo con multivista siempre está a la derecha de la rejilla.

Otra cuestión es que por javascript me funciona sin problema usando el codigo en el manejador de evento, sin embargo no logro que me funcione como proceso JS aplicado al formulario.

Lo que hago es una vista de datos con el proceso JS y el formulario ficha y en el evento item cambio seleccionado Interfaz recalcular vista ficha, nunca me presenta ficha id=0

Gracias.