¡CALL PROCESS puede ser reflexivo!
En principio, el comando CALL PROCESS se utiliza para hacer lo que su nombre indica: alertar a otro proceso para actuar de acuerdo a lo que acaba de ocurrir en el proceso actual, por ejemplo actualizar una ventana de tipo paleta. Cuando recibe el aviso, el proceso de destino puede efectuar toda una serie de acciones, desde la más sencilla a la más compleja, e incluso terminarse.
Si bien CALL PROCESS es un comando común, el siguiente código no lo es tanto:
CALL PROCESS (Current process)
Este código pide al proceso actual que se llame a sí mismo. ¿Para qué hacerlo, teniendo en cuenta que por definición podemos disparar cualquier acción dentro del proceso gracias a los métodos de formulario y de objeto? La razón es que hay casos en los que es la única o más sencilla forma de realizar lo que queremos. Lo vamos a examinar en el siguiente ejemplo:

Este listado está compuesto de dos formularios:
- Un formulario de entrada de tipo Diálogo que contiene los botones y los elementos de la parte superior
- Un subformulario que contiene el listado de registros, incluyendo los títulos de columna
Este formulario no se llama con el clásico MODIFY SELECTION sino con un DIALOG o un ADD RECORD sobre la tabla que contiene el formulario de entrada.

El subformulario permite gestionar las preferencias de ordenación del usuario por un simple clic en un título de columna.
- Un clic en un encabezado de columna permite ordenar por el campo correspondiente.
- Además, cada clic cambia de forma inversa alternativamente el sentido de ordenación actual, creciente o decreciente.
En cada encabezado se encuentran dos imágenes de flecha (hacia abajo y hacia arriba) y un botón invisible sobre todo el ancho de la columna.

En cada clic se hace visible una u otra flecha en la columna correspondiente.
Además del sentido de orden, el usuario puede modificar el ancho de las columnas desplazando los separadores entre las mismas, cambiar el color alternado de las filas, etc. y todas sus preferencias se almacenan en un blob en su registro de usuario, de tal forma que encuentre exactamente los mismos ajustes la próxima vez que abra este formulario.
Por si se encuentra perdido, o ha hecho cambios involuntarios, el botón de Preferencias en la esquina inferior izquierda del formulario le permite regresar a los ajustes por defecto, borrando sus preferencias personales.
Es decir:
- Restablecemos el ancho de columnas estándar
- Ordenamos por la columna por defecto (Nombre)
- Ponemos el sentido de orden a creciente ocultando todas las flechas y mostrando la flecha superior de la columna Nombre con el comando SET VISIBLE
Todos los pasos de esta operación son fáciles de hacer excepto uno: hacer visible la flecha.
Cualquier actualización que hagamos no comportará la actualización de las flechas y tendremos un listado bien ordenado pero con las flechas mal puestas.

La razón es sencilla, ya que el comando SET VISIBLE toca a objetos del subformulario y no tiene efecto si está llamado desde el formulario maestro o uno de sus objetos. Para que funcione correctamente, el comando debe ser invocado desde el método de subformulario o un método de objeto del mismo (como los botones invisibles de cabecera). Pero la opción de restablecer las opciones por defecto, por lógica de interfaz, no puede estar dentro del subformulario.
La respuesta viene de CALL PROCESS. En el método del botón de Preferencias, llamamos al proceso actual con CALL PROCESS (current process) y vigilamos el evento On Outside call en el método del subformulario.
Desde allí, cuando se detecta la llamada, disparamos el código que contiene los SET VISIBLE, y todo vuelve a funcionar normalmente. Sencillo y eficaz…
Publicado el 23 Julio, 2007 por redaccion | | Imprime este artículo