4D v16.3

Método base On Exit

Inicio

 
4D v16.3
Método base On Exit

Método base On Exit 


 

Método base On Exit  
Este comando no requiere parámetros

  

El Método 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)
  • Aplicación 4D compilada y fusionada con 4D Volume Desktop

Nota: el Método base On Exit NO es invocado por 4D Server.

El Método 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 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 base On Exit, 4D comienza la ejecución de este método en un proceso local creado recientemente. Observe que saldrá eventualmente de 4D, el Método 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 base On Exit es perfecto para:

  • Guardar (localmente, en el disco) preferencias o parámetros a reutilizar al comienzo de la siguiente sesión en el Método 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 base On Exit es un proceso local/cliente, por lo tanto no puede acceder al archivo de datos. Si el Método base On Exit realiza una consulta o una ordenación, un cliente 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 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 base On Exit (utilizando por ejemplo variables interproceso).

Nota: en un entorno cliente/servidor, Método base On Exit se comporta de manera diferente dependiendo de si el usuario sale manualmente (vía el comando de menú Salir o una llamada al comando QUIT 4D) o que 4D Server se cierre, lo que obliga a todos los clientes a salir.
Cuando se sale de 4D Server y se da un tiempo de corte (por ejemplo, 10 minutos), cada cliente conectado muestra un mensaje de advertencia y si el usuario sale durante el período de tiempo determinado, el Método base On Exit se ejecuta normalmente. Sin embargo, en otros casos (por ejemplo, el usuario no responde a tiempo, el servidor solicita salir inmediatamente o el administrador desconecta manualmente al cliente), el Método base On Exit se ejecuta al mismo tiempo que la conexión al servidor se cierra. Como resultado, el código en Método base On Exit no puede iniciar otro proceso local o de servidor y no puede esperar a que se cancelen otros procesos (ni estos procesos pueden seguir accediendo al servidor). Si intenta hacerlo, se genera un error de red (como 10001 o 10002) ya que la conexión al servidor ya está cerrada.

Para detener correctamente los procesos en ejecución en el caso de paradas inesperadas, debe probar el comando Process aborted en cada bucle (for, while, repeat) lo que puede durar más de un segundo. Process aborted devuelve true si 4D (local, remoto o 4D Server) está a punto de salir, lo que significa que el procesamiento está a punto de detenerse de inmediato. En este caso, cancele todos los procesos (CANCEL TRANSACTION, etc.)  y salga lo más rápido posible. Aunque tiene tiempo si el usuario sale manualmente, no tiene tiempo si la aplicación es forzada a salir.

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 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 documento—no 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 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 1Apertura de sesión proceso principal
2/6/03 15:55:43 5 ML_1Adición del registro #23 en Tabla1
2/6/03 5:55:46 5 ML_1Adición del registro #24 en Tabla1
2/6/03 15:55:54 6 $DO_QUITSalir de la base
2/6/03 15:55:58 7 $xxCerrar sesión

Nota: $xx es el nombre del proceso local iniciado por 4D para ejecutar el Método base On Exit.



Ver también 

Método base On Startup
QUIT 4D

 
PROPIEDADES 

Producto: 4D
Tema: Métodos base

 
HISTORIA 

Creado por:

 
ARTICLE USAGE

Manual de lenguaje 4D ( 4D v16)
Manual de lenguaje 4D ( 4D v16.1)
Manual de lenguaje 4D ( 4D v16.2)
Manual de lenguaje 4D ( 4D v16.3)