FileMaker : Variables et rubriques globales
FileMaker : Variables et rubriques globales
11 novembre 2010 - Auteur : - Categories : Blog, Technique - Tag : , , , ,

FileMaker : Variables et rubriques globales

variables

le point sur leurs différences, avantages et inconvénients comparés

A la suite d’un fil de discussion sur le forum FM Source, je me suis dit qu’il fallait peut-être, trois ans après la sortie de FileMaker 8 et des variables, faire un point sur les différences entre variables et rubriques globales.

L’étendue

Tout d’abord, il existe trois différentes variables, qui se différencient par leur étendue (scope)

  • les variables de calcul, utilisables uniquement dans la fonction Definir() (Let) : Définir ([variable1 = « salut » ; variable2 = « le monde ! »] ; variable1 &  »  » & variable2 ). Ces variables ne sont valables (répétez ça dix fois très vite) qu’au sein de cette fonction Définir. Dès que la parenthèse est refermée, elle sont « oubliées ». Notons que ces variables de calcul ne peuvent être utilisées dans des fonctions Définir emboîtées *. Elles ne passent pas non plus la barrière de la fonction Evaluation**
  • les variables « locales » ou « de script », notées $ : On peut les déclarer avec une fonction Définir() ou avec l’instruction de script Définir Variable(). Elles ne sont valables que dans le script en cours, et « oubliées à la fin ». Par contre, on oublie souvent qu’elles demeurent pendant tout le script, même si elles ont été déclarées avec une fonction Définir(). Il faut donc se méfier du nommage des variables, afin qu’une fonction Définir() ne vienne pas écraser une variable définie dans le script. On ignore souvent en revanche que des variables locales définies alors qu’aucun script n’est en cours sont valables à chaque fois qu’aucun script n’est en cours. Pour FileMaker, il y a un « script zéro » qui « tourne » quand aucun autre script n’est en cours d’exécution. Définir une variable locale avec la fonction définir alors qu’aucun script n’est en vous permet d’utiliser cette variable à chaque fois qu’aucun script n’est en cours.
  • les variables « globales », notées $$ : Ce sont celles qui nous intéressent ici, car les seules que l’on puisse confondre avec les rubriques globales. En fait, si FMI les avait nommées correctement, la confusion n’existerait sans doute pas du tout, mais le huitième jour, Dieu, qui avait la gueule de bois, a dit que FileMaker n’aurait pas le droit d’adopter le même vocabulaire que toute l’industrie, et qu’il faudrait dire « rubrique » là où tout le monde parle de « champ », « modèle » quand les autres parlent de « formulaire »… Je ne vous raconte même pas le 9ème jour, où Il a imaginé Bento !

* Definir ( var = « bonjour » ; Definir ( var2 = var &  » tout le monde » ; var & var 2 )) ne fonctionnera pas car var n’est pas passée à la deuxième fonction Definir

** Definir ( var = 1 ; Evaluation ( var + 1 )) ne fonctionnera pas car var n’est pas passée à la fonction Evaluation.

Ainsi donc ces variables à deux dollars (et j’ai pas dit deux balles), ne sont en fait pas globales du tout mais « de session ». C’est à dire que leur limite est celle d’une session utilisateur pour un fichier donné.

Comme leur petites sœurs à un seul $, on les déclare avec la fonction Définir() ou avec l’action de script Définir variable().

Les rubriques globales, elles, s’apparentent beaucoup plus à des variables globales, puisqu’elles sont valables pour une session de l’application (donc multi-fichiers), et qu’elle contiennent une valeur au début de cette session.

Notons que la valeur contenue dans une rubrique globale est accessible depuis n’importe quel contexte d’une solution sans avoir à définir de lien. Elles passent même la barrière des fichiers, alors que les variables globales sont propre à une session pour un fichier.

Ce dernier aspect est particulièrement intéressant pour définir des listes de valeurs relationnelles, accessibles depuis n’importe où, plutôt que de re-créer des liens et une liste de valeurs à chaque fois qu’on en a besoin. Ces listes fonctionnent même en mode recherche !

Nous retrouvons donc en finale de ce tournoi, à ma gauche, les variables globales (c’est pas tous les jours que les $$ sont à gauche), et à ma droite, les rubriques globales (je les mets à droite parce qu’elle conservent une donnée, elles sont donc plus conservatrices – désolé, je suis aussi drôle que Goscinny depuis qu’il s’appelle Uderzo, c’est lamentable)

En finale, oui, parce que nous n’avons pour l’instant étudié que leur étendue, mais il reste encore beaucoup à voir. Et d’ailleurs, avons nous vraiment vu tout ce qui concerne l’étendue ?

Pour ce qui concerne les variables « globales », c’est assez simple, elle sont définie au cours de la session, et sont « tuées » à la fermeture.

Il en est autrement pour les rubriques globales, qui conservent une valeur par défaut, valable pour tous les utilisateurs au début de chaque session.

Pour initialiser la valeur d’une rubrique globale, il faut être l’hôte du fichier. Autrement dit, on ne peut en principe pas modifier cette valeur par défaut si le fichier est servi (partagé par FileMaker Server ou par FileMaker Pro sur un autre poste). Concrètement, chaque utilisateur pourra modifier la valeur d »une rubrique globale au cours de sa session, mais retrouvera la valeur par défaut en fermant et ré-ouvrant le fichier.

Truc : il existe malgré tout une méthode pour modifier la valeur d’une globale sur le serveur. Elle nécessite (heureusement) l’accès intégral au fichier.

  1. vider la globale
  2. modifier la rubrique globale en calcul de type global, et définir le calcul comme une constante avec la valeur à attribuer (= »MaValeur ») par exemple.
  3. s’assurer que le calcul est effectivement évalué, en consultant le Visualiseur de Données par exemple
  4. repasser la rubrique en globale standard (non calculée)

