Cómo dominar los procesos en tercer plano

En el artículo de voy a intentar responder a la duda planteada por Mauricio González en el foro de Velneo V7 sobre los procesos en tercer plano. Primero, como siempre, vamos a ver algo de teoría sobre qué es un proceso y los planos de ejecución de Velneo V7.

Un poco de teoría sobre procesos

Procesos en tercer plano

Dentro del “Seminario básico Velneo V7” hay una parte específica dedicado a este objeto y lo defino como “un objeto contenedor de instrucciones definible por el programador“. Además de saber qué es un proceso hay que tener en consideración 2 aspectos FUNDAMENTALES a la hora de definir un proceso:

    • Plano de ejecución: un proceso lo podemos lanzar en primer, segundo o tercer plano dependiendo de si queremos que se ejecute en la máquina cliente o en el servidor

Primer plano: lo ejecuta el vClient por lo tanto se ejecutará en la máquina cliente. El usuario no puede seguir trabajando mientras se ejecuta el proceso.
Segundo plano: lo lanza también el vClient pero lo lanza en un hilo distinto al de la ejecución. A nivel de interfaz no notas que se está ejecutando. El usuario puede seguir trabajando mientras se ejecuta el proceso.
Tercer plano: se ejecuta en el vServer por lo tanto es visible en el cliente cuando termina… Es mucho más óptimo y rápido para nuestras aplicaciones.

    • Flujo: el proceso tiene una entrada y una salida, es decir, un origen ficha, lista o ninguno y una tabla asociada, y un destino ficha, lista o ninguno y una tabla asociada

* Puedes ver mas información a este respecto en este documento

Hasta aquí todo muy bonito… pero ¿y si queremos lanzar una búsqueda dentro del proceso? Lo lógico es lanzarlo en tercer plano ¿y si además queremos pasarle parámetros?… pues parece que la cosa se complica ¿o no?

Manejando objetos dentro de los procesos

Una de las primeras ideas que se nos ocurrirán cuando queramos pasar algún valor de primer a tercer plano es utilizar variables globales. ¡¡Gran error!! Si son en memoria simplemente no funcionarán ¿recuerdas los planos de ejecución? Pues también se aplican para las variables. Y si son en disco error aún mas grande. No hay que abusar de las variables globales en disco. Además serán compartidas por todos los usuarios. Vaya panorama mas negro que se nos presenta… entonces ¿cuál es la solución? El manejador de objetos.

Buscar registros de forma óptima en tercer plano

Vamos a lanzar desde un proceso en primer plano, un proceso en tercer plano mediante un manejador que nos ejecute una búsqueda (con una serie de parámetros) y nos devuelva la lista de registros encontrados.
Y pensarás ¡¡como se complica la vida este tío pudiendo lanzar directamente desde el proceso en primer plano el manejador con la búsqueda en tercer plano!!… Siento desilusionarte Un proceso en primer plano que lance un manejador de objetos con una búsqueda en tercer plano no funcionará…. o mejor dicho funcionará pero la búsqueda se lanzará en primer plano.. Algún bug también tiene que tener Velneo ¿no?

Vamos a suponer que tenemos una tabla de “PEDIDOS”, que tiene entre otros, los siguientes campos:

    • ID: de tipo numérico y en la propiedad “Genera Clave” siguiente al ultimo
    • Fecha: por defecto toma la fecha en la que se ha creado el pedido
    • Estado: campo enlazado a una tabla estática para indicar el estado en el que se encuentra el pedido. Los posibles valores son:

– P: Pendiente de recibir
– Q: Parcialmente recibido
– R: Recibido
– C: Cancelado

    • Tipo de pedido: campo enlazado a una tabla estática que indica si es un pedido o una previsión de compra. Los posibles valores son:

– 1: Pedido
– 2: Previsión de compra

Además vamos a suponer también que tenemos un índice por cada uno de esos campos (creo que estoy suponiendo demasiado).

Petición de datos para procesos

Lo que queremos conseguir es que al introducir algún valor en los datos de la “Búsqueda avanzada” de pedidos, estado, tipo de pedido, o fechas (el dato para buscar por artículos utiliza índices complejos… de los que ya hablaremos a su momento) se lance la búsqueda y nos devuelva aquellos pedidos que cumplan los criterios de búsqueda.

Vamos a comenzar creando los objetos necesarios

Creando la búsqueda

Lo primero es crear una búsqueda de la tabla “PEDIDOS”. La vamos a llamar “PED_CM_ID“.

Vamos a crear también 4 variables locales a la búsqueda. Estas variables servirán posteriormente para pasarle los parámetros de búsqueda desde el formulario:

  • ESTADO: de tipo alfabético
  • TP_PEDIDO: de tipo alfabético
  • FCH_DESDE: de tipo alfabético
  • FCH_HASTA: de tipo alfabético

Ahora vamos a añadirle unos cuantos componentes… Mas o menos quedará así:

Componentes de búsqueda

