I. Résumé▲
Cette note technique vous montrera comment utiliser des formules dans vos bases de données.
II. Afficher le dialogue de formule▲
En Mode Utilisation, vous pouvez lancer une recherche, ou un tri, ou imprimer une sélection. Tout cela peut également être fait par programmation, c'est-à-dire dans votre code dans l'environnement Menus Créés. Cependant il y a un dialogue que vous ne pouviez pas afficher par programmation : le dialogue de la ligne de menu Appliquer une formule…
Il est maintenant possible en 4D 2004, d'utiliser la commande EDITER FORMULE. Cette commande ne fonctionne pas tout à fait de la même manière qu'un dialogue Appliquer une formule… du Mode Utilisation. Le dialogue de la commande EDITER FORMULE et un dialogue où vous pouvez éditer n'importe quelle formule et l'utiliser ensuite dans votre code. Le cas le plus fréquent est l'utilisation de Appliquer une formule… Lorsque le dialogue est affiché, vous pouvez saisir votre formule et cliquer sur le bouton Valider. Mais l'édition d'une formule n'est pas spécifique à ce cas. Vous pouvez aussi éditer une formule lorsque vous lancez une recherche ou un tri, lorsque vous ajoutez une colonne dans un état rapide, ou lorsque vous ajoutez un paramètre pour construire un graphe.
On associe souvent l'éditeur de formule au dialogue d'Appliquer une formule… mais il ne faut pas oublier que les formules peuvent être utilisées partout. C'est pourquoi nous n'avons pas un dialogue Appliquer une formule, mais EDITER FORMULE, une commande qui vous affichera un dialogue de formule en différents endroits de 4D.
III. Le dialogue d'EDITER FORMULE▲
La commande EDITER FORMULE requiert deux paramètres, la table principale, table que vous devez utiliser en table par défaut, et une variable texte. Le premier paramètre est un paramètre d'entrée. Le second paramètre est à la fois un paramètre d'entrée et de sortie.
Pour afficher ce dialogue sans formule, assignez simplement une chaîne vide à la formule avant d'appeler la commande. Pour afficher un dialogue avec une formule, assigner la valeur à la variable avant d'appeler la commande EDITER FORMULE.
Une fois le dialogue affiché, vous pouvez saisir la formule. Si la formule n'est pas valide, 4D désactivera le bouton OK. Le bouton sera à nouveau actif dès que la formule deviendra valide.
Après la fermeture du dialogue, vous pouvez tester la variable OK pour voir si le bouton OK a été cliqué ou non.
Vous devez maintenant choisir comment utiliser la formule. Si vous souhaitez un APPLIQUER A SELECTION, vous devez utiliser la commande APPLIQUER A SELECTION. Si vous voulez ajouter une nouvelle colonne dans votre état rapide, vous pouvez maintenant insérer l'expression dans votre état.
IV. Changements entre 4D 2003 et 4D 2004▲
Vous devez déjà avoir noté des différences dans le dialogue Appliquer une formule… entre la version 2003 et 2004 de 4D.
Il y a deux changements majeurs entre ces deux versions. Ces deux changements sont de réelles améliorations en ce qui concerne :
- la sécurité ;
- la structure virtuelle.
Voyons ce qu'il y a de vraiment nouveau et quels sont les changements sur ces deux points.
Sécurité▲
Une sécurité accrue a été incorporée en version 2003 et antérieure. Lorsque vous affichez le dialogue d'éditeur de formule, vous pouvez exécuter une commande ou une méthode. Il n'y avait aucun moyen d'empêcher ou restreindre ce comportement en fonction de l'utilisateur. Ceci était une réelle restriction pour les développeurs. Vous aviez l'habitude d'exécuter un LECTURE SEULEMENT sur chaque table. En tant que développeur, vous étiez capable de lancer des opérations et connaissiez les conséquences de chaque action, mais qu'en était-il des autres utilisateurs ? Considérez que l'utilisateur final pouvait trouver un moyen d'atteindre ce dialogue et lancer une méthode inadaptée ? Vous pouvez les laisser lancer des recherches, des tris ou construire des états à partir des dialogues standards de 4D. À partir de chacun de ces dialogues, ils peuvent saisir une formule. Que se passe-t-il s'ils sélectionnent la mauvaise méthode ? Ou si un utilisateur peu scrupuleux accède au dialogue et exécute un SUPPRIMER SELECTION ?
Dans 4D 2004, vous pouvez lancer un process externe. Vous pouvez essayer de lancer un fichier batch ou une commande similaire qui reformate votre disque dur par exemple. Heureusement vous ne pouvez plus faire cela en 4D 2004 puisque vous n'accédez plus à toutes les commandes 4D.
Vous ne pouvez pas non plus exécuter la commande QUITTER 4D à partir de ce dialogue en déboguant votre code. Voici quelques raisons pour lesquelles vous ne pouvez plus exécuter toutes les commandes 4D ou toutes les méthodes projets à partir de ce dialogue.
Par défaut vous pouvez voir que vous n'êtes plus autorisé à exécuter aucune méthode. Ceci ne veut pas dire que vous n'avez pas le privilège d'exécuter aucune méthode. Comme 4D ne sait pas quelles méthodes peuvent être utilisées ou pas, il les interdit toutes par défaut. Il vous appartient de spécifier quelles méthodes peuvent être exécutées ou pas en utilisant la commande FIXER METHODES AUTORISEES, décrite plus loin.
Structure virtuelle▲
Dans 4D vous pouvez définir votre propre structure : vous pouvez vouloir cacher certaines tables ou champs, les renommer, ou changer leur ordre lorsqu'ils apparaissent dans les dialogues standards de 4D. L'implémentation de cette fonctionnalité présentait encore quelques imperfections dans les versions précédentes et a été revue en version 2004.
En version 2003, vous pouvez avoir défini une structure virtuelle. Lorsque vous affichez un dialogue de recherche, vous pouviez voir les tables choisies, dans leur nouvel ordre et avec leur nouveau nom, et seulement les noms des champs préalablement définis. À l'affichage de l'éditeur de formule comme avec Appliquer une formule… vous pouvez aussi voir la structure virtuelle. Mais, lorsque vous saisissiez une formule, vous pouviez voir que les noms affichés dans la formule ne sont pas ceux qui apparaissent au niveau de l'interface. En fait, vous pouvez voir les vrais noms des champs dans la base. Ceci n'était pas très pratique pour les utilisateurs : il sélectionne le champ « nom du client » et il voit apparaître « CLI_CliNom80… » plutôt dérangeant pour l'utilisateur.
Ceci a été corrigé en 4D 2004. L'utilisateur de l'éditeur peut maintenant afficher le nom que le développeur a choisi et non le nom réel du champ. Pour voir votre structure virtuelle dans l'éditeur de formule, n'oubliez pas d'ajouter le paramètre « * » lorsque vous utilisez les commandes FIXER TITRES TABLES et FIXER TITRES CHAMPS (fonctionnalité apparue en 4D 2004.2).
V. La commande FIXER METHODES AUTORISEES▲
La commande FIXER METHODES AUTORISEES vous permet de définir la liste des méthodes qui peuvent être sélectionnées et exécuter à partir du dialogue de Formule.
Cette commande requiert un paramètre, un tableau Texte, où vous pouvez définir la liste de toutes les méthodes qui peuvent être sélectionnées. Vous pouvez aussi utiliser le caractère « @ » en tant que joker.
Cela signifie que si vous souhaitez permettre aux utilisateurs d'exécuter n'importe quelle méthode de la base, créez un tableau avec un seul élément contenant la valeur « @ ». Ainsi toutes les méthodes seront listées et exécutables à partir du dialogue (hormis les méthodes déclarées « invisibles »). Si vous y placez une valeur telle que « G@ », cela signifie que toutes les méthodes dont le nom commence par « G » seront visibles et sélectionnables. Bien sûr vous pouvez donner comme valeurs directement le nom de la ou des méthodes autorisées.
Si l'utilisateur essaie de taper le nom d'une méthode non autorisée, d'un champ non autorisé, ou d'une commande 4D non listée, un message d'erreur sera affiché dans l'éditeur de formule et le bouton OK sera désactivé.
Si vous voulez que l'utilisateur puisse sélectionner toutes les méthodes 4D, exécutez juste la commande avec un tableau à un élément contenant la valeur « @ ». L'intérêt de cette commande est qu'elle n'est pas spécifique à un process 4D, mais concerne l'application.
VI. Base de démonstration▲
Pour illustrer le propos ci-dessus, ouvrez la base de démonstration. Notre base de démo. contient trois tables, USR_Utilisateurs, BOK_Livres et KYB_motsclés. Ces tables ont plusieurs champs dont les noms commencent par les trois mêmes premières lettres utilisées par le nom de la table. La base contient quelques Méthodes Projet. Certaines sont utilisées pour un APPLIQUER A SELECTION. D'autres ne devraient pas être utilisées pour un APPLIQUER A SELECTION. Nous allons essayer de les utiliser dans notre éditeur de formule.
Sélectionnez « Lancez la démo. » du Menu « Démonstration ». Cette ligne de menu affiche un dialogue qui va nous permettre d'exécuter nos tests.
La première zone saisissable est notre formule. Nous pouvons choisir de lancer la formule sur la table sélectionnée dans le pop-up menu. À côté du pop-up, il y a plusieurs boutons :
- « Modifier la sélection » qui affiche la sélection courante sur la table choisie dans le pop-up ;
- « Éditer la formule » qui affiche le dialogue standard de formule.
En bas à gauche du dialogue, vous avez une liste de méthodes existantes (et visibles) et une liste des méthodes autorisées. Certaines méthodes préexistantes au nom prédéfini sont fournies pour notre exemple. Glissez et déposez les valeurs souhaitées de la liste de gauche vers la liste de droite qui correspond aux méthodes autorisées. Chaque fois qu'une valeur est déposée dans cette liste, un FIXER METHODES AUTORISEES sera exécutée.
Pour supprimer une valeur de la liste de droite, il suffit de double-cliquer sur cette valeur. La valeur sera supprimée de la liste et un FIXER METHODES AUTORISEES sera à nouveau effectué.
En bas à droite du dialogue, la mise en place de la structure virtuelle exécutera les commandes FIXER TITRES TABLES et FIXER TITRES CHAMPS permettant de mettre en place une structure virtuelle prédéfinie. Le bouton « Restituer la structure » réexécutera les mêmes commandes et reviendra à la structure originale.
VII. Autoriser les méthodes dans le dialogue▲
Sélectionnez la table [BOK_Livres] et cliquez sur le bouton « Editeur de Formule ».
Comme vous pouvez le voir, nous avons tous nos champs, même toutes les tables avec leurs noms d'origine illisibles, mais aucune méthode. Nous pouvons cliquer sur « Annuler », autoriser quelques méthodes et redemander le dialogue de formule à nouveau.
Nous pouvons voir que tous les noms des méthodes qui correspondent aux valeurs autorisées sont maintenant visibles dans le dialogue de formule. Lorsque vous choisissez la chaîne « @ », vous pouvez voir toutes les méthodes, mais pas d'appels plug-in. Les plug-ins peuvent aussi exécuter du code 4D ou autre chose, donc reste une menace possible pour vos données. C'est pourquoi vous ne pouvez plus les voir dans le dialogue d'éditeur de formules. Si vous souhaitez exécuter le code des plug-ins, vous devez écrire votre propre « emballage » de façon à pouvoir le faire. Puisque vous ne pouvez plus exécuter directement la commande EXECUTER, vous devrez écrire une méthode nommée par exemple « mEXECUTER » qui lancerait un EXECUTER. Cependant, si vous décidez d'écrire ce type de méthode, sachez que vous ouvrez une brèche dans votre base et dans vos données.
Si vous voulez bloquer l'utilisation de toutes méthodes, passez simplement un tableau vide en paramètre du FIXER METHODES AUTORISEES. Il y a les paramétrages par défaut de 4D, et les paramétrages de la base de données. Si vous affichez l'éditeur de formules, vous verrez qu'il n'y a aucune méthode projet. Si maintenant vous ajoutez « @4@ », vous verrez toutes les méthodes dont le nom contient le caractère « 4 ». Vous pouvez voir la méthode « M_Executer4D » et « M_Quitter4D ». Il existe une autre méthode « M_Invisible4Test ». Supposons qu'il s'agisse d'une méthode que vous ne voulez pas voir exécuter, car elle supprime la sélection (dans notre exemple elle se contente d'émettre un beep). C'est pourquoi elle a été définie comme invisible. Dans les précédentes versions de 4D, la méthode n'était pas vue, mais pouvait être exécutée si l'on connaissait son nom.
Avec la commande FIXER METHODES AUTORISEES, vous n'êtes plus obligé d'indiquer votre méthode comme invisible. Si aucune méthode n'est autorisée, quand l'utilisateur essaiera d'entrer le nom de la méthode, le bouton « Valider » sera désactivé. Comme vous ne pouvez exécuter la commande EXECUTER dans ce dialogue, les utilisateurs peuvent connaître le nom de votre méthode, mais ils ne pourront pas l'exécuter. En fait, le seul moyen de les exécuter est d'ouvrir une brèche de sécurité. Par exemple, vous pouvez créer une méthode nommée M_Executer4D qui exécutera une unique ligne de code :
EXECUTER(
$1
)
Comme vous avez préalablement autorisé les méthodes « @4@ » contenant donc le chiffre 4, vous pouvez voir la méthode M_Executer4D apparaître dans la liste. La méthode M_SupprimerSelection est invisible et donc n'apparaît pas, mais pourra s'exécuter. Taper la formule suivante exécutera votre méthode :
M_Executer4D (
"M_SupprimerSelection"
)
Vous devez être très prudent si vous souhaitez autoriser ce type de manipulation.
Un autre avantage que cette commande apporte en fait est que vous pouvez personnaliser votre dialogue. Par exemple, vous pouvez souhaiter qu'Alice puisse exécuter quelques statistiques concernant la comptabilité alors que vous ne souhaitez pas qu'elle exécute les méthodes mettant à jour le paiement des factures, une tâche que seulement Bob peut accomplir. À côté, Alice peut aussi exécuter des tâches qui mettent à jour la comptabilité.
Dans les anciennes versions, toutes les méthodes projet étaient accessibles à tout le monde. En 4D 2004, avant d'appeler le dialogue d'édition de formules, vous pouvez choisir les méthodes qui apparaîtront, et proposer directement la formule dans le dialogue adéquat.
À noter : dans la base de démo. vous ne pouvez utiliser la chaîne « @ » que si la liste des méthodes autorisées est vide.
VIII. Structure virtuelle ou non▲
Cliquez sur « Utilisez la Structure virtuelle » pour appliquer votre structure virtuelle et afficher le dialogue de formule. Comme vous pouvez le voir, tous nos champs sont maintenant renommés avec les nouveaux noms. Nous choisissons un nom de champ, nous pouvons voir le nom « virtuel » du champ dans la formule.
Un message d'erreur sera affiché si vous essayez de taper le nom d'origine du champ comme [BOK_Livres]BOK_AnnnéePublication alors que l'interface affiche [Livres]Année de publication. Le même message d'erreur sera affiché si vous utilisez un nom de champ non indiqué dans la structure virtuelle, comme [BOK_Livres]BOK_QtéEnStock ou n'importe quel champ de la table [USR_Utilisateurs].
Si la variable contenait le véritable nom du champ, 4D convertirait la valeur avec le nouveau nom et afficherait le résultat dans le dialogue de formule. Les champs qui ne pourront être traduits seront récupérés comme tels et une erreur sera générée.
Lorsque vous cliquez sur le bouton OK, la formule affichée dans le dialogue sera stockée dans la variable indiquée en paramètre de la commande. Les noms des champs seront les mêmes que définis dans le dialogue de formule. Le problème est que ces noms de champs sont inutilisables dans 4D. Lancez un APPLIQUER A SELECTION avec cette formule générera nombre d'erreurs. Voici pourquoi nous devons transcrire la formule avec les noms des champs que 4D comprend. Le code teste donc la variable OK et vérifie si vous utilisez la structure virtuelle (dans un but d'optimisation seulement) et dans ce cas appelle la Méthode projet RetourAuNonVirtuel.
Cependant, si la variable contenant les noms originaux des champs et vous définissez une structure virtuelle, le dialogue d'édition de formule affichera la formule avec le nouveau nom. Seuls les noms non résolus renverront une erreur, comme décrit précédemment.
IX. Formule astucieuse▲
Après avoir cliqué sur le bouton OK, nous pourrions avoir à convertir la formule. Voici pourquoi nous appelons la méthode RetourAuNonVirtuel.
Si nous n'utilisions pas la structure virtuelle, notre formule ressemblerait à ceci :
[
BOK_Livres]
BOK_Auteur:=
Majusc
([
BOK_Livres]
BOK_Auteur)
Un APPLIQUER A SELECTION sur cette formule fonctionnerait puisque ce sont les vrais noms des champs.
Si nous utilisions la structure virtuelle, notre formule serait :
[
Livres]
Auteur:=
Majusc
([
Livres]
Auteur)
Un APPLIQUER A SELECTION ne pourra pas reconnaître les champs. Nous devons donc convertir cette formule avec les vrais noms des champs. Voici pourquoi nous convertissons [
Livres]
Auteur en [
BOK_Livres]
BOK_Auteur.
Il y a deux moyens de faire cela. Le premier est le plus logique, mais aussi le plus complexe des deux. Le second est plus simple et devrait couvrir 99,99 % des besoins.
La manière la plus logique serait d'analyser l'expression et de remplacer chaque expression avec le nom approprié. Par exemple, avec l'expression [
Livres]
Auteur:=
Majusc
([
Livres]
Auteur)
nous pouvons détecter la première partie de l'expression, [
Livres]
Auteur, grâce au « := ». Cette première partie peut être soit un nom de table et un nom de champ, ou un nom de champ seul. S'il s'agit d'un champ, nous connaissons la table. Nous devons simplement trouver quel champ dans notre table. S'il s'agit d'un nom complet, nous devons extraire le nom de la table et trouver de quelle table il s'agit. Ce peut être le nom d'une autre table et alors nous avons besoin de trouver le vrai nom du champ pour cette table. La seconde partie de l'expression sera Majusc
([
Livres]
Auteur)
. Ce pourrait être l'addition de deux champs de deux tables différentes. Trouver les vrais noms des champs devient alors une tache plus difficile. Mais ça pourrait être pire. Que se passe-t-il si en fait cette partie de l'expression est une méthode qui requiert un groupe de champs comme paramètres ? Comme vous pouvez le voir, décortiquer une expression complexe peut être une très longue et fastidieuse tache. Cependant, si un champ est fourni en tant que paramètre dans une variable chaîne, la valeur peut ne pas être changée. Ceci peut être une bonne chose, à moins que le paramètre puisse être utilisé dans une méthode EXECUTER. C'est difficile à savoir.
Cette solution peut ne pas être la plus appropriée. En outre, l'écriture d'une telle solution peut prendre du temps et vous devez penser à tous les scénarios possibles. Est-elle appropriée ou est-ce juste la satisfaction de clamer que le code est à toute épreuve. Quelquefois, les solutions simples, qui couvrent juste vos besoins, peuvent être suffisantes, ce qui nous amène à la seconde solution.
Lorsque l'on sélectionne des champs à partir du dialogue, nous remarquons que sélectionner un champ de la table courante insère le nom complet. La saisie de formules complexes par l'utilisateur est habituellement une opération longue et simple qui peut mettre en jeu beaucoup de champs. Nous pouvons éliminer la possibilité que l'utilisateur puisse appeler des méthodes et fournisse des champs comme paramètres, noms complets ou noms partiels, ou une information qui permettra à la méthode de construire le champ.
À côté, les utilisateurs peuvent aussi taper manuellement le nom du champ. Dans ce cas, ils voudront certainement saisir le nom court du champ, ce qui signifie que ce sera un champ de la table par défaut. Les champs des tables liées sont seulement affichés avec le nom complet. Comme ils sont habituellement choisis à partir du dialogue, le nom complet sera inséré.
Comme vous avez défini la structure virtuelle, vous connaissez le nom de vos tables, les champs et leur nom complet (c'est-à-dire [Table]Champ). Plutôt que d'analyser la formule, pourquoi ne pas remplacer les éléments ? On peut boucler sur nos tableaux et remplacer chaque expression par le nom du champ associé.
On ne peut pas savoir combien de champs de combien de tables sont utilisés dans notre formule. C'est pourquoi nous n'avons pas d'autre choix que d'appliquer le remplacement pour chaque table et champ. Une fois ceci fait, il y a une possibilité que l'utilisateur ait saisi manuellement un nom court de champ. Dans ce cas, nous analysons à nouveau la formule, mais seulement pour la table courante, essayant de remplacer chaque expression qui peut s'assortir avec nos champs.
Il y a deux solutions qui peuvent être utilisées pour retrouver nos noms de champs. Aucune des deux n'est parfaite, mais elles peuvent être adaptées à vos besoins. Récapitulons-les :
- Analyse de la formule
->pour : très rapide pour de petites expressions.
->contre : difficile de définir une expression, spécialement les expressions natives ou les expressions qui peuvent générer une erreur de syntaxe, très lent pour plusieurs tables et pour les expressions longues. - Boucle sur les tableaux
->pour : vous n'avez pas à calculer l'expression ; parfait pour des formules très complexes, technique « martiale »…
->contre : peut être lent si votre structure virtuelle est très grosse, même avec une expression courte.
Vous pouvez vérifier la méthode RetourAuNonVirtuel qui vous donnera une idée sur la façon de faire. Dans notre base de démo, nous choisissons la technique martiale. Cette technique n'est pas aussi simple comme on le pense. Votre formule peut contenir des noms de champs avec ou sans noms de tables. Voilà pourquoi la première boucle remplace tous les noms des champs avec les noms des tables et la seconde boucle remplacera seulement les noms des champs sans les noms des tables pour la table courante seulement. Cependant, les noms réels des champs peuvent être utilisés seulement pour les autres champs dans notre structure virtuelle. Si nous remplaçons un nom virtuel par un nom réel et que ce nom de champ est identique à un nom virtuel pour un autre champ, notre conversion ne fonctionnera pas. Nous ne voulons pas remplacer deux fois le même champ. C'est pourquoi nous remplaçons chaque champ par une balise unique qui ne sera jamais utilisée dans une formule. Après analyse de tous les tableaux, nous pouvons remplacer ces balises uniques par les noms réels des champs, et voilà…
Une fois que nous avons converti notre formule en quelque chose que 4D peut comprendre, nous pouvons appliquer notre formule avec la commande EXECUTER.
Nous pouvons construire toute la phrase et la lancer avec la commande EXECUTER. Nous lançons un code comme ci-dessous :
APPLIQUER A SELECTION
(
Table
(
al_TableIDs{at_TableNom})->;
EXECUTER(
$MaFormule
))
On peut aussi intervertir les deux commandes et utiliser le code suivant :
EXECUTER(
"APPLIQUER A SELECTION(Table(al_TableIDs{at_tableNom})->;"
+
$MaFormule
+
")"
)
Gardez à l'esprit qu'un APPLIQUER A SELECTION applique la formule seulement si la sélection n'est pas vide.
X. Conclusion▲
Dans 4D 2004, les structures virtuelles ont été considérablement améliorées. L'éditeur de formule affiche maintenant les noms virtuels partout. Une nouvelle commande FIXER METHODES AUTORISEES permet d'indiquer les méthodes à afficher dans le dialogue de formule, utilisée dans le dialogue de l'Appliquer à sélection…, les recherches, les tris, 4D Chart, l'éditeur d'états rapides… Une nouvelle commande vous permet d'appeler ce dialogue et de retrouver votre formule. En additionnant ces trois nouveautés et avec la commande APPLIQUER A SELECTION, nous pouvons mettre en place une fonctionnalité très puissante en menus créés, le dialogue d'APPLIQUER A SELECTION de vos rêves…
XI. Base exemple▲
Téléchargez la base exemple :
base exemple