versión 11 (Modificado)
El Método de base On Exit se llama una vez cuando sale de la base.
Este método se utiliza en los siguientes entornos 4D:
4D en modo local
4D en modo remoto (del lado del cliente)
4D Desktop y 4D Interpreted Desktop
Aplicación 4D compilada y fusionada con 4D Unlimited Desktop
Nota: El Método de base On Exit NO es invocado por 4D Server.
El Método de base On Exit es invocado automáticamente por 4D; a diferencia de los métodos de proyecto, usted no puede llamar este método por programación. Sin embargo, puede ejecutarlo desde el editor de métodos. Igualmente puede utilizar subrutinas.
Se sale de una base si:
El usuario selecciona el comando Salir del menú Archivo en el entorno Diseño o desde el entorno Aplicación (Quit standard action).
Se efectúa una llamada al comando QUIT 4D.
Un plug-in 4D hace una llamada al punto de entrada QUIT 4D.
Sin importar cómo se inicie la salida de la base, 4D realiza las siguientes acciones:
Si no existe un Método de base On Exit, 4D aborta cada proceso en ejecución uno por uno, sin distinción. Si el usuario está introduciendo datos, los registros no se guardarán.
Si existe un Método de base On Exit, 4D comienza la ejecución de este método en un proceso local creado recientemente. Por lo tanto usted puede utilizar esta método base para informar a otros procesos, vía comunicación interprocesos, que deben cerrar (entrada de datos) o detener su ejecución. Observe que saldrá eventualmente de 4D el Método de base On Exit puede realizar toda la limpieza o cierre de las operaciones que usted quiera, pero no puede negarse a salir.
El Método de base On Exit es perfecto para:
Detener los procesos iniciados automáticamente cuando se abre la base.
Guardar (localmente, en el disco) preferencias o parámetros a reutilizar al comienzo de la siguiente sesión en el Método de base On Startup .
Realizar otras acciones automáticamente cada vez que se salga de la base.
Nota: No olvide que el proceso creado por el Método de base On Exit Database es un proceso local/cliente, por lo tanto no puede acceder al archivo de datos. Si el Método de base On Exit realiza una consulta o una ordenación, un cleinte 4D que está a punto de salir quedará "congelado" y en realidad no saldrá de la aplicación. Si necesita acceder a datos cuando un cliente sale de la aplicación, cree un nuevo proceso global desde el cual el Método de base On Exit pueda acceder al archivo de datos. En este caso, asegúrese de que el nuevo proceso termine correctamente antes del final de la ejecución del Método de base On Exit (utilizando por ejemplo variables interproceso).
Ejemplo
El siguiente ejemplo cubre todos los métodos utilizados en una base que sigue los eventos más importantes que ocurren durante una sesión de trabajo y escribe una descripción en un documento de de texto llamado "Diario."
El Método de base On Startup inicializa la variable interproceso <>
<>vbQuit4D, la cual señala los procesos utilizados sin importar si se está saliendo o no de la base. También crea el archivo de diario, si no existe aún.
` Método de base On Startup C_TEXT(<>vtIPMensaje) C_BOOLEAN(<>vbQuit4D) <>vbQuit4D:=False If (Test path name("Diario") # Is a document) $vhDocRef:=Create document("Diario") If (OK=1) CLOSE DOCUMENT($vhDocRef) End if End if ESCRIBIR DIARIO ("Apertura de sesión")
El método de proyecto ESCRIBIR DIARIO, utilizado como subrutina por otros métodos, escribe la información que recibe, en el archivo diario:
` Método de proyecto ESCRIBIR DIARIO ` ESCRIBIR DIARIO ( Texto ) ` ESCRIBIR DIARIO ( Descripción evento ) C_TEXT($1) C_TIME($vhDocRef) While (Semaphore("$Diario")) DELAY PROCESS(Current process;1) End while $vhDocRef:=Append document("Diario") If (OK=1) PROCESS PROPERTIES(Current process;$vsNombreProceso;$vlEstado;$vlTiempo;$vbVisible) SEND PACKET($vhDocRef;String(Current date)+Char(9)+String(Current time)+Char(9) +String(Current process)+Char(9)+$vsNombreProceso+Char(9)+$1+Char(13)) CLOSE DOCUMENT($vhDocRef) End if CLEAR SEMAPHORE("$Diario")
Note que el documento se abre y cierra cada vez. También observe que el uso de un semáforo como "protección de acceso" al documentono queremos dos procesos tratando de acceder el archivo diario al mismo tiempo.
El método de proyecto M_AGREGAR_REGISTROS se ejecuta cuando el comando de menú Agregar registro se selecciona en el entorno Aplicación:
` Método de proyecto M_AGREGAR_REGISTROS SET MENU BAR(1) Repeat ADD RECORD([Tabla1];*) If (OK=1) ESCRIBIR DIARIO ("Adición del registro #"+String(Record number([Tabla1]))+" en Tabla1") End if Until ((OK=0) | <>vbQuit4D)
Este método efectúa un bucle hasta que el usuario cancela la entrada de datos o sale de la base.
El formulario de entrada para [Tabla 1] incluye el tratamiento de los eventos On Outside Call. De manera que, incluso si un proceso está en entrada de datos, puede salir sin problemas y el usuario puede guardar o no la entrada de datos actual:
` Método de formulario [Tabla1];"Entrada" Case of : (Form event=On Outside Call) If (<>vtIPMessage="QUIT") CONFIRM("¿Quiere guardar las modificaciones realizadas a este registro?") If (OK=1) ACCEPT Else CANCEL End if End if End case
El método de proyecto M_QUIT se ejecuta cuando el comando Salir del menú Archivo se selecciona en el entorno Aplicación:
` Método de proyecto M_QUIT $vlProcessID:=New process("SALIR";32*1024;"$SALIR")
Este método utiliza un truco. Cuando se llama a QUIT 4D, el comando tiene un efecto inmediato. Por lo tanto, el proceso del cual se hace la llamada está en "modo detención" hasta que la base se cierre en realidad. Como este proceso puede ser uno de los procesos en el cual ocurre la entrada da datos, la llamada a QUIT 4D se realiza en un proceso local que empieza sólo con este propósito. Este es el método SALIR:
` Método de proyecto SALIR CONFIRM("¿Está seguro de que quiere salir?") If (OK=1) ESCRIBIR DIARIO ("Salida de la base") QUIT 4D ` QUIT 4D tiene un efecto inmediato, ninguna línea de código a continuación se ejecutará ` ... End if
Finalmente, he aquí el Método de base On Exit el cual indica a todos los procesos de usuario abiertos que "¡Es hora de salir!". La variable <>vbQuit4D toma el valor True y envía mensajes interproceso a los procesos de usuario que están realizando entrada de datos:
` Método de base On Exit <>vbQuit4D:=True Repeat $vbHecho:=True For ($vlProceso;1;Count tasks) PROCESS PROPERTIES($vlProceso;$vsNombreProceso;$vlEstado;$vlTiempo;$vbVisible) If (((($vsNombreProceso="ML_@") | ($vsNombreProceso="M_@"))) & ($vlEstado>=0)) $vbHecho:=False <>vtIPMensaje:="SALIR" BRING TO FRONT($vlProceso) CALL PROCESS($vlProceso) $vhInicio:=Current time Repeat DELAY PROCESS(Current process;60) Until ((Process state($vlProceso)<0) | ((Current time-$vhInicio)>=?00:01:00?)) End if End for Until ($vbHecho) ESCRIBIR DIARIO ("Cierre de sesión")
Nota: Los procesos que comienzan con "ML_..." o "M_..." son iniciados por comandos de menú para los cuales la propiedad Nuevo proceso ha sido seleccionada. En este ejemplo, estos son los procesos iniciados cuando se selecciona el comando de menú Agregar registro.
La prueba (Current time-$
vhInicio)>=?00:01:00? permite al método de base salir del bucle "en espera de otro proceso" si el otro proceso no actúa de inmediato.
El siguiente es un ejemplo típico de un archivo de diario producido por la base:
2/6/03 15:47:25 1 Apertura de sesión proceso principal
2/6/03 15:55:43 5 ML_1 Adición del registro #23 en Tabla1
2/6/03 5:55:46 5 ML_1 Adición del registro #24 en Tabla1
2/6/03 15:55:54 6 $DO_QUIT Salir de la base
2/6/03 15:55:58 7 $xx Cerrar sesión
Nota: $xx es el nombre del proceso local iniciado por 4D para ejecutar el Método de base On Exit.
Ver también
Método de base On Startup , QUIT 4D.