Como no queremos que siempre se lancen todos los componentes de la búsqueda (si el usuario no ha introducido nada en el campo correspondiente del formulario… para que vamos a buscar nada) vamos a condicionar estos componentes ¡¡ahhhhhh y esto como se hace!! Pues con las variables locales que hemos creado anteriormente:

  • Para condicionar el componente “TP_PEDIDO” simplemente ponemos en la propiedad “Condición activo” la variable TP_PEDIDO. Dicho en cristiano, que sólo se active este componente si le han pasado a la búsqueda algún valor en la variable TP_PEDIDO
  • Para condicionar el componente “ESTADO”, ponemos en la propiedad “Condición activo” la siguiente fórmula: (( ESTADO = “P” ) | ( ESTADO = “Q” ) | ( ESTADO = “R” ) | ( ESTADO = “C” )). Dicho también en cristiano, que sólo se active este componente si le han pasado a la búsqueda algún valor en la variable ESTADO
  • Por último vamos a condicionar el componente “FECHA”. Sólo se activará si le pasan a la búsqueda algún valor en la variable FCH_DESDE y FCH_HASTA. Para ello vamos a poner la siguiente fórmula en la “Condición activo”: ( ! isEmpty(FCH_DESDE)) & ( ! isEmpty(FCH_HASTA))

Creando el proceso que lanzará la búsqueda

Vamos a crear ahora el proceso que lanzará la búsqueda a través de un manejador de objeto. Al proceso lo vamos a llamar “PED_CM_REFRESCAR_3P“. Este proceso tendrá como “Tabla asociada” la tabla “FILTROS” (es la que uso para convertir un formulario sin origen en un formulario con componentes de búsqueda) y como “Origen” será una ficha. Como “Tabla destino” tendrá la tabla de “PEDIDOS” y como “Destino” será una lista. Este es el proceso:

Proceso con búsqueda

Como podéis observar, creamos el manejador de objetos de la búsqueda y con la instrucción “Set variable local de objeto” le vamos pasando a la búsqueda los valores que el usuario ha introducido en el formulario. Para finalizar este proceso, disparamos el objeto creado al comienzo (la búsqueda) en tercer plano y añadimos la lista de los registros encontrados a la salida.

Para que este proceso funcione, habrá que crear las variables locales correspondientes en el proceso. No os olvidéis de asignarles el tipo correcto.

Vale ya tenemos el proceso que se ejecutará en tercer plano… pero tendremos que llamar a este proceso desde algún sitio y además tendremos que alimentar a las variables que a su vez alimentarán la búsqueda.

Creando el evento que lanzará el proceso en tercer plano

Lo más lógico en este caso es crear un evento en el formulario de PEDIDOS que llame al proceso PED_CM_REFRESCAR_3P lance el manejador con la búsqueda y nos devuelva los registros encontrados para mostrarlos en la rejilla correspondiente.

Vamos a ello. Creamos un evento llamado “REFRESCAR” que tendrá las siguientes instrucciones:

Evento refrescar

  • Primero creamos una cesta local de la tabla de PEDIDOS (PED_CM). En esta cesta se depositarán los registros devueltos por la búsqueda para posteriormente “pasárselos” a la vista de datos que contiene la rejilla en el formulario
  • Inicializamos las variables de búsqueda (que previamente habremos creado) con los valores que el usuario ha introducido en el formulario. En este ejemplo tengo dentro del mismo formulario dos tipos de búsqueda, por eso condiciono la variable con la instrucción choose. Recordad crear las variables con el mismo tipo del dato de la tabla.
  • Creamos un manejador de objeto del proceso PED_CM_REFRESCAR_3P
  • Con la instrucción “Set variable local de objeto” le pasamos al proceso el valor que el usuario ha introducido en los campos del formulario. Para ello nos apoyamos en las variables locales creadas en el evento.
  • A continuación lanzamos la instrucción mas importante de todo este montaje: “Dispara objeto”… se lanza el proceso creado en el manejador… EN TERCER PLANO. Esta instrucción lanzará el proceso en el servidor, se disparará la búsqueda asociada (con los valores que le hayamos pasado y devolverá los registros que encuentre.
  • Con la instrucción “Cesta: Agregar lista a la cesta“, se añadirán a la cesta local creada al comienzo de este evento los registros que nos devuelva el proceso en tercer plano.
  • ¿Qué hace la instrucción “Interfaz: Procesar control“?… Nos permite trabajar, en este caso con el control vista de datos (se llama CONTROL) que incluye la rejilla de pedidos en el formulario.
  • La instrucción “Cortar lista” sirve para “limpiar” la rejilla de pedidos
  • Por último la instrucción “Cesta: Agregar a la lista en curso permite “pasarle” a la vista de datos que contiene la rejilla los registros devueltos por el proceso en tercer plano que estaban guardados en la cesta

Con esto hemos conseguido el propósito de lanzar desde un evento, un proceso que lance una búsqueda de una forma correcta y óptima.

¿Te ha quedado alguna duda? Cuéntame brevemente con un comentario qué errores cometías a la hora de lanzar procesos en tercer plano

Francisco José Vila Martín
ayudavelneo@ayudavelneo.com

Francisco José Vila es programador certificado y formador en la plataforma de desarrollo de aplicaciones empresariales Velneo V7. Es autor del blog Ayudavelneo desde donde ayuda a desarrolladores que se están iniciando en Velneo V7 a acortar su curva de aprendizaje para que obtengan beneficios y sean rentables desde el minuto 1. Ampliar información

2 Comments
  • Veldevelop
    Posted at 05:29h, 18 Octubre Responder

    Si señor,muy buen articulo, esto es lo que yo llamo guía para torpes muy torpes como yo.

Post A Comment

Pin It on Pinterest