Voilà pour l’étendue, je crois que cette fois, nous en avons fait le tour.

Le stockage

Le stockage d’une rubrique globale ou d’une variable globale se fait au niveau du poste client, ce qui est bien pratique. Cela veut dire que la valeur est propre à l’utilisateur, et aussi qu’il n’y a pas besoin d’aller chercher une valeur sur le serveur à chaque fois qu’on en a besoin.

Une rubrique comme une variable peut être multivaluée, mais cela ne présente pas beaucoup d’intérêt pour une variable, car on ne peut pas, contrairement à une rubrique globale, récupérer la liste des valeurs avec la fonction Liste, ou la dernière valeur renseignée avec la fonction Dernière(). En revanche, on peut attribuer n’importe quel entier comme numéro de répétition, qu’il soit négatif, nul ou positif. Considérez que les répétitions d’une variable sont en fait des variables totalement différentes, et vous aurez tout compris.

Le type de données

Voyons maintenant quel type de données les variables peuvent contenir, par comparaison aux rubriques globales. Tout d’abord, il faut noter la différence dans la manière dont on type ces données. Dans le cas des rubriques globales, on choisit un type pour la rubrique dans le petit menu où nous retrouvons Texte/Nombre/Heure/Date/Horodatage/Multimedia. Je ne parle pas du type calcul, qui n’est pas à proprement parler un type, puisque le type de résultat d’un calcul se définit en bas à gauche de la définition de calcul. Il peut être global également. Bref, tout ceci prend du sens si on se dit que dans d’autres langages, un « calcul » s’appelle une « requête », mais bon, le huitième jour, Il avait vraiment mal au crâne.

Dans le cas des variables, le typage se fait automatiquement, mais c’est parfois quelque chose de méconnu. Si on définit une variable telle que = « bonjour le monde », le fait de mettre une constante de texte entre guillemets (ou de faire appel à une rubrique de type texte) typera la variable comme texte. Si on n’utilise que des données de type date, la variable sera de type date…

Je recommande souvent de forcer le type de variable à l’aide des fonctions ObtenirTexte(), ObtenirNombre(), ObtenirDate(), ObtenirHorodatage()

Cela rend le code plus lisible et évite les mauvaises surprises.

En revanche, et c’est également méconnu, les variables peuvent contenir tous les types de données gérés par FileMaker. Tous ? oui ! Cela veut dire que l’on peut parfaitement stocker une image ou un fichier dans une variable globale.

Truc : on notera toutefois un bug pénalisant si vous essayez de stocker un long texte dans une variable globale. L’application se verra dramatiquement ralentie. Ceci ne se produit pas si vous découpez votre texte en plusieurs variables ou… que vous choisissez de le stocker dans une rubriques globale.

La méthode pour les définir

Cela semble assez évident, mais cela a de grandes conséquences : on ne définit pas une rubrique globale comme une variable globale.

Une variable globale peut être définie soit par script (Définir Variable()), soit par simple calcul, grâce à la fonction Définir() : Définir ( $$maVariable = « bonjour le monde ! » ; «  » )

C’est là un immense avantage, car on peut alors dès lors définir des variables sur chaque intervention du moteur de calcul : auto-entrée, contrôle, calcul pour ce qui concerne la définition de la base de données, mais aussi jeux de privilèges, et surtout au niveau du modèle (infobulle, web viewer, formatage conditionnel, et même [[jeux de menus personnalisés]FileMaker Pro Advanced est requis pour mettre en place ces possibilités]).

Pour définir une rubrique globale, vous devez utiliser l’action de script Définir rubrique(). Personnellement, je rêve d’une fonction de calcul qui définirait une rubrique. On peut faire ce genre de choses (et bien plus) avec un plug-in comme DoSQL de myFMbutler, mais pas avec FileMaker tout seul.

On en oublierait presque qu’à l’inverse, il existe une méthode de définition de la rubrique globale qui n’existe pas pour la variable, et pas des moindres ! Allez, allez, laquelle ? Votre langue au chat ? Ben… c’est l’utilisateur, pardi ! L’utilisateur est également un très bon moyen de définir une globale. Muni de son petit clavier et de sa petite souris, mais aussi des menus déroulant, cases à cocher, et autres boîtes de dialogue que vous aurez bien voulu mettre à sa disposition.

Les utilisations

Du fait que la rubrique globale est propre à l’utilisateur, on l’exploitera justement pour tout ce qui est interface (filtres de table externe, images, libellés que l’on veut voir persister en mode recherche…). L’avantage de la rubrique est ici double : modifiable par l’utilisateur (par exemple pour filtrer une table externe via un menu déroulant), et surtout, affichable sur le modèle ! Second rêve du jour : pourvoir insérer un calcul directement sur le modèle, et en particulier une variable globale. On peut déjà, et depuis toujours, insérer une « rubrique de fusion », le nom de l’utilisateur, la date courante… je parie qu’insérer une variable ne coûterait pas des mois de développement à FMI !

Une « rubrique globale » peut également servir de « rubrique clef » au départ d’un « lien » (je vous assure, FileMaker est vraiment un langage codé !), ce qui n’est pas possible avec une variable (troisième songe ?). Ainsi, tous les liens relatifs à l’interface (la vue de l’utilisateur courant) doivent être basés sur des rubriques globales.

Voilà, j’espère avoir fait à peu près le tour, et que ça aidera certains à y voir plus clair

 

Cet article a été publié sur Le Blog FM et a été repris par FileMaker Inc. dans sa Newsletter d’Octobre 2008.

Ajouter un commentaire