Uso avanzado de subobjetos
Drag & drop
Mediante la técnica de drag&drop (arrastrar y soltar) podremos interactuar con la base de datos, más concretamente con listas de registros de tablas.
Un típico ejemplo de uso es un proceso de facturación de albaranes; podremos programarlo de tal forma que, usando dos rejillas, una de albaranes y otra de facturas, pinchando sobre un albarán de la rejilla de albaranes, arrastrando y soltando sobre la rejilla de facturas, se ejecute el proceso de facturación del mismo.

Para su implementación será necesario lo siguiente:
Dos objetos de lista como, por ejemplo, rejillas y/o casilleros.
Un sub-objeto de tipo drop en el objeto de destino.
El proceso a ejecutar al hacer el drop en el objeto de destino.
En este tutorial vamos a desarrollar dos ejemplos, correspondientes a dos casuísticas diferentes.
Para ello vamos a partir de un pequeño proyecto para una empresa de organización de eventos, que tiene la estructura de tablas siguiente:

Contiene dos tablas maestras (ENTIDADES y EVENTOS) y una histórica de ambas (INVITADOS), que nos servirá para guardar las entidades invitadas a cada evento.
En la que cada tabla tiene la siguiente estructura:



En esta tabla destacaremos los índices CONFIRMADO y SIN_CONFIRMAR:

El índice está compuesto por los enlaces a ENTIDADES y a EVENTOS y está condicionado a que el valor del campo CONFIRMADO sea 1.

El índice es igual al anterior, excepto en la condición de indexación, que en este caso es que el campo CONFIRMADO sea 0.
Mediente la técnica del drag & drop vamos a programar dos cosas:
1) Partiendo de dos rejillas de INVITADOS a un envento, en una se mostrarán las entidades pendienes que no han confirmado su asistencia (campo CONFIRMADO = 0 ), y en otra las que la han confirmado (campo CONFIRMADO=1), de modo que podamos confirmar o no la asistencia de una entidad al evento simplemente arrastrando y soltando entre ambas rejillas.
2) Partiendo de una rejilla de ENTIDADES y una de EVENTOS poder seleccionar una o más entidades, pinchar y arrastrar sobre un evento concreto, de modo que al hacer esto se generen los registros correspondientes en la tabla de INVITADOS.
Ejemplo 1: Confirmación de invitaciones
Lo que vamos a implementar en este capítulo es la confirmación de invitaciones a un evento:
Partiendo de dos rejillas de INVITADOS a un envento, en una se mostrarán las entidades pendienes que no han confirmado su asistencia (campo CONFIRMADO = 0 ), y en otra las que la han confirmado (campo CONFIRMADO=1), de modo que podamos confirmar o no la asistencia de una entidad al evento simplemente arrastrando y soltando entre ambas rejillas.
Para este módulo tendremos que crear:
Una rejilla asociada a la tabla de Invitados.
Dos procesos, que se usarán en el formulario del evento, uno para cargar las entidades pendientes de confirmar al evento y otra para cargar las entidades confirmadas.
Un formulario asociado a la tabla de Eventos.
Un proceso a ejecutar en el drop de ambas rejillas para confirmar/anular confirmación al evento.
Propiedades de la rejilla
La rejilla la crearemos con una única columna en la que mostraremos el campo NAME del campo enlazado a Entidades:

Para ampliar información sobre la creación de las rejillas, consultar el capítulo dedicado a las rejillas.
Una vez creada la rejilla, modificaremos las propiedades siguientes:
Identificador: INVITADOS.
Estilos: Activar el valor Arrastrable para mover. Esto hará que cuando la rejilla sea el origen de drag & drop, los registros arrastrados sean quitados de la misma al hacer el drop en la rejilla de destino. Los registros arrastrados serán quitados de la lista, pero no borrados de la base de datos.
Multiselección: Seleccionar el valor Verdadero. Esto dará la posibilidad al usuario final de seleccionar más de un registro en la rejilla de origen.
Proceso para cargar los invitados al evento pendientes de confirmar
Dado que se trata de cargar los invitados pendientes de confirmar a un evento, el proceso tendrá su origen en una ficha de la tabla de Eventos y comodestino una lista de la tabla de Invitados:

Y contendrá las instrucciones siguientes:

En el proceso se hace uso del enlace plural de Eventos a Invitados por el índice SIN_CONFIRMAR.
Proceso para cargar los invitados al evento confirmados
El proceso será idéntico al anterior, salvo que el enlace plural a usar será el que usa el índice CONFIRMADO.

