Méthode base Sur fermeture

4D - Documentation   Français   English   German   Español   4D v11 SQL, Commandes par thèmes   4D v11 SQL, Liste alphabétique des commandes   4D v11 SQL, Constantes par thèmes   Retour   Précédent   Suivant

version 11 (Modifiée)


La Méthode base Sur fermeture est appelée une fois lorsque vous quittez la base.

Les environnements 4D suivants sont concernés :

4D en mode local

4D en mode distant

Application 4D compilée et fusionnée avec 4D VolumeDesktop

Note : La Méthode base Sur fermeture n'est PAS exécutée par 4D Server.

La Méthode base Sur fermeture est exécutée automatiquement par 4D ; à la différence des méthodes projet, vous ne pouvez pas appeler cette méthode base par programmation. Vous pouvez toutefois l'exécuter depuis l'éditeur de méthodes. Vous pouvez également utiliser des sous-routines.

On sort de la base lorsque l'un des événements suivants se produit :

L'utilisateur sélectionne la commande Quitter dans le menu Fichier en mode Développement ou Application (action standard Quitter).

Un appel à la commande QUITTER 4D a eu lieu.

Un plug-in 4D a fait appel au point d'entrée QUITTER 4D.

Quel que soit le moyen par lequel la base a été quittée, 4D accomplit les actions qui suivent :

S'il n'existe pas de méthode base Sur fermeture, 4D détruit chaque process un par un, sans distinction. Si un utilisateur est en train de saisir des données, les enregistrements ne seront pas sauvegardés.

S'il existe une méthode base Sur fermeture, 4D démarre l'exécution de cette méthode dans un process local nouvellement créé. Vous pouvez ainsi utiliser cette méthode base pour informer d'autres process, via la communication interprocess, qu'ils doivent être fermés (en cas de saisie de données) ou stopper leur exécution. Notez que 4D quittera en tout état de cause — la méthode base Sur fermeture peut assurer le nettoyage et la fermeture de toutes les opérations que vous voulez, mais la fermeture de la base est inéluctable.

La Méthode base Sur fermeture est l'emplacement idéal pour :

Stopper les process automatiquement démarrés à l'ouverture de la base.

Sauvegarder (localement, sur disque) les préferences ou paramétrages devant être réutilisés lors de la prochaine session dans la méthode base Sur ouverture.

Accomplir toute autre action que vous souhaitez exécuter automatiquement à chaque fermeture de la base.

Note: Rappelez-vous que le process créé pour la Méthode base Sur fermeture est un process client (local), qui n'existe donc pas sur le poste serveur. Par conséquent, si vous effectuez dans cette méthode base une recherche ou un tri, tout poste client qui tentera de quitter l'application restera "bloqué". Si vous avez besoin d'accéder aux données lorsque le client quitte, vous devez créer depuis cette méthode base un process global qui, lui, pourra accéder aux données. Dans ce cas toutefois, veillez à ce que ce process puisse terminer son exécution (par l'intermédaire de variables interprocess, par exemple) avant d'être stoppé par la Méthode base Sur fermeture.

Exemple

L'exemple ci-dessous liste les méthodes utilisées dans une base qui note les événements significatifs se produisant lors d'une session de travail. Les étapes sont écrites dans un document texte appelé "Journal".

La Méthode base Sur ouverture initialise la variable interprocess <>vbQuit4D, qui signale tous les process utilisés, qu'on sorte ou non de la base. Elle crée aussi le fichier journal, s'il n'existe pas déjà.

      ` Méthode base Sur ouverture
   C_TEXTE(<>vtIPMessage)
   C_BOOLEEN(<>vbQuit4D)
   <>vbQuit4D:=Faux 

   Si (Tester chemin acces("Journal") # Est un document)
      $vhDocRef:=Creer document("Journal")
      Si (OK=1)
         FERMER DOCUMENT($vhDocRef)
      Fin de si 
   Fin de si 
   ECRIRE JOURNAL ("Ouverture Session")

La méthode projet ECRIRE JOURNAL, utilisée comme sous-routine par les autres méthodes, écrit l'information qu'elle reçoit dans le fichier journal :

      ` Méthode Projet ECRIRE JOURNAL
      ` ECRIRE JOURNAL ( Texte )
      ` ECRIRE JOURNAL ( Description Evenement )
   C_TEXTE($1)
   C_HEURE($vhDocRef)

   Tant que (Semaphore("$Journal"))
      ENDORMIR PROCESS(Numero du process courant;1)
   Fin tant que 
   $vhDocRef:=Ajouter a document("Journal")
   Si (OK=1)
      INFORMATIONS PROCESS(Numero du process courant;$vsProcessNom;$vlEtat;$vlTempsEcoule;$vbVisible)
      ENVOYER PAQUET($vhDocRef;Chaine(Date du jour)+Caractere(9)+Chaine(Heure courante)+Caractere(9)+Chaine(Numero du process courant)+Caractere(9)+$vsProcessNom+Caractere(9)+$1+Caractere(13))
      FERMER DOCUMENT($vhDocRef)
   Fin de si 
   EFFACER SEMAPHORE("$Journal")

