4D v15.4On Exit database method |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v15.4
On Exit database method
|
On Exit database method | ||||||||
Ne requiert pas de paramètre | ||||||||
La On Exit database method est appelée une fois lorsque vous quittez la base.
Les environnements 4D suivants sont concernés :
Note : La On Exit database method n'est PAS exécutée par 4D Server.
La On Exit database method 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 :
Quel que soit le moyen par lequel la base a été quittée, 4D accomplit les actions qui suivent :
La On Exit database method est l'emplacement idéal pour :
Note: Rappelez-vous que le process créé pour la On Exit database method 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 On Exit database method.
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”.
` Méthode base Sur ouverture
C_TEXT(◊vtIPMessage)
C_BOOLEAN(◊vbQuit4D)
◊vbQuit4D:=False
If(Test path name("Journal") # Is a document)
$vhDocRef:=Create document("Journal")
If(OK=1)
CLOSE DOCUMENT($vhDocRef)
End if
End if
ECRIRE JOURNAL("Ouverture Session")
` Méthode Projet ECRIRE JOURNAL
` ECRIRE JOURNAL ( Texte )
` ECRIRE JOURNAL ( Description Evenement )
C_TEXT($1)
C_TIME($vhDocRef)
While(Semaphore("$Journal"))
DELAY PROCESS(Current process;1)
End while
$vhDocRef:=Append document("Journal")
If(OK=1)
PROCESS PROPERTIES(Current process;$vsProcessNom;$vlEtat;$vlTempsEcoule;$vbVisible)
SEND PACKET($vhDocRef;String(Date du jour)+Caractere(9)+Chaine(Heure courante)+Caractere(9)+Chaine(Numero du process courant)+Caractere(9)+$vsProcessNom+Caractere(9)+$1+Caractere(13))
CLOSE DOCUMENT($vhDocRef)
End if
CLEAR 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.
` Méthode Projet M_AJOUT_ENRG
CHANGER BARRE(1)
Repeat
ADD RECORD([Table1];*)
If(OK=1)
ECRIRE JOURNAL("Ajout d'enregistrement #"+String(Numero enregistrement([Table1]))+" dans Table1")
End if
Until((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.
` Méthode formulaire [Table1];"Entrée"
Case of
:(Form event=On Outside Call)
If(◊vtIPMessage="QUITTER")
CONFIRM("Voulez-vous sauvegarder les modifications dans cet enregistrement ?")
If(OK=1)
ACCEPT
Else
CANCEL
End if
End if
End case
` Méthode Projet M_QUIT
$vlProcessID:=New process("ON_QUIT";32*1024;"$ON_QUIT")
Cette méthode utilise une astuce. Lorsque la commande QUIT 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 à QUIT 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
CONFIRM("Etes-vous certain de vouloir quitter ?")
If(OK=1)
ECRIRE JOURNAL("Sortie de la base")
QUIT 4D
` QUITTER 4D a un effet immédiat. Aucune ligne de code n'est exécutée par la suite.
` ...
End if
` Méthode base Sur fermeture
◊vbQuit4D:=True
Repeat
$vbfini:=True
For($vlProcess;1;Count tasks)
PROCESS PROPERTIES($vlProcess;$vsProcessNom;$vlEtat;$vlTempsEcoule;$vbVisible)
If(((($vsProcessNom="ML_@") | ($vsProcessNom="M_@"))) & ($vlEtat>=0))
$vbfini:=False
◊vtIPMessage:="QUITTER"
BRING TO FRONT($vlProcess)
CALL PROCESS($vlProcess)
$vhStart:=Current time
Repeat
DELAY PROCESS(Current process;60)
Until((Process state($vlProcess)<0) | ((Current time-$vhStart)>=?00:01:00?))
End if
End for
Until($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.
2/6/03 | 15:47:25 | 1 | Process principal | Ouverture de Session |
2/6/03 | 15:55:43 | 5 | ML_1 | Ajout d'enregistrement #23 dans Table1 |
2/6/03 | 15:55:46 | 5 | ML_1 | Ajout d'enregistrement #24 dans Table1 |
2/6/03 | 15:55:54 | 6 | $On_QUIT | Sortie de la base |
2/6/03 | 15:55:58 | 7 | $xx | Fermeture de session |
Note : $xx est le nom du process local démarré par 4D pour exécuter la On Exit database method.
Produit : 4D
Thème : Méthodes base
Créé :
4D - Langage ( 4D v15.4)
4D - Langage ( 4D v15)
4D - Langage ( 4D v15.3)