Formulario de eventos
Crearemos el formulario usando el asistente, con un diseño similar al siguiente:

Para ello usaremos en dicho asistente la plantilla:

En el layout vacío de la parte inferior izquierda incluiremos la rejilla de asistentes al evento pendientes de confrimar y en el de la derecha la de los confirmados. Para ello usaremos el control Objeto. Para crearlo pulsar sobre el comando
de la barra de controles del editor de formularios y crear el control dentro del layout vacío de la parte inferior izquierda del formulario:

Y modificaremos las propiedades siguientes:
Objeto 1: Seleccionaremos el proceso CARGAR_INVITACIONES_SIN_CONFIRMAR.
Objeto 2: Seleccionaremos la rejilla INVITADOS.
Una vez hecho esto se mostrara la rejilla seleccionada dentro del control:

Duplicaremos este control objeto, lo incluiremos dentro del layout vacío de la derecha y le estableceremos las propiedades siguientes:
Objeto 1: Seleccionaremos el proceso CARGAR_INVITACIONES_CONFIRMADAS.
Objeto 2: Seleccionaremos la rejilla INVITADOS.

Proceso “drop”
El campo que se usa en la tabla de Invitados para marcar una invitación como confirmada o no es un campo de tipo booelano, este tipo de campo solamente puede tener dos valores: 0 (no) y 1 (Sí). Esto nos posibilita la creación de un único proceso para confirmar o no confirmar una invitación, es deicr, para ejecutarlo al arrastrar desde la rejilla de invitaciones pendientes y soltar sobre la de invitaciones confirmadas y viceversa.
En este caso el origen y el destino serán el mismo: Una lista de la tabla de Invitados. Por tanto, estableceremos las propiedades siguientes:
Identificador: CAMBIA_ESTADO_INVITACION.
Nombre: Cambiar el estado de la invitación.
Tabla asociada: INVITADOS.
Origen: Lista.
Tabla destino: INVITADOS.
Destino: Lista.
Y el contenido del mismo será:

El proceso lo que hace es recorrer la lista de reigstros seleccionados en la rejilla de origen y modifica el campo booleano CONFIRMADO a su valor contrario !#CONFIRMADO; es decir, si el origen es la lista de invitaciones pendientes de confirmar (CONFIRMADO = 0) a los registros arrastrados les asignará un 1 al campo CONFIRMADO, y si el origen es la lista de invitaciones confirmadas, a los registros arrastrados les asignará un 0 al campo CONFIRMADO.
Finalmente, envía la lista a la salida, es decir, añadir los registros a la rejilla de destino.
Creación del subobjeto “drop” en la rejilla
Una vez programado el proceso, editaremos nuevamente las propiedades de la rejilla de INVITADOS y, en el panel de subobjetos pulsamos el botón “Añadir subobjeto”
y seleccionamos la opción Drop:

Una vez añadido el subojeto drop haremos doblc clic sobre él en el panel de subobjetos para editar sus propiedades y estableceremos las siguientes:
Tabla origen: INVITADOS.
Proceso: CAMBIA_ESTADO_INVITACION.
Una vez hecho esto, ya tendremos implementada la funcionalidad de drag & drop entre ambas rejillas:


Ejemplo 2: Creación de los registros de invitados a un evento
Lo que vamos a implementar en este ejemplo es la creación de registros de invitados a un evento.
Tomando como origen una rejilla de Entidades y como destino una rejilla de Eventos, progamaremos que al pinchar y arrastrar (drag) desde la primera y soltar (drop) en un evento de la segunda, se creen los registros en la tabla de Invitados para cada una de las entidades seleccionadas y para ese evento.
Para este módulo tendremos que crear:
Una rejilla asociada a la tabla de Entidades.
Una rejilla asociada a la tabla de Eventos.
Dos procesos, uno para cargar las entidades y otra para cargar los eventos.
Un formulario sin origen, en el que incluiremos ambas rejillas.
Un proceso a ejecutar en el drop de la rejilla de Eventos, que cree los registros en la tabla de Invitados.
Creación de las rejillas
Crearemos una rejilla asociada la tabla de Entidades
La rejilla la crearemos con una única columna en la que mostraremos el campo NAME de la entidad:

Para ampliar información sobre la creación de las rejillas, consultar el capítulo dedicado a las rejillas.
Una vez creada la rejilla, modificaremos las propiedades siguientes:
Identificador: ENTIDADES.
Estilos: Activar el valor Arrastrable para mover. Esto hará que cuando la rejilla sea el origen de drag & drop, los registros arrastrados sean quitados de la misma al hacer el drop en la rejilla de destino. Los registros arrastrados serán quitados de la lista, pero no borrados de la base de datos.
Multiselección: Seleccionar el valor Verdadero. Esto dará la posibilidad al usuario final de seleccionar más de un registro en la rejilla de origen.
Crearemos una rejilla asociada la tabla de Eventos
La rejilla la crearemos con todos los campos de la tabla:

Para ampliar información sobre la creación de las rejillas, consultar el capítulo dedicado a las rejillas.
Una vez creada la rejilla, modificaremos las propiedades siguientes:
Identificador: EVENTOS.
Proceso para cargar las entidades
Dado que la rejilla de entidades la vamos a incrustarla en un formulario sin origen, el proceso no tendrá origen y comodestino tendrá una lista de la tabla de Entidades:

Y contendrá las instrucciones siguientes:

En el proceso se carga la lista de entidades por el índice NAME (por tanto, la lista será ordenada por el nombre) y la envía a la salida del proceso.
Proceso para cargar los eventos
Dado que la rejilla de eventos la vamos a incrustarla en un formulario sin origen, el proceso no tendrá origen y comodestino tendrá una lista de la tabla de Eventos:

Y contendrá las instrucciones siguientes:

En el proceso se carga la lista de eventos por el índice FECHA, (por tanto, la lista será ordenada por la fecha del evento en orden ascendente), invierte el orden de la lista obtenida (para que la lista sea ordenada en orden descedente) y la envía a la salida del proceso.
Creación del formulario
Crearemos el formulario usando el asistente, con un diseño similar al siguiente:

Para ello usaremos en dicho asistente la plantilla:

En el layout vacío de la parte izquierda incluiremos la rejilla de entidades y en el de la derecha la de los eventos. Para ello usaremos el control Objeto. Para crearlo pulsar sobre el comando
de la barra de controles del editor de formularios y crear el control dentro del layout vacío de la parte inferior izquierda del formulario:

Y modificaremos las propiedades siguientes:
Objeto 1: Seleccionaremos el proceso CARGAR_ENTIDADES.
Objeto 2: Seleccionaremos la rejilla ENTIDADES.
Una vez hecho esto se mostrara la rejilla seleccionada dentro del control:

Duplicaremos este control objeto, lo incluiremos dentro del layout vacío de la derecha y le estableceremos las propiedades siguientes:
Objeto 1: Seleccionaremos el proceso CARGAR_EVENTOS.
Objeto 2: Seleccionaremos la rejilla EVENTOS.
Proceso “drop”
Dado que se trata de invitar entidades a un evento el origen del proceso será una lista de la tabla de Entidadesy el destino serán una lista de la tabla de Evntos. Por tanto, estableceremos las propiedades siguientes:
Identificador: ENTIDADES_AÑADIR_A_EVENTO.
Nombre: Añadir las entidades al evento seleccionado.
Tabla asociada: ENTIDADES.
Origen: Lista.
Tabla destino: EVENTOS.
Destino: Lista.
Y el contenido del mismo será:

El poceso lo primero que hace es leer la ficha sobre la que se ha hecho el drop (un registro de la tabla de Eventos), para ello hace uso del comando de instrucción Procesar ficha en memoria; este comando genera un subproceso cuyo origen es la ficha en cuestión, por eso en el mismo leemos y guardamos en una variable local su ID.
A continuación recorre la lista de entidades de origen en modo de sólo lectura y, por cada una, comprueba si ya está invitada al evento seleccionado. En caso afirmativo presentará un mensaje advirtiéndolo, en caso negativo, dará de alta el registro correspondiente en la tabla de Invitaciones.
Creación del subobjeto “drop” en la rejilla
Una vez programado el proceso, editaremos nuevamente las propiedades de la rejilla de EVENTOS y, en el panel de subobjetos pulsamos el botón “Añadir subobjeto”
y seleccionamos la opción Drop:

Una vez añadido el subojeto drop haremos doblc clic sobre él en el panel de subobjetos para editar sus propiedades y estableceremos las siguientes:
Tabla origen: ENTIDADES.
Proceso: ENTIDADES_AÑADIR_A_EVENTO.
Y ya tenemos programada la funcionalidad de drag & drop para generar las invitaciones de entidades a un evento concreto.