Notez que le document est ouvert et refermé à chaque fois. Notez aussi l'emploi d'un sémaphore comme "protection d'accès" au document — nous ne voulons pas que deux process essaient d'accéder au fichier journal en même temps.

La méthode projet M_AJOUT_ENRG est exécutée lorsque la commande de menu Ajouter enregistrement est sélectionnée en mode Application :

      ` Méthode Projet M_AJOUT_ENRG 

   CHANGER BARRE(1)
   Repeter
      AJOUTER ENREGISTREMENT([Table1];*)
      Si (OK=1)
         ECRIRE JOURNAL ("Ajout d'enregistrement #"+Chaine(Numero enregistrement([Table1]))+" dans Table1")
      Fin de si 
   Jusque ((OK=0) | <>vbQuit4D)

Cette méthode effectue une boucle jusqu'à ce que l'utilisateur annule la saisie de données ou que la base soit refermée.

Le formulaire entrée de la [Table1] inclut le traitement des événements Sur appel extérieur. Ainsi, même si un process est en saisie de données, on en sort "en douceur", et l'utilisateur peut sauvegarder (ou non) la saisie en cours :

      ` Méthode formulaire [Table1];"Entrée"
   Au cas ou 
      : (Evenement formulaire=Sur appel extérieur)
         Si (<>vtIPMessage="QUITTER")
            CONFIRMER("Voulez-vous sauvegarder les modifications dans cet enregistrement ?")
            Si (OK=1)
               VALIDER
            Sinon 
               NE PAS VALIDER
            Fin de si 
         Fin de si 
   Fin de cas

La méthode projet M_QUIT est exécutée lorsque la commande Quitter du menu Fichier en mode Application est sélectionnée :

      ` Méthode Projet M_QUIT
   $vlProcessID:=Nouveau process("ON_QUIT";32*1024;"$ON_QUIT")

Cette méthode utilise une astuce. Lorsque la commande QUITTER 4D est appelée, elle a un effet immédiat. En conséquence, le process dans lequel elle est appelée est placé en "mode arrêt", jusqu'à ce que la base ait été effectivement refermée. Comme ce process peut être un des process dans lequel est effectuée la saisie de données, l'appel à QUITTER 4D est réalisé dans un process local qui n'est démarré que pour ce but. Voici la méthode ON_QUIT:

      ` Méthode projet ON_QUIT 
   CONFIRMER("Etes-vous certain de vouloir quitter ?")
   Si (OK=1)
      ECRIRE JOURNAL ("Sortie de la base")
      QUITTER 4D
         ` QUITTER 4D a un effet immédiat. Aucune ligne de code n'est exécutée par la suite.
         ` ...
   Fin de si 

Enfin, voici la méthode base Sur fermeture, qui signale à tous les process utilisateur qu'"il est temps de partir !". Elle met <>vbQuit4D à Vrai et envoie des messages interprocess aux process utilisateur qui gèrent la saisie de données :

      ` Méthode base Sur fermeture
   <>vbQuit4D:=Vrai
   Repeter 
      $vbfini:=Vrai
      Boucle ($vlProcess;1;Nombre de process)
         INFORMATIONS PROCESS($vlProcess;$vsProcessNom;$vlEtat;$vlTempsEcoule;$vbVisible)
         Si (((($vsProcessNom="ML_@") | ($vsProcessNom="M_@"))) & ($vlEtat>=0))
            $vbfini:=Faux
            <>vtIPMessage:="QUITTER"
            PASSER AU PREMIER PLAN($vlProcess)
            APPELER PROCESS($vlProcess)
            $vhStart:=Heure courante
            Repeter 
               ENDORMIR PROCESS(Numero du process courant;60)
            Jusque ((Statut du process($vlProcess)<0) | ((Heure courante-$vhStart)>=?00:01:00?))
         Fin de si 
      Fin de boucle 
   Jusque ($vbfini)
   ECRIRE JOURNAL ("Fermeture de session")

Note : Les process dont les noms commencent par "ML_..." ou "M_..." sont démarrés par les commandes de menus pour lesquelles la propriété Démarrer un process a été sélectionnée. Dans cet exemple, ce sont les process démarrés suite à la sélection de la commande de menu Ajouter enregistrement.

Le test (Heure courante-$vhStart)>=?00:01:00? permet à la méthode base de sortir de la boucle "en attente de l'autre process", si l'autre process ne réagit pas pendant une minute.

Voici un exemple type de fichier Journal produit par la base :

2/6/0315:47:251Process principalOuverture de Session
2/6/0315:55:435ML_1Ajout d'enregistrement #23 dans Table1
2/6/0315:55:465ML_1Ajout d'enregistrement #24 dans Table1
2/6/0315:55:546$On_QUITSortie de la base
2/6/0315:55:587$xxFermeture de session

Note : $xx est le nom du process local démarré par 4D pour exécuter la méthode base Sur fermeture.

Référence

Méthode base Sur ouverture, QUITTER 4D.


4D - Documentation   Français   English   German   Español   4D v11 SQL, Commandes par thèmes   4D v11 SQL, Liste alphabétique des commandes   4D v11 SQL, Constantes par thèmes   Retour   Précédent   Suivant