Process Serveur
Date de publication : Avril 2006
Par
Larry Sharpe (Infoservice)
Voici la troisième note d'une série de notes techniques qui ajoute de nouvelles fonctionnalités à notre base exemple. Cette note technique montre comment démarrer, gérer et exécuter des process qui sont gérés sur un 4D Client, mais exécutés sur le 4D Server. Par un effet secondaire du mode de fonctionnement de 4D (et avec quelques Si dans le code), il est aussi possible de faire exécuter ces process sur un 4D Client ou un 4D monoposte si besoin.
Introduction
Explication du code et de la structure
Le formulaire [xPreferences]Pref_Processes
La méthode du formulaire [xPreferences]Pref_Processes
Sur chargement
Sur appel extérieur
Sur libération
La méthode projet People_ImportProcess
Remarques sur des commandes 4D intéressantes
Conclusion
Télécharger la base exemple
Introduction
Voici la troisième note d'une série de notes techniques qui ajoute de nouvelles fonctionnalités à notre base exemple. Cette note technique montre comment démarrer, gérer et exécuter des process qui sont gérés sur un 4D Client, mais exécutés sur le 4D Server. Par un effet secondaire du mode de fonctionnement de 4D (et avec quelques Si dans le code), il est aussi possible de faire exécuter ces process sur un 4D Client ou un 4D monoposte si besoin.
Cette note utilise la même base exemple que la note "
Formulaire de sortie modifiable par l'utilisateur" (référence 4D-200604-10-FR).
Je ne décrirai ici que la partie du code qui concerne les process, pour plus de détails sur les autres tables, formulaires et méthodes, merci de vous référer aux précédentes notes techniques.
Dans cet exemple de code, je vais montrer comment un process peut être lancé pour être exécuté sur le serveur (ou un client ou un 4D mono) de manière permanente. Cela signifie qu'une fois que le process est défini et que la base l'exécute, à intervalle fixé par l'utilisateur, il va chercher dans le dossier A_IMPORTER s'il y a des documents à importer, exécuter le code d'import, puis envoyer un eMail ou un message d'alerte comme spécifié. Le document est ensuite déplacé dans le dossier IMPORT_TERMINE et la boucle recommence.
Explication du code et de la structure
Comme dans les précédentes notes techniques, trois utilisateurs sont définis dans cette base exemple :
Designer, Administrator et Test User. Seul le Designer a un mot de passe (pour forcer l'affichage de
la fenêtre de login et permettre le changement d'utilisateur) et ce mot de passe est : designer.
Dans cette base, il y a trois tables, [Personnes], [Sociétés] et [xPreferences]. Les tables [Personnes]
et [Sociétés] ne servent pas beaucoup dans cette note technique, elles font juste partie du développement
de la base. Regardez les notes précédentes pour plus d'information sur leur utilisation.
Nous créons une nouvelle méthode, un nouveau formulaire et un nouveau process pour gérer les process serveur
(et leurs préférences), de manière complètement séparée des préférences utilisateur. Ceci nous permet de
contrôler les process serveur sans causer de problèmes lors de la mise à jour de préférences utilisateur.
Cet exemple utilise trois méthodes de gestion des préférences. L'une (xPreferences_Users) est appelée par
le menu Edition et ouvre un formulaire qui permet l'édition des préférences utilisateurs. L'autre
(xPreferences) gère toute les données de préférences écrites ou lues dans la base. La séparation en deux
méthodes n'était pas obligatoire, mais le code est beaucoup plus propre ainsi. La troisième méthode
(xPreferences_Processes) est aussi appelée depuis le menu Edition et ouvre le formulaire
"[xPreferences]Prefs_Processes" qui permet l'édition des préférences de process.
Comme ce process « serveur » est habituellement exécuté sur le serveur ou sur un seul client à la fois,
toutes ses valeurs de préférences sont stockées, non sous le nom de l'utilisateur courant, mais sous le
nom « Processes ». Il y a un seul enregistrement pour ces valeurs de préférence (pour cette action « People Import »),
à la différence des enregistrements de préférences utilisateur, dont il existe un enregistrement par utilisateur
(Designer, Administrator, Test User) qui peut se connecter à la base et par type de préférences utilisateur
(Startup view = affichage au démarrage, Data Entry = valeurs par défaut).
Il y juste quelques méthodes qui concernent spécifiquement cette note technique. La première (xFileNameHandler)
est très semblable à l'exemple de code de la documentation 4D (pour les documents système). Elle est utilisée
pour trouver le nom du fichier ou le chemin d'accès de l'application 4D ou de la structure en cours d'exécution.
Mais la partie centrale de cette note est la méthode projet People_ImportProcess. C'est là, et dans le formulaire
"[xPreferences]Pref_Processes" et sa méthode formulaire que tout se passe et c'est de cela dont cette note
technique va parler, pour l'essentiel.
Le formulaire [xPreferences]Pref_Processes
Ce formulaire est ouvert par la méthode xPreferences_processes. Il permet à l'utilisateur
d'éditer les options disponibles pour le process "People Import" (import de personnes). Ces options sont :
• Le lancement du process au démarrage.
• Le lancement du process sur le serveur ou sur le client (en client/serveur seulement, sinon la boîte à cocher est masquée).
• Le nombre de minutes d'attente entre deux vérifications des documents à importer.
• L'envoi d'un email à la fin de l'import, le destinataire, l'expéditeur, le serveur de messagerie à utiliser.
• L'affichage d'un message d'alerte à la fin de l'import.
Il y a aussi un bouton de démarrage et d'interruption de l'import.
Si le process "People Import" est exécuté sur un client ou sur le serveur, toutes les variables de la fenêtre seront inactivées jusqu'à l'arrêt du process. Si le process est exécuté sur le serveur, tous les clients pourront l'interrompre. Si c'est sur un client, seul le client sur lequel il est exécuté pourra l'interrompre et tous les autres clients auront ce bouton inactivé. Dès que le process est lancé ou arrêté, un message est envoyé à tous les clients pour leur faire activer ou désactiver les variables concernées.
La méthode du formulaire [xPreferences]Pref_Processes
C'est la méthode du formulaire décrit dans le paragraphe précédent. Il ne s'y passe pas grand-chose,
c'est juste le lieu où sont éditées les préférences de l'import de personnes. C'est très semblable
au formulaire "[xPreferences]Pref_Users" qui a été présenté dans la précédente note technique.
Le point essentiel à remarquer est l'utilisation de l'événement formulaire Sur appel extérieur.
Sur chargement
A l'ouverture du formulaire, cette partie du code de la méthode formulaire est exécutée. C'est là que nous lisons les valeurs des variables de préférences utilisées et activons ou désactivons des objets du formulaire suivant le statut du process "People Import".
Sur appel extérieur
Chaque fois que le process "People Import" exécute la partie UpdateWindow (mise à jour de la fenêtre) de son code (décrite ci-dessous), le formulaire recharge l'enregistrement de préférences et met à jour l'affichage. Ceci ne s'exécute qu'en client/serveur et non en mono-utilisateur.
Sur libération
Si le process "People Import" n'est pas en cours d'exécution, il faut sauver les changements apportés aux variables de préférences.
La méthode projet People_ImportProcess
C'est l'essentiel du code pour cette note technique. Il aurait pu être remplacé par plusieurs méthodes,
mais j'aime bien regrouper des éléments de code qui se correspondent dans un grand Au cas ou.
C'est plus facile à lire pour moi qu'un grand nombre de méthodes séparées.
| code 4D |
: (Nombre de paramètres=0)
|
Appelée sans paramètres, cette méthode va démarrer un nouveau process ("People Import") qui utilise
la méthode People_ImportProcess en lui passant le paramètre "NewProcess".
Un seul process People Import est créé, et s'il est rappelé, un nouveau process ne sera lancé que
si le premier est fini.
Le process est créé, soit sur le serveur, soit sur le poste utilisateur en monoposte, par la fonction
Executer sur serveur. S'il tourne sur un client et que la variable cbPrefPeopleImportRunOnServer est à
Faux, alors le process sera créé sur ce client. La variable cbPrefPeopleImportRunOnServer est une
variable
de préférence qui a été chargée avant le lancement de la méthode.
Le point à noter ici est que les fonctions Executer sur serveur et Nouveau process sont très
semblables. En version monoposte, les deux fonctions ont la même action, comme il n'y a pas de serveur,
le process est exécuté sur le poste utilisateur. En client-serveur, Executer sur serveur exécute
le process sur le poste serveur. Sur le poste client ou en monoposte, Nouveau process l'exécute sur ce
client ou ce poste.
| code 4D |
: ($command= "RunProcess")
|
Ce process est lancé par le code ci-dessus et commence par lire les préférences de l'import des personnes,
puis démarre une boucle qui vérifie la présence de nouveaux fichiers à importer, puis, s'il en existe, les
importe, envoie les emails ou alertes requis, déplace les fichiers importés et recommence toute la boucle Tant que.
Les points à remarquer dans cette partie du code :
1) Ce code ne doit contenir aucune alerte, ni dialogue ni aucune commande 4D qui ne puisse pas être exécutée
sur le serveur. C'est très important d'y penser en écrivant vos propres process serveur.
2) L'instruction suivante est utilisée à plusieurs endroits :
| code 4D |
EXECUTER SUR CLIENT (sPrefPeopleImportClientMsgName ; "People_ImportProcess" ;"UpdateWindow")
|
Cette instruction dit au client, ET NON au serveur, d'exécuter la partie UpdateWindow de la méthode
People_ImportProcess. Encore une fois, cela se passe sur le client, pas sur le serveur.
3) Au début de la boucle Tant que, il y a une boucle Repeter. C'est dans cette boucle Repeter
que la méthode est mise en attente pour le délai fixé par l'utilisateur dans le dialogue
(15 minutes dans cet exemple) avant de commencer sa recherche d'un fichier à importer. Si
nous utilisions la commande ENDORMIR PROCESS avec un délai de 15 minutes, le process ne
pourrait pas savoir que l'utilisateur a demandé son interruption avant la fin de sa mise
en sommeil. Au lieu de cela, nous calculons le nombre de secondes pour boucler (60*15 ou
60 fois le nombre de minutes de délai), entrons dans la boucle Repeter et faisons un
ENDORMIR PROCESS pour une seconde. Après une seconde, si l'utilisateur n'a pas modifié
la variable <>cbPrefPeopleImportOn sur ce client ou n'importe quel autre, nous retournons
dans la boucle Repeter jusqu'à ce que le nombre de secondes prévu soit atteint. Cela fait,
nous vérifions s'il y a un fichier à importer. Une fois la vérification faite, ainsi que
l'import si besoin, nous recommençons la boucle Tant que jusqu'à ce que quelqu'un l'interrompe.
4) Lorsque nous en venons à la section où l'import doit s'effectuer, nous devons calculer le
chemin d'accès aux dossiers d'import, vérifier leur existence et, si besoin, les créer.
Comme ce code doit pouvoir s'exécuter sur toute application 4D, nous devons vérifier si
nous sommes sur un client ou non. Si l'exécution a lieu sur un client, la commande
PROPRIETES PLATEFORME ne retournera que le nom de la structure 4D, et non son chemin
d'accès complet ou son emplacement. Exécutée sur le serveur ou sur un 4D monoposte,
la commande renvoie le chemin d'accès complet à la structure. C'est pourquoi, en cas
d'exécution sur un client, nous utilisons l'emplacement de l'application client elle-même,
pour un serveur ou un monoposte, nous utilisons l'emplacement du fichier de structure.
Ce sont les points principaux de cette partie du code ; toutes les autres lignes de codes
sont commentées dans le source.
| code 4D |
: ($command="UpdateWindow")
|
Lorsque la méthode RunProcess doit mettre à jour les clients, elle
exécute cette section de code sur tous les clients à l'aide d'une
seule commande EXECUTER SUR CLIENT. Chaque client en ligne, lorsqu'il
est sollicité, effectue cette tâche par un APPELER PROCESS à sa
méthode xPreferences_Processes qui s'exécute localement. Si la
fenêtre de xPreferences_Processes n'est pas ouverte sur ce client,
il ne se passe rien. Si elle est ouverte, la commande APPELER PROCESS
déclenche le Sur appel extérieur de la méthode formulaire, lequel
recharge les valeurs des préférences et met à jour la fenêtre, comme requis.
Une fois de plus, comme le serveur ne peut pas ouvrir de fenêtres ou
afficher des alertes, lorsque nous voulons afficher une alerte sur
tous les clients depuis une méthode exécutée sur le serveur, nous
appelons cette méthode avec un EXECUTER SUR CLIENT. Le client affiche
alors un simple message d'alerte. Pour une exécution en monoposte,
lors de l'appel de cette méthode, le code de RunProcess reste en
attente d'un clic utilisateur sur le bouton de l'alerte. Vous pouvez
avoir besoin d'afficher cette alerte dans un autre process dans une
base mono-utilisateur packagée.
| code 4D |
:($command="UserInterface")
|
Cette partie est exécutée uniquement sur le client ou le poste
mono-utilisateur et sert uniquement à fixer les options d'interface
utilisateur du formulaire, s'il est affiché. Cela servira aussi à
masquer la boîte à cocher "Exécuter sur le serveur" pour une exécution en monoposte.
Cette partie est appelée uniquement depuis la méthode base Sur
ouverture ou Sur démarrage serveur et si la variable cbPrefPeopleImportRunAtStartup
a été initialisée et, dans ce cas, tente de lancer un nouveau process "People Import".
Son comportement est légèrement différent selon que le code s'exécute sur un
client ou sur un serveur/monoposte.
Remarques sur des commandes 4D intéressantes
Quelques remarques sur de subtiles différences dans la dénomination et le fonctionnement des commandes 4D qui suivent.
Nouveau process
Fonctionne à l'identique sur un client et en monoposte. Démarre un nouveau process sur la machine qui l'exécute.
Exécuter sur serveur
Lance un nouveau process sur le serveur lorsqu'elle est exécutée sur un client.
Lorsqu'elle est exécutée sur un monoposte, elle démarre un nouveau process sur ce poste de
la même manière que la commande Nouveau process.
EXECUTER SUR CLIENT
Lance une méthode, et non un process, sur chaque client prévu pour gérer la commande EXECUTER SUR CLIENT
dans la fenêtre des préférences 4D ou par l'utilisation de la commande INSCRIRE CLIENT.
Veillez à ce que la méthode appelée ne consomme pas trop de temps ou de mémoire ; cela peut vous poser
des problèmes. Ne fait rien en monoposte : ni erreur, ni fonctionnement, rien.
INSCRIRE CLIENT / DESINSCRIRE CLIENT
La commande INSCRIRE CLIENT fonctionne comme les préférences 4D sauf que vous pouvez donner aux clients
le nom que vous voulez, ce n'est pas le système qui l'attribue. Ces commandes vous permettent d'activer /
désactiver la fonction EXECUTER SUR CLIENT.
Cette note technique les utilise avec la valeur "AdminClient", mais on pourrait leur passer n'importe
quelle valeur.
LIRE VARIABLE PROCESS
Lit les variables passées par le serveur, mais ne peut pas recevoir une variable locale comme variable source.
VARIABLE VERS VARIABLE
Envoie les variables passées au serveur, mais ne peut pas envoyer une variable locale comme variable destination.
ECRIRE VARIABLE PROCESS
Envoie certaines variables au serveur. Vous ne pouvez pas passer de tableaux, de pointeurs ou de variables locales.
VARIABLE VERS VARIABLE est l'opposé de LIRE VARIABLE PROCESS.
ECRIRE VARIABLE PROCESS n'est PAS l'opposé de LIRE VARIABLE PROCESS.
Conclusion
Avec cette note technique, nous avons traité plusieurs points :
1) Echanger des données entre les process Clients-Serveur pour mettre à jour des variables et des fenêtres.
2) Permettre l'exécution de process sur le serveur, le client ou en monoposte avec le même code.
3) Montrer comment certains outils simples d'interface utilisateurs peuvent servir à limiter l'édition de variables ou de process.
4) Etendre les fonctionnalités de la table xPreferences (introduites dans la précédente note technique). Nous pouvons maintenant fixer des préférences pour un process indépendamment de la personne qui l'exécute et du contexte.
5) Compléter les notes techniques précédentes « Formulaire de sortie modifiable par l'utilisateur et « Préférences utilisateur ».
Tous les éléments mentionnés dans cette note technique ont de nombreux commentaires associés aux formulaires et aux méthodes.
Télécharger la base exemple
__________________________________________________
Copyright © 1985-2008 4D SA - Tous droits réservés
Tous les efforts ont été faits pour que le contenu de cette note technique présente le maximum de fiabilité possible.
Néanmoins, les différents éléments composant cette note technique, et le cas échéant, le code, sont fournis sans garantie d'aucune sorte.
L'auteur et 4D S.A. déclinent donc toute responsabilité quant à l'utilisation qui pourrait être faite de ces éléments, tant à l'égard de leurs
utilisateurs que des tiers.
Les informations contenues dans ce document peuvent faire l'objet de modifications sans préavis et ne sauraient en aucune manière engager
4D SA. La fourniture du logiciel décrit dans ce document est régie par un octroi de licence dont les termes sont précisés par ailleurs dans la
licence électronique figurant sur le support du Logiciel et de la Documentation afférente. Le logiciel et sa documentation ne peuvent être
utilisés, copiés ou reproduits sur quelque support que ce soit et de quelque manière que ce soit, que conformément aux termes de cette
licence.
Aucune partie de ce document ne peut être reproduite ou recopiée de quelque manière que ce soit, électronique ou mécanique, y compris par
photocopie, enregistrement, archivage ou tout autre procédé de stockage, de traitement et de récupération d'informations, pour d'autres buts
que l'usage personnel de l'acheteur, et ce exclusivement aux conditions contractuelles, sans la permission explicite de 4D SA.
4D, 4D Calc, 4D Draw, 4D Write, 4D Insider, 4ème Dimension ®, 4D Server, 4D Compiler ainsi que les logos 4e Dimension, sont des marques
enregistrées de 4D SA.
Windows,Windows NT,Win 32s et Microsoft sont des marques enregistrées de Microsoft Corporation.
Apple, Macintosh, Power Macintosh, LaserWriter, ImageWriter, QuickTime sont des marques enregistrées ou des noms commerciaux de Apple Computer,Inc.
Mac2Win Software Copyright © 1990-2002 est un produit de Altura Software,Inc.
4D Write contient des éléments de "MacLink Plus file translation", un produit de DataViz, Inc,55 Corporate drive,Trumbull,CT,USA.
XTND Copyright 1992-2002 © 4D SA. Tous droits réservés.
XTND Technology Copyright 1989-2002 © Claris Corporation.. Tous droits réservés ACROBAT © Copyright 1987-2002, Secret
Commercial Adobe Systems Inc.Tous droits réservés. ACROBAT est une marque enregistrée d'Adobe Systems Inc.
Tous les autres noms de produits ou appellations sont des marques déposées ou des noms commerciaux appartenant à leurs propriétaires
respectifs.
__________________________________________________


Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur.
La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.