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é